• 2005-10-22

    find_if 와 boost::lambda

    STL 컨테이너를 만지작거리다보면 종종 algorithm 을 써서 코드를 간략하게 표현하고픈 충동이 든다. 그런데 STL에서 제공하는 각종 function template 의 파워는 생각보다 약하다. 가령 다음과 같이 컨테이너 내부 객체의 멤버 함수의 실행 결과를 기준으토 무언가를 하고 싶은 경우...

    class Focker
    {
    public :
        Focker(int v) : value(v) {}
        int GetValue() const { return value; }
    private:
        int value;
    };
    
    typedef list FOCKERS;
    
    FOCKERS fockers;
    
    fockers.push_back( Focker(1) );
    fockers.push_back( Focker(2) );
    fockers.push_back( Focker(3) );
    fockers.push_back( Focker(4) );
    fockers.push_back( Focker(5) );
    
    // how to find whose value ==3 ??
    

    가장 단순한 방법으로는 하드코딩 함수자를 사용하면 된다.

    class GetValueIs3
    {
    public :
        GetValueIs3(){}
        bool operator() ( const Focker & f ) const
        {
            return f.GetValue() == 3;
        }
    };
    
    FOCKERS::iterator itr;
    
    itr = find_if( fockers.begin(), fockers.end(), GetValueIs3() );
    assert( itr != fockers.end() );
    cout GetValue() GetValue() (),3),
            mem_fun_ref(&Focker::GetValue )) );
    

    그래서 이걸 가능하게 하기 위해서 몇 시간동안 씨름하다가 mem_fun_ref 의 코드를 살짝 고쳐서 다음과 같은 코드를 만들어봤다.

    template
    class my_const_mem_fun_ref_t
        : public unary_function
    {
    public:
        explicit my_const_mem_fun_ref_t(_Result (_Ty::*_Pm)() const, const _Fn & f )
            : _Pmemfun(_Pm), func(f)
        {
        }
    
        typename _Fn::result_type operator()(const _Ty& _Left) const
        {
            return (func((_Left.*_Pmemfun)()));
        }
    
    private:
        _Result (_Ty::*_Pmemfun)() const;   // the member function pointer
        _Fn func;
    };
    
    template
    inline
    my_const_mem_fun_ref_t
    my_mem_fun_ref(_Result (_Ty::*_Pm)() const, const _Fn & f)
    {
        return (my_const_mem_fun_ref_t(_Pm,f));
    }
    
    itr = find_if( fockers.begin(), fockers.end(),
        my_mem_fun_ref( &Focker::GetValue, bind2nd(equal_to(),3) )
    );
    assert( itr != fockers.end() );
    cout GetValue() GetValue()
    
  • 2005-10-18

    MMO를 위한 커뮤니티 서비스 구현하기

    MMO 를 위한 커뮤니티 서비스가 가장 잘 구현된 곳은 World Of Warcraft 이다. 물론 채팅과 귓말이야 별거 아닌 것처럼 느껴지지만, 친구 관리나 편지, 길드 채팅 같은 커뮤니티 서비스를 다중 서버에서도 투명하게 구현한다는 것은 생각보다 귀찮은 일이다. 오늘 어디에서 줏어 들기로 와우에서는 내부 채팅을 위해서 IRC 를 쓰고 있다고 하고(미확인 정보), 역시 게임을 개발하는 한 후배는 jabber 를 고려중이라고 했다.

    올해 초 spread 를 기반으로 서버간 채팅을 구현하려고 했는데, 이미 이 놈을 기반으로 만들어본 후배의 불만을 접수하고 바로 계획을 폐기해야만 했다. 어차피 관련 기능을 새로 만들어야 한다면 이미 검증된 놈을 갖다 쓰는 최고니깐 말이다. (그나저나 와우에서는 DB의 계정과 irc 의 데이터간의 연동은 과연 어떻게 할 것인지가 궁금하다. 탈퇴하거나 삭제할 경우 irc 쪽의 데이터도 변경해줘야 할텐데...헐헐)

    언제 나도 저런 걸 만지면서 놀까 생각하니... 깜깜하다.. 이힝~

  • 2005-10-11

    Remove Windows Service

    "sc delete service name" 을 이용해서 서비스를 삭제할 때 만약 다른 어플리케이션이 참조를 하고 있으면 바로 삭제하지 않고 레지스트리에 delete flag 가 추가된다. 이때 레지스트리 키값을 수동으로 삭제하더라도 "[SC] DeleteService FAILED 1072:" 라는 에러를 발생시키고 삭제가 되지 않는다.

    대체로 이런 경우에 관리 도구 - 서비스 관리자를 띄워둔 상태인데, 이 놈을 끈 상태에서 다시 삭제해보면 바로 사라진다. 요는, 서비스를 제거할 때에는 관리자를 끈 상태에서 하라는 것.