[카테고리:] 이전 블로그

태터툴즈, 블로거닷컴, VCL WordPress 등지에서 내보낸 블로그 글들.

  • 워드프레스에 감탄하다.

    세상에나!

    뭐 이렇게 잘 짜여진 웹 기반의  저작 도구가 있을까? 놀라울 지경이다.
    이제는 컨텐츠에 주목해야 하지 않을까?

  • 마인크래프트 잉여짓

    마인크래프트 잉여짓

     

    minecraft_018

     

    minecraft_019

     

    이제 나도 슬슬 잉여짓을 시작한다.
    Piehole-Pattern 텍스쳐에 파란 울, Glowstone을 두 겹으로 이름을 새겼다.
    이름 한 자의 사각 틀 사이즈는 12 * 10이다.

    포토샵에서 적당히 글씨 가져와 도트화했다….

  • 마인크래프트 텍스쳐 팩.

    마인크래프트 텍스쳐 팩.

    텍스쳐 팩을 이용하면 블럭의 모양이 달라진다.
    좀 더 예쁜 모양새를 갖출 수도 있어 꾸미는 데 더 도움이 될 듯.

  • Rapid Environment Editor 한국어 번역 업데이트

    Rapid Environment Editor 한국어 번역 업데이트

    환경 변수 세팅하다가 짜증이 나서 편하게 해 주는 툴이 없을까 하다가, 우연히 Rapid Environment Editor라는 툴을 찾게 되었다.

    한편 이 프로그램은 지역화를 각 언어 사용자들이 자발적으로 참여하기를 원했다.
    중국어, 일본어도 있는데 우리 한글이 없는 것이 안타까웠다. 한글이 제공되면 좀 더 많은 한국 사람들이 이 프로그램을 알지 않을까? 주말에 약간 시간을 들여 작업했고 제작자에게 이메일을 보냈다. 아주 고맙게도 제작자는 내 언어 번역을 자신의 다음 버전에 넣겠다고 답장을 주었고, …

     

    rapidee_localization

    정말 홈페이지에 Korean이 올라왔다. 100% 번역이다. 하하.

     

    rapidee_korean

    업데이트하면 다음과 같은 창이 뜬다. 진짜 내 이름이 나오네!

     

    rapidee_korean_steproll

     

    rapidee_korean_frm

    깔끔하게 한글로 나오는 프로그램. 번역이 아주 훌륭한 편은 아니지만 아마 알아볼 수 있을 정도는 될 것이다.
    결과물을 보니 오히려 내가 제작자에게 고맙다.

  • 마인크래프트 World of Mincraft 공개 서버

    마인크래프트 World of Mincraft 공개 서버

    마인크래프트 공식 홈페이지 서버 리스트에 있는 “World of Minecraft” 서버에 접속해 보았다.
    웹브라우저에서만 실행 가능한 듯.
    들어간 순간 할 말을 잃었다.

    minecraft_008
    루이지…

    minecraft_009
    마리오…

    minecraft_010

    minecraft_011
    별의 별 게임 캐릭터를 쌓아(?) 두질 않나…

     

    minecraft_012
    취향대로 만든 건물들은 외관은 물론 디테일도 상당했다. 스크린샷으로 찍지는 못했지만 동양식으로 쌓은 탑도 있었는데 컬쳐쇼크를 느낄 정도였다.

     

    minecraft_013
    수퍼맨과 배트맨 문양도 떠 다니고…

    minecraft_016
    뭐 이런 높이에서 이런 작업을 하다니, 잉여 짓도 이 정도면 거의 아트 급.

     

    minecraft_014

    minecraft_015

    minecraft_017

    마지막으로 아주 높은 건물에 올라가 찍어 본 전경.

    밤이 없고 몹도 없고, 그냥 모든 블럭이 무한히 주어지는데다 플레이어는 죽지 않으니 뭔가 좀 부자연스러운 듯. 결국 이렇게 지어서 무얼 하겠다는 건지? 좀 아니다 싶기도 하고…

  • 마인크래프트 처음 시작

    마인크래프트 처음 시작

    아이디 패스워드를 입력하면 아래 그림처럼 자동으로 마인크래프트를 업데이트한다.
    그래픽은..마치 둠 시절을 연상시킬 정도로.. 좋은 편은 아니다.

    minecraft_003

    현재 버전은 1.2_02라는군.

    minecraft_004

    싱글 플레이어로 선택해서 혼자 놀아보자

    minecraft_005

    다섯 개의 슬롯이 있고 하나를 골라 플레이 할 수 있다. 보다시피 90년대 통신을 통해 배포하던 쉐어웨어 게임같다….

    minecraft_006

    처음 시작하면 지형 등을 생성하고…

    minecraft_007

    허걱!  모든 것이 네모나다.

  • 마인크래프트를 시작.

    마인크래프트를 시작.

    설 연휴동안 무료인 마인크래프트 알파 버전을 해 보고…

    minecraft_001

    minecraft_002

     

    멋지게 질러 버렸다.

    정식 사용자로 마인크래프트 입문이다.

  • [위키 백업] 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);    
      }