<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>By Networks</title>
    <link>http://five.textcube.com/</link>
    <description />
    <language>ko</language>
    <pubDate>Fri, 11 Sep 2009 13:34:55 +0900</pubDate>
    <generator>Textcube.com 2.0 Garnet</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/yoonsik" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Shell Script 에서 random number 가져오기</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/PZe5Lox2EC8/40</link>
      <description>Shell Programming 을 하다보면 random값이 필요할 때가 있다. 다음은 Unix 시스템 Shell 에서 random 한 숫자를 가져오는 몇가지 방법들이다.&lt;br /&gt;&lt;br /&gt;만약 bash 를 쓴다면 RANDOM 이란 변수로 아주 쉽게 가져 올 수 있다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;echo $RANDOM&lt;/div&gt;&lt;br /&gt;요즘 Linux 에서는 대부분 기본은 bash 를 많이 사용하므로 위 방법이 가장 편하면서도 좋은 방법이다. 하지만 개인적으로 괜히 Shell Programming 할때는 기존 /bin/sh 기준으로 짜고 싶은 생각이 든다.&lt;br /&gt;&lt;br /&gt;그래서 완전 random 은 아니지만 대체로 쓸 수 있는 방법으로, random 한 값으로 쓰일 수 있는것을 찾아서 쓰는 방법이 있다. &lt;br /&gt;다음은 보통 가장 많이 쓰는 시간을 이용한 밥법이다. nanosecond 를 가져와 이용하는 방법인데 0~999999999 값이 나올 수 있다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;date +%N&lt;/div&gt;&lt;br /&gt;혹은 프로세스 아이디를 랜덤한 값으로 쓰는 방법도 있다. Linux 에서는 1~65535 까지의 프로세스 아이디 값을 가질 수 있다. 크지 않는 숫자를 원한다면 이것도 한 방법이다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;echo $$&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;시간이나 프로세스 번호를 쓰는 방법은 랜덤성이 크게 중요하지 않고 큰 범위가 필요하지 않는 경우 mod 값으로 가볍게 사용할 수 있는 방법이라 하겠다. 하지만 랜덤성은 많이 떨어질 수 밖에 없다.&lt;br /&gt;&lt;br /&gt;비교적 괜찮은 랜덤을 가져오는 방법은 sort 의 -R (random sorting) 옵션을 이용한 방법이다. 대부분 기본으로 있는 명령어로 가져올 수 있는 장점이 있으나 큰범위의 값을 가져올때는 효율이 많이 안 좋은 단점이 있다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt; seq 100 | sort -R | head -n1&lt;/div&gt;&lt;br /&gt;만약 /dev/urandom 을 쓸 수 있고 hexdump 명령어가 시스템에 있다면 다음과 같은 방법이 가장 좋으면서도 쉬운 방법이다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;hexdump -n4 -e'"%u\n"' /dev/urandom&lt;/div&gt;</description>
      <category>Linux</category>
      <category>bash</category>
      <category>Linux</category>
      <category>Programming</category>
      <category>Random</category>
      <category>script</category>
      <category>shell</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/40</guid>
      <comments>http://five.textcube.com/40?expandComment=1#entry40Comment</comments>
      <pubDate>Fri, 24 Jul 2009 23:36:48 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/40</feedburner:origLink></item>
    <item>
      <title>boost 라이브러리 cmake 로 컴파일</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/RJH7vJysM48/39</link>
      <description>&lt;a target="_blank" href="http://www.boost.org/"&gt;boost&lt;/a&gt; 라이브러리의 경우 여러 컴파일 환경에서 컴파일 되야 하므로,&amp;nbsp; 별도의 &lt;a target="_blank" href="http://www.boost.org/doc/tools/jam/index.html"&gt;bjam&lt;/a&gt; 이라는 것을 이용하여 빌드하게 된다.&lt;br /&gt;&lt;br /&gt;bjam 만으로도 비교적 쉽게 boost 를 빌드할 수는 있지만 아무래도 boost 를 위해 별도로 만들어진 것이므로 좀 세세한 설정을 하려면 쓰기가 익숙하지가 않다.&lt;br /&gt;최근 1.37.0 버전 부터는 &lt;a target="_blank" href="http://www.cmake.org/"&gt;cmake&lt;/a&gt; 라는 멀티환경 빌드시스템을 이용한 빌드가 고려되기 시작 했으며, 1.40.0 부터는 공식적으로 cmake 를 이용한 빌드 환경도 제공하게 되었다.&lt;br /&gt;&lt;br /&gt;물론 cmake 도 잘 쓰기 위해서는 별도의 공부를 해야 겠지만, cmake 는 이미 여러 유명한 프로젝트에서 많이 쓰이고 있으며 굉장히 유용하므로 알아두면 써먹을 곳이 많다.&lt;br /&gt;&lt;br /&gt;다음은 boost 를 소스를 받고 cmake 를 이용하여 빌드하는 과정이다. 명령어 몇개만으로 아주 쉽게 빌드를 마칠 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ svn co http://svn.boost.org/svn/boost/trunk boost-trunk&lt;br /&gt;$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;$ cmake ../boost-trunk&lt;br /&gt;$ make&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <category>Programming</category>
      <category>bjam</category>
      <category>Boost</category>
      <category>cmake</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/39</guid>
      <comments>http://five.textcube.com/39?expandComment=1#entry39Comment</comments>
      <pubDate>Sat, 11 Jul 2009 01:50:41 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/39</feedburner:origLink></item>
    <item>
      <title>IBM 노트북 TrackPoint Scroll 기능 사용하기</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/L3x4QjmJ1Ho/38</link>
      <description>IBM x61 노트북을 사용하고 있는데, 보통 IBM 노트북은 빨콩이라 불리는 마우스를 조작하는 컨트롤러가 있다.&lt;br /&gt;&lt;br /&gt;일반적인 노트북은 터치패트의 사이드를 손가락으로 스크롤링하는 방식을 사용하지만, 빨콩의 경우 마우스 가운데 버튼을 누르고 움직이면 스크롤이 된다.&lt;br /&gt;&lt;br /&gt;리눅스에서 이 기능을 사용하기 위해서는 몇가지 방법이 있지만, 최신 리눅스 시스템에서 가장 정석적인 방법은 &lt;a target="_blank" href="http://freedesktop.org/wiki/Software/hal"&gt;HAL&lt;/a&gt; 에 설정해 주는
방법이다. HAL (hardware abstraction layer) 은 여러가지 하드웨어적인 설정을 쉽게 설정할 수 있도록
설계된 시스템이다.&lt;br /&gt;&lt;br /&gt;/etc/hal/fdi/policy/mouse-wheel.fdi 파일을 만들고 다음 내용을 적어준다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;deviceinfo version="0.2"&amp;gt;&lt;br /&gt;&amp;lt;device&amp;gt;&lt;br /&gt;&amp;lt;match key="info.product" string="TPPS/2 IBM TrackPoint"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;merge key="input.x11_options.EmulateWheel" type="string"&amp;gt;true&amp;lt;/merge&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;merge key="input.x11_options.EmulateWheelButton" type="string"&amp;gt;2&amp;lt;/merge&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;merge key="input.x11_options.YAxisMapping" type="string"&amp;gt;4 5&amp;lt;/merge&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;merge key="input.x11_options.XAxisMapping" type="string"&amp;gt;6 7&amp;lt;/merge&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;merge key="input.x11_options.Emulate3Buttons" type="string"&amp;gt;true&amp;lt;/merge&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;merge key="input.x11_options.EmulateWheelTimeout" type="string"&amp;gt;200&amp;lt;/merge&amp;gt;&lt;br /&gt;&amp;lt;/match&amp;gt;&lt;br /&gt;&amp;lt;/device&amp;gt;&lt;br /&gt;&amp;lt;/deviceinfo&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</description>
      <category>Linux</category>
      <category>HAL</category>
      <category>IBM</category>
      <category>Linux</category>
      <category>scroll</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/38</guid>
      <comments>http://five.textcube.com/38?expandComment=1#entry38Comment</comments>
      <pubDate>Wed, 08 Jul 2009 00:01:15 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/38</feedburner:origLink></item>
    <item>
      <title>STL set, map iterator 의 문제점</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/jkekTAk5_4I/37</link>
      <description>STL 의 iterator 에는 데이터 변경이 가능한 iterator 와 읽기만 가능한 const_iterator 가 있다.&lt;br /&gt;&lt;br /&gt;set 과 map 도 마찬가지로 iterator 와 const_iterator 가 있다.&lt;br /&gt;하지만 다른 컨테이너들 (vector, list, deque, ..) 과 다른점은 set, map 은 데이타의 내용이 원소의 순서에 영향을 미친다는 것이다.&lt;br /&gt;&lt;br /&gt;set, map 은 내부적으로 tree 로 구현되어 있다. 따라서 들어오는 원소에 따라서 트리의 구성이 달라지게 된다. 그렇기 때문에 set, map 의 iterator 에는 다음과 같은 문제가 있다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;std::set&amp;lt;int&amp;gt; s;&lt;br /&gt;s.insert(1);&lt;br /&gt;s.insert(2);&lt;br /&gt;s.insert(3);&lt;br /&gt;&lt;br /&gt;std::set&amp;lt;int&amp;gt;::iterator iter = s.begin();&lt;br /&gt;*iter = 4;&lt;br /&gt;&lt;br /&gt;assert(s.find(2) != s.end());&lt;/div&gt;&lt;br /&gt;이 코드의 assert 구문은 보증할 수가 없다.&lt;br /&gt;내부 구현에 따라 운이 좋게 이 케이스에 대해서는 assert 가 안 날 수도 있지만 분명히 잘 못된 코드이고 앞으로의 동작을 보증할 수 없게 된다. 내부적으로 구성해 놓은 트리의 값을 임의로 바꾸었기 때문이다.&lt;br /&gt;(VC9 에서 테스트 해보면 assert 가 발생한다.)&lt;br /&gt;&lt;br /&gt;그러므로 set, map 은 iterator 를 허용하면 안된다. const_iterator 만 허용해야 하는 것이다. 그래서 c++0x 부터는 set, map 의 iterator 는 const iterator 로만 동작을 하도록 표준이 바뀌었다.&lt;br /&gt;&lt;br /&gt;다행이도 gcc 같은 경우는 꽤 오래전부터 (정확한 버전은 모름) iterator 를 const_iterator 와 같게 처리 해 왔다. 따라서 위와 같은 코드는 다음과 같은 에러를 내게 된다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;error: assignment of read-only location ‘iter.std::_Rb_tree_const_iterator&amp;lt;_Tp&amp;gt;::operator* [with _Tp = int]()’&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Visual C++ 도 10 (Visual Studio 2010) 부터는 위의 코드를 허용하지 않도록 바뀌었다. 따라서 다음과 같은 에러를 낸다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;error C3892: 'iter' : you cannot assign to a variable that is const&lt;/div&gt;&lt;br /&gt;VC10 은 c++0x 의 문법이 대거 적용되었으므로 위의 문제도 함께 해결된 것이다.&lt;br /&gt;&lt;br /&gt;만약 최신 컴파일러를 쓰지 않는다면 주의해야 겠으며, 가장 좋은 방법은 set, map 은 const_iterator 만을 쓰는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <category>Programming</category>
      <category>C++</category>
      <category>c++0x</category>
      <category>gcc</category>
      <category>Programming</category>
      <category>STL</category>
      <category>vc++</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/37</guid>
      <comments>http://five.textcube.com/37?expandComment=1#entry37Comment</comments>
      <pubDate>Sat, 30 May 2009 12:59:52 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/37</feedburner:origLink></item>
    <item>
      <title>SSL Strip sniffing</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/-ikm5KWLAfQ/36</link>
      <description>예전에 '&lt;a target="_blank" href="http://five.textcube.com/7"&gt;dsniff 를 이용한 패킷 sniffing&lt;/a&gt;' 에서 SSL 의 경우 MITM 을 이용하여 sniffing 하는 방법을 적었었다. 하지만 이것은 사용자가 상위 기관에서 인증되지 않은 인증서를 사용 허가해야 가능한 방법으로 사용자가 주의하면 피할 수 있는 방법이다.&lt;br /&gt;&lt;br /&gt;그래서 가능한 또 다른 방법이 SSL Strip 이다. 이것 역시 통신 중간에 끼어들어 실제 서버와의 정상적인 SSL 접속을 변경 시킨다는 것은 똑같다. (당연한 것이 정상적으로 SSL 통신을 한다면 중간에 아무리 끼어들어도 절대 내용을 볼 수 없다.)&lt;br /&gt;&lt;br /&gt;하지만 기존 방법은 자신의 가짜 인증서를 보내서 클라이언트와 SSL 연결을 하도록 유도 하는 방법이지만, SSL Strip 은 아예 클라이언트가 SSL 접속을 쓰지 않도록 만드는 것이다.&lt;br /&gt;&lt;br /&gt;예를 들어 웹페이지에서 전송되는 웹페이지의 링크 URL 주소들의 'https' 스트링을 'http' 로 바꾸어 전송하게 되면 사용자의 컴퓨터는 그 링크를 클릭 했을 때 SSL 을 쓰지 않는 일반 http 프로토콜로 접속을 하게 된다. 따라서 공격자는 전송되는 내용을 모두 볼 수 있으며 실제 서버와의 정상적인 통신을 위해서 실제 서버와는 SSL 연결을 하여 전달하게 된다.&lt;br /&gt;&lt;br /&gt;사용자들가 주소창을 자세히 보지 않는 이상 연결이 SSL 을 쓰는 않는지를 알아채기 힘들며, 만약 안다고 해도 대부분의 사용자는 SSL 을 쓰지 않는다고 해도  별 생각없이 개인정보들을 입력하며 브라우징 할 것이다.&lt;br /&gt;&lt;br /&gt;간단히 socat 과 netsed 명령을 조합하여 실습 해 볼 수 있다. &lt;br /&gt;https://www.test.com 라는 사이트와의 통신을 가로챈다고 해보자.&lt;br /&gt;&lt;br /&gt;1. 우선 &lt;a target="_blank" href="http://five.textcube.com/7"&gt;예전&lt;/a&gt;에 설명했듯이 dsniff 툴을 이용하여 통신 중간에 끼어든다.&lt;br /&gt;&lt;br /&gt;2. 클라이언트가 SSL 연결을 사용하지 않도록 해당 프로토콜 스트링을 바꾼다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ sudo netsed tcp 80 127.0.0.1 10000 's/https/http'&lt;/div&gt;&lt;br /&gt;3. 실제 서버와는 SSL 을 통신을 해야 하므로 일반 TCP 연결을 SSL 연결로 바꿔준다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ socat tcp-l:10000,fork,reuseaddr openssl:www.test.com:443,verify=0&lt;/div&gt;&lt;br /&gt;4. tcpdump 같은 프로그램을 이용하여 암호화 되지 않은 패킷을 볼 수 있다.&lt;br /&gt;&lt;br /&gt;물론 이것은 단순히 특정 사이트만을 접속한다고 가정할때 가능한 것이고 실제 웹은 접속하는 사이트가 여러군데이며, https 를 쓰지 않는 사이트가 중간에 포함될 수 있으므로 완벽하게 하기 위해서는 그런 사이트들의 주소 관리가 필요할 것이다.&lt;br /&gt;&lt;br /&gt;아마 프로그램을 만들어도 크게 어려움 없이 쉽게 작성할 수 있을 것이다. 이미 python 으로 작성된 &lt;a target="_blank" href="http://www.thoughtcrime.org/software/sslstrip/"&gt;sslstrip&lt;/a&gt; 프로그램이 있긴한데, 내가 잘 못 사용해서 그런지 테스트 해 본 결과 잘 작동하지 않았다. 나중에 시간되면 한번 간단히 만들어 볼 생각이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <category>Security</category>
      <category>https</category>
      <category>netsed</category>
      <category>Security</category>
      <category>sniffing</category>
      <category>socat</category>
      <category>SSL</category>
      <category>sslstrip</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/36</guid>
      <comments>http://five.textcube.com/36?expandComment=1#entry36Comment</comments>
      <pubDate>Sat, 16 May 2009 13:08:54 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/36</feedburner:origLink></item>
    <item>
      <title>ssh 를 이용하여 UDP 터널링 하기</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/ieZinOL5_Hk/35</link>
      <description>ssh 에는 터널링 기능이 있어서 암호화 되지 않은 패킷도 ssl 프로토콜 위에 올려 암호화여 중계 할 수 있다. ( http://en.wikipedia.org/wiki/Ssh_tunnel#SSH_tunneling )&lt;br /&gt;&lt;br /&gt;이것은 보통 방화벽 등으로 막혀 있는 컴퓨터에서 외부와 통신하기 위해서도 유용하게 사용될 수 있다.&lt;br /&gt;&lt;br /&gt;하지만 ssl 은 tcp 기반 이므로 기본적으로 tcp 패킷만 터널링 할 수 있다. 그렇지만 &lt;a target="_blank" href="http://www.dest-unreach.org/socat/"&gt;socat&lt;/a&gt; 을 이용면 tcp 를 다시 udp 로 replay 해주는 방법으로 udp 프로토콜도 사용할 수 있다.&lt;br /&gt;&lt;br /&gt;다음은 udp 터널링으로 dns 정보를 가져오는 예제이다.&lt;br /&gt;&lt;br /&gt;192.168.0.2 에서 192.168.0.1 를 통해 168.126.63.1 (실제 DNS 서버) 로 패킷이 전달되게 되도록 설정하는 예이다.&lt;br /&gt;&lt;br /&gt;ssh 터널링 (192.168.0.1)&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ ssh -R 10001:localhost:10002 192.168.0.2&lt;/div&gt;&lt;br /&gt;udp 패킷으로 중계 (192.168.0.1)&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ socat tcp-l:10002,fork udp:168.126.63.1:53&lt;/div&gt;&lt;br /&gt;udp 패킷에서 중계 (192.168.0.2)&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;# socat udp-l:53,fork tcp:localhost:10001&lt;/div&gt;&lt;br /&gt;터널링 테스트 (192.168.0.2)&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ host www.google.com localhost&lt;br /&gt;
Server: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; localhost&lt;br /&gt;
Address: &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 127.0.0.1#53&lt;br /&gt;
&lt;br /&gt;
Non-authoritative answer:&lt;br /&gt;
www.google.com&amp;nbsp; canonical name = www.l.google.com.&lt;br /&gt;
Name: &amp;nbsp; www.l.google.com&lt;br /&gt;
Address: 74.125.127.104&lt;br /&gt;
Name: &amp;nbsp; www.l.google.com&lt;br /&gt;
Address: 74.125.127.99&lt;br /&gt;
Name: &amp;nbsp; www.l.google.com&lt;br /&gt;
Address: 74.125.127.103&lt;br /&gt;
Name: &amp;nbsp; www.l.google.com&lt;br /&gt;
Address: 74.125.127.147&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;</description>
      <category>Software</category>
      <category>dns</category>
      <category>socat</category>
      <category>ssh</category>
      <category>tunneling</category>
      <category>udp</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/35</guid>
      <comments>http://five.textcube.com/35?expandComment=1#entry35Comment</comments>
      <pubDate>Sun, 12 Apr 2009 01:00:29 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/35</feedburner:origLink></item>
    <item>
      <title>lex 를 이용한 주석문 제거</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/mWG0Vrs0RQo/34</link>
      <description>어떤한 이유에서 프로그램의 주석문을 제거 하고 싶을 때가 있다.&amp;nbsp; (단순히 소스 용량을 줄여야 한다던지..) 다음은 구문 분석기인 lex를 이용해서 C++ 주석을 제거하는 프로그램을 간단히 만들어 보았다.&lt;br /&gt;&lt;br /&gt;comment.l&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;%{&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;static void comment();&lt;br /&gt;%}&lt;br /&gt;&lt;br /&gt;Escape &amp;nbsp; &amp;nbsp; &amp;nbsp; \\[ntbrf\\'"]&lt;br /&gt;&lt;br /&gt;%%&lt;br /&gt;. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { std::cout &amp;lt;&amp;lt; yytext[0]; }&lt;br /&gt;\"([^\"\\]|{Escape})*\" { std::cout &amp;lt;&amp;lt; yytext; }&lt;br /&gt;\/\/.*$ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {}&lt;br /&gt;\/\* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { comment();}&lt;br /&gt;%%&lt;br /&gt;&lt;br /&gt;int main() { yylex(); }&lt;br /&gt;&lt;br /&gt;static void comment()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(;;) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char c = yyinput();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(; c &amp;amp;&amp;amp; c != '*'; c = yyinput());&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(c == 0 || (c = yyinput()) == '/')&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(c == '*') unput(c);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;lex 의 free software 버전인 &lt;a target="_blank" href="http://flex.sourceforge.net/"&gt;flex&lt;/a&gt; 를 이용하여 빌드한다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ flex comment.l &lt;br /&gt;$ g++ -o comment lex.yy.c -lfl&lt;/div&gt;&lt;br /&gt;잘 되는지 테스트해 보자.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ cat test.cpp &lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;int main(int /*argc*/, char** /*argv*/) /* main&lt;br /&gt;function */&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::cout &amp;lt;&amp;lt; "/***hello***///" /* hello */ // ....&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&amp;lt; "//world" &amp;lt;&amp;lt; std::endl; //world&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$ cat test.cpp | ./comment&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;int main(int , char** ) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::cout &amp;lt;&amp;lt; "/***hello***///"&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&amp;lt; "//world" &amp;lt;&amp;lt; std::endl; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;이것을 조금 응용하면 다른 언어용도 쉽게 만들 수 있으며, 주석문만 뽑아 낸다던지&lt;a target="_blank" href="http://www.stack.nl/%7Edimitri/doxygen/"&gt; Doxygen&lt;/a&gt; 처럼 주석에서 어떤 의미 있는 값을 가져온다던지도 쉽게 할 수 있다.&lt;br /&gt;</description>
      <category>Programming</category>
      <category>comment</category>
      <category>flex</category>
      <category>lex</category>
      <category>Programming</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/34</guid>
      <comments>http://five.textcube.com/34?expandComment=1#entry34Comment</comments>
      <pubDate>Mon, 06 Apr 2009 23:22:02 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/34</feedburner:origLink></item>
    <item>
      <title>리눅스에서 ipod touch 동영상 transcoding</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/6d62q9rb3Qg/33</link>
      <description>전에 &lt;a target="_blank" href="http://five.textcube.com/8"&gt;mencoder 를 이용한 transcoding&lt;/a&gt; 에 관한 글을 올린적 있는데, 최근에 ipod touch 를 구입했기 때문에 ipod touch 용 스크립트를 만들어 보았다. 역시 &lt;a target="_blank" href="http://www.kipple.pe.kr/doc/badak/"&gt;badak&lt;/a&gt; 에 있는 preset 을 보고 가져다가 만들었다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;DIR=`dirname "$1"`&lt;br /&gt;NAME=`basename "$1"`&lt;br /&gt;TONAME=$DIR/`echo T]$NAME | sed 's/\.avi/\.mp4/'`&lt;br /&gt;SUBFILE=$DIR/`echo $NAME | sed 's/\.avi/\.smi/'`&lt;br /&gt;&lt;br /&gt;SIZE_X=`file "$1" | sed 's/.* \([0-9]*\) x .*/\1/'`&lt;br /&gt;SIZE_Y=`file "$1" | sed 's/.* x \([0-9]*\).*/\1/'`&lt;br /&gt;SIZE_Y2=`expr $SIZE_Y \* 480 / $SIZE_X`&lt;br /&gt;&lt;br /&gt;TMP=`tempfile`&lt;br /&gt;cat "$SUBFILE" | iconv -f cp949 -t utf-8 &amp;gt; $TMP&lt;br /&gt;&lt;br /&gt;mencoder "$1" -o "$TONAME" \&lt;br /&gt;-mc
0 -of lavf -lavfopts format=MP4 -ofps 24.000 -vf-add
crop=$SIZE_X:$SIZE_Y:-1:-1&amp;nbsp; -vf-add scale=480:$SIZE_Y2 -vf-add
expand=480:320:-1:-1:1 -ovc x264 -x264encopts
bitrate=700:subq=1:global_header:trellis=0:level_idc=13:nocabac -srate
44100 -oac faac -faacopts br=96:mpeg=4:object=2:raw -font
/usr/share/fonts/truetype/ttf-malgun/malgun.ttf -sub $TMP -utf8&lt;br /&gt;&lt;br /&gt;rm $TMP&lt;/div&gt;&lt;br /&gt;</description>
      <category>Linux</category>
      <category>ipod touch</category>
      <category>Linux</category>
      <category>Mencoder</category>
      <category>mplayer</category>
      <category>transcoding</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/33</guid>
      <comments>http://five.textcube.com/33?expandComment=1#entry33Comment</comments>
      <pubDate>Tue, 17 Mar 2009 23:26:20 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/33</feedburner:origLink></item>
    <item>
      <title>Birthday Paradox</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/f5AadJ92zoU/32</link>
      <description>Birthday Paradox 는 n명의 사람이 있을 때, 적어도 생일이 같은 사람이 한쌍 이상 존재할 활률에 관한 문제로, 의외로 생각보다 그 확률이 높기 때문에 여러곳에서 재미있는 문제로 많이 활용되고 있다.&lt;br /&gt;&lt;br /&gt;구하는 방법은 아주 간단하다. 전체 확률에서 모두 생일이 같지 않을 확률을 빼는 방법으로 쉽게 구할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;1 - &lt;sub&gt;365&lt;/sub&gt;P&lt;sub&gt;n/&lt;/sub&gt;365&lt;sup&gt;n&lt;/sup&gt;&lt;/div&gt;&lt;br /&gt;그럼 한번 실제로 구해 보자. 다음은 bc 소스이다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;scale=10&lt;br /&gt;&lt;br /&gt;define factorial(x) {&lt;br /&gt;&amp;nbsp; if(x&amp;gt;1) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return (x * factorial(x-1))&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return (1)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;define permutation(x, n) {&lt;br /&gt;&amp;nbsp; return factorial(x)/factorial(x-n)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;print "numbers: "; n = read()&lt;br /&gt;&lt;br /&gt;1-permutation(365, n)/365^n&lt;br /&gt;&lt;br /&gt;quit&lt;/div&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;$ bc -q birth.bc&lt;br /&gt;numbers: 23&lt;br /&gt;.5072972344&lt;br /&gt;&lt;br /&gt;$ bc -q birth.bc&lt;br /&gt;numbers: 41&lt;br /&gt;.9031516115&lt;/div&gt;&lt;br /&gt;위에서 볼 수 있듯이 23명만 있으면 같은 생일이 있을 확률이 50% 가 넘으며, 41명만 있으면 90% 가 넘는다.&lt;br /&gt;&lt;br /&gt;생각보다 적은 사람만 있어도 같은 생일이 있을 확률이 꽤 크다는 것을 보여주며, 보통 해쉬 충돌같은 문제를 보여주는데 활용되곤 한다.&lt;br /&gt;&lt;br /&gt;</description>
      <category>Mathematics</category>
      <category>bc</category>
      <category>HASH</category>
      <category>Mathematics</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/32</guid>
      <comments>http://five.textcube.com/32?expandComment=1#entry32Comment</comments>
      <pubDate>Tue, 17 Mar 2009 22:43:10 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/32</feedburner:origLink></item>
    <item>
      <title>ubuntu ppa 패키지 올리기</title>
      <link>http://feedproxy.google.com/~r/yoonsik/~3/7wiWigspxho/31</link>
      <description>기존에 있는 패키지를 개인적으로 패치해서 쓰거나 버전업을 할때 기존 패키지를 이용해서 쉽게 할 수 있다. ubuntu 같은 경우는 꽤 최신 버전의 소프트웨어를 빨리 반영하는 편이지만, 그래도 새로운 버전이 나왔을때 패키지에 반영되기 까지는 약간의 시간이 걸리므로 기존 버전의 패키지를 새로운 소스로 업데이트 해서 ppa 에 올려서 쓰는 경우가 많이 있다.&lt;br /&gt;&lt;br /&gt;다음은 &lt;a target="_blank" href="http://www.lesswatts.org/projects/powertop/"&gt;powertop&lt;/a&gt; 이라는 프로그램의 패키지를 만들어 ppa 에 올리는 한 예제이다.&lt;br /&gt;&lt;br /&gt;만약 기존의 패키지를 수정해 쓸거라면 다음과 같이 apt-get 으로 쉽게 소스를 설치 할 수 있다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;apt-get source powertop&lt;br /&gt;cd powertop-1.11&lt;/div&gt;&lt;br /&gt;만약 다른 debian 계열에서 제공하는 패키지 소스가 있으면 다음과 같이 설치 한다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;tar zxvf powertop_1.11.orig.tar.gz&lt;br /&gt;cd powertop-1.11&lt;br /&gt;zcat ../powertop_1.11-1.diff.gz | patch -p1&lt;/div&gt;&lt;br /&gt;이렇게 소스가 설치 되었으면, 수정 사항을 반영한 뒤에 debian/changelog 에 그 사항을 적고 debian/control 의 Uploaders 를 수정한다. 패키지를 인증하기 위해서는 최신 changelog 가 자신의 이름이어야 하며, 이것을 ppa 올리기 위해서는 control 의 Uploaders 도 꼭 자기 이름이어야 한다.&lt;br /&gt;&lt;br /&gt;이제 수정한 것이 빌드가 잘 되는지 확인하기 위해서는 다음과 같이 빌드를 해본다. 이것은 꼭 필요한 작업은 아니지만 만약 빌드가 되지 않는 패키지를 올리게 되면 ppa 에서 빌드가 실패하게 되고, 그러면 버전을 올려서 다시 올려야 하기 때문에 꼭 확인하는게 좋다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;sudo apt-get build-dep powertop&lt;br /&gt;fakeroot debian/rules binary&lt;/div&gt;&lt;br /&gt;패키지를 만들고 자신의 ppa 에 올린다. 올릴때는 dput 이라는 명령어를 이용하면 된다.&lt;br /&gt;&lt;div style="border: 1px solid rgb(204, 204, 204); padding: 10px; background-color: rgb(255, 255, 255);"&gt;debuild -S -sa&lt;br /&gt;cd ..&lt;br /&gt;dput ohyoonsik powertop_1.11-1~ohyoonsik1_source.changes&lt;/div&gt;&lt;br /&gt;자세한 설정 방법 등은 https://help.launchpad.net/Packaging/PPA 를 참고.&lt;br /&gt;&amp;nbsp;</description>
      <category>Ubuntu</category>
      <category>deb</category>
      <category>dpkg</category>
      <category>dput</category>
      <category>Linux</category>
      <category>PPA</category>
      <category>ubuntu</category>
      <author>오윤식</author>
      <guid isPermaLink="false">http://five.textcube.com/31</guid>
      <comments>http://five.textcube.com/31?expandComment=1#entry31Comment</comments>
      <pubDate>Sun, 01 Mar 2009 00:37:35 +0900</pubDate>
    <feedburner:origLink>http://five.textcube.com/31</feedburner:origLink></item>
  </channel>
</rss>
