뭘 이런걸..

Posted
Filed under Tech/프로그래밍
요즘 다시 IP 를 가지고 할 일이 생겨, 간만에 KRISP 2.0.0을 업데이트 했습니다. 딱히 성능이 좋아졌다거나 무언가 변화가 되었다기 보다는, GeoIP 를 가지고 일을 하다보니, GeoIP extension 이 추가될 경우 (상용..) 이를 활용할 수 있도록 지원을 해 보았습니다.

추가된 기능은 다음과 같습니다.

1. GeoIP City or GeoIP Lite City database 가 존재할 경우 도시 정보 contorl 2. GeoIP ISP database 가 존재할 경우, krisp 의 database 에 없는 IP 에 대해서 GeoIP ISP database 를 이용


즉, 고로 GeoIP 의 상용 database 를 사용할 수 있을 경우, krisp 에서도 역시 그 database 를 지원하도록 하는 것에 촛점을 맞춘 것 입니다. 대충 사용해 보니, GeoIP ISP 의 경우에는 품질이 괜찮은 반면, GeoIP City 의 경우 우리나라 환경에서는 영 맞지 않는 듯 싶네요.

krisp API 가 업데이트 됨에 따라, pear_krisp (with mod_geoip), mod_krisp (php extesion), KRISP perl module 모두 따라서 1.1.0 으로 업데이트 되었습니다.
2006/09/08 00:41 2006/09/08 00:41
Posted
Filed under Tech/프로그래밍
cvs 를 이용해서 프로젝트를 할 때 가장 귀찮은 것이 퍼미션/소유권 관리입니다. 이를 위해서 여러가지 꽁수를 쓰는데,

1. 유저들을 공통 그룹으로 묶고 umask 와 setgid 를 이용해서 퍼미션과 그룹권한을 유지시키는 방법
2. CVSROOT/passwd 를 이용하여 CVS passwd 의 User map 을 이용하는 방법
3. CVSROOT tree 의 모든 파일들에 주기적으로 w 권한을 주는 방법

등등 여러가지 형태로 운영이 되는데, 이를 근본적으로 해결할 길이 없을까 찾다가 그냥, 패치를 해 보았습니다. 원래는 2번의 방법을 애용했었는데, 이번에 개발서버들을 AD + winbind 를 이용하여 Active directory
를 이용하여 통합 인증을 구현하다 보니, 2번의 방법이 상당히 번거로와 졌는데, 결국 이를 해결하기 위해, cvs 1.12 의 pam pactch (1.11 을 위한 패치는 Fedora 5 의 cvs 에 들어 있습니다.) 와 아래의 usermap patch 를 만들게 되었네요.

요즘은 SVN 을 많이 사용하는 것 같은데, CVS data 가 너무 많아서 SVN 으로 가기는 힘들거나 귀찮고, user mapping 이 필요한 경우에는 사용하시면 유용할 것 같습니다. 설정은.. CVSROOT/usermap 파일을 생성하시고, loginuser:mapping_user 와 같이 한라인에 하나씩 지정 하시면 됩니다. mapping_user 는 system 에 존재하는 계정이어야 합니다.

diff -urNp src.org/server.c src/server.c --- src.org/server.c 2006-08-21 18:47:02.000000000 +0900 +++ src/server.c 2006-08-21 20:17:57.000000000 +0900 @@ -5785,7 +5785,53 @@ handle_return: It might or might not be the same as host_user. */ CVS_Username = xmalloc (strlen (username) + 1); strcpy (CVS_Username, username); - } + + if ( ! strcmp (username, host_user) ) { + char filename[256] = { 0, }; + FILE *op; + int userlen = strlen (username); + char *linebuf = NULL; + size_t linebuf_len; + sprintf (filename, "%s/%s/usermap", repository, CVSROOTADM); + + syslog (LOG_DAEMON | LOG_NOTICE, "oops: %s", filename); + + op = CVS_FOPEN (filename, "r"); + if ( op != NULL ) { + while ( getline (&linebuf, &linebuf_len, op) >= 0 ) { + if ( (strncmp (linebuf, username, userlen) == 0) + && (linebuf[userlen] == ':') ) { + char *mapuser = NULL; + char *ws = NULL; + char mapuserlen = 0; + + mapuser = strchr (linebuf, ':'); + if ( (ws = strchr (mapuser, ' ')) ) + mapuser[ws - mapuser] = 0; + else if ( (ws = strchr (mapuser, '\t')) ) + mapuser[ws - mapuser] = 0; + else if ( (ws = strchr (mapuser, '\r')) ) + mapuser[ws - mapuser] = 0; + else if ( (ws = strchr (mapuser, '\n')) ) + mapuser[ws - mapuser] = 0; + + mapuserlen = strlen (mapuser) - 1; + if ( mapuserlen > 0 ) { + free (host_user); + host_user = xstrdup (mapuser + 1); + } + break; + } + } + } + if (linebuf) free (linebuf); + + if ( ferror (op) ) + error (0, errno, "cannot read %s", filename); + if ( fclose (op) < 0 ) + error (0, errno, "cannot close %s", filename); + } + } return host_user; }
2006/08/21 21:24 2006/08/21 21:24

얼마전 올렸던 usermap patch 의 버그 수정입니다. 이전 패치에서 usermap 파일이 없을 경우 에러가 발생하는 문제가 있었습니다. 파일이 없으면 CVS_FOPEN 이 에러가 발생할 것이라는 엄청난 착각을 한 결과이네요. 이런저런 경우의 수를 다해서 테스트를 했다고 생각했는데.. diff -urNp cvs-1.11.17.org/src/server.c cvs-1.11.17/src/server.c --- cvs-1.11.17.org/src/s..

Posted
Filed under Tech/Mozilla
* Beta 2 Code Freeze on August 16th, 11:59pm PDT * Beta 2 QA Cycle from August 17th to August 22nd * Beta 2 Release midday on August 23rd


현재까지는 잘 따라가고 있습니다만, 회사일의 습격으로 어떻게 될지 모르겠군요. 그래도 Firefox 2 작업에서는 김인환님과 박찬균님의 QA 로 1.5 보다 품질이 상당히 좋아진 느낌입니다.

전 뭐하냐고요? 보통은 처음 작업 시작할 때, 이전 언어팩을 새로운 구조로 옮기는 scripting 작업이나, tinderbox 에 난 불을 끄는 정도만 작업을 하고 있지요 ^^; 1.5 때는 제가 거의 다 했었는데, 그러다 보니 품질이 좋지 않아서 ㅋㅋ
2006/08/10 16:19 2006/08/10 16:19
김정균

lockdown 얼마 남겨 놓지 않고 또 불을 지르다니.. --; 예정대로 라면 beta2 lockdown 이 대략 6시간 정도 남았군요. 또 뭔짓을 하려나..

Posted
Filed under Tech/프로그래밍
프로그래밍을 하다 보면 coredump file 을 남겨서 segfault 에 대한 debugging 을 원할 때가 있습니다. 하지만 Redhat Linux 는 전통적으로 기본으로 coredump file 을 생성하지 못하도록 되어 있습니다. 더군다나, init script 에서도 이렇게 남기지 않게 되어 있 곤란을 겪을 때가 있습니다.

그래서 RH 에서 coredump 를 남기기 위한 작업을 기술해 봅니다.

1. /etc/profile

대략 26라인 즈음에 보면

ulimit -S -c 0 > /dev/null 2>&1


이라는 설정으로 core 를 남기지 않도록 되어 있습니다. 암울 합니다. --;

ulimit -c unlimited >/dev/null 2>&1


와 같이 수정해 줍니다. 시스템 파일을 건드리고 싶지 않다면, ~/.bash_profile 이나 ~/.bashrc 에 설정 합니다.

2. /etc/sysctl.conf

커널 파라미터 역시 기본으로 core 를 남기지 않도록 되어 있습니다. /etc/sysctl.conf 에 아래 설정을 추가합니다.

kernel.suid_dumpable = 1 kernel.core_uses_pid = 1


설정을 한 후에, sysctl.conf 의 변경 사항을 커널에 반영합니다.

[root@www SPECS]# sysctl -p


여기까지는 시스템에서 기본적으로 coredump 를 남기도록 하는 겁니다.

RH 의 경우에는 한술 더 떠서, init script 로 실행하는 모든 데몬에 대해서 core 를 남기지 않도록 initscripts package 에서 관리하고 있습니다. 그러므로, /etc/init.d/httpd 를 실행했을 때 core
를 남기도록 하려면..

1. /etc/sysconfig/init

DAEMON_COREFILE_LIMIT='unlimited'


를 추가해 줍니다.

2. 위의 설정은 init script 로 실행된 모든 스크립트에 영향을 줍니다. 각 init script 에서 /etc/init.d/functions 를 호출하기 전에

DAEMON_COREFILE_LIMIT='unlimited'


를 넣어 주시면 반영이 됩니다.

참조: http://kbase.redhat.com/faq/FAQ_80_7935.shtm
2006/08/10 16:08 2006/08/10 16:08
Posted
Filed under Tech/Mozilla
firefox 2.0 작업을 하다가, translate korean extension 을 2.0 지원을 하게 하려다 보니, worldlingo 와 empas 가 작동을 하지 않는 것을 발견했습니다.

worldlingo 의 경우에는 url 에 time expired seed 가 포함이 되어 있는 것이 문제라서, seed 가 포함되지 않는 url 로 변경을 해서 처리가 되었습니다.

empas 의 경우에는 영어와 일본어 번역을 지원하게 되면서, 아예 URL 이 바뀐 경우이더군요. 덕분에 영문 번역과 일본어 번역에 empas 번역을 추가하게 되었네요. :-)

1.4 에서의 기능은..

1. firefox 2.0 지원
2. worldlingo time expired seed 문제 해결
3. empas 중국어 번역 되지 않던 문제 해결
4. empas 일본어/영어 번역 추가

가 되겠습니다. 2.0 에서는 extension 의 구조가 변경이 되지 않아서, 그리 어려운 문제는 없는데, 3.0 에서도 translate korean 이 지원가능할지는 난감하군요. 변경할 시간이 있을지.. ㅋㅋ
2006/07/29 23:34 2006/07/29 23:34
Posted
Filed under Tech/Mozilla
드디어 Firefox 2.0 Beta1 이 출시 되었습니다. (며칠 되었지만.. ^^)

Beta1 에서는 한국어 팩이 출시가 되지 않았습니다. 물론 작업을 하지 않아서 출시가 되지 못한거죠. 실은 1.5 때 워낙 고생을 해서, 2.0 작업은 message 가 freeze 가 되면 하자고 생각을 하고 미뤄두고 있었는데, 윤석찬님이 하자고 자꾸 꼬셔서.. 시작을 했습니다.

2.0 작업이 수월해야 3.0 때도 힘내서 할텐데.. 그냥 commiter 라는 딱지 때문에.. 또 2.0 작업에 동참을 하고 말았습니다.

불꺼진 tinderbox



이번에는 석찬님이 번역을 거의 다 하시고, 저는 여전히 diff 파일을 파싱해서 cvs repository 에 붙이는 스크립트를 만들었습니다. 그리고, 드디어 어제 새벽.. commit 을 완료하고, tinderbox 의 불을 모두 꺼버렸습니다. 이제 nightly version 이 빌드되기 시작할 겁니다.
2006/07/22 03:56 2006/07/22 03:56
Posted
Filed under Tech/프로그래밍
Neowiz 는 시스템 설치를 PXE 와 kickstart 의 post script 를 이용하여 자동 관리를 하고 있습니다. 회사에서는 이 시스템을 P.I.P.E (본 뜻은 까먹었음. 그냥 파이프라고 함) 라고 칭합니다.

이번에 pipe system 을 migration 을 하고 있는데, 다음주 즈음 대략 몇백대를 동시에 설치할 일이 있어서, web daemon 을 apache 에서 lighttpd 로 변경을 했습니다.

centos 를 테스트 할 때까지만 해도 좋았는데.. redhat 9 의 anaconda 에서 lighttpd 기반에서 kickstart 파일을 받아오지 않는 난감한 사태가 발생을 하더군요. apache 로 가도 상관이 없지만, 몇백대씩 설치를 하려면 apache 로는 1대로는 버틸수가 없다는 문제가 발생을 합니다. 또한, pipe 의 특성상 설치를 하면서 시스템 내부에서 작업을 많이 하게 되는데, apache 로 몇백대를 설치할 경우에는 시스템이 과부하가 걸리게 됩니다.

그래서 고민하다가, 그래 한번 해결해 보자는 오기가 생기더군요. 원래 제가 이 바닥에서 뽀로꾸로 시작해서 오직

안되면 될 때까지 !!!


라는 신념으로 버텨온지라.. 이번에도 누가 이기나 한번 해 보자는 "자포자기"식으로 도전을 하게 되었습니다.

먼저.. 그럼 뭐가 문제일까.. 하고선 lighttpd 를 debug symbol 을 줘서 빌드한 후에 debugging 도 해 보았지만 뚜력한 이유를 알수가 없었고, 그럼 패킷이 어떻게 지나가나 보자.. 하고선 dump 를 떠 보았지만.. 시간만 속절없이 흘러가더군요. 그러다가.. 제대로 되는 패킷과 안되는 패킷을 비교하는 도중 아래의 붉은 글자 부분의 차이를 발견하게 됩니다.

* 400 Bad Request 경우
0x0000: 4510 0069 52fc 4000 4006 e980 7f00 0001 E..iR.@.@....... 0x0010: 7f00 0001 886f 0050 9443 d892 9435 6606 .....o.P.C...5f. 0x0020: 8018 0040 fe5d 0000 0101 080a 92a6 8da3 ...@.].......... 0x0030: 92a6 8a69 4745 5420 2f70 726f 6669 6c65 ...iGET./profile 0x0040: 2f64 6566 6175 6c74 2e72 6564 6861 742e /default.redhat. 0x0050: 392e 6933 3836 2f70 6970 652e 6b73 2048 9.i386/pipe.ks.H 0x0060: 5454 502f 312e 3009 0a TTP/1.0..


* 200 정상적인 경우
0x0000: 4510 0069 52fc 4000 4006 e980 7f00 0001 E..iR.@.@....... 0x0010: 7f00 0001 886f 0050 9443 d892 9435 6606 .....o.P.C...5f. 0x0020: 8018 0040 fe5d 0000 0101 080a 92a6 8da3 ...@.].......... 0x0030: 92a6 8a69 4745 5420 2f70 726f 6669 6c65 ...iGET./profile 0x0040: 2f64 6566 6175 6c74 2e72 6564 6861 742e /default.redhat. 0x0050: 392e 6933 3836 2f70 6970 652e 6b73 2048 9.i386/pipe.ks.H 0x0060: 5454 502f 312e 300d 0a TTP/1.0..


해당 자리는 carrige return (\r) 이 들어가야 할 자리인데.. 대체 09 가 무야 하고 찍어보니.. tab (\t) 를 찍고 있는 것입니다. 이제껏.. query 를 던지면서 왜 똑같은데 안되지 하고 있었는데.. RH9 anaconda 는

GET http://domain.com/uri\t\n


을 찍고 있었던 겁니다. 그러니 될 턱이 없지요 --; 이것 땜시 anaconda 소스와 lighttpd 의 소스를 까보면서 헛되이 시간을 보내고 있었던 것이었습니다. 알고나자 허탈함이 밀려 오면서.. (속으로는 이런 "씹x"...) 여기서 포기해야 하는가 하다가, 들인 시간이 아까와서 다시

안되면 될 때까지 !!!


의 정신으로, lighttpd 가 저 쿼리를 받아들일 수 있도록 수정해 보자는 말도 안되는 결심을 하게 됩니다. 그렇게 한참을 뒤져서 다음의 패치가 나오게 됩니다.

diff -urNp lighttpd-1.4.11.org/src/connections.c lighttpd-1.4.11/src/connections.c --- lighttpd-1.4.11.org/src/connections.c 2006-07-21 00:27:44.000000000 +0900 +++ lighttpd-1.4.11/src/connections.c 2006-07-21 00:26:47.000000000 +0900 @@ -910,15 +910,21 @@ int connection_handle_read_state(server /* check if we need the full package */ if (con->request.request->used == 0) { buffer b; + char *_bptr; b.ptr = c->mem->ptr + c->offset; b.used = c->mem->used - c->offset; + /* fixed redhat 9 anaconda bug */ + _bptr = strstr (b.ptr, "\t\n"); + if ( _bptr != NULL ) *_bptr = '\r'; + + //log_error_write(srv, __FILE__, __LINE__, "ss", "request header1:", b.ptr); if (NULL != (h_term = buffer_search_rnrn(&b))) { /* \r\n\r\n found * - copy everything incl. the terminator to request.request */ buffer_copy_string_len(con->request.request, b.ptr, h_term - b.ptr + 4);


간단하게, \t\n 을 찾아서 \t 를 \r 로 바꾸는 거죠. ^^; 이렇게 하다가 갑자기 포인터로 구현을 해 보고 싶더군요. 전 앞에서 밝혔다 시피 뽀로꾸와 수많은 닥질의 경험으로 오늘날의 바탕을 마련했는데, C 역시 그냥 마구잡이로 소스를 써내려간 막가파로서, 포인터에 대한 이해가 전혀 없이 사용해 왔는데 갑자기 포인터가 이해가 되는 듯한 느낌이 들었습니다. 그래서 별 소용은 없지만 다음과 같은 코드도 만들게 됩니다.

diff -urNp lighttpd-1.4.11.org/src/connections.c lighttpd-1.4.11/src/connections.c --- lighttpd-1.4.11.org/src/connections.c 2006-07-21 00:27:44.000000000 +0900 +++ lighttpd-1.4.11/src/connections.c 2006-07-21 00:26:47.000000000 +0900 @@ -910,15 +910,31 @@ int connection_handle_read_state(server /* check if we need the full package */ if (con->request.request->used == 0) { buffer b; + char *_bptr; b.ptr = c->mem->ptr + c->offset; b.used = c->mem->used - c->offset; + /* fixed redhat 9 anaconda bug */ + if ( strchr (b.ptr, '\t') != NULL ) { + _bptr = b.ptr; + while ( *_bptr != 0 ) { + if ( *_bptr == '\t' ) { + if ( *(_bptr+1) == '\n' ) { + *_bptr = '\r'; + break; + } + } else *_bptr++; + } + } + /* fixed redhat 9 anaconda bug */ + + //log_error_write(srv, __FILE__, __LINE__, "ss", "request header1:", b.ptr); if (NULL != (h_term = buffer_search_rnrn(&b))) { /* \r\n\r\n found * - copy everything incl. the terminator to request.request */ buffer_copy_string_len(con->request.request, b.ptr, h_term - b.ptr + 4);


누워서 침뱉기 일지는 모르겠지만.. 포인터를 사용하면서 한번에 이렇게 써 내려간 적은 처음인 듯 싶습니다. 예전에 기타를 칠때도 한동안 안 늘다가 어느날 갑자기 못치던 것을 치게 되는 경우가 있었는데, 마치 오늘 위의 코드가 그런 경우인 듯 싶습니다. 스스로가 감탄스럽더군요. (저는 가끔 제멋에 뻑 갈때가 종종 있습니다. ^^)

RH9 의 말도 안되는 request query 덕분에, 고생도 엄청 했고, 저런 것까지 처리를 해 주고 있는 apache 에 대해서 새삼스럽게 존경을 하게 되었으며 (괜히 apache 라고 하는게 아니구나..), 이런 코드를 한번만에 만들어 낸 자신에게 감탄도 하고.. (워낙 설계라는 것 없이 하나 보니, 한번에 쓰는 경우는 정말 드물었죠..), 금방 위치를 찾아낸 것도 감탄 스럽고.. 몸은 힘들었지만, 마음은 그대로 나름대로 뿌듯합니다.

처음에는 google 신에게 구걸을 하려고 시도를 했으나, 결국에는 찾지를 못하여.. 이 글로 내가 했던 고생을 좀 덜 수 있으면 다행이라 생각하고 후기를 남깁니다.
2006/07/21 04:01 2006/07/21 04:01
비밀방문자

관리자만 볼 수 있는 댓글입니다.

김정균

ㅎㅎ 버그가 맞네요. \t\n 을 \r\n 으로 하는 것이 목적인데, 제 코드는 \t\r 을 만들고 있었네요. ㅋㅋ 오류 알려 주셔서 감사합니다.

뭐 어차피 이 코드는 실제 패치에 사용한 코드가 아니라 그냥 심심해서 만들어본 코드였으니 상관은 없습니다만..

그리고 요즘 버전은 이 패치가 맞지 않습니다. 그래서 패치 자체도 바뀌었죠. 요즘은..

+ /* if rh9 support flag on, convert \t\n to \r\n */
+ if ( srv->config_storage[0]->rh9support ) {
+ //log_error_write (srv, __FILE__, __LINE__, "s", "RH9 Support flag on";);
+ if ( ch == '\\t' && b.ptr[i+1] == '\n' )
+ b.ptr[i] = '\\r';
+ }

이정도로 처리가 되고 있네요 :-)

popori

역쉬 뽀로꾸 마왕.. 그거땜시 내 점심이 날아간겨?

박정욱

이야.. 그때 그놈이군요.. 당황케했던.. 결국 발견.. @.@

Posted
Filed under Tech/Mozilla
오랜만에 관리하던 extension 들의 버전을 업데이트 해 보았습니다. 다행히도, 언어팩 변경사항이 없어서 별 작업이 없었습니다.

1. Tidy extension 0.7.9.3 update 2. Thunderbird Display mail User Agent 1.3.1 update


별로 한 작업은 없지만.. 그래도 기록으로.. ㅋㅋ

distplay mail user agent 는 언어팩을 저자에게 보냈으니, 다음부터는 따로 작업을 하지 않아도 상관 없지 않을까 예상하고 있습니다. ^^ tidy 는 보내야 할지 말지를 아직 갈등중.. tidy 의 경우에는 help message 들이 있는데, 이걸 아직 모두 번역을 한 상태가 아니라서.. 좀 애매하게 생각하고 있어 보내지를 못하겠네요 쩝.

http://validator.kldp.org 도 업데이트를 해야 하는데.. 귀찮아서.. 쩝.
2006/07/03 17:02 2006/07/03 17:02

미루다가 미루다가 한글팩 업데이트를 단행했습니다. Tidy extension 의 경우에는 옵션 번역은 그리 양이 많지 않은데, help file 번역이 굉장히 많습니다. 더군다나, 0.8 부터는 SGML 파서 - http://validator.w3.org 에서 사용되는 파서 - 를 지원하도록 되어서, 그 양이 더 많아졌습니다. 그래서 업데이트를 할까말까 상당히 갈등을 했습니다. 영문판으로 계속 버텨보다.. 한글이 보고싶어, 드디어 큰 맘을 먹고 단행..

Posted
Filed under Tech/안녕리눅스
안녕 리눅스 1.2 R3 가 릴리즈 되었습니다.

커널 2.4 를 사용하는 1.x serise 는 1.2 R2 에서 정리하려고 했는데.. 어찌하다 보니 R3 까지 나오게 되었습니다.

2.0 작업을 전혀 안하고 있는 것은 아니지만, 이제껏은 귀찮아서 밀리고 있었는데, 요즘은 정말 시간이 없어서 밀리는 현상이 발생을 하네요. 올해로 10년차인데.. 이렇게 정신없이 일을 해 보는 것은 처음 인 듯 싶습니다.

1.2 R3 는 커널 보안 업데이트 및, 신규 chipset driver 들이 몇몇 업데이트가 되었습니다. 기존에 installer 에서 잡히지 않던 e1000/tg3/3w-9xxx 등이 새로이 installer 에서 지원이 가능하며, ML 150 에 포함되어 있는 aar81xx SATA driver 의 경우에는 addon 으로 제공을 합니다. (aar81xx 는 지원 장담 못함 --)

뭐 어쨌든.. 또하나의 버전이 릴리즈 되었고.. 언제까지 커널 2.4 를 우려 먹는지 저도 한번 지켜봐야 겠습니다. ^^;

아마.. 장비만 주어진다면.. 2.x 는 어쪄면 x86_64 (AMD Dual Core) 용이 먼저 나오게 될 지도 모르겠습니다.
2006/04/02 05:49 2006/04/02 05:49
골빈해커

여기가 김정균님 블로그였군요. 몰랐네요^^;
안녕리눅스는 정말 감사히 잘 사용하고 있습니다. 특별히 따로 써야 할 기능이 없다면 생각없이 사용할 수 있는 서버로는 최고인 것 같습니다. (칭찬인거 아시죠?;; )
언젠가 돈을 많이 벌게되는 날이 오면 개발용 서버라도 보태드릴께요(...)

Posted
Filed under Tech/프로그래밍
openlook.org 의 장혜식님 블러그를 보다보니, blog 의 trackback 의 인코딩때문에 (요즘 utf8 이 대세로 가는 분위기라..) 이런 저런 코드들이 나오고 있습니다.

그래서 저도 잊어 버릴까 만든 코드를 기록해 높습니다. (예전에 만들어 놓았다가 찾느라고 힘들었습니다. T.T)

다른 분들의 코드들이 대부분 iconv 나 언어에서 제공하는 charset encoding/deconding 함수를 이용하는 반면, 제 코드는 직접 까 봐서 이놈이 정말 맞는지 여부를 확인하는 코드 입니다.

<?php // // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2003 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Author: JoungKyun Kim <http://www.oops.org> | // +----------------------------------------------------------------------+ // // $Id: eSystem.php,v 1.2 2005/07/11 05:58:11 oops Exp $ require_once 'PEAR.php'; /** * PEAR's eSystem:: interface. Defines the php extended system mapping function * and any utility mapping function * * @access public * @version $Revision: 0.1 $ * @package Unicode */ class Unicode extends PEAR { function chr2bin ($c, $shift = '') { $c = ord ($c); if ( $shift && preg_match ('/^([<>]+)[\s]*([0-9]+)/', $shift, $match) ) : switch ($match[1]) : case '>>' : $c = $c >> $match[2]; break; case '<<' : $c = $c << $match[2]; break; case '<' : $c = $c < $match[2]; break; case '>' : $c = $c > $match[2]; break; endswitch; endif; return decbin ($c); } function is_utf8 ($str) { $_l = strlen ($str); $_not = 0; for ( $i=0; $i<$_l; $i++ ) : #$_first = $this->chr2bin ($str[$i]); # if 7bit charactior or numeric, skipped #if ( strlen ($_first) != 8 ) # continue; # if single byte charactors, skipped if ( ! (ord ($str[$i]) & 0x80) ) : continue; endif; $_first = $this->chr2bin ($str[$i], '>>4'); switch ( $_first ) : case 1111 : $b = 3; break; # 4byte case 1110 : $b = 2; break; # 3byte default : return 0; # not utf8 endswitch; for ( $j=1; $j<$b; $j++ ) : if ( substr ($this->chr2bin ($str[$i+$j]), 0, 2) != 10 ) return 0; endfor; break; endfor; return $_not ? 0 : 1; } } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ ?>


코드는 Pear 코드로 작성이 되었으며, 사용법은

<? require_once 'Unicode.php'; $_f = 'usage_200509.html'; $_ff = 'bb.html'; $u = new Unicode; if ( file_exists ($_ff) ) unlink ($_ff); $_t = file ($_f); foreach ( $_t as $_v ) : $_v = trim ($_v); if ( $u->is_utf8 ($_v) ) putfile_lib ($_ff, utf8decode_lib ($_v, 'cp949'), 1); else putfile_lib ($_ff, $_v, 1); endforeach; ?>


와 같이 사용할 수 있습니다.

단, euc-kr 과 utf8 만 구분이 됩니다.
2006/03/31 15:55 2006/03/31 15:55

트랙백은 HTTP GET 으로 간단한 파라미터들을 함께 넘기면 단순히 받아 저장하는 기능에 불과하므로 보내는쪽의 인코딩이 무엇인지 파악하기가 어려운 점이 있습니다. 물론 향상된 트랙백 규약에는 트랙백을 POST로 보내고 인코딩 정보도 함께 전송하도록 확..

문서의 Charset 을 detecting 하는 library 로는 IBM 이 지원하는 International Components for Unicode (ICU Project) 의 ICU library 와 Mozilla Browser 에서 이용하는 Universal Chardet library 가 있습니다. ICU 의 경우에는 charset detect 가 포함된지 꽤 되었음에도 불구하고, php 5.3 부터 기본 포함되는 intl extensi...

이창일

putfile_lib ($_ff, utf8decode_lib ($_v, 'cp949'), 1);
위에서 없는 함수를 사용 했네요;;
앞의 putfile_lib 파일에 쓰는 함수 인것 같고
utf8decode_lib 는 변환 같은데 PEAR.php 에도 엇는 함수네요

김정균

음 깜빡 했군요. 해당 함수들은 http://devel.oops.org 에서 배포하는 korean extension 에 포함되어 있습니다. 그리고 해당 함수들이 사용된 것은, 그냥 예제일 뿐이죠. 해당 부분에 님이 필요하신 코드를 적어 주시면 됩니다.