[글쓴이:] changwoo

  • [위키 백업] log4cxx 컴파일 삽질

    Visual Studio 2010

    프로젝트 설정하기

    • apr, apr-util과 log4cxx를 준비한다. 컴파일 할 때 apr-1.4.2-win32-src, apr-util-1.3.10-win32-src, apache-log4cxx-0.10.0을 사용하였다.
    • 세 파일을 모두 압축을 풀되 apr, apr-util의 디렉토리 이름은 그냥 apr, apr-util로 버전 명을 제거한다.
    • apache-log4cxx-0.10.0 디렉토리로 가서 configure.bat 파일을 한 번 클릭해 실행한다.
    • 공식 홈페이지 문서를 보면 configure-aprutil.bat 도 실행하라고 되어 있는데 이 안을 보면 sed를 실행하는 스크립트에 불과하다. sed-4.2.1-setup.exe를 설치해 실행하면 에러 메시지만 생긴다. 일단 나중에 손으로 고쳐 주자.
    • 비주얼 스튜디오를 열어 apache-log4cxx-0.10.0/projects 안의 log4cxx.dsw를 읽어들인다.
    • 다음 log4cxx를 스타트업 프로젝트로 설정한다.

    컴파일 준비

    • 이전 단계에서 수정하지 못한 sed 스크립트를 손으로 고친다.
      • apr-utilincludeapu.hw 파일에서 #define APU_HAVE_APR_ICONV 부분을 #define APU_HAVE_APR_ICONV 0로 수정.
      • apr-utilincludeapr_ldap.hw 파일에서 #define APR_HAS_LDAP 부분을 #define APR_HAS_LDAP 0로 수정.
    • 다음 수많은 컴파일 에러와 싸워야 함.
      • LOG4CXX_LIST_DEF 매크로가 말썽인데 이것을 클래스 밖(네임스페이스를 넘지는 말고)으로 빼낸다.
      • telnetappender.h 파일 안에서는 바로 윗줄의 typedef log4cxx::helpers::SocketPtr Connection; 구문까지 밖으로 빼낸다.
      • LoggingEvent::KeySet 과 같이 스코프가 바뀌어서 에러가 나는 부분은 그냥 KeySet으로 변경한다.
      • insert_iterator가 없다고 에러가 나는 경우는 #include <iterator>를 선언한다.
      • 위의 사항을 모두 수정하면 컴파일 에러는 다 수정하게 된다.
    • apr, apr-util의 lib 파일이 참조되지 않아 링크 에러가 나는 문제가 남는다.
      • log4cxx 프로젝트의 설정의 ‘additional dependencies’에 아래 세 줄을 추가한다.
    ....apr-utillibdaprutil-1.lib
    ....apr-utilxmlexpatliblibdxml.lib
    ....aprlibdapr-1.lib
     
    Release 빌드의 경우 libd에서 libr로 변경하면 된다.

    기타

    • VS2008에서 컴파일했을 때 LOG4CXX_XXXX 매크로 안에서 “<<” 연산자를 이용하면 access violation이 일어나는 문제가 있었다. VS2010을 이용해 컴파일한 것에서는 문제가 발생하지 않았다. 컴파일러의 버전이 달라서 발생하는 문제였나? 잘 모르겠다.

    참고

    이 글이 다른 이들게 도움이 되었는지 모르겠다. 귀찮으신 분들(나를 포함한)을 위해 바이너리를 올려두도록 하겠다.

    • 우리의 모습

      우리의 모습

      아.. 눈물이 난다.

    • Mediawiki 다시 살려내기

      미디어 위키는 자료를 체계적으로 보관하기 좋고,
      블로그는 자료를 안정적으로 보관할 수 있어서 좋다.

      이번에 너무 성급히 젠투 서버를 밀어버리는 바람에 위키를 다시 살리느라 고생을 좀 했는데
      실제로 해본 경험을 적어두도록 한다. 위키를 살려내는 과정을 위키에 적을 수는 없지 않나…

      연구실 NAS에 2010년 12월 25일까지 백업을 시켜 두었다.

      • 백업 문제점
      • 여기는 환경설정 및 이미지만 백업이 되어 있었고 extension data는 없었다. extension도 간간히 백업하도록 (1달에 1번?) 고쳐야할 것이다.

      이것을 받아 미디어위키에서 위키를 받는다.

      그리고 데이터베이스를 복구한다.
      위키로 가면 위키를 설치하라는 말이 나오는데, 일단 위키는 설치 메뉴를 이용해 설치하도록 한다. 기존의 위키 옵션과 동일하게 하자. 위키 이름은 Nambaxawiki이다.

      위키를 복구하면 데이터베이스가 있기 때문에 어떻게든 화면이 나온다. 기존의 LocalSettings.php 파일을 교체한 후 위키가 생성한 LocalSettings.php 파일을 참고하면서 일단 돌아가도록 세팅을 변경하자.

      그리고 처음에는 apache의 rewrite 가 되지 않기 때문에 항상 index.php를 붙여 주어야 한다.
      이것을 고치려면

      $wgArticlePath = “$wgScriptPath/$1”;
      $wgUsePathInfo = true;

      위키 디렉토리에 .htaccess를 생성한다.

      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]
      문제가되는 extension은 주석 처리하면 이렇게 하면 어떻게든 위키가 살아난다.

      GeSHi가 Waning을 뱉어내는데, 이것은 php.ini의 display_errors = Off 로 하자.
      나는 PHP로 개발할 거 아니니까..

    • 현재 블로그는

      현재 블로그는 설치형 블로그에 의존하고 있습니다.
      http://nambaxa.wo.tc/tc/ 로 오면 똑같은 블로그가 있습니다.

      요즘은 위키를 더 선호합니다.
      http://wiki.nambaxa.wo.tc 입니다.

    • 클래스 크기에 멤버 함수가 영항을 줄까?

      클래스 크기에 멤버 함수가 영항을 줄까?

      일단 VS2008에서의 답은 NO 입니다.

      좀 생각해 보면 그럴 만도 하지..
      컴파일 된 이후 오브젝트 코드에서 무슨 클래스와 멤버 변수, 함수 개념이 있나..
      그냥 언어 단계에서 사람들이 작성할 때 필요한 규칙일 뿐인 것을.

    • getPath

      #include <iostream>
      #include <string>
      #include <vector>
      #include <algorithm>
      #include <iterator>

      std::string getPath(std::string & fullpath);

      int main(int argc, char **argv)
      {
          std::vector<std::string> arglist;

          for(char ** v = argv+1; *v != NULL; ++v) {
              std::cout << *v << std::endl;
              arglist.push_back( getPath(std::string(*v)) );
          }

          std::copy(arglist.begin(), arglist.end(), std::ostream_iterator<std::string>(std::cout, “n”));
          return EXIT_SUCCESS;
      }


      std::string getPath(std::string & fullpath)
      {
          for(std::string::iterator it = fullpath.begin();
              it != fullpath.end();
              ++it)
          {
              if( *it == ‘\’ )
                  *it = ‘/’;
          }

          std::string::size_type pos_beg =  fullpath.at(0)    == ‘”‘ ? 1 : 0;
          std::string::size_type pos_end = *fullpath.rbegin() == ‘/’  ? std::string::npos : fullpath.rfind(‘/’)+1;
          
          return fullpath.substr(pos_beg, pos_end);    
      }