한글 PuTTY 주요 기능 업스트림

그동안 3년정도 관리해 왔던 한글 PuTTY를 이제 관리하기도 귀찮고, 업데이트도 자주 올라오고 해서 이제 주요 기능을 그냥 다 업스트림 패치를 만들어서 올려버리고 그만둘까 생각을 하게 되었습니다. 🙂

우선, 현재 한글 PuTTY의 주요 변경점을 보면,

  • 한글 위에 커서가 올라가는 경우 커서 크기를 키움
  • 한글 입력 도중에 입력창이 별도로 뜨지 않고 현재 위치에서 입력
  • 환경 설정창이 한글로 나옴
  • 한글 윈도우 98에서 입력이 전혀 안 되는 문제점 수정

정도가 들어가 있습니다.

여기서 커서 크기가 늘어나는 것은 Hung-Te Lin이라는 사람이 업스트림한 패치가 3월말에 들어가서, 이제 PuTTY에서 별도의 패치 없이도 커서 크기가 자동으로 한글 위에서 늘어나게 되어서 다행히도 이제 한글 PuTTY에서 패치를 안 해도 되게 되었습니다. 🙂

그 다음, 입력창을 안 띄우는 것은 사실 IME을 쓰는 곳 중에서 창이 걸리적거리는 곳은 거의 한국어가 유일하기 때문에, 아무래도 직접 패치를 할 수 밖에 없었는데, 지난 번에 좀 삽질해서 패치한 위치를 출력단에서 터미널단으로 옮긴 덕분에, 업스트림 패치를 비교적 단시간에 만들 수 있었습니다. 🙂

한글로 나오는 설정창과 윈98 문제는 현재 업스트림이 가능할 만한 것들이 아니기 때문에, 우선은 업스트림에서는 빼고, PuTTY를 선택적으로 gettext와 빌드할 수 있도록 하는 것을 넣어서 그것을 통해서 넣는 게 나을 것 같네요. 그래서 일단은 차후로~

그래서 일단 업스트림할 것은 제자리 입력 패치 (이른바 onthespot 패치)인데, 패치는 오픈룩에도 올려 두었습니다. 곧 들어가게 되면 이제 한글 PuTTY 다운 받지 말고 그냥 오리지날을~ 🙂

서울 지하철 모듈

IRC 봇 SugarCube의 주요 플러그인 중의 하나였던 지하철 플러그인이 최근에 정보 싸이트로 쓰고 있던 WebSubway가 개편을 하는 바람에 안 돌아가게 돼 버렸습니다. 한동안 고치기 귀찮아~~~을 외치며 우어우어 거리고 있다가, 휴가 중 짬을 내어 봇에서 따로 쓸 수도 있게 그냥 일반화 클래스를 만들어버렸습니다.

사용법은 대충 이런식..

흐흐 일단 SugarCube에 적용해 놓았는데, 다른데 msnm 봇이나 웹사이트 같은 데 활용하실 분들은 마음껏 사용하세용~ (라이선스는 libpng/zlib 라이선스) 소스는 OpenLook Trac에서 받으실 수 있고, 소스코드 문서도 있습니다. (크크~)

모든 것이 새롭다 – rrdtool 1.2

압도적인 인기의 오픈소스 라운드 로빈 데이터베이스인
RRDTool이 1.2가 릴리스 되었습니다. 그동안의 버전이었던
1.0에서 상당히 오래 머물러 있었는데, 갑자기 1.2로 올라오고
나서는 요새 유행하는 모든 것이 새롭다 스타일이군용~ 쿠쿠~

  • 베이스 그래픽 라이브러리가 바뀌었습니다. 원래 gd 라이브러리를 사용했었기에, 국제화에 한계가 있었으며 비트맵 그래픽만 가능했었지만, 이제는 기반 라이브러리가 libart로 바뀌고, freetype으로 폰트 렌더링을 하기 때문에, 이제 anti-alias 벡터 그래픽이 가능해졌고, 트루타입 폰트 (한글도 가능!)도 지원됩니다. 와와!
  • 새로운 출력 포맷: 이제 기존 포맷 외에도 SVG, PDF, EPS가 지원됩니다.
  • VDEF 지원: 기존에 CDEF와 DEF와 LINE등을 써서는 최대값이나 평균값 같은 것을 무척 단순하게 밖에 표현할 수가 없었는데, 이제 VDEF로 그래프 전역에 있는 다른 값들을 다룰 수가 있게 되었습니다.
  • 예상값 밖으로 튀는 것 검사: Holt-Winters Forecasting 라는 것을 사용해서, 이제 원래 진행되던 것 외로 데이터가 튀는 것에 대해서 표시를 할 수 있게 되었습니다.
  • COMPUTE 데이터 타입: 이제 로깅 남길 때 데이터 타입을 지정해서 로그를 남길 때 미리 계산해서 RRD에 넣을 수 있게 되었습니다.
  • 외부 라이브러리 별도 배포: rrdtool에서는 그동안 gd라이브러리, png, jpg같이 외부 라이브러리들을 모두 소스에도 같이 묶고 static 링크를 하는 방식으로 배포하고 있었는데, 동적 라이브러리를 최대 활용하는 최근 트렌드에 맞춰서 이제 모두 외부 소스를 쓰며, 동적 링크를 하게 되었습니다. 그래서, 이제 컴파일하기가 간단하지가 않습니다. 으흐흐 -ㅇ-; 포트 없으면 이제 컴파일도 못하겠 -.,-;
  • mmap 지원: 이제 파일 I/O를 할 때 mmap을 씁니다. mmap은 lazy on-demand I/O를 하다보니 아무래도 rrd 파일을 관리할 때 좀 더 시간을 절약할 수도 있을 것 같군요.

rrdtool 1.2로 만든 anti-alias 이미지

한편, 마티즈같이 바뀌지 않은 것이 하나 있는데.. 바로 이것! 🙂

그런데, 오늘 어떤 사람이 py-rrdtool을 rrdtool 안에 넣으려고 Oetiker씨와 얘기를 하고 있다고 라이선스에 대해서 저에게 문의를 해 왔는데, 잘 되면 다음 1.2버전 부터는 rrdtool만 깔면 파이썬에서도 쓸 수 있게 되겠군용.~

coreblog 트랙백을 똑똑하게 받자

어제 뽀빠이님께서 보내주신 트랙백이 장렬하게 깨져서 한참 보였었는데, 그 부분을 수정하기 위해서 코드를 좀 들여다 봤습니다. 이 부분은 아주 유명한 프로토콜 디자인 상의 오류인 트랙백의 인코딩 문제로 인해서 발생합니다. 아시다시피 트랙백을 전송하는 HTTP GET 리퀘스트에는 특별히 인코딩을 쓸 수 있는 방법이 없는데, URI/URL의 원초적인 한계성으로 인해서 HTTP GET에는 뭐가 들어오던 간에, 인코딩 이름을 직접 주지 않고서는 뭐 해결할 방법이 전혀 없는.. 참으로 답답한 경우 중의 하나입니다. 으흐~ (이 부분은 트랙백의 기반 표준을 IRI로 바꿔버리면 해결되긴 합니다.)

그래서, 결국은 아직까지는 euc-kr인가 utf-8인가를 구분하기 위해서는 그냥 디코딩해 보는 방법 외에는 딱히 방법이 없는데, 많은 블로그 소프트웨어들이 이런 경우는 고려하지 않고 작성되어 있어서~ ~ 코어블로그도 마찬가지라서.. 그냥 깨져버리고 말았네요.. 흐.. 그래서 일단은 우선 긴급 상황을 패치하기 위해 양쪽 다 시도하는 코드를 우겨넣어 보았습니다. 주말에 환경 설정에서 읽도록 바꿔야겠네요.. 🙂

mono의 한국어 DateTimeFormatInfo

FreeBSD에서 mono가 여전히 잘 안되는 부분이 많기에.. 고치기도 힘들고 해서 깔아놓고는 별로 안 쓰고 있었는데, 창우옹께서 날짜가 이상하게 나오는 문제가 있다기에, 주말에 날씨도 화창한데 집에서 문제를 고쳐 봤습니다.

우선, 문제는 System.DateTime.ToShortTimeString()의 결과가 “오 5:12″같이 오전/오후가 표시가 안 되는 생뚱맞은 것이었는데, MS.NET CLR에서는 “오후 5:12″로 제대로 나왔는데, mono에서만 짤려서 나오는 것이었습니다. 그래서 무슨 문제인지 추적을 해 봤는데.. 역시 구조는 여기 저기 많이 거친거라.. 한참을 “그건 우리 담당이 아니니 다른 데 가서 알아보세요”를 겪고 찾아버렸습니다. 으흐.

  • 일단은 corlib의 System.DateTime 클래스: 여기서는 ShortTimeString 메쏘드가 ToString 메쏘드를 호출하고, ToString에서는 내부적인 다른 메쏘드에서 System.Globalization.DateTimeFormatInfo 클래스의 ShortTimePattern을 참조하고 있었습니다.
  • System.Globalization.DateTimeFormatInfo을 보니까, 별다른 내용은 없고, 그냥 다른 곳에서 construct해 준 값을 그냥 단순히 받아만 주는 것 같아서, 다시 System.DateTime으로~
  • System.DateTime 구현을 자세히 보니까 System.Globalization.CultureInfo 클래스의 인스턴스를 가져오도록 되어있었는데, 그놈이 TLS에 저장되는 전역 인스턴스를 가져오도록 되어있었습니다. 그런데, 데이터를 로딩하는 부분은 construct_datetimeformat_info()라는 정의되지도 않은 메쏘드를 쓰고 있었는데, [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern void 라는 데코레이트 되는 타입으로 되어있어서, 아 이게 뭔가 하고 한참을 고민했습니다. ;;
  • 결국 mono 소스 전체에서 저 메쏘드 이름을 grep해 보니까, 와와! monoruntime의 mono/mono/metadata/locale.c에서 C함수를 그 메쏘드로 매핑하고 있었던 것.. 자세히 보니까 culture-info-table.h라는 자동 제너레이트된 파일에 datetime 포맷이 기록되어 있었습니다. 근데 그놈은 또 다른 프로그램이 만든 것;
  • 휴.. 결국은 목적지에 도착! mono/tools/locale-builder라고 하는 C#으로 작성된 프로그램이 locale과 culture관련 XML파일들을 모아서 monoruntime의 C 헤더파일로 변환을 해 주고 있었습니다. mono에서는 ICU의 데이터들을 그대로 쓰고 있는데, ICU LDML와 CLI의 포맷이 다른 점을 supp/ 디렉터리 아래의 xml 파일들로 오버라이드하고 있는 바로 그 부분에서 잘못된 포맷이 있었던 것! 그래서 잽싸게 쓱싹 수정해서..
  • 버그를 질렀습니다. 으흐.. 버그질라는 왜이리 복잡하지~

그런데, 이번에 이 작업을 하면서, mono의 System.Globalization 지원 부분의 내부 구조를 잘 알게 되었는데, 생각보다는 역시 디자인이 괜찮은 것이, 파이썬에도 CultureInfo같은 것을 하나 만들어 넣고 싶어졌습니다. 지금 있는 locale 모듈은 시스템 의존적이라, 안 되는게 너무 많아서.. 으흐.. 그런데, 구글에서 찾아보니 Zope X3의 zope.i18n 쪽에서 ICU를 기반으로 한 국제화 지원이 들어가고 있었는데, 아직 구체적으로는 안 봤지만 뭔가 기대가 됩니다!

fastcgi에서 php를 chroot 안에서 구축하기

오늘부터 OpenLook은 새로운 서버에서 돌아가게 되었습니다. 옵테론 242 듀얼이라 무지 빨라졌지요~ (사실 별로 돌아가는 게 없어서 그다지 체감 속도는;;) 이번에 옮기는 김에, 기존에 쓰던 아파치에서 lighttpd로 바꿨습니다. 요새 lighttpd가 워낙 인기가 있어서, 한번 도전을 해 봤는데, 환경 설정이나 속도나 소모되는 자원이나 여러모로 아주 마음에 듭니다. 🙂

OpenLook서버에서 돌아가고 있는 웹 사이트 중에 동아리 홈페이지와 파이썬마을이 php를 쓰고 있기 때문에, php를 설정하는 방법을 고심하다가, 심심하면 터지는 php 애플리케이션의 보안 버그에도 좀 대비를 하고자 각각의 php 사이트를 별도의 fastcgi 프로세스로 분리를 해서 setuid/chroot 해버리기로 마음을 먹었습니다. 그래서, lighttpd에서 기본으로 제공해 주는 spawn-fcgi 유틸리티를 이용해서 일단은 만들어 봤는데, spawn-fcgi는 소켓을 만든 다음에, setuid, setgid, chroot를 한 다음에 php를 띄우는 순서로 하다보니, php바이너리는 물론이고 관련 라이브러리까지 모두 chroot 디렉토리 안에 넣어야 제대로 돌아가는 문제점이 있었습니다.

그래서, 아무래도 원하는대로 하려면, chroot를 하기 전에 php의 초기화를 모두 끝내고 나서 chroot를 해줘야하기 때문에, 알고보면 spawn-fcgi에서는 아무리 별짓을 해 봐야, 방법이 없고, 결국은 php 내부에서 해결을 해야 하는 문제로 판단이 됐습니다.

그래서 결국은 패치를 만들었습니다. 으흐.. php-cgi-sapi는 fastcgi와 cgi를 동시에 지원하느라 코드가 상당히 지저분하긴 했지만서도;; 하여간 패치하고 나니까, pear를 사용하지 않는 대부분의 php 프로그램들은 그럭저럭 잘 돌아가는 것이, 제로보드를 돌려도 안전할 것 같은 느낌이 드는군요 -ㅇ-;; 가급적이면 명령행 옵션으로 만들어서 메인스트림에 올렸으면 좋았을텐데, 명령행옵션이 이미 너무 많이 들어가있어서, 옵션들을 더 넣을라니 알파벳도 마땅찮고 –; 그래서 결국은 그냥 환경변수로 그냥 혼자 쓰는 패치로;; 으흐~ 포트 유저는 패치를 /usr/ports/lang/php5/files에 넣으시고 www/php5-cgi를 WITH_FASTCGI=yes옵션을 주고 깔으시면 됩니다~!

명랑하고 발랄하고 경쾌한 lighttpd 세상으로 오세요~ -O-

간단한 국어사전

#gentoo의 바둥옹이 웹 아닌 국어사전 없냐고 물어보셔서.. 원론적으로 말 그대로 해석해서 하나 만들어 봤습니다.

function kdic { w3m -dump ‘http://kr.dic.yahoo.com/search/kor/search.html?p=’$1 | awk ‘BEGIN {d=0;} /검색결과/ {d=1;} /브라우저에/ {d=0;} { if(d) print $0; };’ | less }

흐흐흐.. zsh사용자는 위에 대로 쓰시면 되고, bash 사용자는 {뒤와 } 앞에 다른 줄로 띄어 줘야합니다. 이렇게..

function kdic {
w3m -dump ‘http://kr.dic.yahoo.com/search/kor/search.html?p=’$1 | awk ‘BEGIN {d=0;} /검색결과/ {d=1;} /브라우저에/ {d=0;} { if(d) print $0; };’ | less
}

UTF-8 터미널 사용자는 $1을 echo $1|iconv -f utf-8 -t euc-kr로.. 결과는 이렇게 나옵니다.

흐흐.. 자꾸 한줄 쓰고 그러면 토끼군처럼 되는데.. =3=3

한글 PuTTY 0.57 릴리스

exman님의 결혼을 축하드리는 기념으로 한글 PuTTY 0.57을 방금 릴리스 했습니다. -O-;

작년 10월쯤에 발표된 PuTTY 보안 버그패치도 적용하지 않고 있었는데, 2월에 또 하나 더 나와서 좀 더 버티기는 무리라고 생각하고.. 흐흐; 이번에 겉으로는 이런 것들이 바뀌었습니다.

  • IPv6 지원이 들어갔습니다.
  • 포워딩 같은 용도로 사용하기 위해 셸이나 명령어 실행 안하기 모드가 추가되었습니다.
  • 여러개의 SSH관련 보안 버그가 수정되었습니다.
  • 접속이 끊긴 창에서 새 창을 안 띄우고 그자리에서 다시 접속할 수 있게 되었습니다.
  • SOCKS 5 프락시를 위한 CHAP인증 기능이 추가되었습니다.
  • X포워딩과 리모트 포트 포워딩에 관련된 여러가지 버그들이 수정되었습니다.

늘 그랬듯이 이번에 외부적으로 크게 변한 것은 없는 반면에, 내부적으로 소스 코드에서는 상당히 많이 바뀌었는데, 특히 그동안 주 코드에 붙어 있었던 win32 지원 코드가 모두 windows/ 하위 디렉토리로 내려가는 바람에 이제 소스 레이아웃에서도 멀티 플랫폼의 냄새가 납니다. 🙂 그리고, 터미널 제어 코드들이 성능을 위해서 여기저기 많이 고쳐놔서, 성능이 나쁜 컴퓨터에서도 스크롤 속도가 그다지 느리지 않을 듯 합니다. 덕분에 기존에는 대충 근처만 invalidate하면 새로 그려져서 커서 패치가 쉬웠는데, 이번엔 정확하게 커서 위치를 맞춰서 그려야 제대로 그려지는 바람에, 한 이틀밤을 디버거 들고 씨름했네요.. 흐흐;; (바보~) ㅠ.ㅠ

특히 작년 초부터 시작된 PuTTY의 전역변수 제거 작업은 이제 어느 정도 단계까지 진행되어서, 터미널과 접속 관련된 대부분의 변수가 전역변수에서 벗어났고, 설정과 관련된 일부 변수들만 전역으로 남아있어서, SDI 인터페이스로 감싼다던지 하는 것도 쉽게 될 것처럼 보입니다.

그럼, PuTTY와 함께 즐거운 작업~ (;;)

자바스크립트에서 다른 프레임의 함수 호출하기

고객의 꿈을 실현하려는 도중에.. (.. 우어~) 자바스크립트로 도배가 되어 있는 웹 화면에서 숨은 프레임을 통해 서버와 통신해서 숨은 프레임이 또 상위 프레임을 제어해야 할 일이 생겼습니다. 양쪽에 모두 코딩을 하자니, 몇가지 전역변수에도 접근을 해야하기에 js를 양쪽에 모두 포함하기도 그렇고.. 여러모로 딱히 대책이 없어서 한참을 고민 끝에 하나 해결책을 만들었습니다. -O-

므흐흐.. 빈 구멍에 input 태그를 하나 넣고 거기서 onclick을 통해서 호출을~ 아아.. 깔끔하게 document.getScriptFunction 뭐 이런 것 있으면 참 좋을텐데 말이죠.

공중 무선랜 공짜로 쓰기

무선랜 서비스 AP가 요즘 지나다니다보면 정말 많이 잡힙니다. -o- 아 이거 등록을 해서 쓰기는 또 너무 쓸 일이 없고.. 가끔가다가 한번 쓰면 정말 좋은데.. 하고 참 아쉬운데, 언젠가 미국의 어느 호텔에서 IETF 회의가 있었을 때 IP over DNS 같은 ㅂㅌ 프로토콜들이 마구 만들어져서 단체로 돈을 안 내고 인터넷 했다는 얘기가 생각나서 해 봤습니다. 므흐흐

원리

원래 무선랜은 이런 과정을 통해서 접속하도록 되어 있습니다.

  • 서플리컨트(고객측 기계)가 AP를 스캔한 뒤에 접속할 AP에 접속(Associate)요청.

  • AP가 서플리컨트에 EAP-Start 보냄.

  • 서플리컨트가 원하는 인증 프로토콜과 껍데기 ID를 적어서 EAP-Response를 보냄.

  • AP가 받은 EAP-Response를 AAA(인증/과금서버)에 전송해서 답을 서플리컨트로 전송.

  • 인증이 완전히 끝날 때까지 3-4를 반복. (EAP-MD5는 2회, EAP-TLS류는 8~10회)

  • AAA측에서 EAP-Success가 오면 서플리컨트에 EAP-Success를 보내주고, 접속을 완전히 열어 줌.

  • 서플리컨트가 DHCP요청.

  • 정식으로 라우팅돼서 해당 망을 담당한 DHCP 서버가 IP 할당.

  • 끝.

  • 그런데, 우리나라 무선랜 서비스들은 사용자 가입 페이지를 보여주게 하기 위해서 자동 접속하게 하는 편법을 이용하느라 이런 방식으로 되어 있습니다.

  • 서플리컨트가 AP에 접속 요청.

  • AP는 가인증 상태로 서플리컨트의 접속을 열어 줌.

  • 서플리컨트가 DHCP서버에 IP 할당 요청.

  • DHCP서버에서 IP 할당.

  • CM(접속관리자)를 띄워서 AAA와 EAP 인증을 함. (물론 중간에 AP는 거침.)

  • AAA에서 EAP-Success를 보내주면 중간에 막아 놨던 포트들을 모두 열어 줌.

  • 끝.

  • 여기서 바로 문제가 되는 것은, 완전히 인증도 되기 전에 IP를 주고, CM 다운로드나 가입 신청 페이지같은 것을 제공해 주기 위해서, 몇몇 포트를 열어준다는 것인데, 국산 AP들은 대부분 53 udp, tcp를 그냥 열어버리고 80번은 투명 프락시로 어떤 호스트에 접속하던 ISP의 가입 페이지로 리다이렉트하도록 하고 있습니다. 여기서 바로 53번 포트가 열려 있다는 점에 주목! +_+

    응용

    53번 포트가 열려있으니 이제는 뭐 거기로 나가는 방법만! 우선 제일 세팅이 간단한 방법은 sshd를 53번 포트에 열어서 쓰는 방법.ssh -p 53 -L 8080:127.0.0.1:8080 대상호스트이런 식으로 하면 로컬 호스트의 8080번 포트가 sshd가 띄워져 있는 서버측의 8080로 포워딩되기 때문에, 서버측에 HTTP 프락시가 띄워져 있다면 웹도 다 쓸 수 있게 됩니다. 물론 좀 다르게 응용해서 53번 포트에 VNC나 rdesktop을 띄워놓는 방법도 있겠고.. 아예 L2TP를 어떻게 엮어버리면 완전히 VPN 터널로 응용도 가능하겠죠. 믓흥;

    현실적인 한계현실적으로는 53번 TCP 포트에 뭔가 터널에 응용할 수 있을만한 서버를 띄울 수 있는 사람을 대상이 제한됩니다. 따라서, 거의 대부분의 일반인은 사용할 수가 없고, 자기 서버를 갖고 있고, DNS 서비스를 안 하고 있는 경우에만 이런 방법이 사용이 가능하겠죠.

    해결책

    이런 방법을 막기 위해서는 53번을 모두 열어버리는 것이 아니라, AP의 기본 설정 DNS로 리다이렉트해버리는 방법을 접속을 허용하기 전에 사용해야 합니다. 그렇게 되면 53번을 아무리 열심히 시도를 해도 결국은 ISP측 네임 서버로 갈 것이기 때문에 딱히 방법이 없어집니다..:)