Code Metaphor

Programming, Writing, Reading, Thoughts…

이 블로그는 더이상 운영되고 있지 않습니다. 단지 예전 URL을 유지하는 용도로만 남아 있습니다. 새 블로그의 주소는 blog.dahlia.kr입니다.

Archive for February, 2007

30줄짜리 정규 표현식 엔진

Wednesday, February 28th, 2007

브라이언 커니건(Brian Wilson Kernighan)랍 파이크(Rob Pike)가 구현한 30줄짜리 정규 표현식 엔진(via KLDP).

생사경 (生死儆)

Wednesday, February 21st, 2007

내가 살고 있는 곳은 “벽제 화장터”로 유명한 서울특별시 장묘사업소 바로 옆이다. 서울특별시라고 했지만, 위치는 고양시 덕양구인데, 바로 옆이라는 것이 과장이 아니라 정말 50미터 거리에 화장터와 납골당이 자리잡고 있다. 원래 이쪽 주변이 장묘업만 성행해서 집 뒤로는 절에서 세운 사립 납골당도 있다(여기는 더 가깝다. 내 방 창문을 열면 바로 앞에서 보인다).

설 연휴가 되면 당연히 집 앞은 붐비고 붐벼 우리집 마당까지 주차장으로 쓰이게 된다. 이곳에서 산지 얼마 안되었을 때는 그것이 무척 분통 터지는 일이었지만(하루종일 먼지가 가라앉지 않는다), 이제는 별 생각도 없다. 이번 설 연휴 때 문득 느낀 것은, 왜 우리나라는 죽은 자를 한곳에 몰아놓으려 하는가 하는 생각이였다. 죽은 사람의 장례식을 올리고—그 다음에는 쓰레기통에 처박듯, 산 사람 죽은 사람 분리수거를 하듯 납골당, 공동 묘지에 모아 격리시키는 모양새다.

모든 사람들이 미신과 귀신을 비웃으며 자기 시대를 과학의 시대라 칭하면서도 죽음을 가능한 멀리 떨어뜨리려 한다. 떨어뜨린다는 것은 생명을 연장한다는 것이 아니라, 말 그대로 물리적인 장소를 떨어뜨린다는 소리다. 대체 왜?

나는 10년 이상 화장터 옆에서 살면서 귀신을 본 적이 없다(본다면 그것이 더 이상한 것이다). 아무런 느낌도 없다. 친구들이 종종 우리집에 와서는 말한다. “으시시한데. 기분 안 나쁘냐?” 하나도 기분 안 나쁘다. 한번은 어떤 친구에게 우리집 옆에 있는 건물이 무엇인지 말해주지 않았다. 그러자 이런 말도 한다. “야 여기 사람도 없고 분위기 좋다.” (아닌게 아니라 우리집 주위의 야경은 썩 좋다.)

나는 자신의 가족이 죽었다면, 그를 자신이 사는 곳 근처에 두고 항상 곁에서 있는 것이 더 바람직하다고 생각한다. 실제로 과거에는 그렇지 않았는가? 과학의 시대가 되면서 비과학에 대한 두려움이 커졌나?—죽음은 비과학인가? 비싼돈 들여 장례하는 것 하나 소용 없다. 장례만 후딱 하고 보이지도 않는 곳에 치워놓고 1년에 한번 생색내며 오면 뭐하나. 정말 소중하다고 생각하면 보이는 곳에 두는 것이 옳다.

Phunctional: 오랜만에 업데이트

Saturday, February 17th, 2007

오랜만에 Phunctional을 업데이트했다. 가장 큰 개선점이라면, map(), filter()가 게으른 평가(lazy evaluation)를 하도록 반복자로 재작성했다는 것이 있겠다. map()의 지연 평가 버전 반복자 클래스의 이름은 Transformation.

php > $map = new Transformation($_0 * 2, xrange(1, 10));
php > echo get_class($map);
Transformation
php > assert($map instanceof Iterator);
php > var_export(iterator_to_array($map));
array ( 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, )

기존에 iterator-tools.php에 있던 map()은 사라지고 대신 새로운 Transformation 클래스의 생성자 역할을 하게 바꾸었다.

php > var_export(iterator_to_array(map($_0 * 2, xrange(1, 10))));
array ( 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, )

filter()의 반복자 클래스 이름은 Filter다. 역시나 filter() 함수는 iterator-tools.php에서 사라지고 Filter 클래스의 생성자 역할을 하도록 바꿨다. 새로운 Filter는 원본의 열쇠값도 유지한다.

php > $filter = new Filter($_0 % 3 == 0, $map);
php > var_export(iterator_to_array($filter));
array ( 2 => 6, 5 => 12, 8 => 18, )

Iterator()라는 함수도 생겼다. 이 함수는 Functor() 함수와 비슷한 역할을 한다. 인자로 받은 값의 반복자를 반환하고—배열의 경우 SPLArrayIterator를 반환한다—반복이 불가능한 값일 경우에는 InvalidArgumentException 예외가 발생한다.

이 외에 Announcement, Binding, Range의 버그를 고치고 내부적인 개선을 했다.

덧. Phunctional을 PEAR 패키지로 만들어 배포하려고 하는데 귀찮아서 계속 미루고 있다.

시각적 마크업 vs 의미적 마크업

Monday, February 12th, 2007

아래는 삼성 올앳카드 홈페이지의 마크업 일부. 물론 시각적 마크업으로 되어 있는 것을, 내가 손을 보았다.

시각적 마크업 (visual markup)

<span class="null">...</span>1. 행운의7 당첨을 위해 2회이상 승인 후 취소하는 경우
    <font color=CD0000>재승인시부터 나오는 ' 행운의 7 '은 캐쉬백 <br> 
<span class="null">......</span>대상에서 제외됩니다.</font><br>

<span class="null">......</span>2회부터 나오는 행운의 7의 경우
    당첨 E-mail은 발송되지만, 캐쉬백등록이 되지 않습니다.<br>
<span class="null">...</span>2. 시스템이나 프로세스 상의 오류로 인한 승인취소의 경우
    재승인 시 나오는 ' 행운의 7' 에 대해서는<br>
<span class="null">......</span>예외로 캐쉬백 대상에 포함시킵니다.
    고객센터로 문의하세요.<br>

의미적 마크업 (semantic markup)

<style type="text/css"> ol li em { color: #CD0000 } </style>

<ol>
    <li>행운의 7 당첨을 위해 2회 이상 승인 후 취소하는 경우
        <em>재승인시부터 나오는 ‘행운의 7’은 캐쉬백 대상에서 제외됩니다.
        2회부터 나오는 행운의 7의 경우 당첨 이메일은 발송되지만,
        캐쉬백 등록이 되지 않습니다.</em></li>
    <li>시스템이나 과정상의 오류로 인한 승인 취소의 경우
        재승인시 나오는 ‘행운의 7’ 에 대해서는 예외로 캐쉬백 대상에 포함시킵니다.
        고객센터로 문의하세요.</li>
</ol>

이거야 원 HTML 모르는 사람도 어느 쪽이 더 좋은 마크업인지 맞출 수 있겠다. 그리고 맞춤법도 좀 지키자.

덧. 사실 시각적 마크업이란 없다고 봐야 한다. 마크업 자체가 메타적 의미를 포함하는 텍스트 표현을 말하는 것이 아닌가?

추가. 흥섭이의 요청으로 추가 설명 덧붙이겠다.

lee@heungsub.net: 그리고 시각적 마크업은 없다고 하셨는데

lee@heungsub.net: <font> 같은건 명백히 시각요소 아닌가요?

mydahlia@msn.com: 내가 하고 싶은 말은

mydahlia@msn.com: <font color="red">빨간색</font>

mydahlia@msn.com: 이 아니라

mydahlia@msn.com: <font color="red">강조</font>

mydahlia@msn.com: 둘의 차이를 모르겠냐

mydahlia@msn.com: 색 자체가 하나의 컨텐츠일 때와

mydahlia@msn.com: 색이 표현의 한 방식일 때

lee@heungsub.net: 아하

lee@heungsub.net: 그에 대한 설명도 추가해주시는 게 좋겠는데요?

mydahlia@msn.com: ㅇㅇ

<font color="red">red가 문서 내용의 의미적 일부라면 그것은 마크업이다. 그러나 그것이 의미를 표현하는 서식 표현 가운데 하나라면 마크업이라고 부를 수 있을까?

Io에서 문자열 인코딩 탐지

Friday, February 9th, 2007

해결책: Python의 chardet 모듈을 그냥 가져다 쓰면 된다. ㅋㅋㅋ

EncodingDetection := Object clone do(
    encoding := "ascii"
    confidence := 0
)

Sequence detect := method(
    res := Python import("chardet") detect(self)
    det := EncodingDetection clone
    det encoding = res __getitem__("encoding")
    det confidence = res __getitem__("confidence")
    return det
)

Io의 Python 브릿지가 숫자, 문자열, 리스트 객체 정도만 변환을 지원해서 list(encoding, confidence) 형태로 반환되도록 바꾸었다. 코드를 전면 수정해서 알맞은 객체를 반환하게 하였다. 객체의 encoding, confidence 슬롯을 접근하여 사용할 수 있다.

Io> "cogita ergo sum" detect encoding
==> ascii

Io> "道可道 非常道" detect
==>  EncodingDetection_0x395bf70:
  confidence       = 0.99
  encoding         = "utf-8"

Io에서 무작위 문자열

Friday, February 9th, 2007

무작위 문자열을 생성할 일이 있어서 작성하려고 했다. 그런데 문득 Io가 떠올라서 그것으로 작성해봤다. 어떤 코드가 나올까 궁금했는데 결과는 좀 놀라웠다.

length := if(args size < 2, Random value * 50, args at(1) asNumber) floor
Sequence anyOne := method(self at((Random value * sequence size) floor))
sequence := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890`~!@#$%^&*()[]{}<>\\|-_=+'\":;,./?"
1 to(length) map(sequence anyOne asUint32Buffer) join println

네 줄 정도면 충분히 가능한 듯했다(사실 세 줄이었는데 리팩토링을 살짝). 이것으로 Io도 마법의 언어 목록에 추가. 다른 언어로 하면 어떤 코드가 나올까?

덧. 마법의 언어란? 언어가 너무 탁월한 나머지 별 고민 없이 작성해도 탁월한 코드가 나오는 신통함을 지닌 그런 언어들을 말한다(ㅋㅋ). 나는 마법의 언어로 Haskell, Scheme 같은 것들을 꼽는다. 다른 분들이 생각하는 마법의 언어 혹은 마법의 도구로는 무엇이 있나?

덧2. 이렇게 한 문제를 두고 여러 사람이 트랙백을 통해 여러 언어로 릴레이 코드 카타를 해도 재밌을 것 같다.

Network Time Protocol

Tuesday, February 6th, 2007

서버의 표준시간 설정이 10분 정도 오차가 있다는 흥섭이의 제보를 듣고 서버 표준시간 설정을 다시했다. 내 PowerBook에 설치한 Mac OS X에서는 time.asia.apple.com으로부터 표준시간 정보를 받아 동기화를 하길래, 그렇게 할 수 있지 않을까 해서 검색을 좀 해보았다. 그랬더니 NTP라는 것이 있어서 그걸 이용하기로 했다. 서버에는 NTP 관련 패키지가 없어서 emerge ntp로 유틸리티를 설치했다.

$ ntpdate time.asia.apple.com

라고 했더니 시간이 올바르게 설정되었다. 시간설정은 시간이 지날수록 오차가 생긴다고 하길래 1시간 주기로 자동으로 동기화되도록 cron에도 올려두었다.

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.