Wedding for a Penny
You’ll find there are many
Who’ll wed for a pennyThe Mikado, No. 13: Finale, Act II
You’ll find there are many
Who’ll wed for a pennyThe Mikado, No. 13: Finale, Act II
회사에서 쓰던 17인치 LCD가 답답해서 24인치 LCD를 구입했습니다.
구입한 제품은 Richwell의 RW2040DA입니다. Apple 쪽은 비싸서 일찌감치 포기했고, Dell을 사려다가, 디자인은 좀 구려도 약간 더 나은 스펙의 삼성패널을 쓰고 있는 중소 기업 제품을 사기로 했습니다. 24인치 중소 기업 제품들은 모조리 동일한 삼성 패널을 쓰고 있는 것이 재미있었습니다. (들리는 소문에 의하면 삼성은 내년부터 LCD부문 OEM은 줄이고 자체 브랜드를 추진한다죠.) 회사에서 사용하기 때문에 TV 기능은 포기했습니다. 전엔 업체에 직접 문의해서 불량화소 체크를 해달라고 했었는데, 지금은 ‘무결점’이라는 꼬리표가 달려서 4만원 정도 비싼 값으로 팔더군요. 사실 불량화소는 실제 사용에 전혀 문제가 안되지만, 무결점이 아닌바에야 불량화소가 걸릴 확률이 훨씬 높을 거란 판단에, 역시 꺼림찍해서 ‘무결점’ 제품을 샀습니다.
3GATE의 2410WV도 디자인이 그나마 간소해서 구입을 고려하고 있었는데, 비슷한 가격에 pivot 기능이 있고, Xbox이랑 연동이 잘 된다는 철호군의 확인 때문에 Richwell의 제품을 선택했습니다. (3gate의 제품도 잘될런지도 모릅니다만 확인이 안되니까요.)
블랙 색상을 골랐습니다만, 아쉽게도 재고가 없는 관계로 화이트 모델을 골라서 주문했는데, 블랙 모델이 왔군요.무슨 조화인지.
폰트를 크게 해놓고도 넓직한 환경에서 프로그래밍할 수 있어서 매우 만족스럽습니다. 구입한 가격은 약 60만원입니다.
On Encoding URI with Non-ASCII chracters 글에 오류가 있었습니다. Firefox는 현재 (2.0) URI를 UTF-8로 Percent-encoding하지 않습니다. (이 사실은 윤묵형이 지적해주셨습니다.)
Firefox의 about:config 페이지를 보면 URI encoding에 관한 두개의 옵션이 있습니다.
encode-utf8 옵션의 디폴트 값이 false이기 때문에, Firefox는 클라이언트 환경이 정의하는 인코딩으로 Percent-encoding을 수행합니다. 따라서, 한글 윈도우에서는 EUC-KR로 Percent-encoding됩니다. UTF-8 환경의 리눅스에서는 위의 옵션 값이 false라고 하더라도 UTF-8로 Percent-encoding됩니다. 따라서 IE와 firefox는 다릅니다. 아마 기존과의 호환성을 위해서 아직 false인 것 같은데, IE에서는 기본값을 사용하는 상태이므로 Firefox도 true로 가는 것이 타당하다고 생각됩니다.
한편, escape-utf8 옵션의 디폴트 값이 true이므로, Firefox의 주소표시줄에 한글을 적으면 Percent-encoding된 형태로 표시됩니다. 이 옵션의 값을 false로 만들면, 한글 그대로 표시됩니다.
IE나 표준과 호환되면서, 사용자 입장에서는 디코딩된 형태의 URI를 보고 싶다면, Firefox about:config 페이지의 network.standard-url.encode-utf8 옵션은 true로, network.standard-url.escape-utf8 옵션의 값은 false로 만들어주시면 되겠습니다. 테스트는 http://ko.wikipedia.org/wiki/대한민국 로 해보시면 됩니다. 주소표시줄에 “대한민국”이라고 나오면 성공입니다.
아직 안읽어봤지만 이 문제에 대한 다음과 같은 논의들이 있는 것 같군요.
다음번에는 웹서버별로 URI encoding에 대해서 어떻게 처리하고 있는지 알아보도록 하죠.
1994ë ì URI를 ì ìíë RFC1630 ëë URLì ì ìíë RFC1738ì ë³´ë©´ ì ì ìë¯ì´, ì´ê¸°ë¶í° URIë Non-ASCII 문ì를 í¬í¨í ì ìë¤. íì¬ ì°ë¦¬ê° Percent Encodingì´ë¼ê³ ë¶ë¥´ë escaping ë°©ìì ë¨ì§ 공백ì´ë ì ì´ ë¬¸ìë¤ ê·¸ë¦¬ê³ 7bit ë²ì를 ëì´ìë unsafe 문ìë¤ì ííí기 ìí´ ì ì ëì´ììì¼ë, ì´ë¤ 문ì ì¸ì½ë©ì ì¬ì©í´ì¼íëì§ë ì ìëì§ ììì¼ë©°, I18Nì ëí´ì ëª ííê² ì¸ê¸íì§ë ììë¤.
1998ë , IETF Policy on Character Sets and Languages (RFC2277)ìì I18Nì ìí´ ëª¨ë íë¡í ì½ìì 모ë 문ì ë°ì´í°ë 문ìì (charset)ì ëª ìí´ì¼íë©°, UTF-8 문ìì§í©ê³¼ ì¸ì½ë©ì ì¬ì©í ì ìì´ì¼ íë¤ê³ ëª ìë¨ì¼ë¡ì¨ ì¸í°ë· íë¡í ì½ë¤ì ëí 기본ì ì¸ I18N ê°ì´ëë¼ì¸ì´ ë§ë¤ì´ì¡ë¤. ê·¸ë¼ìë ë¶êµ¬íê³ , ì´íì ì ë°ì´í¸ë URI를 ì ìíë 1998ë ì RFC2396ì Escaped Encodingì ê´í´ì ì¢ ë ìì¸íê³ ì ë°íê² ì¤ëª íê³ ìì§ë§ ìì Escaped Encodingì ì ì©í ë ì´ë¤ character encodingì ëí ì¸ê¸ì ììë¤. ë¤íí 1999ë ì W3Cìì ì¶íí HTML 4.01ì Appendixììë Non-ASCII 문ì를 UTF-8ë¡ íííëë¡ ‘ê¶ì¥’íê² ëìë¤. 2001ë ì ìì W3C쪽 ë©¤ë² í ì¬ëì´ 19th IUC(International Unicode Conference)ìì Non-ASCII 문ìì ëí UTF-8ê³¼ Percent Encoding ì¬ì©ì ê³µìííë IRI (Internationalized URI)ì ê´í ë°í를 íê³ , ì´ë IRI specification ìì ì¼ë¡ ì´ì´ì¡ë¤. IRIì ê²°ê³¼ê° RFCë¡ ê²°ì¤ì 맺ì ê²ì 2005ë ì RFC3986ì´ìë¤. ì´ ëììì¼ scheme-specificí 문ì ì¸ì½ë©ì ê´í ì¸ê¸ê³¼ í¨ê» ìë¡ì´ schemeì´ UCSë¡ ë í ì¤í¸ë¥¼ ì ìí ëë UTF-8ê³¼ Percent Encodingì ì¬ì©í´ì¼íë¤ë ì¸ê¸ì´ ë¤ì´ê°ê² ëìë¤. (http schemeì Generic URI를 ì¬ì©íë¯ë¡ UTF-8ë¡ ì¸ì½ë©ëì´ì¼í¨ì ì미íë ê²ì¼ë¡ í´ìíë ê²ì´ ì ì í ê²ì´ë¤.)
íí¸, ì¹íì´ì§ë¤ì ìê° ì¦ê°íê³ , Non-ASCII 문ìë¤ì í¬í¨í URIë¤ì´ íêµì í¬í¨í ë¹ìì´ê¶ì ë§ì ì¹íì´ì§ë¤ì ë¤ì´ê°ë©´ì, ë¸ë¼ì°ì ë ì´ë¤ì ì´ë»ê² ì²ë¦¬í´ì¼í ì§ ê³ ë¯¼í´ì¼ë§ íë¤. ì¼ë°ì ì¼ë¡, ì¹ë¸ë¼ì°ì ë ì¬ì©ìê° íì´ì§ ë´ì URIì í´ë¦íì ë, ê·¸ URLì í´ë¹íë íì´ì§ë¥¼ ë³´ì¬ì£¼ê¸° ìí´ì, URIì ëª ìëì´ìë ìë²ë¡ URIì ë³´ë´ì¼íë¤. ë¸ë¼ì°ì ê° ì´ URIë¤ì ì´ë¤ ííë¡ ìë²ë¡ ë³´ë´ëëì ë°ë¼ ì¸ê°ì§ì ë°©ìì¼ë¡ ëë ì ìë¤.
1ë²ìì ë°©ìì Non-ASCII 문ìê° URIì ë¤ì´ê°ìë ìëë¤ë íì¤ì ì§ì ì ì¼ë¡ ë°°ì¹ë ë¿ë§ ìëë¼,
ì¹ìë²ê° ì¸ì½ë©ì ëí ì§ìì´ ë¹ ì ¸ìë trivialí 구íì¸ ê²½ì° íìì ê²½ì°ê° ë°ìíê² ëë¤. ì´ë¥¼í ë©´ EUC-KR ì¹íì´ì§ìì ëì¨ EUC-KR URI를 ì¹ìë²ìì ê·¸ëë¡ ë겨주ëë¼ë ë¤íí EUC-KR íì¼ ìì¤í ì´ë¼ì ì ëë¡ ì¹íì´ì§ê° ë³´ì¬ì¡ìë¿, íì¼ìì¤í ì ì¸ì½ë©ì UTF-8ë¡ ë³ê²½íë ¤ë©´, ì¹íì´ì§ì ì¸ì½ë©ê¹ì§ ë°ê¿ì¼íë¤.
2ë²ìì ê²½ì°ë 1ë²ìì ê²½ì°ì ë¹ì·íë, 1ë²ìììì íìì ê°ì ê²½ì°ë ë°ìí ì ìë¤. ì ëë¡ êµ¬íë ì¹ìë²ë¼ë©´ URIì í´ìì´ í
¹ì ì¸ì½ë©(Encoding A)ì¼ë¡ ì¤ì ëì´ìê±°ë íì´ì§ì ì¸ì½ë©ì ë°ë¥¸ë¤ê³ íëë¼ë, ìë²ì íì¼ìì¤í
ì´ ì´ë¤ ì¸ì½ë©(Encoding B)ì¸ì§ ì¸ì§í í ì ì íê² ì¸ì½ë©ì ë³í(A->B)í´ì¤ ê²ì´ë¤. íì§ë§, íì¤ì ì¼ë¡ ì¹ìë²ìì ì´ë¬í ëê°ì§ ì¸ì½ë©ì 모ë ëª
ìíë ê²ì ìë¹í ë³µì¡ë를 ì¼ê¸°ìí¨ë¤. ëë¤ë¥¸ 문ì ë, ì´ë° ì¹ìë²ë¡ Non-ASCII 문ì를 í¬í¨í URI를 ìì±í´ì ë³´ë´ì¤ ëë ì¹ìë²ê° ì´ë¤ ì¸ì½ë©ì ì¬ì©íëì§ í´ë¼ì´ì¸í¸ ì¦, ì¹ë¸ë¼ì°ì ë ì¹ì¬ì©ìê° ì¸ì§íê³ ìì´ì¼íë¤ë ê²ì´ë¤. URIê° ì¹íì´ì§ììë§ í´ë¼ì´ì¸í¸ìê² ì£¼ì´ì§ë¤ë©´ ì¹íì´ì§ì ì¸ì½ë©ì ìëì ì¼ë¡ ë°ë¦ì¼ë¡ì ì´ë¬í 문ì 를 í´ê²°í ì ìì¼ë, URIì interoperatibility를 í¬ê² ë¨ì´ë¨ë¦°ë¤. í´ë¼ì´ì¸í¸ê° Non-ASCII 문ìë¡ URI를 ìì±íë ì¼ì´ íë¤ì´ì§ ë¿ë§ ìëë¼, ìë²ì¸¡ì 문ì ì¸ì½ë©ì¼ë¡ ì¸ì½ë©ë URI를 í´ë¼ì´ì¸í¸ 측ìì ëì½ë©í´ì ë³´ì¬ì¤ ìë ìê²ëë¤. (trivialí í´ë¼ì´ì¸í¸ë¼ë©´ ìë²ì¸¡ì ì¸ì½ë©ì 무ìíê³ í´ë¼ì´ì¸í¸ì ì¸ì½ë©ì ì¬ì©í´ì ëì½ë©í¨ì¼ë¡ì¨ ë¶ë¶ì ì¼ë¡ ë³´ì¬ì£¼ë ìë를 í ìë ìì ê²ì´ë¤.)
3ë²ìì ê²½ì°ìë ëëì´ URIë í´ë¼ì´ì¸í¸ì¸¡ì ì¸ì½ë©, ìë²ì¸¡ì ì¸ì½ë©ê³¼ë ë 립ì ì´ê³ , í´ë¼ì´ì¸í¸ì ìë² ëª¨ë ì¶ê°ì ì¸ ì ë³´ìì´ URI를 ì¸ì½ë©íê³ ëì½ë©í ì ìê²ëë¤. ë°ë¼ì, ë¶ê°ì ì¸ ì¤ì ì´ íìíì§ë ìì ë¿ëë¬, URI를 ì¬ì©ììê² ì¹ìí ííë¡ ëì½ë©í´ì ë³´ì¬ì£¼ê¸°ë ì¬ì¸ ê²ì´ë¤. 2ë²ìì ë¹í´ì í¬ê² ì¶ê°ëë ë¹ì©ë ìë¤.
ì¬ê¸°ì íµì¬ì RFC3986ì 2.5ì ìì ì¸ê¸íë¯ì´, URIì ìì±ê³¼ ì ì¡ê³¼ì ììë íë ì´ìì 문ìì¸ì½ë©ì´ ê´ì¬í ì ìë¤ë ê²ì´ë¤. ì´ë¥¼ í´ê²°í기 ìí ê°ì¥ ì§ê´ì ì¸ ë°©ë²ë¤ì ë°ë¡ 문ì ì¸ì½ë©ì ëª ìíê±°ë, íëì íµì¼ë 문ì ì¸ì½ë©ì ì íë ê²ì´ë¤. íì¬ì íì¤ ëª ì¸ì URIì 문ì ì¸ì½ë©ì ëª ìí ì ìë ë©ì»¤ëì¦ì´ ì¡´ì¬íì§ ì기 ë문ì ì¤í ê°ë¥í ê²ì íìì ë°©ìì´ê³ , íëì íµì¼ë 문ì ì¸ì½ë©ì ë°ë¡ UTF-8ì´ ëë ê²ì´ë¤. ê·¸ë¦¬ê³ ê·¸ê²ì´ 3ë²ìì´ ì°ë¦¬ê° ë³´ê³ ìë í´ëµì¸ ì´ì ë¤.
Internet Explorer ìµì
ì ì¸ì¬íê² ë¤ì¬ë¤ë³´ì§ ììëë¼ë, Internet Explorerê° URIë¤ì UTF-8ë¡ ì¸ì½ë©íëë¡ íë ìµì
ì´ ì¡´ì¬íë¤ë ì¬ì¤ì íêµì¸ë¤ìê²ë ì ìë ¤ì ¸ìì ê²ì´ë¤. ìë§ë, ëë¶ë¶ì ì¬ëë¤ì ì´ ìµì
ì êº¼ì¼ íêµì ì¹íì´ì§ë¤ì ì ìì ì¼ë¡ ë¸ë¼ì°ì§í
ì ììë ê²½íì ê°ì§ê³ ìì ê²ì´ë¤. ë¬¼ë¡ , í¹í URIìì Non-ASCII 문ì, ì¦ íê¸ì ì¬ì©íë ê²½ì° ë§ì´ë¤. ì´ì ë ììì ì¤ëª
í 1ë² ë°©ìì´ë 2ë² ë°©ìì í´ë¹íë ì¹ë¸ë¼ì°ì , ì¹ìë²ë¤ì´ ì¹ì ì§ë°°íê³ ìì기 ë문ì´ë¤. ì ì´ë Internet Explorer 5 ë¶í° ì´ ìµì
ì´ ìì§ë§, Non-ASCII 문ì를 í¬í¨íë URIë¤ì ìí´ìë ì´ ìµì
ì ëëë¡ ê¶ì¥íê³ ìë¤.
ë´ ê¸°ìµì¼ë¡ë ì´ ìµì ì´ ì²ì ë±ì¥íì ëë (ìë§ë íê¸íììë§?) 기본ì ì¼ë¡ êº¼ì ¸ììë ê² ê°ë¤. ê·¸ë°ë° ì¸ì ê°ë¶í°ì¸ê° ì´ ìµì ì´ ê¸°ë³¸ì ì¼ë¡ ì¼ì§ë©´ì ë§ì íêµ ì¬ì´í¸ë¤ì 문ì ê° ë°ìíê³ ì´ ë mod_urlì´ ë±ì¥íë¤. mod_urlì UTF-8ë¡ ì¸ì½ë©ëì´ ì¹ìë²ë¡ ë¤ì´ì¤ë URI를 ìíë ì¸ì½ë© (e.g. EUC-KR)ë¡ ë³ííì¬ redirect ìí´ì¼ë¡ì¨ ì¹ ë¸ë¼ì°ì ê° ê°ì ë¡ í¹ì ì¸ì½ë©ì ì¬ì©íëë¡ ë§ëë ì¼ì¢ ì í¸ë¦ì´ìë¤. ì´ë¬í ë°©ìì´ Internet Explorer 6ê¹ì§ë ì ëìíì§ë§, Internet Explorer 7ê° redirectë URIë UTF-8ë¡ ì¸ì½ë©íê² ëë©´ì ì´ í¸ë¦ì ëìíì§ ìê² ëìë¤. ê²°êµ, mod_urlì ì¬ì©í´ 문ì 를 í´ê²°íë ì¹ìë²ë¤ì ë¤ì 문ì ê° ë°ìíê² ëìë¤. (mod_urlì ìì¸í ëì ë°©ìì´ë IE 7ê³¼ ê´ë ¨í 문ì ì ëí´ìë mod_urlê³¼ IE7ì´ë¼ë ê¸ê³¼ ie7 utf-8 bug íê¸ì£¼ì ìì² ë²ê·¸ë¼ë ê¸ì ì°¸ê³ íë¼.) Internet Explorer 7ì ì´ë¬í ë³ê²½ì ‘ë²ê·¸’ë¡ ë¶ë¥´ë ê²ì ì못ë ê²ì´ë¤. Internet Explorer 7ì ì¢ ë íì¤ì í¸íëë ì¡°ì¹ë¥¼ ì·¨íì ë¿ì´ê³ , 기존ì 문ì 를 í¸ë¦ì¼ë¡ í´ê²°í ê³³ë¤ë§ 문ì ê° ë°ìí ê²ì´ë¤.
íì¬ Internet Explorer 7ì 기본ì ì¼ë¡ URI를 UTF-8ë¡ Percent Encodingíë¤. Firefoxë Percent Encodingì íì§ë§, UTF-8ë¡ íë ê²ì´ ìëë¼, ì¤íëë íê²½ì 기본 ì¸ì½ë© (ì를 ë¤ì´, íêµì´ Windowsë¼ë©´ EUC-KR, íëì 리ë ì¤ íê²½ì´ë¼ë©´ UTF-8)ì¼ë¡ Percent Encodingì íë¤. ë°ë©´ì, Percent Encodingì íë ë¶ë¶ììë ë ë¸ë¼ì°ì ë ì°¨ì´ê° ëë¤. Firefoxë URI ì 체를 Percent Encodingíì§ë§, Internet Explorer 7ì ? ì´íì ë¶ë¶ ì¦ query ë¶ë¶ì Percent Encodingíì§ìê³ ê·¸ëë¡ ë³´ë¸ë¤. ê²°êµ, íê¸ì´ queryì í¬í¨ëê³ , ì´ì ëí ì¸ì½ë©ì EUC-KRë¡ ê°ì íê³ ê°ë°í ì¹ì í리ì¼ì´ì ì´ ìë¤ë©´, 리ë ì¤ìì ì¤íë Firefoxììë ì¤ëìí ê±°ë ì기ë¤. ë¬¼ë¡ ë ë¸ë¼ì°ì 모ë ì ì´ì ì ëë¡ ì¸ì½ë© ëì´ìë URLì ê·¸ëë¡ ì²ë¦¬í기 ë문ì, ì´ ë¬¸ì 를 í¼í기 ìí ë°©ë²ì ì ì´ì ë§í¬ë¥¼ Percent Encodingíë ê²ì´ì§ë§, ê·¸ë° ì ëë¡ ì ê²½ì ì´ë¤ë©´ ì ì´ì ì´ë° 문ì ê° ë°ìíì§ë ììì ê²ì´ë¤. ê²°êµ, Internet Explorerì 차기ë²ì , IE8ì´ë IE9 ì¦ììì ì´ ëìë íì¤ í¸íëê² ë³ê²½ëë©´ ê·¸ì ìì¼ ì¬ëë¤ì IE를 ìíë©´ì ì ëë¡ ëì²í ê²ì´ë¤.
ì¬ì´í¸ ë´ì íê¸ì í¬í¨í URIë¤ì UTF-8ë¡ ì¸ì½ë©íë ìì ì íê²ëë©´ ì¬ì©ìë¤ì ê²°êµ ì½ê¸° íë URIë¤ë§ ë³´ê² ëë¤. Internet Explorerì ìííìì¤ìë ëì½ë©ë ííì URI를 ë³´ì¬ì£¼ê¸´ íì§ë§, ì무ë 그곳ì ë³´ì§ ìëë¤. ë§ì½ ì¹ ë¸ë¼ì°ì ë¤ì´ ì¬ëë¤ì´ URI를 ê°ì¥ ì주 ì íë 주ìíìì¤ì ëì½ë©ë ííì URI를 ë³´ì¬ì¤ë¤ë©´, ë¸ë¼ì°ì§ ê²½íì ìë¹í í¥ìë ê²ì´ë¤. http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%ADë³´ë¤ë http://ko.wikipedia.org/wiki/ëí민êµì´ ì¢ì§ ììê°. ì´ë¯¸ 구ê¸ê³¼ ê°ì ê²ììì§ììë ê²ì 결과를 ë³´ì¬ì¤ ë ëì½ë©ë ííë¡ ë³´ì¬ì£¼ê³ ìë¤. (ê²ì ê²°ê³¼ anchorì URIë ì¸ì½ë©ë íí)
ìì§ I18N-awareíì§ ìë ìì¤í
ë¤ì´ ë§ì§ë§ ê°ë°ìë¼ë©´ ì´ì ë¶í°ë¼ë I18Nê³¼ ì¸ì½ë©ì ëí´ì ì ì´í´íê³ ìì´ì¼íë¤. 문ì ì¸ì½ë©ì ê´í ì´í´ê° ë¶ì¡±í ê°ë°ìë¤ì ë무ë ì주 ë³¼ ì ìë¤. ìëë°©ì´ ë¬¸ì ì¸ì½ë©ì ê´í´ 모른ë¤ë©´ ì´ë»ê² URI ì¸ì½ë©ì ëí´ ì¤ëª
ì íê² ëê°. ê·¸ ì¬ëì ê³¼ì° ìì 문ì ë¤ì í¸ë¦ ì´ì¸ì ê²ì¼ë¡ í´ê²°í ì ì
ìê¹. ê°ë°ìì ìì´ì ìì¸ë¡ ì¸ì´ë ë¼ì´ë¸ë¬ë¦¬ì ì¬ì©ë²ì ì¤ìíì§ ìë¤. ì½ê² ë°°ì¸ ì ì기 ë문ì´ë¤. ì¸ì´ë ë¼ì´ë¸ë¬ë¦¬ ì¡°ì°¨ í¼ì ê³µë¶íì§ ëª»íë¤ë©´ ê°ë°ìë¼ë ì§ì
ì ê·¸ë§ëë¼ê³ íê³ ì¶ë¤. ì ì ì¸ê¸íëëë¡ íë¡ê·¸ë머ìê² ê°ì¥ ì¤ìíê³ , êµì¡ ê³¼ì ììë ê°ì¡°ëë©´ìë ì½ê² ì»ì´ì§ì§ë ìê³ , ë ì¸í°ë·°ììë ì무ë ì ê²½ìì°ë ê²ì ë°ë¡ Abstractionì ê´í ê²ë¤ì´ë¤. 기본ì ì¸ ê°ë
ë¤ì ì´í´íì§ ëª»íê³ , ìë¡ì´ ê°ë
ë¤ì ë§ë¤ì´ë¼ ì ìë¤ë©´, ëìíë ê²ì ì ë§ëë ì¸ì¼í°ë¸ë¥¼ ë§ì´ ë°ë ê°ë°ìë ë ì ìì´ë, ë¤ë¥¸ ê°ë°ìë¤ìê² ì¸ì ë°ë íë¥í ê°ë°ìë ë ì ìë¤. ë¬¼ë¡ ì기ë§ì¡±ì´ ì´ëìì ëì¤ëì§ì ê´í ê°ê°ì¸ì ì íì´ê² ì§ë§.
íí¸, URI ì¸ì½ë©ì ê´í ì¬ë¬ê°ì§ 문ì ë¤ì ë³´ë©´ ì¹ ë¸ë¼ì°ì ì ê°ì ì¤ìí ì í리ì¼ì´ì ì ì ëë¡ ëìíë ê²ë ì¤ìíì§ë§, íì¤ì ì¤ìë ì¤ìíë¤ë ê²ì ëë ì ìë¤. ë¹íì¤ì ì¸ íìì íê°ì§ íì©í ëë§ë¤ ì¼ë§ë ë§ì ì¬ëë¤ì´ í¸íì± ë¬¸ì ë문ì 골머리를 ìê³ ë¹ì©ì ëë¹íìê¹. ì ì´ì ëìíë ë²ì ì ë§ë¤ ì ììë¤ë©´ ì무 문ì ê° ìììí ë° ë§ì´ë¤. ì¤ìí ì í리ì¼ì´ì ì¼ ìë¡ íì¤ ì¤ì ì¬ë¶ë ë©´ë°íê² ê´ì°°ëì´ì¼íê³ ì¤ìëì§ ìë ê²ì ë¹íëì´ì¼ ë§ë íë¤.
Java SE 6가 릴리즈되었습니다.
Java 개발자라면 놓치면 안되는 몇가지 중요한 레퍼런스들을 살펴보시죠.
몇가지 코멘트.
Agile 언어들의 생산성은 충분히 입증된 사실입니다. Java를 프로젝트의 주요 언어로 채택하더라도 각종 툴들에서 사용할 Agile 언어의 필요성은 여전히 남아있습니다. 그렇지 않아도 JRuby나 Groovy를 try해보려고 계속 생각 중이었는데, Agile 언어를 좀 더 잘 지원하게 되었다는 것은 반가운 소식입니다.
Apache Derby가 SQLite를 대체할 수 있겠군요.
address resolving 상의 성능 문제 jrockit을 사용하고 있었는데 일반적으로 Java SE 5가 성능이 더 좋다는 것은 처음 알았습니다. (적절한 벤치마크를 해보지도 않았지만.) Java SE 6는 더 좋아졌다니 다행이군요. 현재 개발하고 있는 애플리케이션도 한번 벤치마크를 해보아야할 것 같습니다. 그나저나 Java SE 6에서는 제발 gethostbyname 대신 getaddrinfo를 사용해주었으면 좋겠군요. (소스도 한번 살펴보아야겠습니다.)
SQL을 annotation으로 쓰는 기능은, annotation의 full power를 활용하는 동시에, Object-Relational impedance mismatch를 어느 정도 보완하려는 노력이 엿보이는 것 같습니다. JDBC를 사용하다가 발생하는 오류는 상황별로 자동 복구하는 등의 처리가 매우 힘들었는데, (그래서 기록해두는 수 밖에 없었는데), SQLException이 계층화된 것은 매우 환영할만한 일인 것 같습니다.
그나저나, JDBC 3과의 인터페이스 호환성이 없다는 것이 상당히 짜증스럽군요. (당연히 호환된다면 JDBC 4로 나올 이유도 없을 것 같긴 합니다만.) JDBC 3과 JDBC 4 둘다 지원하기 위한 유일한 방법은 빌드를 분리해서 바이너리를 나누는 수 밖에 없는 것 같습니다. 현재 진행중인 프로젝트라면 가능한 한 Java 6과 JDBC 4로 가는 것이 편하겠죠. 하지만, 안타깝게도 PostgreSQL의 JDBC driver 외에는 아직 공식적으로 JDBC 4를 지원하는 경우가 별로 없는 것 같습니다. 적어도 MySQL Connector/J와 Commons DBCP의 경우에는요. PostgreSQL의 경우에도 새로 추가된 메서드들을 제대로 구현하진 않았더군요. 소외받는 JDBC 4입니다.
뉴스 글에 제목이 있는 한국 뉴스 서비스를 찾기 힘들다. 물론 ‘제목’은 있지만, 그것을 title element로 명기하지 않은 경우를 말한다. 뉴스 서비스 별로 제목을 제대로 다는지 여부를 알아보자.
title element에 제목 달기를 제대로 하는 뉴스 서비스는 극소수에 불과하다. 그나마 제대로 하던 서비스도 (조선일보) 사이트 개편하면서 제목을 없애버렸다.
title element의 중요성에 대해서는 이전의 글에서도 주변에도 누차 얘기해왔다. 상식적으로 제목을 다는 것은, 브라우저간 호환성 이슈처럼 비용 문제가 논쟁 거리가 되는 것은 아니다. 그렇다면 뉴스 글에 대한 제목을 달지 않는 것에 어떤 전략적 의의(이를테면, 검색 엔진에의 노출을 방지하기 위한 목적)가 있는 것인가. 내가 그러한 의의에 대해서 알고 있는 사실은 없으나, 설령 그것이 유효하더라도, 사용자의 모든 불편함을 감수할만큼의 이득이 있는 걸까?
젊은이들이 연기를 하는 것은 그들의 잘못이 아니다. 삶은, 아직 미완인 그들을, 그들이 다 만들어진 사람으로 행동하길 요구하는 완성된 세상 속에 턱 세워놓는다. 그러니 그들은 허겁지겁 이런저런 형식과 모델들, 당시 유행하는 것, 자신들에게 맞는 것, 마음에 드는 것, 등을 자기 것으로 삼는다. ― 그리고 연기를 한다.
La Plaisanterie by Milan Kundera
Why We Write에서 쓰기의 중요성은 충분히 얘기한 것 같다. 소프트웨어 개발에서도 쓰기의 역할과 중요성은 다르지 않다. 하지만, 그 중요성을 인지하지 못하는 경우, 소프트웨어 개발에서는 여러가지 문제들이 발생할 수 있다. 이 글은 쓰지 않는 것이 소프트웨어 개발에 어떤 악영향을 미치는 지에 관한 개인적인 경험을 기술한다. 이 글은 소프트웨어 개발에 있어서 어떤 것을 써야하는가, 어떻게 써야하는가를 다루지는 않는다.
10페이지 내지 100페이지 짜리 Microsoft Word 명세 문서를 써내야한다고 주장하는 것은 아니다. 단 하나의 문장으로 쓰더라도, 명세는 글로 쓰여질 필요가 있다. 구두를 통한 명세와 그 전달은 애초에 명세가 불명확하거나, 그러한 불명확한 점을 쉽게 짚어낼 수 없고, 전달과정에서 왜곡되거나 손실되며, 이후에도 잘못된 점을 알아차리기 힘들다. 반대로, 명세가 글로 쓰여진다면, 처음부터 불명확할 가능성이 줄어들 것이며, 불명확함을 누구든 그것을 읽는 사람이 알아차리기 쉬울 것이며, 적어도 전달과정에서는 왜곡되거나 손실되지 않을 것이며, 나중에 다른 누군가가 보더라도 잘못된 점을 알아차릴 것이다.
구두를 통한 의사소통(직접 대면한 상태의 대화, 전화, 회의)의 커다란 단점 중의 하나는 바로 의사소통 참가자의 시간을 배타적으로 점유한다는 것이다. 의사소통이 언제 어디에서 일어날 것인지가 결정되면, 또는 이미 의사소통이 일어난 후에는, 다른 중요한 일이 있더라도 의사소통의 우선순위를 재조정하기는 매우 힘들다는 것이다. 쓰기를 통한 의사소통은 그렇지 않다. 의사소통의 참가자들은 자신이 원하는 시간과 장소를 사용할 수 있다. 우선순위의 조정이 매우 자유롭다. 물론, 구두를 통해서만 할 수 있는 활동(즉각적인 피드백, 상대방 의지의 확인 등)이 존재하기 때문에, 모든 의사소통이 쓰기를 통해야한다는 것은 아니다. 다만, 구두를 통해서만 할 수 있는 활동이 아닐 경우에는 쓰기를 선호해야한다는 것이다.
특정 시간과 장소에 국한된다는 구두를 통한 의사소통의 단점에서 파생되는 다른 문제는 바로 참여한 당사자 외에는 의사소통의 내용을 알기 힘들다는 것에 있다. 회의록을 남기는 이유는 바로 이러한 문제를 해결하기 위한 것이다. 공식적인 회의가 아니라고 하더라도 구두를 통한 의사소통을 쓰는 것은 같은 이유로 중요하다.
쓰기가 없는 구두를 통한 의사소통이 비효율적인 점을 보여주는 단편적인 예로, 한사람과 의사소통한 내용을, 다른 한 사람, 그리고 또 한 사람 이렇게 차례대로 의사소통하는 경우를 볼 수 있다. 그야말로 코미디가 아닌가.
쓰지 않는 조직해서 흔히 볼 수 있는 광경은 다음과 같은 것이다.
“이렇게 하기로 결정/생각/디자인했었는데, 실제로 반영/작업/구현을 했었던가?”
“대체 왜 우리가 그런 결정을 했더라?” “내가 왜 그렇게 작업/디자인/구현했지?”
한달 내지는 두달 만에 끝나고 다시는 쳐다보지 않을 소프트웨어 개발 프로젝트에서는 이러한 경우는 별로 없다. 하지만, 단기 프로젝트가 아니라면, 현대의 소프트웨어 개발의 특성상 환경과 요구사항은 빠르게 변화하기 때문에, 과거의 결정을 회고하고 다시 결정해야하는 경우가 자주 발생한다. 쓰지 않는 조직은 그 때마다 위와 같은 질문들을 하기 마련이다.
쓰는 것의 가장 본질적인 이유 중의 하나는 인간의 기억력을 (일반적으로는 정신적인 능력을) 신뢰할 수 없고(unreliable), 기억은 (정신적인 활동은) 왜곡되기 쉽상(volatile)이기 때문이다. 문학의 경우에는 우리가 쓰는 것 자체나 또는 쓰는 것의 결과물을 읽음으로서 오는 어떤 종류의 카타르시스를 즐기기 위한 목적도 있을 수 있다. 소프트웨어 개발에 있어서는, 일반적으로 과학적인 연구나 엔지니어링에 있어서는 전자가 그 목적일 것이다.
쓰는 것은, 인간 능력의 한계라는 본질적인 한계에서 파생되는 문제들을 해결하고 있는데, 그 중의 가장 중요한 것들은 바로, 사고의 도구로서의 쓰기, 의사소통의 도구로서의 쓰기, 회고의 도구(기록)로서의 쓰기가 있다.
사고의 대상에 대한 기억이 없다면, 더 나아가서 기억력이 없다면 우리는 사고할 수 없다. 합리적인 사고의 과정은 일련의 사고 내용을 기억하는 단계를 포함한다. 대부분의 단순한 사고의 과정에서는 인간의 (한계를 가진) 기억력만으로도 충분하다. 하지만, 좀 더 복잡한 사고를 필요로 하는 경우에는 인간의 한계를 드러내기 시작해서, 사고의 과정은 끊겨버리거나, 잘못된 방향으로 나아가서 왜곡되어버리거나, 불충분 할 수 있다. 물론 그러한 한계는 개인적으로 다르고, 천재의 경우에는 그러한 어려움을 겪지 않을 수도 있으나, 일반적으로는 그렇지 않다.
쓰는 것은 이러한 어려움을 해결해주는 역할을 한다. 사고와 쓰기를 병행할 경우, 기억의 단속이나 왜곡을 막아주기 때문에, 우리는 사고의 대상과 내용, 방향을 정확히 유지할 수 있으며, 특히 과학적(또는 수학적) 사고에서 중요한, 모든 가능성을 타진하는 과정을 제대로 수행할 수 있다.
의사소통 과정에서의 정보의 손실과 왜곡은 의사소통을 필요로 하는 모든 조직의 골칫거리다. 과학적인 연구 또는 엔지니어링에 있어서의 의사소통은 일반적으로 사고를 동반하므로 의사소통에서의 기억력이 차지하는 비중과 역할은 사고의 경우와 같다.
쓰기는 협업 사고의 도구로서만 의사소통에 작용하는 것이 아니라, 의사소통의 방식에도 관여해서 비동기적인 의사소통을 가능하게 해준다. 대부분의 구두를 통한 의사소통은 시간과 장소를 참가자들에게서 배타적으로 점유하는 동기적인 의사소통 방식이다. 동기적인 의사소통 방식은 시간과 장소를 공유하지 않는 사람은 의사소통에 참가할 수 없다는 단점을 내포한다. 물론, 참가자들의 의지를 확인할 수 있다거나 피드백이 빠르다는, 동기적인 의사소통 방식에 고유한 장점도 존재한다. 하지만, 장점만을 취할 수 없게 만드는 단점이 있기 때문에, 시간과 장소라는 자원이 부족한 현대인은 가능한 한 비동기적인 의사소통방식을 선호하는 것이 합리적이다.
인간의 장기적인 기억력이 단기적인 기억력에 비해서 결코 더 믿을 수 없다는 것을 생각하면, 그리고 회고를 일종의 ‘장기간에 걸친 느린 사고’로 본다면, 회고에 있어서의 기억력의 비중과 역할은 사고의 경우와 같다고도 볼 수 있다.
하지만, 회고를 필요로 하는 종합적인 사고는 필요로 하는 기억들의 항목들이 더 많을 가능성이 높고, (기억들의 항목이 많으면 그들을 ‘모두’ 기억할 가능성이 낮아진다는 전제하에) 쓰기의 중요성은 사고의 도구로서의 경우보다 더 크다고 볼 수도 있다.
쓰기는 인간의 한계, 특히 기억력에 있어서의 한계를 보완하기 위한 중요한 도구다. 사고, 의사소통, 회고는 모두 이러한 인간의 한계가 제약하는 중요한 활동들이다. 쓰기는 이러한 활동을 효율적이고 정확하게 수행하는데 중요한 역할을 한다.