Author Archives: mix1009

CentOS (Redhat Enterprise)에서 lighttpd 설치

이번에 회사에서 새 서버들을 구매해서 IDC에 들어왔습니다. Dell PowerEdge SC1435로 AMD기반 옵테론 CPU라서 FreeBSD보다는 Linux가 좋을거 같더군요. 전에도 델서버 들어왔었는데 FreeBSD에서 네트워크 디바이스가 정상적으로 동작을 안하더군요. 델서비스에 연락했더니 Redhat Enterprise Linux(RHEL)구해서 설치하라고 해서 설치했었는데 네트워크 드라이버를 따로 구해서 설치해야되더군요. 서버에는 원래 엑스를 설치를 잘 안해서 고생했습니다. 일단 이미 설치된 다른 서버에 X 설치하고 웹에서 다운로드하는데 문서가 exe 파일이더군요! 황당 –; 집으로 VNC로 연결하여 실행하여 풀어보니 별거 없더군요 –; 설치했던 서버는 PE2950이었습니다. 다행히 USB 메모리가 있어서 네트워크를 잡을수 있었습니다…  그때 RHEL4를 받아서 설치했었는데 유료사용자가 아니면 업그레이드가 안되더군요. 그래서 이번에는 RHEL 소스를 이용하여 바이너리 호환이 되는 CentOS (Community Enterprise OS) AMD64 버전을 받아서 설치했습니다.

서버 여러대 설치하느라 시간이 좀 남아서(DVD 한장만 궈서갔음) FreeBSD 6.2(AMD64)도 설치해봤는데 별 이상없이 깔리더군요. 근데 SC1435에 PS/2 포트가 없어서 USB포트로 키보드와 마우스를 연결(Y케이블 이용해서 PS/2 키보드와 마우스연결)했는데 뺐다가 끼면 키보드와 마우스가 인식이 안되더군요.. 관리편의상 동시에 들어오는 서버는 같은 OS를 설치하는게 편하기 때문에 다시 밀고 CentOS를 설치하고, 업데이트까지 무사히 마치고 왔습니다. 업데이트는 정말 편하더군요. (#yum update) 그리고 네트워크 드라이버도 추가 설치없이 바로 잡히더군요.

이제 CentOS(AMD64)에서 lighttpd와 친구들 설치 방법에 대해서 설명드릴께요^^

AMD64의 php는 fastcgi가 컴파일안되어 있어서 lighttpd와 php를 fastcgi와 연결하기 위해서 php를 컴파일했습니다.

# cd /opt
# wget http://isoredirect.centos.org/centos/4/os/SRPMS/php-4.3.9-3.15.src.rpm
# rpm -i php-4.3.9-3.15.src.rpm
# vi /usr/src/redhat/SPECS/php.spec

       –enable-force-cgi-redirect \
      앞줄에
       –enable-fastcgi \
      를 넣어줍니다.

# rpmbuild -bb php.spec

이때 필요한 패키지를 설치하고 해야할수도 있습니다. 오류에 뭐가 필요하다고 나옵니다.
  ( # yum update aspell-devel httpd-devel pcre-devel …)
컴파일 완료되면 /usr/src/redhat/RPMS/x86_64 (또는 i386)에 바이너리 rpm이 생깁니다.

컴파일후 원하는 패키지를 업데이트 합니다. 버전번호 때문에 업그레이드가 안되면 –force를 이용해서 강제로 업데이트하면 됩니다.

lighttpd는 src rpm을 받아서 컴파일 합니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpmbuild –rebuild lighttpd-1.3.15-1.src.rpm

xcache 역시 src rpm을 받아서 설치합니다.

# wget http://www.jasonlitka.com/media/files/SRPMS/php-xcache-1.2.0_0.2.src.rpm
# rpmbuild –rebuild php-xcache-1.2.0_0.2.src.rpm

rpm 바이너리 파일은 /usr/src/redhat/RPMS/x86_64 나 i386 등에 생깁니다. 적당히 원하는 패키지를 설치해주면 됩니다. 5대 서버에 설치하느라 한곳에서 컴파일하고 다음 스크립트를 이용하여 여러서버에 설치하였습니다.

#!/bin/sh
# install_lighttpd.sh

/usr/sbin/apachectl stop

rpm -ivh lighttpd-1.4.13-1.x86_64.rpm
rpm -Uvh –force php-4.3.9-3.15.x86_64.rpm php-devel-4.3.9-3.15.x86_64.rpm  php-pear-4.3.9-3.15.x86_64.rpm php-ldap-4.3.9-3.15.x86_64.rpm  php-mysql-4.3.9-3.15.x86_64.rpm
rpm -ivh php-xcache-4.3.9_1.2.0-0.2.x86_64.rpm

mkdir -p /etc/lighttpd
cp ./lighttpd.conf /etc/lighttpd
adduser -s /sbin/nologin www
/sbin/chkconfig httpd off
/sbin/chkconfig –add lighttpd
/sbin/chkconfig lighttpd on

touch /var/log/lighttpd.access.log
touch /var/log/lighttpd.error.log

chown www:www /var/log/lighttpd.access.log
chown www:www /var/log/lighttpd.error.log

/etc/init.d/lighttpd start

lighttpd.conf는 freebsd에서 사용하던걸 그대로 가져와서 server.event-handler 등 몇가지만 바꿨습니다. 주석등의 라인은 삭제했습니다.

# lighttpd.conf
server.modules              = (
                               “mod_redirect”,
                               “mod_alias”,
                               “mod_access”,
                              “mod_status”,
                              “mod_fastcgi”,
                              “mod_userdir”,
                               “mod_accesslog” )
server.document-root = “/var/www/html/”
accesslog.filename          = “/var/log/lighttpd.access.log”
server.errorlog             = “/var/log/lighttpd.error.log”
index-file.names            = ( “index.php”, “index.html”,
                               “index.htm”, “default.htm” )
server.event-handler = “linux-sysepoll”
mimetype.assign             = (
  생략…
)

userdir.path = “public_html”
url.access-deny             = ( “~”, “.inc” )
static-file.exclude-extensions = ( “.php”, “.pl”, “.fcgi” )
server.pid-file            = “/var/run/lighttpd.pid”
server.username            = “www”
server.groupname           = “www”
fastcgi.server              = ( “.php” =>
                               ( “localhost” =>
                                 (
                                  “socket” => “/tmp/php-fastcgi.socket”,
                                  “bin-path” => “/usr/bin/php”,
                                  “min-procs” => 1,
                                  “max-procs” => 2,
                                  “max-load-per-proc” => 4,
                                  “idle-timeout” => 10,
                                  “bin-environment” => ( “PHP_FCGI_CHILDREN” => “16”,
                                                         “PHP_FCGI_MAX_REQUESTS” => “2000” )
                                 )
                              )
                             )

server.max-fds = 4096

그리고 로그가 계속 쌓이지 않도록 /etc/logrotate.d/lighttpd 파일을 만들었습니다.

/var/log/lighttpd.*.log {
  rotate 30
  daily
  missingok
  notifempty
  compress
  sharedscripts
  postrotate
       touch /var/log/lighttpd.access.log
       touch /var/log/lighttpd.error.log
       chown www:www /var/log/lighttpd.access.log
       chown www:www /var/log/lighttpd.error.log
       /bin/kill -HUP `cat /var/run/lighttpd.pid 2>/dev/null` 2> /dev/null || true
  endscript
}

참고 URL:
http://www.cyberciti.biz/tips/redhat-enterprise-linux-lighttpd-fastcgi-php.html
http://www.jasonlitka.com/2006/12/20/php-caching-and-acceleration-with-xcache/

윈도우즈에서 OCaml 개발 환경 (tuareg)

예전엔 FreeBSD에서 vi로 작업했었는데, Lisp/Slime 환경에 친숙해지면서 OCaml에서도 비슷한 개발환경을 찾아보게 됐습니다. Emacs외에도 몇가지 통합개발환경이 있지만 저는 Emacs 위에서 돌아가는 tuareg mode를 받아서 설치했습니다. 저는 로컬 윈도우즈에서 Emacs를 사용하지만 유닉스에서도 동일하게 사용할수 있습니다. OCaml은 mingw 기반의 설치파일을 받아서 설치했습니다.

tuareg는 tuareg-mode-1.46.1.zip를 받아서 Emacs의 site-lisp에 압축을 풀었습니다. 그리고는 다음을 .emacs 파일에 추가해주었습니다.

[CODE type=lisp](add-to-list ‘load-path “c:/Progra~1/emacs/site-lisp/tuareg-mode-1.46.1”)
(setq auto-mode-alist (cons ‘(“\\.ml\\w?” . tuareg-mode) auto-mode-alist))
(autoload ‘tuareg-mode “tuareg” “Major mode for editing Caml code” t)
(autoload ‘camldebug “camldebug” “Run the Caml debugger” t)

(defvar tuareg-interactive-program “c:/Progra~1/Object~1/bin/ocaml”)
(defvar tuareg-library-path “c:/Program Files/Objective Caml/lib”)
[/HTML][/CODE]
tuareg-interactive-program 지정할때  Program Files와 Objective Caml등으로 넣으면 OCaml 실행이 안되더군요.. 위 사항을 적용하면 ml이나 mli 파일을 읽을때 tuareg-mode로 자동으로 넘어갑니다.

키는 Lisp/Slime과 많이 유사하지만, Slime보다는 제공하는것이 적네요. C는 Ctrl, M은 Alt(Meta)키 입니다.

  • C-x C-e, C-c C-e, C-M-x : 세가지 키조합 모두 현재 expression을 실행합니다. OCaml이 실행중이 아니면 실행합니다.
  • C-c C-b : 현재 버퍼(파일)을 실행합니다.
  • C-c C-c : make를 실행하는데 프로젝트에 맞는 Makefile이 있어야합니다.
  • C-M-p, C-M-n : (toplevel) expression 위아래로 이동.
  • C-c C-a : ml과 mli 사이를 왔다갔다 합니다. 아주 유용한 기능이네요.

또 Emacs메뉴에 Tuareg에 보면 여러가지 기능이 제공됩니다. Definition-Scan을 선택하면 현재 파일에서 모든 정의(type & value)를 정리해서 메뉴에 보여줍니다. 또 C-c . 으로 시작하는 명령들이 있는데, 많이 사용하는 구절들을 빠르게 입력할수 있게 도와줍니다. 한가지 아쉬운점은 completion 기능이 동작하지 않는데, 왜 그런지 아직 파악하지 못했습니다. 메뉴에 보면 관련 항목이 있는데, 활성화 되어있지 않습니다. 또한 키도 할당되어 있지 않습니다. 소스를 보면 C-c TAB( (define-key map [?\C-c ?\t] ‘tuareg-complete) 로 할당되어 있는데, 이 키는 Interrupt Caml Toplevel로 할당되어 보이고, M-x tuareg-complete로 호출해도 “Symbol’s function definition is void: caml-complete”라는 메시지만 출력됩니다.

좀더 연구 해봐야겠습니다…

XP에서 ClearType 폰트 사용.

ClearType폰트가 정확히 뭔지 몰랐었는데, 회사에서 만든 프로그램이 IE7에서 문제가 있다고 해서 설치해봤습니다. IE7에 대해서 안좋은 말을 많이 들었지만, 인터페이스 깔끔하고, 무겁지도 않고 첫 느낌은 좋네요. 그리고 설치하면서 폰트가 ClearType으로 바뀌었는데 영문 폰트가 많이 예뻐졌네요.

ClearType은 PDA에서 Acrobat Reader나 CHMReader에서 사용해보긴했었는데 어떤 원리인지 몰랐었습니다. 요즘은 궁금증이 생기면 항상 위키피디아에 가봅니다. 네이버도 가끔 가지만 설명이 그렇게 정돈되어있진않죠. 하여튼 내용을 보니 LCD 화면의 특성을 이용해서 사람의 눈에 가독성이 좀더 좋게 하는 기술이네요. LCD의 픽셀 하나가 일반적으로 RGB의 세개의 긴 세로 픽셀로 구성되어 있다고 하는데 글자를 출력할때 픽셀단위가 아니라 이렇게 세개로 나눠진 서브픽셀 단위로 화면에 그려준다고 합니다. 색은 정확히 출력되지 않지만, 사람 눈에는 더 자연스럽게 보인다고 하네요. 제 느낌도 확실히 부드럽게 보이네요.

XP에서 이 페이지로 가면 IE7과는 별개로 ClearType 폰트를 사용할수 있도록 변경할수 있습니다. XP에는 아쉽게도 한글 ClearType은 포함되어 있지 않으며, Vista에서는 한글 ClearType 폰트도 포함되어 있다고합니다. 또한, XP에서는 pivot한 상태의 LCD 모니터를 지원하지 않는다고 합니다. (피봇한 상태에서는 가로로 서브픽셀이 구성되므로 그리는 방법이 달라지겠죠.) PocketPC(PDA)와 Vista에서는 pivot을 지원한다고 하네요.

얼마전에 IDC에서 Linux를 설치했었는데 폰트가 영 아니여서 이상하다 했었는데 그게 ClearType 폰트였나봅니다. CRT 모니터에서는 어색해 보이더군요. freetype에서 지원하나봅니다.

BitTorrent에서 μTorrent 인수 했다고 하네요.

좀 의외의 소식인데, BitTorrent Inc.에서 μTorrent를 인수했다고 하네요. BitTorrent가 python으로 되어 있어서 리소스를 많이 차지하고, 하나의 클라이언트당 하나의 파일묶음 밖에 지원이 안됩니다. 그래서, 다른  여러 bittorrent 클라이언트를 깔아보고 정착한게 μTorrent입니다. 리소스도 적게 먹고 꼭 필요한 기능은 다 들어있어서 요즘도 잘 사용하고 있습니다.

μTorrent에서 앞쪽에 μ는 “뮤”로 읽거나 마이크로 정도로 읽어주면 될듯하고, 이름처럼 정말 가볐습니다. 1명의 개발자가 개발한 프로그램인데 아쉽게도 소스는 공개하지 않았습니다. 하지만 사용자 커뮤니티로부터의 의견을 열심히 들어서 지속적으로 좋아지고 있는것 같네요.

근데 왜 BitTorrent에서 μTorrent를 인수했는지 의문이 드네요. 가볍게 돌아가고, 잘 짜여진 소스가 탐난건지 사용자 커뮤니티를 노린건지… python이 embedded 장비에는 적합하지 않아서라는 생각도 드네요. 아마도  μTorrent는 C나 C++로 되어있겠죠. 하여튼 slashdot 댓글들을 보면 걱정하는 목소리가 많군요. BitTorrent가 RIAA나 MPAA 말을 어느정도 들어주기 때문에, μTorrent에 불법적인 자료를 필터링하는 기술이 들어갈거라는 얘기들이 있습니다.

저는 μTorrent 소스가 공개될지가 궁금하네요…

Firefox 2.0 & third-party cookie

Firefox 1.5 까지는 설정에서 third-party cookie를 사용하지 않도록 할수 있었는데, 2.0에서는 이 기능이 도구-설정에서 빠졌다고 하네요. about:config에서 설정이 가능하지만 바꿔야하는 설정값의 이름이 좀 상관없어 보이고, 설정하는것도 bool 값이 아닌 int 값입니다.
주소창에서 about:config를 치고, 필터에 cookieb까지 치면 항목이 하나 남습니다. network.cookie.cookieBehavior를 바꿔주면 됩니다. 디폴트 값이 0인데 더블클릭해서 1로 바꿔주면 third-party cookie를 허용안하도록 바뀝니다.

cookie는 웹서버와 웹브라우저간에 주고 받는 정보로 웹서버에서 임의의 정보를 웹브라우저쪽에 저장을 할수가 있습니다. 예를들면 사용자 로그인 정보, 장바구니 등이 저장됩니다. 웹서버와 웹브라우저가 연결을 유지하면 그 사용자가 누군인지 관리할수 있지만, 웹 프로토콜인 HTTP는 기본적으로 연결을 하고 있는 구조가 아닙니다. 그래서 가상의 세션을 유지하게 위해서 만들어진것이 쿠키라고 생각하면 됩니다. 쿠키는 웹서버가 웹브라우저쪽으로 정보를 저장하고, 다시 조회하는 형태지만, 클라이언트 측에서 악의적으로 쿠키를 변경하면, 로그인 없이 사이트에 접속이 가능할수 있는 가능성이 있죠. 그래서 웹서버에서 웹브라우저에서 쿠키를 변조 못하도록 신경을 써주지 않으면 보안 문제가 발생할수 있습니다. 웹브라우저에서는 사이트별로 쿠키가 저장되도록 하고, 어떤 사이트에서 해당 사이트의 쿠키만 조회하고 변경할수 있도록 하여, 보안 문제가 발생하는 걸 보호합니다.

그럼 third-party cookie가 무엇인지 설명드리겠습니다. 요즘은 웹이 광고로 도배되면서 광고이미지 등은 원래 웹사이트가 아닌 다른 서버(AD서버)에서 주로 가져옵니다. 이미지를 요청할때는 원래 웹사이트의 URL이 referer라는 값으로 전송됩니다. 그래서 AD서버에서 광고를 보는 사용자가 어떤곳을 보고 있는지 모두 저장할수 있습니다. 광고가 나온곳이 검색 사이트면 검색하는 단어들을 다 볼수 있는거죠. 그런데 이렇게 보는것 까지는 보는 사람이 누구인지 모르고 IP정도만 공개되기 때문에 문제가 아주 심각하지는 않습니다. IP는 그래도 가끔씩 바뀌는 정보니 개인의 신원이 바로 드러나지는 않죠. 근데 만약 AD 서버에서 쿠키를 내 PC에 저장할수 있다고 합시다. 그러면 AD 서버를 운영하는 사람은 IP보다 더 정확하게 사용자에 대한 정보를 모을수 있습니다. 만일이라도 광고를 보고 그 쪽 사이트에 개인정보를 입력하여 가입하면, 사용자와 사용자가 자주가는 웹사이트, 검색하는 단어들이 그대로 유출되는거죠. 이런 정보는 돈으로 충분히 거래될수 있는 정보죠.

IE에서는 third-party 쿠키를 사용못하게 하는 방법이 옵션으로 쉽게 설정되지는 않습니다. 근데 익스플로러에서 더 걱정되는건 요즘 많이 설치되는 툴바들과 플러그인들입니다. 대부분 툴바들이 주소에 따라서 부가적인 정보를 보여주거나 하는데 이게 가능하기 위해서는 사용자가 보고있는 사이트에 대한 정보가 유출된다는거죠. 많이 쓰는 구글툴바의 page rank도 사용자 라이센스에 보면 어떤 정보가 어떻게 사용되는지 자세히 설명되어 있습니다.

위 정보는 Security Now Podcast의 Listener Feedback Q&A #12에서 언급된 내용입니다.

Xming, putty 를 이용한 원격 X 프로그램 실행

꽤 오래전에 다니던 회사에서 eXceed를 이용했었는데 그 당시 회사에서 사용하던 피씨의 메모리는 64M였습니다. 로터스 노츠와 싱글(ㅎㅎ)을 띄우면 더이상 띄울수 있는 프로그램이 별로 없었습니다. (요즘은 싱글이 웹기반으로 바뀐거 같더군요..) 그 당시는 피씨용 오픈소스 엑스서버가 없었습니다. 메모리 사용량이 적은 Xmanager의 평가판을 사용하다가 사용기간이 지나서 프로그램을 번갈아가면서 어렵게 사용하던 기억이 납니다. Xmanager는 우리나라 회사에서 만든 좋은 프로그램이었는데 회사에서 eXceed 있다고 다시 구매를 못했었습니다.

지금 오픈소스 엑스서버를 찾아보니 cygwin기반으로 도는 Cygwin/X와 mingw(Minimalist GNU for Windows)로 별도 라이브러리 필요없는 Xming이 있더군요. 저는 Xming을 설치했습니다. 여기에서 Xming과 Xming-fonts를 받아서 설치했습니다. 설치는 간단하더군요. 설치후 엑스서버를 다시 시작해주고, ssh를 이용한 터널링으로 쉽고 안전한 방법으로 원격 서버해  연결하여 클라이언트 프로그램을 띄웠습니다.

putty 설정에서 “접속-SSH-터널링” 에서 “X11 포워딩 사용”을 선택하고 “X 디스플레이 위치”를 “localhost:0” 으로 설정하고 세션을 저장했습니다. 원격 서버에 연결하고, 로그인 후 xterm &을 실행하면 새 xterm이 윈도우즈 화면에 뜹니다. ^^. 단, 원격 서버의 sshd_config에서 X11Forwarding yes로 설정되어 있어야합니다.

원격 서버에서 DISPLAY 환경변수를 세팅하는 방법도 있지만, 안전하지도 않고 세팅하기도 힘듭니다. DISPLAY 환경변수를 이용한 방법은 모든 정보가 암호화 없이 그냥 갑니다. 또, 요즘 엑스서버는 디폴트로 localhost를 제외한 호스트에서는 연결을 받아들이지 않기 때문에 X0.hosts 등에 원격 서버를 등록해야합니다. 또한 PC가 방화벽 뒤나 공유기(NAT) 뒤에 있다면 더욱더 상황이 복잡해집니다.

엑스 서버를 얘기하면 서버와 클라이언트의 구분이 좀 애매해집니다. 원격 유닉스 서버가 엑스 클라이언트 역할을 하고, 로컬 윈도우즈 호스트가 엑스 서버 역할을 합니다. 윈도우즈에서 엑스 서버 프로그램이 뜨고, 원격 유닉스에서는 엑스 서버에 화면을 그려주도록 요청하는 클라이언트로 동작합니다.

엑스서버를 윈도우즈에 깔지 않고 서버의 그래픽하면 보는 방법으로 VNC를 이용한 방법도 있습니다. VNC가 나온지 꽤 되었는데, 예전에 비하면 많이 빨라졌더군요. vnc를 사용하면 세션이 관리가 되서 편해서텍스트의 screen과 비슷한 형태로 사용하고 있습니다. 그런데 제 컴퓨터에서만 문제가 되는지 모르겠지만, 키 입력을 빨리할때문자가 빠지거나 문자가 반복해서 찍힌다던지 하는 버그가 있는거 같습니다. 윈도우즈간 vnc에서는 못본 문제인거 같은데 문제가 왜발생하는지 좀더 연구해봐야겠습니다.

사실 저는 거의 텍스트 위주로 작업하기 때문에 꼭 필요할 경우만 X윈도우 프로그램을 띄웁니다. 엑스윈도우에서 직접 작업할때는 열심히 윈도우 메니저를 꾸면서 사용하지만, 윈도우즈에서 동시에 사용할때는 그냥 윈도우즈 화면과 동일하게 독립적으로 띄우는게 작업 효율면에서 더 효과적인거 같네요.

사용중인 Firefox Extension 소개

Firefox 2.0에서 사용중인 Extension을 소개합니다. Firefox에서 사용하는 용어가 좀 헷갈리네요. 부가기능(Add on) 밑에 확장기능(extension)과 테마가 있습니다.

All-in-One Gestures: 오페라에서 처음(?) 구현된 기능으로, 마우스 오른쪽 버튼을 누른채로 왼쪽으로 하면 뒤로, 오른쪽으로 하면 앞으로, 위로하면 새탭, L자를 쓰면 닫기. 마우스를 멀리 움직이지 않고 마우스만으로 여러 동작을 쉽게 할수 있습니다. 한번 사용하면 없으면 무지 불편해요. 오페라에서 많이 사용해서 마우스 동작을 약간 바꿔서 사용하고 있습니다.

Tab Catalog: 열려있는 탭을 빠르게 이동할수 있는 기능을 제공합니다. 특히 썸네일기능으로 작은 화면을 미리 보고 고를수 있는 기능을 제공합니다. 오른쪽 마우스를 누른 상태에서 마우스 중간버튼을 스크롤하면 탭을 고를수 있는 기능(이것도 역시 오페라에서 지원)을 제공합니다.

IE Tab: 우리 나라에서는 아직 Internet Explorer에서만 제대로 보이는 페이지들이 많기 때문에 이걸 설치한 상태에서 상태창의 오른쪽의 firefox아이콘을 클릭해주면 이게 ie 아이콘으로 바뀌면서 페이지도 IE로 랜더링 해줍니다. 단 IE로 랜더링된 화면에서는 firefox의 많은 기능들이 동작안합니다.

ScrapBook: 페이지를 내컴퓨터에 저장하고 밑줄 긋고, 형관펜으로 선택하고, 편집할수 있는 기능을 제공합니다. 책에 공부할때 표시하기 좋아하는 사람에게는 딱입니다. 저는 책을 깨끗하게 보는 편(!)이기 때문에 어디까지 공부했는지와 잘 모르는 부분만 대충 표시해둡니다. 페이지 상세 캡쳐 기능을 사용하면 전체 사이트를 긁어올수도 있습니다.

Internote: 임의의 페이지에 포스트잇 노트를 붙일수 있습니다. 크기와 색상 조정이 가능합니다.

NoScript: Javascript 실행을 사이트별로 제한할수 있습니다.

JSView: 현재 페이지에서 사용된 javascript, css 등을 파일별로 보여줍니다.

Web Developer: 웹개발자에게 유용합니다. 자잘한 여러가지 기능을 제공하며, 도구-Web Developer에 메뉴가 쫙! 생깁니다.

StumbleUpon: IE에서 사용하던 플러그인이라 설치했습니다. stumbleupon.com에 가입을 해야 동작하고, 개인별로 사이트를 추천해주는 서비스입니다. 처음에는 아무 사이트나 소개해주고 마음에 들면 “i like it”을 선택하면 그 후로는 비슷한 페이지를 소개해줍니다. 웹서핑하다 새로운걸 만나고 싶을때 가끔씩 눌러줍니다. 이걸 통해서 좋은 정보들을 꽤 건졌습니다.

Unison을 이용한 로컬 백업

Objective Caml에 평소에 관심이 많다보니, O’Caml로 짠 유명한(?) 프로그램도 관심있게 지켜보고 있습니다. mldonkeyunison이 그래도 많이 쓰이는 프로그램인 거 같은데, mldonkey는 아직 사용은 못해봤고, Unison은 전에 설치는 해봤는데 사용은 제대로 못했었습니다. mldonkey는 외국에서 많이 사용하는 P2P 프로토콜(edonkey, fasttrack, bittorrent, gnutella, dc…)을 모두 지원하는 텍스트 기반 P2P 프로그램입니다. Unison은 두 디렉토리들을 동기화시켜주는 유틸리티입니다. 버전 관리툴하고 유사하긴 하지만 버전을 관리해주지는 않고 양쪽 디렉토리에서 변경되는 부분을 양방향으로 동기화 해줍니다. 주로 원격 컴퓨터간 동기화하기 위해 만들어진것 같지만 한 컴퓨터 내에서도 아주 잘 동작합니다. 원격 컴퓨터간 동기화 할때는 ssh, rsh와 unison 자체 프로토콜 등을 지원합니다.

회사의 모든 소스는 버전관리툴로 관리합니다. 하지만, 집에서 사용중인 많은 개인 파일들을 따로 등록해서 관리하기는 용량도 좀 크고, CD나 DVD로 백업하기도 귀찮더군요. 백업 하드디스크 따로 사서 가끔씩 중요한 폴더들을 그대로 복사하다가 시간도 오래 걸리고, 까먹고 해서 백업 툴들을 찾아봤었는데, 괜찮은것들은 대부분 쉐어웨어더군요. 음악을 취미로 하다보니 녹음한번 하면 꽤 용량이 됩니다. 그리고 새로 업데이트된 폴더들을 찾아서 복사해주는것도 일이더군요. 전체 다 복사하면 너무 오래걸리고요…

Unison은 알고있었는데 원격 동기화 프로그램으로만 생각해서 로컬 백업에 적합하다고 생각을 못했었습니다. 사용해보니, 사용방법도 간단하고 한번 세팅해두니 매일 새벽 자동으로 백업이 됩니다. ^^

unison win32 바이너리unison-2.13.16-win-text.exe를 받았습니다. 유닉스하고 버전을 맞추기 위해서 stable 버전을 받았습니다. 그래픽 버전은 GTK도 설치해야하고 백업은 사용자 인터액션 없이 자동으로 실행되는게 편하다고 생각하여 텍스트 버전으로 받았습니다. 적당한 디렉토리에 복사하고 커맨드창에서 다음을 실행하면 됩니다. 실행 파일명은 간단하게 바꿨습니다. 백업 디렉토리 f:\backup\music은 미리 만들었습니다.

unison.exe -batch -fastcheck true c:\music f:\backup\music

-batch 옵션은 실행도중에 디폴트로 자동응답하도록 하며, -fastcheck true는 양쪽 파일들을 비교할때 전체 파일에 대한 해시(핑거프린트)를 바로 하지 않고, 변경날짜 등으로 비교한후 틀린 파일들에 대해서 해시비교한다고 합니다. -fastcheck true 옵션을 주지 않고 대용량 디렉토리를 하면 무지 느립니다! 그리고, 처음 실행할때는 원래 느립니다. (모든 파일에 대해서 해시하는거 같네요.)

하지만 위에 처럼 실행하면 양쪽 디렉토리를 동기화해주기 때문에 backup 디렉토리에서 파일을 삭제하면 원본에서도 지워집니다. 그래서 한방향으로만 씽크해주는 옵션이 있습니다.
-force ROOTDIR로 어느쪽이 원본인지를 알려주면 됩니다.

unison.exe -batch -fastcheck true -force c:\music c:\music f:\backup\music

백업을 원하는 디렉토리 백업하는 batch 파일을 위에처럼 만들어주고, “시작-프로그램-보조프로그램-시스템도구-예약된작업” 에 등록시켜서 매일 새벽에 실행시켜주면 백업 걱정 끝입니다. 물론 가끔씩 DVD나 네트워크 백업을 해주는게 더 안전하겠죠.

백업을 열심히 하는 편인데… CD도 믿을만한 매체는 못되는거 같더군요. 전에 백업해 둔 CD를 못읽어서 6개월 정도의 데이타를 날린적이 있습니다. TT

날개셋 한글 입력기(IME)와 세벌식

저는 세벌식 사용자입니다. 두벌식은 독수리 타법으로만 잠깐 치다가 처음 배울때부터 세벌식을 배워서 두벌식에 비해서 어떤점들이 좋은지 직접 체험하지는 못했습니다. 92년도에 대학교에 처음들어가서 선배들중에 한글문화원에서 준 세벌식 스티커를 나눠주시며 세벌식에 대해 알려주신 분들이 있었습니다. 그래서 전 아예 세벌식부터 배웠고, 형컴퓨터에 스티커를 붙일수도 없어서 그냥 타자 프로그램을 통해서 배우면서 외우게 됐죠. 그때 배웠던게 세벌식390 자판이였습니다. 세벌식 관련한 링크를 발견하고 인터넷 서핑하다가 윈도우즈의 기본 IME를 바꿀수 있는 날개셋이라는 한글 입력기를 발견하고 현재 설치해서 사용중입니다.

나라셋 한글 입력기 프로그램은 여기에서 받을수 있으며, 더불어 입력기와는 별도로 즐길수(?) 있는 타자연습 프로그램인 날개셋 타자연습도 있습니다. 개발자가 한글과 오토마타에 관심이 많아서 여러가지 자판과 입력 방법을 제공하고 있습니다. 다른건 잘 모르겠지만 세벌식 모아치기는 정말 유용한거 같습니다. 세벌식은 초성,중성,종성이 따로 있어서 하나의 글자를 세개의 키를 눌러 동시에 입력가능하고, 순서가 약간 틀리더라도 제대로 조합이 되니 빨리치는데 도움이 될것 갈네요.

이번 기회에 세벌식 390에서 세벌식 최종으로 바꾸는것을 고려해봐야겠습니다. 390에 비해서 어떤점이 좋은지는 모르겠지만 자판이 꽤 차이가 나네요. ()의 위치는 좀 깨네요. 주로 프로그램을 짜다보니 영어만 많이 치지만 QWERTY 자판은 사용한지 너무 오래되서 DVORAK 자판으로의 전환은 쉽지않을듯하네요.

날개셋 한글 입력기… 한가지 아쉬운 점은 소스 공개가 안된거 같네요…

Unit Test의 조건

몇일전에 들었던 podcast를 다시 들으며 언급했던 내용들을 찾아봤습니다. agile toolkit podcast에서 최근에 올라온 Psychology of Build Times에서 언급된 내용입니다.

현재 Unit Test 제대로 적용한 프로젝트를 못했었는데 이미 프로젝트 시작한지도 오래된것도 있고, 모두 네트워크와 디비 연결 같은것이 있어서 어떻게 유닛 테스트를 작성해야 할지 막막하더군요. 라이브러리화 된 몇개의 소스 파일들만 유닛 테스트 코드가 조금 들어있을뿐입니다. 특별한 유닛테스트 라이브러리를 쓴것도 아니고 그냥 ifdef 입니다. –;

podcast를 듣고, Michael Feathers의 A Set of Unit Testing Rules를 읽어보니 유닛테스트로 어떤 정도를 테스트하는지 좀더 감이 오는거 같습니다. 유닛테스팅하는데 걸리는 시간이 길어지면 개발자들이 잘 하지 않고, 하더라도 기다리다 딴일하게 된다는군요. 그래서 10초 이내로 모든 유닛테스트가 되게하고, 오래걸리는 테스트는 따로 분류해서 유닛테스팅에서 구별해 내라고 하네요. 다음은 블로글 글에서 나온 유닛 테스트의 조건입니다.

1. 디비와 연결하지 말것
2. 네트워크를 통한 통신이 없을것
3. 파일시스템에 손데지 말것
4. 다른 유닛테스트와 의존성이 없을것 (독립적으로 테스트 가능)
5. 설정파일을 만드는 등의 별도의 환경설정이 필요하지 않을것

다시 cppunit을 적용해보도록 노력해봐야겠네요.