뭘 이런걸..

Posted
Filed under Tech/프로그래밍
http://css-validator.kldp.org 를 접속해 보셨던 분들은 아시겠지만, 일주일 전 부터 design 과 결과가 달라진 것을 아실 수 있을 겁니다. 현재 KLDP CSS validator 는 http://jigsaw.w3.org/css-validator/ 보다 훨씬 새 버전으로 많은 변경 사항이 있습니다. (물로 보이는 것은 외부적인 변화가 더 크지만..)

이번 update 에서는 완전 한글화에 중점을 두었으며, 이전에 처리를 하지 못하던 부분을 완료하였습니다. 일단, 내부적인 메세지 번역은 이전 버전에 해 두었지만 각종 문서들의 번역은 이루어지지 않았는데, 이전의 일본어 번역 페이지뿐 아니라 이번에는 중국어 번역페이지가 추가된 것에 자극을 받아, 한국어 번역 페이지까지 모두 작성하게 되었습니다.

또한,
"유효한 CSS 정보"
에서 css 에 한글이 들어가 있을 경우 (예를 들어 폰트 이름.. 등) 한글이 깨져서 나오는 문제를 해결을 했습니다. css-validator 가 내부적으로 UTF8 로 처리를 하는데, 이 경우 multi-byte 환경을 고려하지 않는 문제점이 있더군요. 대략적으로 문서가...

1. EUC-KR일 경우
  1. EUC-KR -> ISO-8859-1
  2. ISO-8859-1 -> UTF-8
2. UTF8 문서일 경우
  1. EUC-KR -> ISO-8859-1


와 같이 변환하여 print 를 하는 문제가 있습니다. 제가 java 를 모르는 관계로, 몇가지 patch 를 한것 외에는 이것까지 하려니 너무 막막해서, php wrapper 를 이용하여

function iconv_callback ($m) { global $u; $c = iconv ("utf8", "iso-8859-1", $m[3]); if ( ! $u->is_utf8 ($c) ) $c = iconv ("euc-kr", "utf-8", $c); return $m[1] . $c; }


꽁수를 사용하여 KLDP CSS Validator 에서는 정상적으로 나오도록 처리하고 있습니다.

마지막으로 중요한 것은... 이 메세지 번역과 기타 한글 관련 패치, 그리고 multi-byte 환경에서의 오작동 부분을 reporting 을 하는 것이 맞으려나.. 메일링 리스트 가입을 하지 않으면 투고할 곳이 없고, 그렇다고 메일링 리스트를 가입하여, 그 메일들을 받고 싶은 생각도 없고, 또.. 영어도 못하는 관계로.. 결국에는 main stream 으로의 진입은.. 또 다시 좌절 입니다. ^^;

다만, 한국어 버전으로 설치를 하고 싶으신 분은..

http://css-validator.kldp.org/howto/

를 참고 하시면, 제가 CSS Validator 를 설치하기 위한 닥질의 내용이 적혀 있습니다. 이번 업데이트된 버전은 예전 버전과 달리 문서가 많이 없데이트 되었고, 공식적인 설치 문서는

http://css-validator.kldp.org/DOWNLOAD.html

를 참고 하시면 됩니다. 다만, 전자가 좀더 자세할 겁니다. :-)
2006/09/29 17:21 2006/09/29 17:21

http://jigsaw.w3.org/css-validator 가 드디어 업데이트 되었습니다. 그동안 http://css-validator.kldp.org 가 개발 버전으로 운영되어 오다 보니 디자인이 달라서 이거 뭐에요 하는 질문을 많이 받았었는데, 이제 디자인도 동일해진 관계로 이런 질문은 더이상 오지 않을 듯 싶군요. 한국어 버전을 사용하면 좋은 점은 일단 한글 폰트가 들어가 있을 때 에러가 발생하지 않는 다는 점과 속도가 빠르다는 점이죠. 아..

Posted
Filed under 주절주절
2006년 9월 17일 KLDP 10 주년 기념 conference 에 다녀왔습니다. KLDP step 으로 빠지기도 그랬고, 듣고 싶었던 section 도 있었고, 초기 흥행이 부진해서 "안녕 리눅스" BoF 를 진행하기로 한 것도 있었습니다.

가장 듣고 싶었던 고급 디버깅 section 은 군이가 따라오겠다고 떼쓰는 것을 떼어놓고 오느라, 시간을 놓쳐 퍼키군의 section 밖에는 듣지를 못하는 아쉬움이 있었고..

저녁식사 시간 후에는 "안녕 리눅스" BoF 를 진행을 하게 되었습니다. 가비아에 근무 하시는 조명욱님, 소방 방채청에 근무하시는 분 (이름이 기억이 나지 않아서 죄송합니다. ^^), 그리고 약간은 잘못 찾아오신 듯한 (그래도 시종일관 진지하게 들어주시던 분.. 역시 성함이 기억이 안나서 죄송합니다.) 한분.. 그리고 현성군.. 까지 5명에서 오붓하게 대화를 나눌 수 있었습니다. 할 얘기가 별로 없을 것 같았는데, 어느샌가 2시간이 훌쩍 지나가 버리고, 더 많은 얘기를 나누지 못한 것이 좀 아쉬웠네요.

BoF 참석하셨던 조명욱님과 현성군

BoF 참석하셨던 조명욱님과 현성군

BoF 중..

BoF 중..



다만, 아쉬웠던 부분은, BoF 진행이 별로 깔끔하지 못했던 듯 싶습니다. 다만, 행사 진행하느라 고생하신 분들께 할 말은 아닌듯 싶어 아무런 말을 하지 않았지만, 뻘쭘하게 앉아서 기다리던 모습들.. 어디인지 찾지를 못하시던 분들.. 진행자가 돌아다니면서 참가자를 찾아 다녀야 했던 점.. 음료수 하나없이 2시간 동안 떠들기도 쉽지 않았고, 그리고 찾지를 못해서 그냥 돌아가신 3분께는 죄송하다는 말씀을 드리고 싶습니다. 뭐 그렇다고 해서 뭐라 그를 수 있는 처지도 아니고요. ^^ (바쁘다는 핑계로 step 임에도 불구하고 도움하나 주지를 못했으니까요.)

행사장 도착하자 마자 흡연구역에서..

행사장 도착하자 마자 흡연구역에서..

행사 마지막 Step 소개때

행사 마지막 Step 소개때



행사 중간 phpschool 대표님과 KISA 이영재님..

행사 중간 phpschool 대표님과 KIPA 이영재님..그리고 한분은 ??



마지막으로, 성함을 거론(?)하지 못하신 분들께 죄송합니다. 제가 워낙 사람이름을 못 외워서.. (__)
2006/09/19 00:49 2006/09/19 00:49
coffeejava

이번달에 하나 포스팅 하셔서 안하실줄 알았는데 못본사이 포스팅이 되어있었네요^^. 저만 음료수 먹어서 죄송했습니다. 드릴수도 없고 참~ 난감했습니다. 중간에 좀 사올걸 그랬습니다. ㅎㅎㅎ 얘기 듣다보니..

Posted
Filed under Tech/프로그래밍
얼마전 올렸던 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/server.c 2006-09-13 17:35:21.000000000 +0900 +++ cvs-1.11.17/src/server.c 2006-09-13 18:07:24.000000000 +0900 @@ -5785,7 +5785,56 @@ 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; + struct stat mapfile; + sprintf (filename, "%s/%s/usermap", repository, CVSROOTADM); + + //syslog (LOG_DAEMON | LOG_NOTICE, "oops: %s", filename); + + if ( CVS_STAT (filename, &mapfile) > -1 ) { + if ( (op = CVS_FOPEN (filename, "r")) != 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/09/13 19:47 2006/09/13 19:47
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 주절주절
무지개가 떴어요
군이랑 연날리고 오는길에 아주 커다란 무지개를 발견하고 사진을 찍었습니다.

아무생각 없이 오고 있었는데, 군이가 "무지개다!" 하고 소리쳐서 보니 정말 이렇게 큰 무지개는 처음 본것 같았네요. 카메라를 가지고 오지 않아서 그냥 카메라폰으로 찍어서 화질이 별로인게 좀 아쉽지만.. :-)

더군다나, 비온 후의 무지개는 많이 봤어도 비오기 전의 무지개는 처음 보는 것 같네요.
2006/08/19 20:35 2006/08/19 20:35
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