Cygwin emacs용 mule-ucs 설치

2009/03/06 19:41
cygwin용 emacs에서 utf-8로 저장된 파일의 한글을 보기에 제일 쉬운방법이 mule-ucs 패키지를 설치하는 방법이다. cygwin 패키지로 제공해주면 좋으련만 그렇지 않기 때문에 직접 컴파일해서 설치해야한다.

http://tats.haun.org/mule-ucs/ 에서 최신 mule-ucs 를 다운받는다.
당당하게 unofficial이라고 써있다.

다운받은 mule-ucs 파일을 적당한 곳에 풀면 mucs-comp.el 이 있는 디렉토리 밑이 doc/ 디렉토리와 lisp/ 디렉토리가 있을것이다. 그 디렉토리에서 mule-ucs를 바이트코드 컴파일 한다
emacs -q --no-site-file -batch -l mucs-comp.el
컴파일이 다되면 emacs/site-lisp 디렉토리 밑으로 lisp/ 디렉토리를 mule-ucs 이름으로 바꿔 옮겨준다
내 cygwin system은 다음과 같은데
$ uname -srv
CYGWIN_NT-6.0 1.5.25(0.156/4/2) 2008-06-12 19:34
다음과 같이 옮겼다
mv lisp/ /usr/share/emacs/site-lisp/mule-ucs
마지막으로 .emacs 파일을 설정한다.
(require 'un-define)
참고로 시그윈 이맥스에서 한글을 쓰는 방법이 여러가지 있지만 나는 다음과 같은 방법을 사용한다
(set-keyboard-coding-system 'korean-iso-8bit) ; using IME
(set-selection-coding-system 'korean-iso-8bit) ; copy/paste

윈도우/개발환경 cygwin, emacs, utf-8

어차피 io는 느린걸

2009/02/08 17:02
C의 printf 계열보다 C++ 의 cout 등의 io 계열이 많이 느리다는건 익히 알려진 문제이다. 그런데 printf계열은 가변인자를 사용하여 printf와 비슷한 함수를 직접만드려면 어쩔수없이 va_list 계열의 매크로를 건드려야한다.

게다가 printf 계열은 버퍼오퍼플로를 막기위해 많은 변종들이 생겨나서 어떤게 표준인지 했갈리기도 한다. c99 표준이라고 알고 있는 snprintf는 Visual Studio 2008에서 조차 지원하지 않는다.

이런거 저런거 다 따져보면 차라리 C++ 계열의 io를 사용하는게 낫겠다는 생각이 들었다.
가변인자를 오버로딩으로 처리하면 formatting이 없는 경우에는 오히려 printf보다 빠르겠다는 생각도 들었다.

그래서 logger를 이런식으로 구현해봤다.
(Language : cpp)
static void log( const char* _pSzContents )
{
    onPreSetMessage_();
    pLogger_->strCurrentMessage_ = _pSzContents;
    onPostSetMessage_();
}

template< typename T0, typename T1 >
static void log( const char* _pSzContents, T0 _t0, T1 _t1 )
{
    onPreSetMessage_();
    EStringUtils::formatStr(pLogger_->strCurrentMessage_, _pSzContents, _t0, _t1);
    onPostSetMessage_();
}

template< typename T0, typename T1, typename T2 >
static void log( const char* _pSzContents, T0 _t0, T1 _t1, T2 _t2 )
{
    onPreSetMessage_();
    EStringUtils::formatStr(pLogger_->strCurrentMessage_, _pSzContents, _t0, _t1, _t2);
    onPostSetMessage_();
}
...


물론 formatStr로 비슷하게 구현되어 있다.
(Language : cpp)
template< typename T0 >
static void formatStr(std::string& _rString, const char* _pSzContents, T0 _t0 )
{
    formatStr(_rString, _pSzContents, _t0, FORMAT_INDEX_ERROR);
}

template< typename T0, typename T1 >
static void formatStr(std::string& _rString, const char* _pSzContents, T0 _t0, T1 _t1 )
{
    formatStr(_rString, _pSzContents, _t0, _t1, FORMAT_INDEX_ERROR);
}

...

static void formatStr(std::string& _rString, const char* _pSzContents, T0 _t0, T1 _t1, T2 _t2, T3 _t3, T4 _t4, T5 _t5, T6 _t6, T7 _t7 )
{
    assert(_rString.empty());
    std::vector< std::string > vBuffers;
    splitFormat_(_pSzContents, vBuffers);

    std::ostringstream oss;
    ...
   
}

뭐, 어차피 io는 느린걸...

관련 자료들
 - printf vs. cout
 - ELogger.h
 - EStringUtils.h

프로그래밍 C++, 프로그래밍

T-Rex : 작은 C++ 정규표현식 라이브러리

2009/02/07 21:25
C++에서 C# 형태의 스트링 포메팅을 지원하는 로거를 만들다보니 정규표현식을 지원하는 라이브러리가 필요하게 되었다. 유명한 boost 에 정규표현식 지원 라이브러리가 있었지만 여러프로젝트의 기반이 되는 프로젝트에 포함시킬 생각이어서 코드상태로 프로젝트에 포함될정도 작아야했다.

sf에서 뒤지다가 딱 필요한 정도의 기능만 구현되어 있는 t-rex라는 라이브러리를 발견했다. zlib 라이센스에 파일도 헤더파일, cpp파일 2개만 있으면 쓸수 있을정도로 작았고 사용방법도 아주 간단했다.

세미콜론에 비교적 안정적인 path splitter(앞뒤로 세미콜론이 있을수 있고, 세미콜론사이에 여러개의 세미콜론이 들어가도 분리가능하고 맨 끝은 세미콜론이 없어도 나누어줄수 있는) 를 요 라이브러리로 구현하면 다음과 같다.

(Language : cpp)
std::vector< std::string > vecSplittedPath;

const char* pSzContents = ";;/usr;;/opt/lib;/sbin;;/etc";
const char* pSzError = 0;
const char* pSzPattern = "[^;]+";
TRex* pRex = trex_compile(pSzPattern, &pSzError);
if(pRex)
{
    const char *pSzBegin,*pSzEnd;
    while(trex_search(pRex, pSzContents, &pSzBegin, &pSzEnd) )
    {
        TRexMatch match;
        trex_getsubexp(pRex,0,&match);
        vecSplittedPath.push_back( std::string(match.begin, match.len) );

        pSzContents = pSzEnd;
    }
}
trex_free(pRex);

프로그래밍 C++, 프로그래밍