2011년 3월 25일 금요일

[Emacs] 유용한 ERC 설정 몇 가지

ERC는 Emacs에서 구동되는 IRC 클라이언트 모듈입니다. Emacs 23 버전부터 Emacs 기본 lisp 꾸러미에 포함되어 있기 때문에 다운로드하거나 설치하는 과정 없이 설정만 몇 가지 변경해주면 Emacs에서도 쉽게 IRC 채팅을 할 수 있습니다. 대부분의 ERC 관련 설정은 Customize Group을 통해 변경이 가능합니다.

M-x customize-group RET erc RET

그리고, 기본적인 설정 외에 제가 사용하는 것 중 유용하다고 생각되는 몇 가지를 정리해보았습니다.

서버 별 접속 함수 만들기

주로 IRC 네트워크 단 한 곳만 찾는 사람이라면 그냥 ERC 기본 설정에 서버와 닉을 지정해놓으면 되지만, 둘 이상의 네트워크에 접속할 일이 잦다면 각 네트워크 별로 접속 함수를 만들어두는 편이 더 편리합니다. 아래는 Freenode, HanIRC, 오징어 IRC 세 곳에 대한 코드 예입니다. (주의: Freenode는 NickServ가 있으므로 :password 필드에 닉 인증용 암호를 줄 수 있지만, HanIRC와 오징어 IRC는 다른 방법을 사용해야 합니다. 그 부분은 다음 단락에 다시 설명합니다.)

;; Freenode Network
;; NickServ: /msg NickServ identify PASSWD
;; ChanServ: /msg ChanServ help
(defun irc-connect-freenode ()
  "connect to freenode IRC server"
  (interactive)
  (erc-tls :server "irc.freenode.net"
           :port 7000
           :nick "MyNick"
           :password "MyPassword"
           :full-name "My Full Name"))

;; HanIRC Network
;; NickServ: /msg ^^ login NICK PASSWD
;; ChanServ: /msg ChanServ help
(defun irc-connect-hanirc ()
  "connect to HanIRC server"
  (interactive)
  (erc :server "irc.hanirc.org"
       :port 6667
       :nick "MyNick"
       :full-name "My Full Name"))

;; Ozinger Network
;; NickServ: /msg 오징오징어 identify PASSWD
;; ChanServ: /msg ㅇㅈㅇ help
(defun irc-connect-ozinger ()
  "connect to Ozinger IRC server"
  (interactive)
  (erc :server "irc.ozinger.org"
       :port 6667
       :nick "MyNick"
       :full-name "My Full Name"))

HanIRC와 오징어 IRC 닉(nick) 자동 인증

HanIRC와 오징어 IRC는 닉 인증을 위해 NickServ 대신 다른 방식을 사용하기 때문에 기본 설정만으로는 닉 자동 인증을 할 수 없습니다. 대신, erc-after-connect hook을 사용하여 닉 인증이 자동으로 되도록 설정해줄 수 있습니다.

(add-hook 'erc-after-connect
          '(lambda (SERVER NICK)
             (cond
              ;; hanirc
              ((string-match "hanirc\\.org" SERVER)
               (erc-message "PRIVMSG"
                            (concat "^^ login "
                                    "MyHanIRCNick" " "
                                    "MyHanIRCPassword")))
              ;; ozinger
              ((string-match "ozinger\\.org" SERVER)
               (erc-message "PRIVMSG"
                            (concat "오징오징어 identify "
                                    "MyOzingerPassword")))
              )))

알림(notice) 메시지 관련 설정

알림 메시지가 왔을 때 미니 버퍼에 보여주고, 현재 활성화되어 있는 채널 버퍼에도 그 내용을 보여주도록 설정합니다. 알림 메시지를 놓치지 않도록 도와주는 매우 유용한 설정입니다.

(setq erc-echo-notices-in-minibuffers-flag t)
(add-hook 'erc-echo-notice-hook 'erc-echo-notice-in-active-buffer)

mIRC 색상(color) 보여주기

메시지에 포함된 색상 코드를 해석해서 그 색상과 스타일을 표시해줍니다.

(setq erc-interpret-mirc-color t)

채널(channel) 자동 입장(join)

서버에 접속할 때마다 자동으로 특정 채널에 입장하도록 설정해줄 수 있습니다. 이 설정은 erc-modules list 내에 autojoin이 포함되어 있어야 작동합니다. 즉, autojoin 모듈을 활성화해두어야 합니다. -- 이 글 처음에 언급했던 Customize Group ERC 파트에서 활성화 모듈을 선택할 수 있습니다.

(setq erc-autojoin-channels-alist
      (quote (
        ("freenode.net" "#abc"
                        "#def")
        ("hanirc.org" "#channel1"
                      "#channel2")
        ("ozinger.org" "#chn1"
                       "#chn2")
        )))

닉(nick)마다 고유 색상 부여하기

닉에 고유한 색상을 부여해서 닉 별 대화 내용을 쉽게 구분할 수 있도록 도와주는 기능입니다. 이 기능을 사용하기 위해서는 erc-highlight-nicknames.el 파일이 필요한데, 아래 주소에서 받을 수 있습니다. 물론 자세한 설명도 함께 제공됩니다.

LINK: EmacsWiki: ErcHighlightNicknames

위 주소에서 erc-highlight-nicknames.el 파일을 받아 site-lisp과 같이 load-path에 포함된 적절한 폴더에 복사해넣습니다. 또는 load-path에 이 파일이 위치한 경로를 추가해도 됩니다. 그런 다음 아래 코드를 설정에 추가하면 됩니다.

(require 'erc-highlight-nicknames)
(and
     (require 'erc-highlight-nicknames)
     (add-to-list 'erc-modules 'highlight-nicknames)
     (erc-update-modules))

오징어 IRC 네트워크 접속 오류

ERC를 통해서 오징어 IRC 네트워크에 접속했는데 'USER: not enough parameters' 오류 메시지를 보여주더니 잠시 후 끊어지더군요. ERC 설정도 바꿔보고 소스도 좀 뒤져보고 해서 겨우 이유를 알아낸 다음에는 사실 좀 허탈했습니다.

일단 해결 방법은 erc-anonymous-login 값을 nil로 설정해주는 것입니다. (이 값을 nil로 설정하면 IRC 서버 연결됐을 때 닉 인증에 사용할 패스워드를 물어보는 프롬프트가 미니 버퍼 영역에 뜨는데, 그냥 엔터 키를 쳐서 넘어가면 됩니다.)

(setq erc-anonymous-login nil)

erc-login 함수 소스를 살펴봤더니 위 설정이 t로 되어 있으면 IRC 서버에 USER 명령을 보낼 때 첫 번째 파라미터로 닉(nick) 대신 이메일(email) 값을 보내도록 되어 있는데, 오징어 IRC 서버에서는 첫 번째 파라미터에 email 값이 주어지면 'USER: not enough parameters' 오류를 내는 것이었습니다.

USER MyNick 0 * My_Full_Name        --> OK
USER abc@def.net 0 * My_Full_Name   --> Error

2011년 3월 24일 목요일

Windows 환경에서 OpenSSL 빌드하기

OpenSSLSSL을 지원하는 많은 프로그램에서 사용하는 라이브러리 모듈이기 때문에 버그나 보안 관련 이슈가 발견되어 그것을 수정한 새로운 소스가 릴리즈될 경우 영향을 받을 수 있는 프로그램들은 최대한 빨리 업그레이드 해줄 필요가 있습니다. 다행스러운 점은 OpenSSL을 사용하는 대부분의 프로그램들이 (Windows 환경 기준으로) 두 개의 DLL 파일(ssleay32.dll & libeay32.dll)만 교체해주면 OpenSSL 모듈 업그레이드가 가능하다는 것입니다. -- DLL을 사용하지 않고 정적(static)으로 링크해버린 경우는 어쩔 수 없고, DLL을 사용했다고 하더라도 DLL 파일만 교체했을 때 드물게 오류를 일으키는 경우도 있습니다.

그러나 주의할 점이 하나 있는데, OpenSSL 1.0.x 버전과 0.9.x 버전의 라이브러리 인터페이스가 서로 다르기 때문에 DLL 파일 교체 시에 각각 인터페이스가 호환되는 버전으로 대체해야 한다는 것입니다. 예를 들어, 기존에 0.9.8q 버전의 DLL 파일이 사용되고 있었다면 0.9.8r 또는 그 이후 버전의 DLL 파일로 대체해야지 1.0.0d 버전이나 그 이후 버전의 DLL 파일로 대체하면 안 된다는 뜻이지요. DLL 파일의 속성 보기를 통해 버전 정보를 확인할 수 있으므로 적절한 대체 버전을 결정하는 것은 그리 어렵지 않습니다.

[libeay32.dll 속성 대화창]
[ssleay32.dll 속성 대화창]

빌드 준비

Windows 환경에서 OpenSSL 소스를 직접 빌드하는 것은 아주 간단합니다. 빌드에 사용되는 도구들도 모두 무료로 구할 수 있는 것들이기 때문에 비용에 대해 고민할 필요도 없습니다. (Visual C++ 64bit Compiler는 상용 제품에서만 제공됩니다.) 빌드에 필요한 도구들을 나열해보면 다음과 같습니다.

  • Perl: ActivePerl 또는 Strawberry Perl(@euler_kr 님 지적해주심)
  • C Compiler: Visual C++ 또는 Borland C 또는 GCC(Cygwin 또는 MinGW)
  • Assembler: nasm 또는 MASM

소스와 빌드 도구 다운로드 및 설치

소스는 OpenSSL 공식 홈페이지에서 다운로드 가능합니다. 1.0.x 버전과 0.9.x 버전이 함께 업데이트가 되고 있으므로 둘 다 받거나 둘 중 필요한 것으로 골라서 받습니다.

LINK: OpenSSL Source Downloads

이 글에서는 주로 많이 사용하는 Visual C++과 nasm을 가지고 Win32 환경으로 빌드하는 방법을 설명하겠습니다. 다른 도구 구성으로 빌드하고 싶은 분들은 OpenSSL 소스에 포함된 INSTALL.xxx 파일을 참고하시기 바랍니다. (Win32 빌드에 대해서는 INSTALL.W32 파일을, Win64 빌드에 대해서는 INSTALL.W64 파일을 참고)

가장 먼저 아래의 도구들을 각각 다운로드하여 설치합니다. OpenSSL 빌드에 사용되는 도구들은 특별히 버전에 대한 제약이 없으므로 최신 안정 버전을 받으면 됩니다. 단, Microsoft Visual C++은 빌드에 사용한 버전에 따라 결과물로 만들어진 DLL 파일이 해당 MSVC Runtime 버전에 대한 의존성을 가지게 되므로 외부에 전달할 때는 반드시 필요한 MSVC Runtime 버전을 알려주거나 재배포 가능한 패키지를 함께 제공할 필요가 있습니다.

LINK: ActivePerl 또는 Strawberry Perl 둘 중 하나

LINK: Microsoft Visual C++ Express Edition

LINK: Netwide Assembler(nasm)

빌드

  1. Windows 시작 메뉴에서 Visual Studio 명령 프롬프트를 실행합니다.

  2. nasmw.exe 파일의 위치를 PATH 환경 변수에 추가하거나 이미 PATH에 포함된 경로로 복사해줍니다.

    주의: 최근 nasm 배포본에서는 실행 파일명이 nasm.exe가 되었으므로 OpenSSL 빌드를 위해서는 nasmw.exe로 이름을 변경줄 필요가 있습니다.

  3. OpenSSL 소스가 풀려 있는 폴더로 경로를 변경합니다.

  4. Perl 스크립트를 통해 빌드 환경을 설정해줍니다.

    perl Configure VC-WIN32 --prefix=설치될_경로

    주의: 위와 같이 OpenSSL 기본 옵션으로 빌드하게 되면 미국과 몇몇 나라에서 특허로 보호받고 있는 암호화 알고리즘을 포함하게 되어 이것을 개발 중인 제품에 적용하거나 재배포할 때 법적인 문제를 야기할 수 있습니다. 그러므로, 특허로 보호되는 알고리즘을 제외하고 빌드하고 싶은 경우 no-idea no-mdc2 no-rc5 옵션을 추가해주어야 합니다. (greenfish77 님 지적해주심) 더 자세한 내용은 소스 내 README 파일의 PATENTS 항목과 FAQ 파일의 LEGAL 항목에서 확인할 수 있습니다.

    perl Configure VC-WIN32 no-idea no-mdc2 no-rc5 --prefix=설치될_경로
    또한 여기에 덧붙여, OpenSSL을 사용(또는 포함)한 어떠한 형태의 배포도 OpenSSL에 적용되고 있는 두 가지의 라이센스에 대해 표기해야 합니다. 자세한 것은 소스에 포함된 LICENSE 파일 내용을 참고하시기 바랍니다.

  5. Assembler로 nasm을 사용할 것임을 지정해줍니다.

    ms\do_nasm
  6. nmake로 빌드합니다. (한글 Windows 환경이라면 빌드 도중 에러가 발생할 수 있습니다. 이 에러에 대해서는 다음 단락을 참고하세요.)

    nmake -f ms\ntdll.mak
  7. 빌드가 잘 되었는지 테스트합니다.

    nmake -f ms\ntdll.mak test
  8. 최종적으로 만들어진 바이너리를 설치될_경로로 설치합니다.

    nmake -f ms\ntdll.mak install

빌드 중 compile error 해결하기

한글 Windows 환경에서 OpenSSL 소스를 빌드하게 되면 도중에 컴파일 에러를 만나게 됩니다. 소스 파일 중 딱 두 개가 컴파일 오류를 일으키는데, 그 원인은 소스 파일이 iso-8859-1 인코딩으로 저장되어 있고 그 내용 중에 확장 ASCII 문자가 포함되어 있기 때문입니다. Visual C++ Compiler(.NET 이후 버전부터)는 소스를 읽어 들일 때 UTF-8으로 인코딩된 파일인지 확인하고 그렇지 않다면 시스템 기본 인코딩(한글 Windows에서는 CP949)으로 간주합니다. 이 때 그 확장 ASCII 문자가 적절하지 못한 문자로 처리되어 컴파일 오류를 발생시키게 되는 것입니다.

컴파일 에러가 발생하는 소스 파일은 다음과 같습니다.

crypto\x509v3\v3_pci.c
crypto\x509v3\v3_pcia.c

해결 방법은 간단합니다. 문제가 되는 확장 ASCII 문자(ö)는 소스 파일 첫 부분(line 5)에 있는 주석 중 저작권 표기 부분에 포함되어 있습니다.

/* Copyright (c) 2004 Kungliga Tekniska Högskolan

그러므로, 적절한 텍스트 편집기로 열어서 그 이름 부분을 지우고 저장한 다음 빌드하면 됩니다. (주의: OpenSSL 라이센스 정책에 따라, 배포하는 소스에서 위 저작권 관련 표기를 삭제하는 것은 허용되지 않습니다. 이것은 단지 빌드 시에 오류를 피하기 위한 방법일 뿐입니다.) 혹은 그냥 소스를 UTF-8 인코딩으로 변환해서 저장해주면 됩니다.