• 2005-03-21

    TortoiseSvn

    탐색기에서의 버전 관리라니... 아무래도 IDE 에 연동되는 것에 비해서는 좀 불편하지 않을까? 하는 것이 나의 첫 느낌이었다. 물론 Visual Studio .NET 에 연동되는 넘이 있긴 하지만, 아직까지 안정화되어 있지 않다는 소문 때문에, 결국 거북이SVN 으로 오게 되었다. 그런데 이틀 정도 써보니까 어째 예전에 비해서 심리적인 면에서 더 편해졌다는 느낌이 들었다.

    우선, '체크아웃하시겠습니까? 라는 창이 안떠서 좋았다.' 사실 이건 VSS 옵션을 끄면 되는 것이지만, 웬지 새로운 소스를 고치기 전 경건한 마음을 가지자는 의미에서 그냥 켜두곤 했는데, 실제로는 꽤나 심리적인 불편함과 강박 관념(너는 소스를 더럽히고 있다..)을 개발자에게 주고 있다는 생각이 들었다. 좀더 코드에 편하게 접근할 수 있게 되었다고나 할까? (만약 아직 VSS를 사용하고 있다면 이 옵션을 끄고 작업해 보기 바란다.)

    두번째는 IDE에서 작업하고 탐색기에서 커밋할 때의 심리적인 해방감이 들게 되었다는 점. 가장 비슷한 예라면 회사에서 양복을 입다가 집에서 평상복을 입을 때의 느낌이리라. 딱딱한 IDE에서 비교적 화려한 탐색기 + 바탕화면으로 전환되면서 내가 이제 커밋을 하게 된다는 마음 자세로 바뀌더라는, 실로 억지스러운 주장이다. :)

    세번째로는 로컬 워킹 카피에 있는 삭제된 파일들을 손쉽게 관리할 수 있게 되었다는 점이다. VSS를 쓸 경우 버전 관리되던 파일을 삭제하려면 로컬 카피도 지우고 저장소에서도 지워 줘야 한다. IDE에서 삭제하는 것까지 감안하면 세 군데에서 지워줘야 한다. 역시나 이것도 저장소에서 삭제시 로컬 파일도 삭제한다는 VSS 옵션이 있긴 하지만 좀 위험한 감이 있어서 실제로 쓰기는 곤란했었는데, SubVersion 에서는 아예 파일 관리를 탐색기에서 다 할 수 있어서 괜찮은 듯 했다.

    난감한 점이라면, 아무 생각없이 그냥 파일을 삭제하다가는 피를 본다는 점(물론 재빨리 업데이트해서 파일을 받아와야 한다.), 그리고 작업중인 .svn 폴더를 삭제하면 버전 관리 정보가 날아가서 다시 add 를 해야 한다는 점 등이다. 그리고 '''거북이CVS와 함께 사용할 경우 탐색기의 오른쪽클릭 메뉴가 너무 길어진다'''는 사소한 단점도 있다. :(

    사실 아직까지 태그, 브랜치, 머지를 해보지 않아서 이 부분에서 얼마나 더 매력적인 모습을 보여줄런지는 의문이다. 유니코드 비교시 문자열을 잘 표현해주는지도 미확인. 빨리 이 부분에 대해서도 테스트를 해봐야 겠다.

    Ignore List

    글로벌 ignore 리스트는 TortoiseSvn - 설정 메뉴에서 지정하며, 이 값은 레지스트리의 HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Config\Miscellany\global-ignores에 들어있다.

    반면 로컬 ignore 리스트는 해당 파일의 상위 폴더의 .svn/dir-props 에 들어있다. 이 값을 지우려면 그냥 탐색기에서 속성 메뉴에서 TortoiseSvn 메뉴에서 지우면 된다. TortoiseSvn 의 CHM 도움말에서 4.9. Get/Set Information About Files/Directories 항목을 참조하도록.

    see also:
    거북이SVN 공식 홈페이지
    SubVersion
    SeriousCode:Subversion
    KLDP:SubVersion

  • 2005-03-01

    Trac

    TRAC = 위키 + 이슈 트래킹 + 버그 트래킹 + 이벤트 트래킹 + 소스 브라우징 & diff + 리포팅....

    더군다나, 파이썬으로 구현되었고, SQLLite 를 쓰며, SubVersion 연동이라니... 이 정도라면, 새 회사에서 KMS 로 쓰려고 했던 모니위키와는 무조건 이별을 해야 할 듯 하다.. 만티스도 안녕... phpBB도 안녕...

    그렇잖아도, 동료 개발자들의 check-in 여부를 확인하려고 모인모인 위키에서 파이썬으로 VSS 히스토리 뷰어 매크로를 작성하다가 이상한 이유로 포기한 전적이 있었기에... 더욱 기대가 된다. :)

    위키에서 디자인, 구현, 테스트의 전 개발과정을 진행하고 싶은 사람에게 권장한다. 단 과도한 욕심은 금물... ;)

    한글화

    한글 페이지를 만들기 위한 문법은, [wiki:한글링크 한글링크]와 같이 사용한다. 이걸 가능하게 하려면...

    • CJK-Python을 설치할 것. (CJK-Python은 Python2.4부터는 포함되어 있지만, Trac은 Python2.3을 사용한다~)
    • trac.ini 에서 default charset = euc-kr 을 사용할 것.
    • Wiki.py 를 다음과 같이 수정할 것.
    
    30 from util import escape, TracError, get_reporter_id, to_utf8
    
    191  def render(self):
    192  name = to_utf8(self.args.get('page', 'WikiStart'),'euc-kr')
    
    • 한글 템플릿은 OpenLook에서 다운받을 것.

    see also:
    [http://trac.edgewall.com/ TRAC Official Homepage]
    [http://openlook.org/blog/reviews/0412TracInAction Trac과 함께 한 2주]
    Trac:TracInstall - TRAC 설치 매뉴얼(영문)
    Trac:TracOnWindows - TRAC on 윈도우즈 설치 매뉴얼(영문)
    * [http://synergy.kaist.ac.kr/~paraon/tt/index.php?pl=59 Trac 0.8 On WindowsXP] - 한글 관련 설치 팁

  • 2004-11-26

    Visual Studio Tips

    .h <-> .cpp 단축키

    Visual Assist 를 사용하시는 분은, [도구]-[옵션]-[환경]-[키보드] 에서 VAOpenOpposite를 Ctrl+Q등으로 단축키를 지정하면 파일 전환을 보다 쉽게 할 수 있다.

    Alt + F7

    [도구]-[옵션]-[환경]-[키보드]에서 빌드.선택영역빌드를 Alt+F7로 단축키 지정하면, 현재 프로젝트를 키보드만으로 빌드할 수 있다.

    외부 도구

    레이옷은 현재 솔루션의 각 프로젝트의 산출물(exe,pdb,xml 등)들을 서버에 배포하기 위해서 Python 으로 배포 스크립트를 제작했다. 문제는 이 넘을 실행하기 위해서 꼭 탐색기를 띄워서 찾아가서 실행하는게 너무 귀찮았다는 점. 그러나 [도구]-[외부도구]-[외부명령] 으로 새 명령을 등록할 수 있다. 아래와 같이 등록하면, 이제 파이썬 스크립트를 메뉴에서 실행할 수 있게 된다. 특히 출력창 사용을 선택하면 스크립트의 표준 출력을 Visual Studio 에서 살펴볼 수 있다.

    external_tool.JPG

    또한 이 명령을 도구모음에 등록하면 더욱 편하다. [도구]-[사용자지정]-[새로만들기]에서 도구바를 하나 만든 다음, [명령] 탭을 눌러 아까 등록한 넘을 [범주]-[도구]-[외부명령N]에서 찾아 드래그 앤 드랍으로 새 도구바로 옮겨 주면 끝. 그나저나, 아이콘을 새로 등록하고 싶지만 어떻게 하는지 모르겠다.

    한글폴더/파일

    가능하면 사용하지 말라. 레이옷은 빈태군의 권유를 듣고 한쪽귀로 흘리다가 다음과 같은 고생을 하게 되었다.

    • xerces c++ 라이브러리 사용시, XML 파일의 절대 경로를 파싱할 때 한글 폴더가 포함될 경우 [Unicode] 로 경로 문자열을 넘겨야 한다.
    • DevPartner 사용시 디버깅 정보가 찾아지지 않는다.
    • 이 외에도, 프로젝트 폴더명 중에 space 가 포함될 경우에도 항상 $(InputDir) 등의 매크로들을 " " 으로 둘러싸줘야 한다.

    정규식

    global replace 할 때, 정규식을 사용하면 매우 편리하다. 다음 예를 살펴보자

    string strValue = __NODE_TEXT(pStrNode);           // ----> string strValue = pStrNode.ToString();
    int iValue = __NODE_INT(pIntNode);                 // ----> int iValue = pIntNode.ToInt();

    MSXML 에서 xerces 로 XML 라이브러리를 교체할 때, 위와 같은 코드가 이곳 저곳에 수두룩 했다. 이를 고치기 위해 다음 정규식을 사용했다.




    필드 입력
    Find __NODE_TEXT({.+})
    Replace {{{\1.ToString()}}}

    • () 의 경우 backslash escape 를 해줘야 한다
    • .+ 는 설명안해도 알 듯?? ㅋㅋ
    • 특정 패턴을 replace 에서 사용하려면 {패턴}으로 검색하고, (발견순서대로) \N 으로 사용하면 된다
    • replace 는 정규식이 아니니깐 막 써도 된다

    일반 문자열 "xxx" 를 _T("xxx") 로 바꾸는 정규식

    필드 입력
    Find \"{:Al@}\" (단, 문자열 가운데 ' ' 또는 '_' 가 있을 경우 인식이 안된다.)
    Replace _T("\1")

    빌드 이벤트

    UnitTest나 EventLog 를 위한 Message DLL 등을 만들 때 사용되는 사용자 지정 빌드 단계에 대해서 알아보자. 우선, MSDN 에 나오는 Visual Studio 빌드 이벤트 및 사용자 지정 빌드 단계의 순서는 다음과 같다.

    • '''빌드 전 이벤트'''
    • 개별 파일에 대한 사용자 지정 빌드 단계
    • 프록시 생성기
    • MIDL
    • 리소스 컴파일러
    • C/C++ 컴파일러
    • '''링크 전 이벤트'''
    • 링커 또는 라이브러리 관리자(해당되는 경우)
    • BSCMake
    • 프로젝트에 대한 사용자 지정 빌드 단계
    • 웹 배포 도구
    • '''빌드 후 이벤트'''

    UnitTest를 자동으로 실행하게 하려면, '''프로젝트 사용자 지정 빌드 단계''' 또는 '''빌드 후 이벤트'''가 적절하다.

    Command Line Build

    특이하게도 한 순간에 한가지 프로젝트, 한가지 빌드 타겟만이 가능하다. 결국 여러 개의 프로젝트를 함께 빌드하려면 각각을 따로 명시해야 할 듯. /out 의 경우 이전 파일에 로그를 append 한다.

    devenv /project /build /out

  • 2004-11-26

    Python Service

    win32serviceutil.ServiceFramework를 상속받아서 SvcStop(), SvcDoRun() 을 override 하면 가장 기본적인 서비스를 구현할 수 있다. 아래의 예제는 Python Programming on Win32 에서 발췌한 것이다.

    !python

    import win32serviceutil, win32service, win32event
    class MyService(win32serviceutil.ServiceFramework):
    svc_name = "MyService"
    svc_display_name = "My First Service"
    def init(self,args):
    win32serviceutil.ServiceFramework.init(self,args)
    self.event = win32event.CreateEvent(None,0,0,None)
    def SvcStop(self):
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
    win32event.SetEvent(self.event)
    def SvcDoRun(self):
    win32event.WaitForSingleObject(self.event,win32event.INFINITE)

    if name=='main':
    win32serviceutil.HandleCommandLine(MyService)

    이렇듯 간단한 서비스를 실행하기 위해서는 우선 Win32 Python 모듈과 함께 배포되는 PythonService.exe를 레지스트리에 등록해야 한다. 다음과 같이 하라. (그런데, 아마도 win32 모듈을 설치하면 자동으로 이 넘이 등록되는 듯하다. 확인 요망)

    PythonService.exe /register

    이제 서비스를 실행해보자. win32serviceutil.HandleCommandLine()이 이미 모든 것을 구현해뒀기 때문에, 그냥 다음과 같이 하면 된다.

    python MyService.py install | start | stop | remove

    물론 net start | stop MyService 라고 해도 서비스를 시작/종료할 수 있다.

  • 2004-11-26

    MoniWiki Tips

    Security

    $security_class="needtologin";

    RcsLite

    $version_class='RcsLite';

    Disable Theme

    테마와 CSS 모두 강제 지정하려면 아래와 같이 할 것.

    $theme='...';

    $theme_css=1;

    MoinMoin Migration(?)

    MoinMoin 위키에서 MoniWiki 로 이전한 경우, 구글 등의 검색 엔진이나 지인들의 링크가 이전 주소로 되어 있는 경우, fake moin.cgi 를 만들어서 링크를 계속 유지시킬 필요가 있다. 특히 apache 환경에서는 .htaccess 설정을 이용해서 손쉽게 fake moin.cgi 를 만들 수 있다. 일단 아래와 같이 moin.cgi 를 만든다. 특별히 실행권한을 주지 않아도 무방하다.

    <?php

    chdir("/path/to/moniwiki");

    include("wiki.php");

    ?>

    • .htaccess 에 moin.cgi 를 php 가 핸들링하도록 다음과 같이 추가한다.

    SetHandler application/x-httpd-php

    파일 업로드 크기 제한

    이것은 모니위키의 문제가 아닌 php 의 문제이다. php.ini 에서 업로드 및 POST 크기 제한을 적절하게 수정해야 한다.

    xls 파일 업로드

    UploadFiles.php 에서 기본적으로 정의된 확장자가 아닐 경우 업로드가 금지된다. 따라서, 여기에 xls 확장자를 추가할 것.

    // plugin/UploadFile.php:71

    $pds_exts="png|jpg|jpeg|gif|mp3|zip|tgz|gz|txt|css|exe|hwp|xls";

    external link 제거

    한글로 된 외부 링크의 경우 URL 이 너무 길어져서 화면 크기를 넘어서는 경우가 있다. 아예 URL 표시를 제거하는 편이 더 좋을 듯?

    // wiki.php:1440

    $external=$this->ex_bra.$url.$this->ex_ket;

    $external=''; //

    see also:

    • http://en.wikipedia.org/wiki/Favicon