<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="html">Go! Bbuwoo</title>
  <id>http://my.oops.org/</id>
  <link rel="alternate" type="text/html" hreflang="ko" href="http://my.oops.org/" />
  <subtitle type="html">뭘 이런걸..</subtitle>
  <updated>2010-08-13T21:51:30+09:00</updated>
  <generator>Textcube 1.7.8 : Con moto</generator>
  <entry>
    <title type="html">요즘 근황</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/138" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/138" thr:count="0"/>
    <category term="주절주절" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/138</id>
    <updated>2010-08-13T21:26:08+09:00</updated>
    <published>2010-08-13T21:26:08+09:00</published>
    <summary type="html">지인께서 이제 블러그 관리 안하시냐고 물어 보시길래.. 글 올린지가 꽤 되었구나 해서.. 일단 근황을 한번 올려 봅니다.&lt;br /&gt;
&lt;br /&gt;
요즘은 다들 twitter를 이용하여 근황 관리를 하시던데, 전 왠지 me2day도 그렇고 twitter도 그렇고 별로 와닿지를 않습니다. 그리고 blog도 관리를 못해서 허덕이는데, 또 다른것을 펼치기도 그렇고 해서.. 사용하고 있지 않습니다. 그러니 근황도 blog를 통해서 하게 되는 군요.&lt;br /&gt;
&lt;br /&gt;
요즘 초 필살 살인 스케줄에 시달리고 있습니다. D-day가 5일 남았는데(주말 빼면 3일 남았죠), 아직 정해진 것이라고는 D-day는 08/18 이다.. 입니다. T.T 10년을 넘게 일하면서 이런 스케줄은 정말 돌아버리겠군요. 요즘은 메일을 보면 메일의 문자가 한글이라는 것만 인식이 될 정도로 인지력까지 떨어진 상태입니다.&lt;br /&gt;
&lt;br /&gt;
그러다 보니, TB 3.0 작업도 못하고 (석찬님이 대신 해 주셨습니다.) 못한다고 연락도 못드렸군요. 더불어 안녕 리눅스 2.0 작업도 석달때 손 놓고 있는 상황 (이건.. 머 몇 년전 부터이니.. 새삼스럽지도 않지만 ^^)&lt;br /&gt;
&lt;br /&gt;
이 프로젝트가 앞으로도 3달 정도는 더 확장될 예정인데.. 요즘은 정말 좌절 스럽습니다. 같이 근무하던 분이 휴가 쓰신다고 하시니까 화가 나더군요 :-)</summary>
  </entry>
  <entry>
    <title type="html">Firefox 확장에서 New Window POST/Referrer 제어</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/137" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/137" thr:count="0"/>
    <category term="Mozilla" />
    <category term="extension" />
    <category term="Firefox" />
    <category term="Firefox Extension" />
    <category term="Post" />
    <category term="Referrer" />
    <category term="window.open" />
    <category term="window.openDialog" />
    <category term="확장" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/137</id>
    <updated>2010-02-17T12:53:48+09:00</updated>
    <published>2010-02-17T12:53:14+09:00</published>
    <summary type="html">이번에는 이전 &lt;a href=&quot;/136&quot;&gt;&quot;Firefox 확장에서 New Tab POST/Referrer 제어&quot;&lt;/a&gt;에 이어 New Window로 POST data제어와 Refferer를 제어하는 방법에 대해서 논하도록 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
보통 javascript 에서 새 창을 띄울 경우 &lt;b&gt;windows.open&lt;/b&gt;을 사용합니다. Firefox extension에서도 마찬 가지 입니다. 하지만 &lt;b&gt;windows.open&lt;/b&gt;을 이용할 경우, referrer를 제어할 수가 없습니다. 또한 Post data를 제어를 하려면 상당히 귀찮습니다. --; Post data를 제어하는 예제를 보시죠.&lt;br /&gt;
&lt;br /&gt;
&lt;p id=&quot;more137_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;137_0&#039;,&#039; window.open으로 새 창으로 열기 &#039;,&#039; less.. &#039;); return false;&quot;&gt; window.open으로 새 창으로 열기 &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content137_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;code&gt;var page = window.open (
        &#039;about:blank&#039;, &#039;winID&#039;,
        &#039;fullscreen=no&#039; +
           &#039;resizable=yes&#039; +
           &#039;toolbar=no&#039; +
           &#039;menubar=no&#039; +
           &#039;width=600&#039; +
           &#039;height=400&#039; +
           &#039;localtion=no&#039;
);

var doc = page.content.document;
var formElement = doc.createElement (&#039;form&#039;)

formElement.setAttribute (&#039;method&#039;, (method == &#039;POST&#039;) ? &#039;post&#039; : &#039;get&#039;);
formElement.setAttribute (&#039;action&#039;, url);
formElement.setAttribute (&#039;style&#039;, &#039;display: none;&#039;);

var firstElement = doc.createElement (&#039;input&#039;);
firstElement.setAttribute (&#039;name&#039;, &#039;first&#039;);
firstElement.setAttribute (&#039;name&#039;, first_value);
formElement.appendChild (firstElement);

var secondElement = doc.createElement (&#039;textarea&#039;);
secondElement.setAttribute (&#039;name&#039;, &#039;second&#039;);
secondElement.value = second_value;
formElement.appendChild (secondElement);

doc.body.appendChild (formElement);
form.Element.submit ();&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
이 코드는 javascript 에서도 아마 사용이 가능 할 겁니다. 하지만, 얼마나 괴로울까요? 일단 &lt;b&gt;about:blank&lt;/b&gt;로 새 창을 열고, 이 창에 DOM을 이용해서 form을 생성 시켜서 데이터를 post 또는 get으로 제어를 해야 합니다.&lt;br /&gt;
&lt;br /&gt;
Translate To Korean 재작성을 하면서 Post 데이터를 처리하기 위해서 열라 검색을 해서 이런 코드를 만들었는데, referrer 처리도 안되고 openNewTabWith 와 object 호환도 안되서 코드가 난장 직전까지 가다 보니, 도저히 이렇게 사용을 할 수는 없겠더군요. 그래서 역시 Firefox source를 또 뒤져 보았습니다.&lt;br /&gt;
&lt;br /&gt;
역시나, &lt;b&gt;openNewTabWith&lt;/b&gt; API 아래에 &lt;b&gt;openNewWindowWith&lt;/b&gt;라는 API가 존재를 하는 군요. &lt;b&gt;openNewTabWith&lt;/b&gt; API 처럼 Post와 referrer를 모두 제어할 수 있도록 되어 있습니다. 그런데 문제는 창 속성을 지정을 할 수 있는 인자가 없습니다. 즉 무조건 새창을 현재창 크기로 띄워야만 하는 군요. 그래서 API 코드를 열어서 어떻게 사용하는지를 확인해 보았고 다음과 같은 코드를 만들어 낼 수 있었습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;p id=&quot;more137_1&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;137_1&#039;,&#039; Firefox API로 새 창으로 열기 &#039;,&#039; less.. &#039;); return false;&quot;&gt; Firefox API로 새 창으로 열기 &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content137_1&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;code&gt;var url = &#039;http://some.domain.com/action&#039;;
var referer = &#039;http://some.doamin.com&#039;;
var post = &#039;first=1&amp;second=&#039; + encodeURIComponent (somtext);

if ( method == &#039;Get&#039; ) {
    url += &#039;?&#039; + post;
    post = null;
} else {
    post = getPostStream (post, null, null, &#039;application/x-www-form-urlencode&#039;);
}

var page = window.openDialog (
        &#039;chrome://browser/contetn/&#039;,
        &#039;winID&#039;,
        &#039;fullscreen=no&#039; +
           &#039;resizable=yes&#039; +
           &#039;toolbar=no&#039; +
           &#039;menubar=no&#039; +
           &#039;width=600&#039; +
           &#039;height=400&#039; +
           &#039;localtion=no&#039;,
        url,
        &#039;UTF-8&#039;,
        makeURI (referer),
        post,
        false;
);&lt;/code&gt;&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">Firefox 확장에서 New Tab POST/Referrer 제어</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/136" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/136" thr:count="0"/>
    <category term="Mozilla" />
    <category term="extension" />
    <category term="Firefox" />
    <category term="Firefox Extension" />
    <category term="loadOneTab" />
    <category term="openNewTabWith" />
    <category term="Post" />
    <category term="Referrer" />
    <category term="확장" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/136</id>
    <updated>2010-02-17T12:53:46+09:00</updated>
    <published>2010-02-17T12:26:19+09:00</published>
    <summary type="html">요즘 Translate To Korean을 rewrite 하고 있습니다. 이번 작업에서 두가지를 처리하려고 하는데 하나는 GET으로 정보를 전달 하던 것을 POST method를 이용할 수 있도록 하는 것과, referer로 막는 것을 방지하기 위하여 referer를 처리할 수 있도록 하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
Firefox에서 이미 이를 위한 API를 제공하는데, 이에 대한 문서가 충분하지 않아 기록을 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;p id=&quot;more136_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;136_0&#039;,&#039; 새 탭으로 열기 &#039;,&#039; less.. &#039;); return false;&quot;&gt; 새 탭으로 열기 &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content136_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;Firefox에서 새 탭을 열기 위해서는 다음의 API를 이용 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;openNewTabWith (aURL, aDocument, aPostData, aEvent, aThridPartyFixup, aReferrer)

aURL             : connected url
aDocument        : 현재 url
aPostData        : Post data or null
aEvent           : browser event
aThirdPartyFixup : send event to Third Party
aReferrer        : user defined referrer
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
대충 보시면 이해가 가실 것이고, 여기서 확인할 것은 &lt;span class=&quot;em&quot;&gt;aPostData와 aDocument, aReferrer&lt;/span&gt; 입니다. 일반적으로 새탭만 제어를 할 경우라면 &lt;span class=&quot;em&quot;&gt;aEvent&lt;/span&gt;와 &lt;span class=&quot;em&quot;&gt;aThirdPartyFixup&lt;/span&gt;은 false 값을 사용하시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
Post data를 제어하기 위해서는 &lt;span class=&quot;em&quot;&gt;aPostData&lt;/span&gt; 인자를 이용하는데, &lt;b&gt;openNewTabWith&lt;/b&gt;는 &lt;span class=&quot;em&quot;&gt;aPostData&lt;/span&gt; 가 null 일 경우 Get Method를 이용하게 되며, &lt;span class=&quot;em&quot;&gt;aPostData&lt;/span&gt; 값이 존재할 경우, Post Method로 탭을 열게 됩니다. 간단하게 사용하는 예를 보도록 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var url = &#039;http://some.domain.com/action&#039;;
var referer = &#039;http://some.doamin.com&#039;;
var post = &#039;first=1&amp;second=2&amp;third=3&amp;text=&#039; + encodeURIComponent (somtext);

if ( method == &#039;Get&#039; ) {
    url += &#039;?&#039; + post;
    post = null;
} else {
    post = getPostStream (post, null, null, &#039;application/x-www-form-urlencode&#039;);
}

openNewTabWith (url, null, post, false, false, makeURI(referrer));
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
위의 예는 간단하게 openNewTabWith로 POST/GET method를 제어 하는 예제 입니다. post data의 경우 &lt;b&gt;getPostStream&lt;/b&gt; API를 이용하여 처리를 해 주어야 하는 점이 key point 입니다. Post 방식에는 application/x-www-form-urlencode 방식 외에 multipart/form-data 를 이용할 수 있고, 저의 경우 multipart/form-data를 선호하는데, 이 방법을 어떻게 처리해야 하는지에 대해서는 아직 저도 알아내지 못했습니다. :-)&lt;br /&gt;
&lt;br /&gt;
다음은 referrer 처리에 대해서 말해 보고자 합니다. &lt;b&gt;openNewTabWith&lt;/b&gt;의 referrer는 2번째 인자인 &lt;span class=&quot;em&quot;&gt;aDocument&lt;/span&gt; 입니다. 그런데 &lt;b&gt;openNewTabWith&lt;/b&gt; API 내부에서 &lt;span class=&quot;em&quot;&gt;aDocument&lt;/span&gt;를 현재 브라우저 창의 URL로 제한을 하고 있습니다. 코드상에서는 security 이슈로 막는 듯 싶습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;if (aDocument)
    urlSecurityCheck(url, aDocument);
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
그런데, 우리는 가짜 referrer를 처리하기 위함인데, 이렇게 되면 referrer 처리를 할 수가 없게 됩니다. 그런데 코드를 잘 보다 보니&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var referrerURI = aDocument ? aDocument.documentURIObject : aReferrer;
&lt;/code&gt; &lt;br /&gt;
&lt;br /&gt;
요런 라인이 보입니다. 즉 마지막 인자에 string으로 원하는 referrer를 넣어주면 되는 것입니다. 즉, 두번째 인자인 &lt;span class=&quot;em&quot;&gt;aDocument&lt;/span&gt;를 null로 처리하고, 여섯번째 인자에 원하는 url을 referrer로 넣어 주시면 해결이 됩니다.&lt;br /&gt;
&lt;br /&gt;
이렇게 하면 새 탭으로 referrer 처리와 Post data의 제어를 할 수 있게 되었습니다만, 한가지 문제가 또 있습니다. &lt;b&gt;openNewTabWith&lt;/b&gt; API를 사용하게 되면 새 탭이 background에서 뜨게 됩니다. 탭을 띄우고 새로 open된 탭이 foreground로 오게 하고 싶은데, 이게 안되는 것이죠. &lt;b&gt;openNewTabWith&lt;/b&gt;은 background/foreground 제어를 할 수 있는 인자가 없기 때문입니다. 그래서 이를 위해서 API를 하나 더 깊게 들어가서 사용하는 수 밖에 없습니다. 위의 예제에 대해서 탭이 foreground로 뜨게 하는 코드의 예제를 보여 드립니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;var url = &#039;http://some.domain.com/action&#039;;
var referer = &#039;http://some.doamin.com&#039;;
var post = &#039;first=1&amp;second=2&amp;third=3&amp;text=&#039; + encodeURIComponent (somtext);

if ( method == &#039;Get&#039; ) {
    url += &#039;?&#039; + post;
    post = null;
} else {
    post = getPostStream (post, null, null, &#039;application/x-www-form-urlencode&#039;);
}

gBrowser.loadOneTab (url, makeURI(referrer), &#039;UTF-8&#039;, post, false, false);
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
와 같이 하시면 tab이 foreground로 뜨게 됩니다. &lt;b&gt;loadOneTab&lt;/b&gt;에 대해서는 직접 찾아 보시기 바랍니다. :-)&lt;br /&gt;
&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">&quot;Translate To Korean&quot; on Sunshine</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/134" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/134" thr:count="1"/>
    <category term="Mozilla" />
    <category term="extension" />
    <category term="Firefox" />
    <category term="Firefox Extension" />
    <category term="Mozilla" />
    <category term="Mozilla Firefox" />
    <category term="Translate" />
    <category term="Translate Korean" />
    <category term="Translate To Korean" />
    <category term="번역" />
    <category term="웹번역" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/134</id>
    <updated>2010-02-10T15:58:24+09:00</updated>
    <published>2010-02-10T15:58:15+09:00</published>
    <summary type="html">제가 관리하고 있던 &quot;Translate To Korean&quot; Firefox 확장이 드디어 http://addons.mozilla.org의 sendbox를 탈출하게 되었습니다. 작년에 한번 시도했다가 code review에서 고배를 먹고, 이번에 Worldlingo 번역 URL이 변경되어 이를 수정하다가, 코드를 다시 가이드대로 재작성 하여 제출을 했었는데, 오늘 Congratulations 메일이 왔습니다.&lt;br /&gt;
&lt;br /&gt;
sandbox 탈출의 의미는 현재 부가기능에서 업데이트 찾기가 되지 않는 문제가 Mozilla Addons 를 통해서 가능해 졌다는 점이 가장 의미가 있겠네요.&lt;br /&gt;
&lt;br /&gt;
앞으로 Translate To Korean을 관리하던 http://oops.org/project/Firefox/Extension/translatekorean/ 은 유지하지 않고, Mozilla Addon에서 정식으로 유지를 하는 것으로 하려고 합니다. 그리고 여기서 받은 버전은 Mozilla Addons 사이트에서 받으신 것으로 설치를 해야지 업데이트 찾기가 가능해 집니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래는 메일 전문 입니다. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box&quot;&gt;&lt;p&gt;Congratulations! Your nominated add-on, Translate to Korean, has been reviewed by a Mozilla Add-ons editor who approved your add-on to be public.&lt;/p&gt;
&lt;p&gt;
Your most recent version (1.7.0) has also been made public.&lt;/p&gt;
&lt;p&gt;
You can view your public add-on now at: http://addons.mozilla.org/addon/7919&lt;/p&gt;
&lt;p&gt;
Review Information:&lt;br /&gt;
Reviewer: Raymond Lee&lt;br /&gt;
Comments: Congratulations, your add-on has been approved for public status. Due to caching and mirroring of AMO, it may take a couple of hours for your add-on to appear public, so please be patient.&lt;/p&gt;
&lt;p&gt;
Keep up the good work!&lt;/p&gt;
&lt;p&gt;
If you have questions about this review, please reply to this email or join #addons on irc.mozilla.org.&lt;/p&gt;
&lt;p&gt;
Mozilla Add-ons&lt;br /&gt;
http://addons.mozilla.org&lt;/p&gt;
&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">Cygwin on Windows 7</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/133" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/133" thr:count="0"/>
    <category term="Tip &amp; Trick" />
    <category term="run.exe" />
    <category term="Windows 7" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/133</id>
    <updated>2009-12-25T03:51:38+09:00</updated>
    <published>2009-12-24T03:01:11+09:00</published>
    <summary type="html">노트북도 하나 사고, 덩달아 Windows 7 Machine이 하나 생기게 되었습니다. OS를 64bit로 신청했는데 32bit로 온것 빼고는 그리 나쁘지 않더군요. 연말까지 휴가고 해서 회사 notebook을 과감히 Windows 7 64bit로 설치를 해 버렸습니다.&lt;br /&gt;
&lt;br /&gt;
그런데 난리가 나 버렸군요.&lt;br /&gt;
&lt;br /&gt;
제가 사용하는 환경은 Windows 기반에 cygwin + hanterm-xf 또는 portable ubuntu 환경을 사용합니다. 그런데 일단 Cygwin + hanterm-xf환경에서.. Windows 7에서 run.exe를 실행 할 때 cmd 창이 hidden 처리가 되어야 하는데, 되지를 않는 문제가 있더군요. 즉, hanterm 창 하나에 cmd 창이 하나씩 따라 열립니다. --; (엄격히 말하면 cmd 창이 열려서 hanterm-xf.exe를 실행하고 닫혀야 하는데 - 이게 run.exe가 하는 일이죠.) 그래서 이젠 오랫동안 사용한 cygwin + hanter-xf 환경은 버리고, portable ubuntu에 정착을 하자고 마음을 먹고 있었는데.. Windows 7 64bit 에서 colinux가 동작하지 않는다는 것을 까먹고 있었습니다. 그래서 어떡하든 cygwin을 해결해야 하는 상황이 되었습니다.&lt;br /&gt;
&lt;br /&gt;
일단 cygwin homepage를 보니 cygwin 1.7 부터 Windows 7을 지원한다고 하고, 11월 말이나 12월 초에 릴리즈 할 거라고 적어 놓고선.. 왜 안하고 있지 하고 열심히 기다리고 있는데, 어제부로 cygwin 1.7이 릴리즈 되어 얼씨구나 하고 업데이트를 했지만 동일한 증상이 나타나더군요.&lt;br /&gt;
&lt;br /&gt;
열심히 googling을 하다 보니.. 이미 메일링 리스트(http://www.cygwin.com/ml/cygwin-apps/2009-08/msg00018.html)에 이슈가 되어 있었으나, 개발자는 해당 패치를 거부한 모양 입니다. 혹시나 싶어서 이 패치를 적용해 보니.. ㅎㅎ 잘 되더군요.&lt;br /&gt;
&lt;br /&gt;
혹시 비슷한 문제를 겪으시는 분들을 위해서.. 포스팅 합니다. 해당 패치가 된 run package는 ftp://mirror.oops.org/pub/Cygwin/pcakages/run/ 에서 받으실 수 있습니다. (웹 브라우저로 접근이 잘 안될 겁니다. ftp client를 이용하세요.) Windows 7 이 아닌 경우에는 받으실 필요 없습니다.&lt;br /&gt;
&lt;br /&gt;
받으신 후에&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;
shell&gt; tar xvfpj run-1.1.12-11.tar.bz2 -C /
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
명령으로 설치가 가능 합니다. (한마디로 덮어 씌우는 거죠 ^^)</summary>
  </entry>
  <entry>
    <title type="html">KRNIC data 긁어오기</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/132" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/132" thr:count="4"/>
    <category term="Tip &amp; Trick" />
    <category term="cookie" />
    <category term="curl" />
    <category term="krnic" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/132</id>
    <updated>2009-12-04T18:54:40+09:00</updated>
    <published>2009-12-04T18:52:13+09:00</published>
    <summary type="html">저번달에 비해 KRNIC (정확하게는 kisa.or.kr 이죠) data를 가져오려다 보니, access 제한을 걸어 놓았더군요. 처음 접속했을 때 특정 쿠키가 없으면 쿠키를 set하고 reload 하도록 되어 있는데, 문제는 이걸 javascript 로 처리해 놓았다는 것 입니다. 즉 java script를 지원하지 않는 w3m, wget, links, lynx 같은 브라우저들은 접근 조차 할 수 없다는 얘기이죠.&lt;br /&gt;
&lt;br /&gt;
libkrisp가 KRNIC data를 이용해서 parsing 하는 것이라서 script 화를 해 놓았는데, 이 스크립트가 작동하지 않아서 보니.. 이런 변경 사항이 있었습니다. 그래서.. 뚫을 수 있는 스크립트를 다시 만들어 보았습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;
Class KRNIC_data {
    static public $useragent = &#039;Mozilla/4.0 &#039; .
                               &#039;(compatible; MSIE 6.0; Windows NT 5.1; &#039; .
                               &#039;.NET CLR 1.1.4322; .NET CLR 2.0.50727)&#039;;

    function get ($url) {
        if ( false === ($cookie = self::getCookie ($url)) )
            return false;

        if ( false === ($data = self::getPage ($url, $cookie)) )
            return false;

        return $data;
    }

    function getPage ($url, $cookie = &#039;&#039;) {
        $c = curl_init ($url);

        curl_setopt ($c, CURLOPT_URL, $url);
        curl_setopt ($c, CURLOPT_TIMEOUT, 60);
        curl_setopt ($c, CURLOPT_NOPROGRESS, 1);
        curl_setopt ($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($c, CURLOPT_USERAGENT, self::$useragent);

        $src = array (&#039;!http[s]?://!&#039;, &#039;!/.*!&#039;);
        $dst = array (&#039;&#039;, &#039;&#039;);
        $host = preg_replace ($src, $dst, $url);

        $header[] = &#039;Host: &#039; . $host;
        #$header[] = &#039;Excpet:&#039;;

        curl_setopt ($c, CURLOPT_HEADER, 0);
        curl_setopt ($c, CURLOPT_NOBODY, 0);
        curl_setopt ($c, CURLOPT_HTTPHEADER, $header);
        curl_setopt ($c, CURL_FAILONERROR, 1);

        curl_setopt ($c, CURLOPT_SSL_VERIFYPEER, false);

        if ( $cookie )
            curl_setopt ($c, CURLOPT_COOKIE, $cookie);

        $data = curl_exec($c);

        if ( empty ($data) ) {
            error_log (&#039;Error: &#039; . curl_error ($c), 0);
            return false;
        }
        curl_close ($c);

        return $data;
    }
    function getCookie ($url) {
        $data = self::getPage ($url);
        preg_match (&#039;/(_accessKey2=[^\&#039;]+)\&#039;/&#039;, $data, $m);

        if ( ! trim ($m[1]) ) {
            error_log (&#039;Error: Can\&#039;t get krnic cookies =&gt; &#039; . $m[1], 0);
            return false;
        }

        return $m[1];
    }
}

$site = &#039;https://ip.kisa.or.kr/ip_cate_stat/stat_05_04_toexcel.act&#039;;
echo KRNIC_data::get ($site);
exit (0);
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
이 스크립트를 작동 하시기 위해서는 curl extension 이 필요 합니다.</summary>
  </entry>
  <entry>
    <title type="html">Thunderbird 3 일정..</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/131" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/131" thr:count="1"/>
    <category term="Mozilla" />
    <category term="Mozilla" />
    <category term="Mozilla Thunderbird" />
    <category term="Thunderbird" />
    <category term="썬더버드" />
    <category term="천둥새" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/131</id>
    <updated>2009-10-03T04:23:06+09:00</updated>
    <published>2009-10-03T04:23:01+09:00</published>
    <summary type="html">&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1278910054.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1278910054.jpg&quot; width=&quot;200&quot; height=&quot;293&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt; About Thunderbird 3 &lt;/p&gt;&lt;/div&gt;Thunderbird 3 작업을 벌써 1여년을 끌고 가는 것 같네요.&lt;br /&gt;
&lt;br /&gt;
이 놈의 Thunderbird가 참 사람을 괴롭힙니다. 원래 5월에 RC가 나왔어야 하는 상황인데, 계속 연기가 되더니, 11/3에 RC1이 build 될 계획입니다. rc3 - 4 정도 까지 갈거라고 예상을 한다면, 아마 정식 release는 내년 중반은 되어야 하지 않을까 예상이 됩니다.&lt;br /&gt;
&lt;br /&gt;
다만, 안습인 상황은.. &lt;a href=&quot;https://wiki.mozilla.org/Thunderbird/StatusMeetings/2009-09-29&quot;&gt;Stuats Meeting&lt;/a&gt; 에 따르면 l10n string freeze가 9/29 인데, 아직도 영문 string이 freeze 되지 않은 듯 싶습니다. beta 4가 나왔는데도 불구하고, string 변경 사항이 거의 60-70개 짜리 bug track issue가 등록이 되고 있습니다. --;&lt;br /&gt;
&lt;br /&gt;
Firefox의 경우 Beta 가 출시 되면 string쪽은 거의 변경이 되지 않습니다. 큰 변경이 있어야 할 것 같으면 다음 버전으로 넘겨 버리는데, Thunderbird는 2.0출시 이후, 만 2년만에 나오는 release라서 그런지, Beta 단계에서도 string쪽 변경이 무지하게 빈번하게 진행이 되고 있습니다. 덕분에 따라가는 l10n 커미터들만 죽어나갈 뿐이죠. ^^;&lt;br /&gt;
&lt;br /&gt;
그래도, 문맥을 알 수 없는 부분을 확인하기 위해서 Thunderbird 3의 구석구석에 있는 기능들을 다 까보게 되었는데, Thunderbird 3은 기대할 만 한 듯 싶습니다. 아직도 약간의 버그가 수시로 보이기는 하지만 새로 지원하는 기능들 중 아쉬웠던 부분을 긁어주는 것들이 꽤 되는 것 같습니다. 특히 검색의 경우에는, UI가 한국 실정에는 좀 헷갈리기는 하지만 상당히 신경써서 만든 듯 싶군요.&lt;br /&gt;
&lt;br /&gt;
아직 10개월 정도 더 고생해야 할 듯 싶기는 합니다만.. 그냥 궁금하신 분이 있으실까 중간에 살짝 끄적여 보았습니다.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
흠.. 전 FF 번역을 도와 주는데, channy님은 TB 번역을 도와주지 않는 군요. --; 벌써 FF 3.6 beta 1 작업을 시작해 버렸습니다. TB는 또 저 혼자 계속 해야 할 듯.. (FF 3.5를 제가 하다가 말았더니, channy님이 TB beta 1 까지만 하고 도와주고 있지 않으십니다. T.T&lt;br /&gt;
</summary>
  </entry>
  <entry>
    <title type="html">안녕 리눅스 openssh 기능 추가</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/130" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/130" thr:count="0"/>
    <category term="안녕리눅스" />
    <category term="AnNyung" />
    <category term="AnNyung LInux" />
    <category term="Annyunglinux" />
    <category term="안녕 리눅스" />
    <category term="안녕리눅스" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/130</id>
    <updated>2009-10-02T20:35:44+09:00</updated>
    <published>2009-10-02T20:33:00+09:00</published>
    <summary type="html">이미 추가된지는 오래된 패치들이기는 하지만, 따로 announce를 하지 않아 모르는 분들이 많은 안녕 리눅스만의 패치에 대한 글들을 포스팅 해 보려고 합니다.&lt;br /&gt;
&lt;br /&gt;
오늘 첫번째로는 안녕 리눅스에 포함된 openssh의 추가 사항을 보도록 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
1. Skip host key check&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;sub-block&quot;&gt;보통 ssh로 접속할 때 ssh client는 접속할 host에서 host key를 받아서 ~/.ssh/known_hosts 파일에 기록을 해 놓습니다. 이 이유는, 오타로 다른 호스트에 접근을 하거나 또는, 어떤 host가 자신을 접속하려는 host라고 속이는 것을 방지하기 위함이 목적입니다. 그러므로 접근 하려는 호스트가 known_hosts 파일에 등록이 되어 있지 않을 경우 다음과 같이 confirm을 하게 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;[root@work ~]# ssh domain.com&lt;br /&gt;
The authenticity of host &#039;domain.com (12.0.0.1)&#039; can&#039;t be established.&lt;br /&gt;
RSA key fingerprint is fe:de:8d:34:27:82:7c:42:09:16:0f:34:33:dd:72:d9.&lt;br /&gt;
Are you sure you want to continue connecting (yes/no)? &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
참 좋은 기능임에는 틀림이 없으나, ssh notty를 이용하여 여러 서버에 동일한 명령을 내리기 위해서 script같은 것을 사용할 때, 이게 걸리면 무지하게 불편합니다. 300대의 서버에 명령을 내리려면.. 300번 엔터를 입력해야 하니까요...&lt;br /&gt;
&lt;br /&gt;
그래서 안녕 리눅스에서는 -H 옵션을 제공해서, known_hosts에 등록이 되어 있지 않으면, 물어보지 않고 등록을 하고, confirm 부분을 skip 할 수 있도록 지원하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;[root@work ~]# ssh -H domain.com&lt;br /&gt;
LInux AnNyung release 1.3R5 (Indongcho)&lt;br /&gt;
Login domain.com in 20:04 on Friday, 02 October 2009&lt;br /&gt;
root@domain.com&#039;s password:&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
키 등록을 해 놓았다면, 패스워드도 물어보지 않고 로그인이 되겠죠. :-)&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
2. 한글 도메인 사용&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;sub-block&quot;&gt;안녕 리눅스에는 multibyte domain에 대한 패치가 많이 되어 있습니다. 보통 multibyte 도메인을 사용하기 위해서는 브라우저 외의 경우에는 puny code로 변환된 도메인을 사용해 주어야 합니다. 하지만 안녕 리눅스의 왠만한 application(nslookup, dig, host, ssh 등..)들은 내부적으로 패치가 되어 있어 multibyte domain을 직접 사용할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;[root@work ~] ssh 안녕리눅스.com&lt;br /&gt;
LInux AnNyung release 1.3R5 (Indongcho)&lt;br /&gt;
Login 안녕리눅스.com in 20:04 on Friday, 02 October 2009&lt;br /&gt;
root@안녕리눅스.com&#039;s password:&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
3. sftp 에서 readline 제공&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;sub-block&quot;&gt;안녕 리눅스의 sftp에는 readline 기능이 패치되어 있습니다. sftp 접속을 하신 후에, 디렉토리 이동을 하신 후에, 화살표 상/하를 움직여 보시면, 이전에 실행한 명령의 history를 보실 수 있고, 실행하실 수 있습니다. tab기능도 구현을 하려고 했으나, 쉽지 않더군요. 그래서 이건 보류해 놓았습니다.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
3. Banner Magic Cookie 지원&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;sub-block&quot;&gt;openssh는 sshd_config의 Banner 에 지정된 파일을 login전에 출력해 주며, login 후에는 /etc/motd파일을 출력합니다. 기본적으로 original openssh는 magic cookie를 지원하지 않습니다만, 안녕 리눅스의 경우&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;[root@work ~]# ssh domain.com&lt;br /&gt;
LInux AnNyung release 1.3R5 (Indongcho)&lt;br /&gt;
Login domain.com in 20:04 on Friday, 02 October 2009&lt;br /&gt;
root@domain.com&#039;s password:&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
와 같이 Banner에 지정된 /etc/issue.net과 /etc/motd 에서 magic cookie를 사용할 수 있도록 수정이 되어 있습니다. 지원하는 Magic Cookie의 경우는 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;\t, \d - 현재 시간과 날자를 출력&lt;br /&gt;
\h, \n - 시스템의 노드명(FQDN)을 출력&lt;br /&gt;
\s     - 운영체제의 이름을 출력&lt;br /&gt;
\m     - 하드웨어의 유형을 출력&lt;br /&gt;
\r     - 운영체제의 릴리즈를 출력&lt;br /&gt;
\v     - 운영체제의 버전을 출력&lt;br /&gt;
\\     - &#039;\&#039; charactor 를 출력&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
이상 오늘은 안녕 리눅스가 다른 배포본과 어떤 차이점이 있는지 포스팅을 시작했으며, 그 첫번째로 openssh를&lt;br /&gt;
 살펴 보았습니다. 시간이 나는대로 계속 다른 기능을 소개하도록 하겠습니다.</summary>
  </entry>
  <entry>
    <title type="html">안녕 리눅스 1.3 R5 Release</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/129" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/129" thr:count="1"/>
    <category term="안녕리눅스" />
    <category term="AnNyung" />
    <category term="AnNyung LInux" />
    <category term="안녕 리눅스" />
    <category term="안녕리눅스" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/129</id>
    <updated>2009-08-21T19:32:44+09:00</updated>
    <published>2009-08-20T05:46:32+09:00</published>
    <summary type="html">ㅎㅎ 정말 정말 무안하기 짝이 없군요. 2년전에 1.3 R2를 릴리즈 하면서 무안하다는 글을 올렸었는데 이젠 R5까지 나와 버렸습니다. :-)&lt;br /&gt;
&lt;br /&gt;
1.3 R5는 kernel 보안 버그 fix하는 검해서 몇몇 드라이버들을 업데이트 하여 installer에 반영한 것이 다 입니다. 특별히 별 내용은 없고, 최신의 벤더 장비들을 지원하기 위함 입니다. (HP의 G6 시리즈들은 HP에서 더이상 2.4 driver를 지원하지 않아서 꽁수로 해 보았는데, 지원 여부는 저도 테스트를 못해봐서 확신이 없습니다.)&lt;br /&gt;
&lt;br /&gt;
1.3 R5에 대한 자세한 내용은 http://annyung.oops.org/?m=update&amp;amp;p=1.3&amp;amp;t=1250715038&amp;amp;n=251 를 참고 하십시오.&lt;br /&gt;
&lt;br /&gt;
어쨌든 안녕 1.x 는 본의 아니게 장수 하는 군요.&lt;br /&gt;
&lt;br /&gt;
정말로 1.x 는 1.3 R5가 마지막 릴리즈 입니다. 정말로 더이상 추가 H/W 지원은 없을 예정이며, 보안버그 업데이트만 지원을 할 예정입니다.&lt;br /&gt;
&lt;br /&gt;
더불어 2.0이 궁금하신 분들을 위하여 한마디 하자면, 언제 나오느냐? 저도 모릅니다. 다만 2.0 작업은 시작 되어서 현재 installer 수정 작업을 진행 중입니다. 빨리 하면 2-3개월 안에 작업이 마무리 가능할 듯 싶으나, 회사가 저를 놀리지 않는 관계로 좀 지연이 많이 되고 있습니다. 올 12월에 릴리즈 하는 것이 목표 입니다.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
1.3 R5의 code name은 Indongcho 입니다. 아실 분들은 아실 거라고 생각하고 의미는 적지 않겠습니다.</summary>
  </entry>
  <entry>
    <title type="html">ID tag for SVN</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/128" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/128" thr:count="0"/>
    <category term="Tip &amp; Trick" />
    <category term="Id tag" />
    <category term="SVN" />
    <category term="SVN Id tag" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/128</id>
    <updated>2009-06-04T18:17:26+09:00</updated>
    <published>2009-06-04T18:00:00+09:00</published>
    <summary type="html">CVS 에서 주석에 &lt;span style=&quot;font-style:italic; font-weight: bold; color: red&quot;&gt;&amp;quot;$Id: $&amp;quot;&lt;/span&gt; 와 같이 기록을 해 놓으면, commiter, revision, date 등의 정보가 자동으로 입력이 됩니다. 그래서 현재 내가 checkout 해 놓은 파일의 revision이 어떻게 되는지, 누가 commit 을 했는지 등의 정보를 알 수가 있는데 SVN에서는 어떻게 하는지 궁금했었는데, googling 을 하니 금방 나오는 군요.&lt;br /&gt;
&lt;br /&gt;
home directory 의 ~/.subversion/config 파일에서 다음의 설정을 추가해 줍니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;[miscellany]&lt;br /&gt;
enable-auto-props = yes&lt;br /&gt;
&lt;br /&gt;
[auto-props]&lt;br /&gt;
*.java = svn:keywords=Author Date Id Revision;svn:eol-style=native&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
키워드의 리스트는 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box&quot;&gt;&lt;br /&gt;
Author, Date, Header, Id, Log, Locker, Name, RCSFile, Revision, Source, State&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
이 설정을 마치면, commit 을 할 때 id tag 가 자동으로 갱신이 됩니다. 이미 repository에 추가 되어 있는 파일들의 tag 내용을 갱신 시키려면 다음과 같이 하시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;shell&amp;gt; svn up&lt;br /&gt;
shell&amp;gt; svn:keywords &quot;Author Date Id Rev&quot; file_name&lt;br /&gt;
shell&amp;gt; svn commit -m &quot;Adding Id and Rev property to all files&quot;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
출처: &lt;a href=&quot;http://ajmoore.blogspot.com/2007/12/enabling-cvs-id-tag-for-svn.html&quot;&gt;http://ajmoore.blogspot.com/2007/12/ena &amp;middot;&amp;middot;&amp;middot; svn.html&lt;/a&gt;</summary>
  </entry>
  <entry>
    <title type="html">About:credits</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/127" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/127" thr:count="2"/>
    <category term="Mozilla" />
    <category term="about:credits" />
    <category term="Credits" />
    <category term="Firefox" />
    <category term="L10N" />
    <category term="번역" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/127</id>
    <updated>2009-04-08T22:28:04+09:00</updated>
    <published>2009-04-08T22:27:51+09:00</published>
    <summary type="html">openweb 때문에 요즘 난리다. 어느분이 &lt;a href=&quot;http://bangjunyoung.blogspot.com/2009/04/blog-post_06.html&quot;&gt;&amp;quot;가짜 개발자&amp;quot;&lt;/a&gt; 논쟁을 불러 일으키며 좀 시끄럽습니다. 그 중에 그 분이 하신 말씀 중에 L10n commiter 를 까는 내용이 좀 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box&quot;&gt;
흔히들 오픈 소스 프로젝트에 참여한다고 하면 뭔가 대단한 일을 하는 줄 아는 경우가 많은데, 여러 가지 중에서도 번역이 가장 낮은 급의 작업이다. 일정 규모 이상의 오픈 소스 프로젝트들은 대개 기여도가 높고 권위를 인정받는 소수의 개발자들로 이루어진 핵심 그룹이 전반적인 개발 방향을 결정하며, 그 밑에 나머지 대다수 개발자들이 개인적으로 또는 팀을 이루어 개발에 참여한다. 그리고 사이트 관리자나 번역자들이 있어 개발외적인 분야에서 프로젝트에 참여한다. 여기서 중요한 것은 번역자는 개발자가 아니기 때문에 개발에 참여하지 못한다는 점이다. 개발에 참여하지 못하므로 프로젝트에 행사할 수 있는 영향력도 거의 없다(돈이라도 많아서 거액을 후원한다면 모를까). 따라서 개발자가 아니면서 프로젝트 내에서 뭔가 중요한 일을 하는 것처럼 말하는 사람은 한마디로 허풍쟁이다.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
일단, 이 내용은 일부 이기 때문에 오해의 소지가 있으니, 심각하게 받아 들이지 마시고, 이 내용을 여기서 말하고자 함이 아니니, 가볍게 넘기시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
어쨌든 이렇게 L10n 얘기가 나오면서 FF 번역은 윤석찬님 혼자 하고 있는 분위기로 흘러가더군요. 뭐 솔직히 많이 섭섭하더군요. 하긴 실제로 제가 이런일을 한다는 것을 아는 사람은 극소수고.. (심지어는 제가 다니는 회사에서 FF사용하시는 분도.. 제가 한 작업이라는 것을 아시는 분이.. 1분 뿐입니다. T.T)&lt;br /&gt;
&lt;br /&gt;
그러다가 윤석찬님 블러그를 보다가 about:credits 내용이 나왔는데.. 저만 언급이 없더랍니다. 그래서 에이 설마.. 하고 봤는데.. 정말 저만 없습니다. 이거 더 많이 섭섭해 지더군요.&lt;br /&gt;
&lt;br /&gt;
머 3.5 작업은 거의 하지 못했습니다. cvs 에서 mercurial 로 환경이 바뀌면서 적응을 못하고 있고 (mercurial 사용법을 적응 못하는 것이 아니라 번역을 진행하기 위한 시스템이 변경이 되었는데.. 이걸 적응 못하고 있습니다. --;) 또 작년말 부터 갑자기 회사에서 일을 많이 시켜서 손을 대지 못하고 있는 형편이라 왠지 석찬님께 좀 미안한 마음이 있었는데, about:credits를 보니.. 뭐 이제 그만해도 되겠다는 생각이 좀 드네요.&lt;br /&gt;
&lt;br /&gt;
어쩌면 그만두기 위한 자기방어 및 핑계일까요 :-)&lt;br /&gt;
&lt;br /&gt;
그래도 about:credits 에 저만 없다는 것은 충격입니다. T.T 아무래도 영어를 못해서 안끼워주나 봐요.</summary>
  </entry>
  <entry>
    <title type="html">Charset Detecting on PHP</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/126" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/126" thr:count="14"/>
    <category term="프로그래밍" />
    <category term="Chardet" />
    <category term="ICU" />
    <category term="ICU chardet" />
    <category term="ICU Charset Detect" />
    <category term="KSC-5601" />
    <category term="KSC5601" />
    <category term="mod_chardet" />
    <category term="Mozilla Chardet" />
    <category term="PHP Chardet" />
    <category term="Python C API" />
    <category term="python chardet" />
    <category term="Universal Chardet" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/126</id>
    <updated>2009-02-24T03:46:11+09:00</updated>
    <published>2009-02-19T05:12:17+09:00</published>
    <summary type="html">문서의 Charset 을 detecting 하는 library 로는 IBM 이 지원하는 International Components for Unicode (&lt;a href=&quot;http://icu-project.org&quot;&gt;ICU Project&lt;/a&gt;) 의 ICU library 와 Mozilla Browser 에서 이용하는 Universal Chardet library 가 있습니다.&lt;br /&gt;
&lt;br /&gt;
ICU 의 경우에는 charset detect 가 포함된지 꽤 되었음에도 불구하고, php 5.3 부터 기본 포함되는 &lt;a href=&quot;http://kr2.php.net/manual/kr/book.intl.php&quot;&gt;intl extension&lt;/a&gt; 에는 이 기능이 들어가지 않고 있습니다. 그 외에도 pecl 이나 pear 의 icu library 관련 패키지들에도 이상하게 이 부분만 들어가지 않고 있군요.&lt;br /&gt;
&lt;br /&gt;
그리고 좀 더 안습인 것은, Mozilla 의 Universal Chardet 의 경우에는 C#, java, python, ruby (python chardet 을 porting 했음) 등등이 지원하고 있음에도 불구하고, PHP 나 별도의 c/c++ library 로는 제공되지 않고 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/source/intl/chardet/src/&quot;&gt;Mozilla Universal Charset&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.conceptdevelopment.net/Localization/NCharDet/&quot;&gt;Nchardet for C#&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://jchardet.sourceforge.net/&quot;&gt;jchardet for Java&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://chardet.feedparser.org/&quot;&gt;chardet for python&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://rubyforge.org/projects/chardet/&quot;&gt;rchardet for ruby (python clone&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://search.cpan.org/~jgmyers/Encode-Detect-1.01/Detector.pm&quot;&gt;Encode-Detect-1.01 &amp;gt; Encode::Detect::Detector for perl&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
mozilla code 에 c++ 로 지원하고 있으니 이걸 포팅하면 되겠지 하고 쉽게 생각을 했는데, xpcom 구조를 알기 전에는 쉽게 뗄 수 있을 놈이 아니더군요.&lt;br /&gt;
&lt;br /&gt;
이렇듯 저렇듯.. 나오기만 2여년을 기다리다가.. 귀찮아서 mod_chardet 이라는 php extension 으로 하나 만들어 보고 말았습니다. 일단 mod_chardet 은 기본은 ICU library 의 Charset detect 기능을 이용하고, 옵션으로 python chardet 이 설치가 되어 있으면 Python C API를 이용하여 python chardet 을 사용할 수 있도록 설계를 했습니다. Mozilla Universal chardet 이 PHP 만 없다는 것도 좀 그렇다는 생각이 들었고..&lt;br /&gt;
&lt;br /&gt;
일단, ICU 와 Universal Chardet 의 성능 비교도 해 볼겸해서 돌려 보았는데, 역시 ICU 보다는 Universal Chardet 이 detect 능력이 좋더군요. 그리고 ICU 에서 detect 할 수 있는 charset 보다 Universal chardet 이 좀 더 많이 지원하는 까닭도 있었고요.&lt;br /&gt;
&lt;br /&gt;
일단, &lt;a href=&quot;http://chardet.feedparser.org/&quot;&gt;python chardet homepage&lt;/a&gt; 에 있는 자료가 오래된 까닭에 다음의 환경에서 해당 자료를 다시 분석해 보았습니다.&lt;br /&gt;
&lt;br /&gt;
테스트 환경으로는 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
Python 2.5&lt;br /&gt;
Python Chardet 1.0.1&lt;br /&gt;
PHP 5.2.6&lt;br /&gt;
ICU library 4.0.1&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;Python Chardet result:
google.cn            {&#039;confidence&#039;: 0.98999999999999999, &#039;encoding&#039;: &#039;GB2312&#039;}
yahoo.jp             {&#039;confidence&#039;: 0.98999999999999999, &#039;encoding&#039;: &#039;utf-8&#039;}
amazon.co.jp         {&#039;confidence&#039;: 1, &#039;encoding&#039;: &#039;SHIFT_JIS&#039;}
pravda.ru            {&#039;confidence&#039;: 0.93312187961594417, &#039;encoding&#039;: &#039;windows-1251&#039;}
auction.co.kr        {&#039;confidence&#039;: 0.56471064895612277, &#039;encoding&#039;: &#039;ISO-8859-2&#039;}
haaretz.co.il        {&#039;confidence&#039;: 0.98999999999999999, &#039;encoding&#039;: &#039;windows-1255&#039;}
www.nectec.or.th     {&#039;confidence&#039;: 0.77645629965698426, &#039;encoding&#039;: &#039;TIS-620&#039;}
feedparser.org       {&#039;confidence&#039;: 0.98999999999999999, &#039;encoding&#039;: &#039;utf-8&#039;}
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
python-chardet 1.0.1 의 경우, 홈페이지 자료와는 약간 다른 결과가 나오더군요. 일단 &lt;a href=&quot;http://chardet.feedparser.org/&quot;&gt;python chardet homepage&lt;/a&gt; 의 정보가 변경이 되었을 수도 있고, chardet 이 업데이트 되면서 결과가 달라질 수도 있겠지만, 일단 이 결과에서 auction 이 예전에는 제대로 EUC-KR로 판단이 되었는데, 지금 환경에서는 다른 결과를 보여 주고 있습니다.&lt;br /&gt;
&lt;br /&gt;
다음은 mod_chardet 의 결과 입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;PHP mod_chardet result:
google.cn (7121)
  ICU : Encoding -&gt; GB18030 Confidence -&gt; 100
  MOZ : Encoding -&gt; GB2312 Confidence -&gt; 98

yahoo.jp (30367)
  ICU : Encoding -&gt; UTF-8 Confidence -&gt; 100
  MOZ : Encoding -&gt; utf-8 Confidence -&gt; 98

amazon.co.jp (166082)
  ICU : Encoding -&gt; Shift_JIS Confidence -&gt; 100
  MOZ : Encoding -&gt; SHIFT_JIS Confidence -&gt; 100

pravda.ru (97826)
  ICU : Encoding -&gt; ISO-8859-1 Confidence -&gt; 28
  MOZ : Encoding -&gt; windows-1251 Confidence -&gt; 93

auction.co.kr (101330)
  ICU : Encoding -&gt; EUC-KR Confidence -&gt; 100
  MOZ : Encoding -&gt; ISO-8859-2 Confidence -&gt; 56

haaretz.co.il (174179)
  ICU : Encoding -&gt; ISO-8859-1 Confidence -&gt; 32
  MOZ : Encoding -&gt; windows-1255 Confidence -&gt; 98

www.nectec.or.th (41527)
  ICU : Encoding -&gt; ISO-8859-1 Confidence -&gt; 37
  MOZ : Encoding -&gt; TIS-620 Confidence -&gt; 77

feedparser.org (28443)
  ICU : Encoding -&gt; UTF-8 Confidence -&gt; 100
  MOZ : Encoding -&gt; utf-8 Confidence -&gt; 98


18.33 Sec
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
보시다 시피, CJK / UTF-8 / ASCII 를 제외한 다른 1byte 권의 언어들에 대해서는 Universal chardet 이 ICU chardet 보다 월등히 detecting 을 잘 하고 있습니다. 다만 안습인 것은, mod_charset 의 Universal chardet 이 Python C API 를 이용해서 python 을 호출하다 보니, ICU 보다 성능이 굉장히 많이 떨어집니다. 실제로 위의 결과를 Universal chadet 체크를 하지 않는다면, 대략 0.04초 정도에 결과가 나옵니디만, Universal chardet detecting 을 시키니 거의 20초 가까운 결과치가 나옵니다.&lt;br /&gt;
&lt;br /&gt;
대략 테스트를 해 보니 문자열이 3K 정도가 넘어가면 Python C API 로 호출한 결과가 상당히 늦어지는 결과를 보이더군요. 대략 1K 이내의 경우에 어느정도 비슷한 속도가 나옵니다.&lt;br /&gt;
&lt;br /&gt;
또한, 짧은 문자열에 대해서도 ICU 보다 Universal chardet 이 성능이 조금 더 좋더군요. 그래도 한글 기준으로 테스트를 했을 때, 한글 10글자 정도는 받아야지 왠만한 confidence 가 나오게 됩니다.&lt;br /&gt;
&lt;br /&gt;
다음의 결과는 web page 에서 html code 를 삭제하고 나온 결과 입니다. 다음의 코드가 사용이 되었습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;$buf = preg_replace (&#039;/&lt;[^&gt;]*&gt;/&#039;, &#039;&#039;, $buf);&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
보통 웹 페이지의 경우, &amp;lt;&amp;gt;로 쌓여져 있는 코드들은 대부분 ASCII 이기 때문에 확률적 판단을 하는 chardet 에 부정적인 영향을 줄것이라 생각을 하고 한번 시도를 해 보았습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;PHP mod_chardet result:
google.cn (2781)
  ICU : Encoding -&gt; GB18030 Confidence -&gt; 100
  MOZ : Encoding -&gt; GB2312 Confidence -&gt; 98

yahoo.jp (3561)
  ICU : Encoding -&gt; UTF-8 Confidence -&gt; 100
  MOZ : Encoding -&gt; utf-8 Confidence -&gt; 98

amazon.co.jp (30739)
  ICU : Encoding -&gt; Shift_JIS Confidence -&gt; 100
  MOZ : Encoding -&gt; SHIFT_JIS Confidence -&gt; 100

pravda.ru (15728)
  ICU : Encoding -&gt; windows-1251 Confidence -&gt; 28
  MOZ : Encoding -&gt; windows-1251 Confidence -&gt; 94

auction.co.kr (36084)
  ICU : Encoding -&gt; EUC-KR Confidence -&gt; 100
  MOZ : Encoding -&gt; ISO-8859-2 Confidence -&gt; 27

haaretz.co.il (44570)
  ICU : Encoding -&gt; ISO-8859-8-I Confidence -&gt; 23
  MOZ : Encoding -&gt; windows-1255 Confidence -&gt; 98

www.nectec.or.th (10425)
  ICU : Encoding -&gt; EUC-JP Confidence -&gt; 64
  MOZ : Encoding -&gt; TIS-620 Confidence -&gt; 76

feedparser.org (5854)
  ICU : Encoding -&gt; UTF-8 Confidence -&gt; 100
  MOZ : Encoding -&gt; utf-8 Confidence -&gt; 98

4.86 Sec
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 detecting 을 하니 ICU의 결과가 조금 좋아졌으며 (하지만 오판하는 경우도 생겼군요), 텍스트 양이 줄면서 Python C API를 사용하는 Univiersal chardet 의 성능이 대략 5초 정도로 시간이 절약 되었습니다.&lt;br /&gt;
&lt;br /&gt;
머 어쨌든 두가지 기능을 다 지원을 하고, PHP 에서도 Universal chardet 을 지원할 수 있다는 점에 일단은 만족을 하고, posting 과 함께 mod_chardet 을 공개합니다.&lt;br /&gt;
&lt;br /&gt;
그리고 혹시나 단순히 euc-kr / utf-8 만 판단을 해야 한다면, chardet 은 overhead 일 경우가 많습니다. 이럴 경우에는 차라리 &lt;a href=&quot;http://cvs.oops.org/?cvsroot=PHP-Module&amp;amp;module=pear_KSC5601&quot;&gt;pear KSC5601&lt;/a&gt;에 있는 is_utf8 method 를 사용하시는 것이 훨씬 경제적/성능적 효과가 좋습니다. 물론 제가 만들어 놓은 것입니다 ^^;&lt;br /&gt;
&lt;br /&gt;
코드는 &lt;a hef=&quot;http://cvs.oops.org/index.php?cvsroot=PHP-Module&quot;&gt;http://cvs.oops.org/index.php?cvsroot=PHP-Module&lt;/a&gt; 에서 받으실 수 있으며, 소스 안의 &lt;a href=&quot;http://cvs.oops.org/?cvsroot=PHP-Module&amp;amp;module=mod_chardet&amp;amp;file=test.php,v&amp;amp;rev=1.5&quot;&gt;test.php&lt;/a&gt; 를 참조 하시면 사용하시는데 별 무리는 없을 겁니다.</summary>
  </entry>
  <entry>
    <title type="html">PHP LDAP Active Directory 연동</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/125" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/125" thr:count="5"/>
    <category term="프로그래밍" />
    <category term="Active Directory" />
    <category term="AD" />
    <category term="LDAP" />
    <category term="LDAP SSL" />
    <category term="LDAPS" />
    <category term="PHP" />
    <category term="PHP + LDAP" />
    <category term="PHP + LDAP + SSL" />
    <category term="PHP + LDAPS" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/125</id>
    <updated>2009-02-19T06:48:24+09:00</updated>
    <published>2009-01-28T21:50:00+09:00</published>
    <summary type="html">요즘 하는 일이 Linux Server 들에 대하여 Active Directory 와 인증 통합을 하는 작업을 하고 있습니다. 물론 kerberos 나 ldap 을 이용해서 Linux Server들의 인증을 하는 것은 아니고, Windows 2003 R2 에 Server For Unix 의 NIS password entry 를 받아와서 Linux NIS server 를 운영하게 하는데, 이 과정에서 AD 정도 변경이 실시간으로 Linux NIS Server 로 반영이 되게 하기 위해서 관리 tool 을 만들고 있습니다.&lt;br /&gt;
&lt;br /&gt;
이 과정에서 PHP Ldap API를 이용하여 Active Directory 를 관리하는데, 다른 정보를 변경하는 것은 별 무리가 없으나, Active Directory 의 Password 를 변경할 경우, AD에서 ldap ssl 로 연결을 할 경우에만 Password 변경이 가능 합니다. 이 부분 때문에 엄청난 삽질을 하게 되었습니다. 뭐 기본적으로 ldap 에 대한 지식이 별로 없었던 것이 삽질의 가장 주된 원인이기는 했지만, 검색에 걸린 대부분의 문서들이 ldap 에 대한 지식이 있다는 가정하에 설명을 하다보니 미치고 환장하겠더군요 ^^;&lt;br /&gt;
&lt;br /&gt;
각설하고, 여기에서는 Active Directory 의 Password 변경이 가능하도록 PHP에서 Ldap SSL 로 연결하는 것에 대한 설명을 하고자 합니다.&lt;br /&gt;
&lt;br /&gt;
기본적인 전제 조건으로는, Windows 2003 에 Active Directory Domain controller 가 구성이 되어 있고, 이 서버에서 Ldap SSL (ldaps://) connection 이 가능하도록 설정이 되어 있다는 가정하에 설명을 하도록 하겠습니다. Domain controller 에 Ldap SSL 을 설정하는 것은 googling 으로 쉽게 찾을 수 있으므로.. 생략 하도록 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Client 에서 사용할 CACERT 인증서 생성&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Domain controller 에서 사용되는 인증서를 &quot;&lt;u&gt;DER로 인코딩된 X.509 바이너리(.CER)&lt;/u&gt;&quot; 로 export 를 합니다. export 한 CA 인증서를 Unix 서버로 이동한 후에, 다음의 명령으로 .pem file 로 전환을 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;shell&amp;gt; openssl x509 -in cacert.cer -inform DER -out cacert.pem -outform PEM
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. PHP Ldap Extension 확인&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
phpinfo() 함수를 이용해서, ldap extension 이 지원되는지와, ldap 에서 SASL 지원이 되는지를 확인 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;LDAP Support =&gt; enabled
RCS Version =&gt; $Id: ldap.c,v 1.161.2.3.2.13 2008/05/04 21:19:17 colder Exp $
Total Links =&gt; 0/unlimited
API Version =&gt; 3001
Vendor Name =&gt; OpenLDAP
Vendor Version =&gt; 20327
SASL Support =&gt; Enabled
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Coding&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Active Directory 에서 AD Password 는 unicodePwd 라는 entry 에 UTF16 형식의 plain text 를 입력을 해 주면 됩니다. 이 의미는 abcd 를 입력하려면 &#039;a\000b\000c\000d\000&#039; 과 같이 입력을 하면 된다는 의미 입니다.&lt;br /&gt;
&lt;br /&gt;
간단하게 코드의 예를 들자면 다음과 같이 생성할 수 있습니다. (단 주의할 것은 ASCII 범위 밖의 문자열을 입력하시면 안됩니다.)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;&amp;lt;?php
    function make_ad_passwd ($pass) {
        $pass = &#039;&quot;&#039; . $pass . &#039;&quot;&#039;;
        $len = strlen ($pass);

        for ( $i=0; $i&amp;lt;$len; $i++ )
            $newpass .= $pass[$i] . &quot;\000&quot;;

        return $newpass;
    }
?&amp;gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
그럼, AD password 함수를 변경하는 코드의 예를 보도록 하겠습니다. 이 코드에서 중요한 것은, 또는 다른 문서에 나오지 않는 내용은, &lt;u&gt;unicodePwd entry 를 변경하기 위해서는 ldap ssl 연결을 사용&lt;/u&gt;해야 한다는 것이고, 또 하나는 &lt;u&gt;SSL 연결을 위한 인증서 설정&lt;/u&gt; 입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;dash-box-pre&quot;&gt;&amp;lt;?php
# SSL 로 접속을 해야 하기 때문에 ldaps:// protocol 을 사용한다.
$host = &quot;ldaps://ad.domain.controller.com&quot;;
# ldaps 의 기본 포트는 636 을 사용한다.
$port = &quot;636&quot;;
# 인증서 설정
$certfile = &#039;/some/path/cacert.pem&#039;;
# default DN
$defaultdn = &#039;domain_manager@DOMAIN.NAME.COM&#039;;
$accesspw  = &#039;password_of_domain_manager&#039;;
# 관리 OU
$ou = &quot;OU=Users,DS=DOMAIN,DS=NAME,DS=com&quot;

$username = $argv[1];
$userpass = $argv[2] ? $argv[2] : &#039;abcd&#039;;

if ( ! $username ) {
  echo &quot;ERROR: You must input changed username on argv[1]\n&quot;;
  exit 1;
}

#
# system 의 ldap 설정을 건드리지 않고 하기 위해서 다음의 환경 변수를 설정한다.
putenv (&#039;LDAPTLS_REQCERT=never&#039;);
putenv (&quot;LDAPTLS_CACERT={$certfile}&quot;);

$ldap = ldap_connect ($host, $port);

if ( $ldap === false ) {
  echo &quot;ERROR: connect failed to $host\n&quot;;
  exit 1;
}

$bind = @ldap_bind ($ldap, $defaultdn, $accesspw);
if ( $bind === false ) {
  echo ldap_error ($ldap) . &quot;\n&quot;;
  exit 1;
}

$filter = &quot;(samaccountname={$username})&quot;;
$result = ldap_search ($ldap, $ou, $filter);
ldap_sort ($ldap, $result, &#039;sn&#039;);
$info = ldap_get_entries ($ldap, $result);

for ( $i=0; $i&lt;$info[&#039;count&#039;]; $i++ ) {
  echo &quot;You are changing the password for &quot; .
       $info[$i][&#039;givenname&#039;][0] . &quot;, &quot; .
       $info[$i][&#039;sn&#039;][0] . &quot; (&quot; .
       $info[$i][&#039;samaccountname&#039;][0] .
       &quot;) to {$userpass}\n&quot;;

  $userdata[&#039;unicodePwd&#039;] = make_ad_passwd ($userpass);
  $result = ldap_mod_replace ($ldap, $info[$i][&#039;distinguishedname&#039;][0], $userdata);

  if ( $result === false )
    echo &quot;There was a problem changing your password, please call IT for help\n&quot;;
  else
    echo &quot;Your password han been changed!\n&quot;;
}
@ldap_close ($ldap);
?&amp;gt;
&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">2008년 휴가</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/124" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/124" thr:count="0"/>
    <category term="주절주절" />
    <category term="오크밸리" />
    <category term="휴가" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/124</id>
    <updated>2008-12-31T03:23:39+09:00</updated>
    <published>2008-12-31T03:18:51+09:00</published>
    <summary type="html">2008.12.28 ~ 2008.12.30 2박 3일간 오크밸리를 다녀왔습니다. 여행을 가기만 하면 wife 랑 싸웠었는데, 이번에는 싸우지 않고 2박 3일을 잘 버텨냈네요. --; 아무리 익숙해 지려고 해도 쉽지 않은 일입니다.&lt;br /&gt;
&lt;br /&gt;
겨울 ski season 이라서 그런지 역시 방은 만땅이고, 신문지상에서는 연일 &quot;불황&quot;을 떠들지만, 분위기는 전혀 상관이 없는듯 하게 보였습니다. (다른 사람들의 눈에 저도 그렇게 보일지 모르겠지만 ^^)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1002319640.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;차안에서 쫑아&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1002319640.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;차안에서 쫑아&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;가는길 차인에서 쫑아&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
애 보기가 힘들어 거금을 들여서 6시간 1:1 강습을 맡겨 버립니다. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1268211963.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;1:1 ski 강습 준비 중&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1268211963.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;1:1 ski 강습 준비 중&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;1:1 ski 강습 준비 중&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
콘도 안에서 한 컷..&lt;br /&gt;
&lt;br /&gt;
&lt;p id=&quot;more124_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;124_0&#039;,&#039; 사진 보기.. &#039;,&#039; 사진 감추기.. &#039;); return false;&quot;&gt; 사진 보기.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content124_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1323388036.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1323388036.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;군이&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1079047247.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1079047247.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;쫑아&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
엄마랑 군이랑 ski 를 타요&lt;br /&gt;
&lt;br /&gt;
&lt;p id=&quot;more124_1&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;124_1&#039;,&#039; 사진 보기.. &#039;,&#039; 사진 감추기.. &#039;); return false;&quot;&gt; 사진 보기.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content124_1&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1404189024.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1404189024.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1006724767.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1006724767.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1017160038.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;유모자에서 쫑아&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1017160038.jpg&quot; width=&quot;300&quot; height=&quot;199&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;유모자에서 쫑아&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
엄마랑 군이는 ski 타러 가고, 아빠랑 쫑아만 남아서 기다립니다.&lt;br /&gt;
&lt;br /&gt;
유모차에 바람막이(원래 용도는 우비)를 씌워서 바람을 막고, 혹시나 바람이 들어갈까봐 엄마 코트로 덮어 씌우는 센스..&lt;br /&gt;
&lt;br /&gt;
표정이 썩 좋지는 않습니다.&lt;br /&gt;
&lt;br /&gt;
간단하게 오크 밸리 ski course 를 소개해 봅니다. 취향에 따라 다를 수 있으니..&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1372440359.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;초보자 코스&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1372440359.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;초보자 코스&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;초보자 코스&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
오크 밸리의 교습은 대략 30분 정도 밑에서 하고, 바로 리프트를 타고 초보자 코스로 올라가서 진행을 합니다. 군이 강습시에 그 말을 듣고선 될까 생각을 했었는데, 다녀온 wife 말로는 장난 아니게 완만하다고 합니다. 가속이 거의 없다 시피 하다고 하는 군요. 좀 타시는 분들에게는 최악의 코스이고, 아주 겁이 많으신 분들에게는 최적의 코스가 아닐까 싶습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1015890920.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;중급자 코스&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1015890920.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;중급자 코스&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;중급자 코스&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
제가 가본 유일한 스키장이었던 알프스와 비교해 보자면, 알스프의 regular 코스 정도 되지 않을까 싶습니다. 초급자와 중급자 사이의 약간 애매한 정도?&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1090846946.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;상급 코스&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1090846946.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;상급 코스&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;상급 코스&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
산꼭대기에 있기는 하지만 역시나 다른곳의 상급자 코스와는 확연히 차이가 납니다.&lt;br /&gt;
&lt;br /&gt;
오크 밸리의 경우, 중급자 코스만 되도 리프트가 한산합니다. 상급 코스의 경우에는 거의 사람이 없고요. 그러므로 중급 레벨이라고 생각 되시는 분들은 오크밸리의 상급 코스에서 즐기시면 우질라게 즐기실 수 있을 듯 싶습니다. 다만, 가장 단점은 모든 코스가 한 지점에서 합쳐진다는 점입니다. 이건 좀 설계 미스 인듯.. 그렇다고 해서 박터지게 미이지는 않기 때문에 대충 잘 피해서 간다면 크게 무리는 없어 보입니다.&lt;br /&gt;
&lt;br /&gt;
밖에서 엄마랑 군이랑 기다리다가 쫑아가 너무 추워해서 유아 휴게실로 피신을 합니다. 유아 휴게실의 경우 36개월 이상 부터 만 5세까지 이용 가능하며, 36개월 이하는 보호자 동반으로만 가능합니다. (즉 36개월 이상은 알아서 노니까 나두고 가고, 36개월 미만은 문제의 소지가 많으니 알아서 봐라.. 이거죠.)&lt;br /&gt;
&lt;br /&gt;
&lt;p id=&quot;more124_2&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;124_2&#039;,&#039; 사진 보기.. &#039;,&#039; 사진 감추기.. &#039;); return false;&quot;&gt; 사진 보기.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content124_2&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1242251926.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1242251926.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1162305619.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1162305619.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1064123992.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1064123992.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1312928251.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1312928251.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1302211765.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1302211765.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1211665963.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1211665963.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1300775385.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1300775385.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1042318735.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1042318735.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1260776526.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1260776526.jpg&quot; width=&quot;450&quot; height=&quot;299&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">JSBoard 오랜만이야..</title>
    <link rel="alternate" type="text/html" href="http://my.oops.org/123" />
    <link rel="replies" type="application/atom+xml" href="http://my.oops.org/atom/response/123" thr:count="3"/>
    <category term="프로그래밍" />
    <category term="Captcha" />
    <category term="Christmas Version" />
    <category term="JSBoard" />
    <category term="SPAM" />
    <author>
      <name>(김정균)</name>
    </author>
    <id>http://my.oops.org/123</id>
    <updated>2008-12-05T01:51:18+09:00</updated>
    <published>2008-12-05T01:42:13+09:00</published>
    <summary type="html">오랜만에 JSBoard 와의 조우를 하고 있습니다. 회사일 때문에 JSBoard는 이제 거의 뒷전으로 밀린 상태였는데 (안녕 리눅스도 회사일에 밀리는 판국에 JSBoard 야 더 할말이 없겠죠 ^^) 제가 관리해 주고 있는 서버의 계정에서 방치된 JSBoard의 스팸을 보니 갑자기 오기가 나더군요.&lt;br /&gt;
&lt;br /&gt;
어떤 게시판이라도 방치를 해 놓으면 어쩔 수 없겠지만, JSBoard 야 하물며 요즘의 스팸 attack 에는 제대로 대응을 할 수 있는 기능이 없으니 더 하겠죠. 이 문제 때문에 제 주위에도 JSBoard 사용을 포기하신 분들을 꽤 많이 봐 왔음에도 불구하고 직접 보니 확 다가 오네요 :-)&lt;br /&gt;
&lt;br /&gt;
JSBoard .. 분명 제게서는 이미 관심사에서 멀어진 작품이기는 합니다. 더 이상 개발의 이슈도 없었고, 웹 프로그래밍이 제 주 전공 분야가 아니다 보니, 다른 프로젝트로 전환을 하지 못해 어떻게 보면 시대에 뒤떨어진 작품이 되고 말았습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1236083511.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1236083511.jpg&quot; width=&quot;450&quot; height=&quot;60&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;JSBoard last release&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
위의 이미지 같은 안습에, 마지막 릴리즈도 2년전이니.. 한 때는 정말 나름 웹을 풍미하던 프로그램이 이제는 그저 명맥만 유지하는 모습을 보이고 있는 것 같습니다. 그래도 나름 제가 만든 프로그램이라는 책임하에 보안버그 fix 와 아래 로그와 같이 release 는 되고 있지 않았지만 개발은 꾸준히 명맥을 이어오고는 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://my.oops.org/attach/1/1405881447.jpg&quot;  rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://my.oops.org/attach/1/1405881447.jpg&quot; width=&quot;450&quot; height=&quot;549&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;cap1&quot;&gt;JSBoard 2 Changelog&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
JSBoard 2 외에 JSBoard 2.1 tree 도 계속 진행 중이지만 아직 생각해둔 기능들을 미처 추가를 하지 못해서 release 는 까마득 하고.. (그래도 기능 추가 외에는 JSBoard 2 만큼의 안전성은 가지고 있다고 생각 됩니다.)&lt;br /&gt;
&lt;br /&gt;
그래서 모처럼 JSBoard 에 시간 투자를 해 보았습니다. 우선적으로 스팸에 어느정도는 항거해 보고자, 먼저 Captcha image 를 지원하도록 수정을 했으며, 몇몇 스팸 관련 기능을 수정하였고, 예전의 JSBoard christmas release 를 올해 한번 해 보려고 시간을 조금씩 투자를 해 보려고 합니다.&lt;br /&gt;
&lt;br /&gt;
올 12월 25일에는 JSBoard 2.0.14 를 기다리는 사람은 없겠지만 한번 release 해 볼까 합니다. ^^;</summary>
  </entry>
</feed>
