<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4787189274939091009</id><updated>2012-03-21T14:35:19.453+09:00</updated><category term='prompt'/><category term='msvc'/><category term='a320'/><category term='glibc'/><category term='fingerprinting'/><category term='sloc'/><category term='C4127'/><category term='apt-get'/><category term='Bug'/><category term='pwdhash'/><category term='tinyscheme'/><category term='프렌드피드'/><category term='regexp'/><category term='Windows'/><category term='fibers'/><category term='Test'/><category term='win32'/><category term='소독제'/><category term='Crash'/><category term='audio'/><category term='Livemesh'/><category term='Lingoes'/><category term='gevent'/><category term='valgrind'/><category term='upstart'/><category term='nosql'/><category term='SyntaxHighlighter'/><category term='msgpack'/><category term='dotnet'/><category term='이슈'/><category term='Ogre'/><category term='Video'/><category term='compress'/><category term='scheme'/><category term='TABLE'/><category term='Lynx'/><category term='Subversion'/><category term='dotemacs'/><category term='friendfeed'/><category term='core'/><category term='wxwidget'/><category term='leak'/><category term='autohotkey'/><category term='battery'/><category term='winsdk'/><category term='poco'/><category term='deque'/><category term='slime'/><category term='Highlight'/><category term='beamer'/><category term='Pencil'/><category term='Unicode'/><category term='Assembly'/><category term='Firefox'/><category term='bdb'/><category term='build'/><category term='VMware'/><category term='Less'/><category term='jom'/><category term='nmake'/><category term='glib'/><category term='TeX'/><category term='Widget'/><category term='network'/><category term='ubuntu'/><category term='ccl'/><category term='Boost'/><category term='텍스트큐브'/><category term='Random'/><category term='Python'/><category term='podcast'/><category term='ctest'/><category term='ec2'/><category term='unittest'/><category term='bccl'/><category term='tmux'/><category term='vaporware'/><category term='xmarks'/><category term='dump'/><category term='시퀀스다이어그램'/><category term='몬헌'/><category term='ccache'/><category term='IDE'/><category term='Lisp'/><category term='원피스'/><category term='ebook'/><category term='폴아웃'/><category term='GUI'/><category term='Apollo'/><category term='eshell'/><category term='techtalk'/><category term='plugin'/><category term='tencode'/><category term='concept'/><category term='forkbomb'/><category term='cppcheck'/><category term='iostream'/><category term='ulimit'/><category term='screen'/><category term='roguelike'/><category term='gdb'/><category term='optimize'/><category term='ndrive'/><category term='mockup'/><category term='repl'/><category term='ssh'/><category term='Prototype'/><category term='한글'/><category term='누트'/><category term='SlideShow'/><category term='xmonad'/><category term='CDB'/><category term='Google'/><category term='모로윈드'/><category term='우분투'/><category term='sql'/><category term='Linux'/><category term='memcheck'/><category term='sucks'/><category term='log'/><category term='gcc'/><category term='dukenukem'/><category term='forge'/><category term='토먼트'/><category term='병맛'/><category term='GPU'/><category term='wubi'/><category term='gobject'/><category term='agc'/><category term='inittab'/><category term='SO_KEEPALIVE'/><category term='clojure'/><category term='3d'/><category term='C'/><category term='keepass'/><category term='punning'/><category term='리눅스'/><category term='upnp'/><category term='RecordWildCards'/><category term='Windows7'/><category term='wtf'/><category term='eucalyptus'/><category term='unitest'/><category term='koei'/><category term='binary'/><category term='library'/><category term='Web'/><category term='만화'/><category term='watchdog'/><category term='Military'/><category term='jdee'/><category term='ufoai'/><category term='ioctl'/><category term='iPod'/><category term='treemap'/><category term='haskell'/><category term='grep'/><category term='function'/><category term='video lecture'/><category term='link'/><category term='idutils'/><category term='macro'/><category term='디버깅'/><category term='Starwars'/><category term='textcube'/><category term='돈지랄'/><category term='foxmarks'/><category term='호스팅'/><category term='webdev'/><category term='대항해시대'/><category term='bind'/><category term='snapin'/><category term='serial'/><category term='sloccount'/><category term='lfs'/><category term='skydrive'/><category term='삽질'/><category term='win32API'/><category term='비누'/><category term='threads'/><category term='mysql'/><category term='rtmp'/><category term='구글'/><category term='Wii'/><category term='UML'/><category term='game'/><category term='bash'/><category term='티맥스'/><category term='intrepid'/><category term='movie'/><category term='lastpass'/><category term='불만제로'/><category term='레퍼런스'/><category term='MinGW'/><category term='quicklisp'/><category term='UAC'/><category term='m4650'/><category term='dingoo'/><category term='o3d'/><category term='dropbox'/><category term='Debug'/><category term='cscope'/><category term='LaTex'/><category term='lib'/><category term='JavaScript'/><category term='곱창'/><category term='zlib'/><category term='predefined'/><category term='keepalive'/><category term='bit'/><category term='lint'/><category term='media'/><category term='gp32'/><category term='gun'/><category term='프로젝트오일러'/><category term='게임기'/><category term='wxhaskell'/><category term='benchmark'/><category term='웹개발'/><category term='minunit'/><category term='증명서'/><category term='asio'/><category term='ghc'/><category term='greenlet'/><category term='딩고'/><category term='C++'/><category term='S7'/><category term='angband'/><category term='wxwindow'/><category term='cmake'/><category term='HASH'/><category term='crlf'/><category term='gamedev'/><category term='tokyocabinet'/><category term='sizeof'/><category term='setsockopt'/><category term='range'/><category term='parallel'/><category term='ppt'/><category term='nose'/><category term='scons'/><category term='사표'/><category term='bjam'/><category term='게임'/><category term='FireGesture'/><category term='NUUT'/><category term='database'/><category term='NamedFieldPuns'/><category term='도미노피자'/><category term='Unreal'/><category term='psdk'/><category term='coroutine'/><category term='variadic'/><category term='emacs'/><category term='좃스팟'/><category term='tool'/><category term='stored procedure'/><category term='hunchentoot'/><category term='flymake'/><category term='snappy'/><category term='cabal'/><category term='Java'/><category term='xcom'/><category term='go'/><category term='Ogre3D'/><category term='boostbuild'/><category term='idiom'/><category term='kindle'/><category term='codehighlight'/><category term='tcp'/><category term='gdbtui'/><category term='무쌍'/><category term='Syntax'/><category term='blogger'/><category term='feature'/><category term='iterator'/><category term='엘더스크를'/><category term='NDS'/><category term='minidump'/><category term='사직서'/><category term='링크'/><category term='SVN'/><category term='mercurial'/><category term='password'/><category term='NASA'/><category term='netcat'/><category term='JailBreak'/><category term='db'/><category term='profile'/><title type='text'>헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤</title><subtitle type='html'>헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤헤</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default?start-index=101&amp;max-results=100'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>258</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3882987807183023259</id><published>2012-02-16T20:48:00.001+09:00</published><updated>2012-02-16T20:48:53.331+09:00</updated><title type='text'>Youporn.com is now a 100% Redis Site</title><content type='html'>&lt;a href="https://groups.google.com/group/redis-db/browse_thread/thread/77841c595d29f983"&gt;https://groups.google.com/group/redis-db/browse_thread/thread/77841c595d29f983&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;redis!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3882987807183023259?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3882987807183023259/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3882987807183023259' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3882987807183023259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3882987807183023259'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2012/02/youporncom-is-now-100-redis-site.html' title='Youporn.com is now a 100% Redis Site'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5461928759850284028</id><published>2012-02-15T13:31:00.002+09:00</published><updated>2012-02-15T13:32:59.237+09:00</updated><title type='text'>mercurial phases</title><content type='html'>&lt;a href="http://mercurial.selenic.com/wiki/Phases"&gt;http://mercurial.selenic.com/wiki/Phases&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이전에 쓴 &lt;a href="http://yoonkn.blogspot.com/2012/01/mercurial-push.html"&gt;nudge alias&lt;/a&gt; 보단 이게 더 쓰기 좋은듯.&lt;br /&gt;이거 응용한 local branch 류 확장도 곧 나오지 않을까?&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5461928759850284028?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5461928759850284028/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5461928759850284028' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5461928759850284028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5461928759850284028'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2012/02/mercurial-phases.html' title='mercurial phases'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8202026335696326070</id><published>2012-02-14T14:59:00.004+09:00</published><updated>2012-02-14T14:59:36.184+09:00</updated><title type='text'>Git performance results on a large repository</title><content type='html'>&lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/189776"&gt;http://thread.gmane.org/gmane.comp.version-control.git/189776&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;페이스북 리파지토리 쩐다.&lt;br /&gt;난 아마 저런규모 소스트리를 볼날이 없겠지....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8202026335696326070?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8202026335696326070/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8202026335696326070' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8202026335696326070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8202026335696326070'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2012/02/git-performance-results-on-large.html' title='Git performance results on a large repository'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7576057451704593399</id><published>2012-01-26T15:26:00.000+09:00</published><updated>2012-01-26T15:26:02.799+09:00</updated><title type='text'>mercurial 현재 브랜치만 push 하기</title><content type='html'>&lt;a href="http://hgtip.com/tips/advanced/2009-09-28-nudge-a-gentler-push/"&gt;http://hgtip.com/tips/advanced/2009-09-28-nudge-a-gentler-push/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;우왕. git 부럽지않네. mercurial 관련 최고의 팁인듯.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7576057451704593399?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7576057451704593399/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7576057451704593399' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7576057451704593399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7576057451704593399'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2012/01/mercurial-push.html' title='mercurial 현재 브랜치만 push 하기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8838463468348734880</id><published>2012-01-11T18:16:00.002+09:00</published><updated>2012-01-11T18:16:30.991+09:00</updated><title type='text'>flash 게임 어떻게 돈버나</title><content type='html'>&lt;a href="http://www.reddit.com/r/gamedev/comments/o16aw/if_one_would_program_a_small_but_popular_flash/"&gt;http://www.reddit.com/r/gamedev/comments/o16aw/if_one_would_program_a_small_but_popular_flash/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8838463468348734880?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8838463468348734880/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8838463468348734880' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8838463468348734880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8838463468348734880'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2012/01/flash.html' title='flash 게임 어떻게 돈버나'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-21094752098186180</id><published>2011-11-12T14:18:00.001+09:00</published><updated>2011-11-12T14:18:46.726+09:00</updated><title type='text'>메일 계정 털렸는지 알아보는 사이트</title><content type='html'>&lt;a href="https://www.pwnedlist.com/"&gt;https://www.pwnedlist.com/&lt;/a&gt;&lt;br /&gt;이런게 있네.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.reddit.com/r/AskReddit/comments/m8uuc/reddit_i_just_came_across_a_list_of_about_47k/"&gt;http://www.reddit.com/r/AskReddit/comments/m8uuc/reddit_i_just_came_across_a_list_of_about_47k/&lt;/a&gt;&lt;br /&gt;에서 알게됐음&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-21094752098186180?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/21094752098186180/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=21094752098186180' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/21094752098186180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/21094752098186180'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/11/blog-post_12.html' title='메일 계정 털렸는지 알아보는 사이트'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2778858940141674875</id><published>2011-11-04T21:13:00.003+09:00</published><updated>2011-11-04T21:13:36.902+09:00</updated><title type='text'>에버큐브</title><content type='html'>&lt;a href="http://evercu.be/"&gt;http://evercu.be/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;아..&lt;br /&gt;좋아보인다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2778858940141674875?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2778858940141674875/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2778858940141674875' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2778858940141674875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2778858940141674875'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/11/blog-post.html' title='에버큐브'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8581307545365730324</id><published>2011-11-03T15:53:00.001+09:00</published><updated>2011-11-03T15:53:30.435+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>Mercurial 2.0 has added largefiles extension (older r. are downloaded on demand)</title><content type='html'>&lt;a href="http://news.ycombinator.com/item?id=3185982"&gt;Mercurial 2.0 has added largefiles extension (older r. are downloaded on demand) &lt;/a&gt;&lt;br /&gt;&lt;a href="http://mercurial.selenic.com/wiki/LargefilesExtension"&gt;LargefilesExtension&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;현재 hg 만족하면서 쓰고 있는데 덩치큰 리소스 파일들 처리가 좀 애매하다.&lt;br /&gt;저링크 기억해두고 후에 도입을 검토해봐야 할듯.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8581307545365730324?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8581307545365730324/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8581307545365730324' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8581307545365730324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8581307545365730324'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/11/mercurial-20-has-added-largefiles.html' title='Mercurial 2.0 has added largefiles extension (older r. are downloaded on demand)'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2916615484024857879</id><published>2011-11-03T14:19:00.004+09:00</published><updated>2011-11-03T14:19:52.876+09:00</updated><title type='text'>tumblr</title><content type='html'>&lt;a href="http://yoonkn.tumblr.com/"&gt;http://yoonkn.tumblr.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;우왕굿.&lt;br /&gt;깔끔한데?&lt;br /&gt;블로거보다 맘에 드는데?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2916615484024857879?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2916615484024857879/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2916615484024857879' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2916615484024857879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2916615484024857879'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/11/tumblr.html' title='tumblr'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5660934104218817176</id><published>2011-11-02T16:02:00.000+09:00</published><updated>2011-11-02T16:04:45.382+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>occur-edit-mode</title><content type='html'>&lt;br /&gt;Occur Edit mode applies edits made in *Occur* buffers to the original buffers. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;emacs NEWS 를 읽다보니 이런게 생겼네.&lt;br /&gt;occur 자주 쓰는데 이기능 종종 쓸것같다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5660934104218817176?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5660934104218817176/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5660934104218817176' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5660934104218817176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5660934104218817176'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/11/occur-edit-mode.html' title='occur-edit-mode'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-9195236271019510486</id><published>2011-11-01T16:46:00.001+09:00</published><updated>2011-11-01T16:46:22.769+09:00</updated><title type='text'>tio - container server (key/value, list, queue), focused on publish/subscribe pattern</title><content type='html'>&lt;a href="http://code.google.com/p/tio/"&gt;http://code.google.com/p/tio/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.reddit.com/r/programming/comments/lv3o8/tio_container_server_keyvalue_list_queue_focused/"&gt;reddit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;음. 흥미있는 프로젝트네.&lt;br /&gt;기억해두자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-9195236271019510486?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/9195236271019510486/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=9195236271019510486' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/9195236271019510486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/9195236271019510486'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/11/tio-container-server-keyvalue-list.html' title='tio - container server (key/value, list, queue), focused on publish/subscribe pattern'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3801784311533662843</id><published>2011-03-23T14:57:00.000+09:00</published><updated>2011-03-23T14:57:35.967+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zlib'/><category scheme='http://www.blogger.com/atom/ns#' term='snappy'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='compress'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='lib'/><title type='text'>google snappy</title><content type='html'>&lt;a href="http://code.google.com/p/snappy/"&gt;http://code.google.com/p/snappy/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.reddit.com/r/programming/comments/g95ki/google_releases_snappy_a_fast_compression_library/"&gt;reddit&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;오.. 기억해둘만한 라이브러리.&lt;br /&gt;다음번에는 zlib 말고 이놈을 써보자.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3801784311533662843?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3801784311533662843/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3801784311533662843' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3801784311533662843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3801784311533662843'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/03/google-snappy.html' title='google snappy'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4087071098370467012</id><published>2011-03-03T12:42:00.000+09:00</published><updated>2011-03-03T12:42:04.611+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='stored procedure'/><title type='text'>mysql stored procedure 에 유니코드를 인자로 넘기기</title><content type='html'>내가 보통 mysql 사용시 필드 타입을 char() 으로 잡기 때문에 sp 에서도 인자 타입을 char() 로 잡았었는데 이럴경우 sp 에 유니코드(한글)을 넘길때 에러가 나네. 아 쉬바.&lt;br /&gt;&lt;br /&gt;결국 sp 에서는 nchar 로 잡아줘야만 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;코드 적어보면 아래 testme sp 를 만들고 call testme('한글') 을 부르면 깨지고&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;drop procedure if exists `testme` $$&lt;br /&gt;create procedure `testme` (s nchar(40))&lt;br /&gt;begin&lt;br /&gt;        select s;&lt;br /&gt;end $$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;s 타입을 nchar(40) 으로 바꾸고 testme('한글') 을 부르면 오키.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.5/en/charset-national.html"&gt;http://dev.mysql.com/doc/refman/5.5/en/charset-national.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4087071098370467012?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4087071098370467012/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4087071098370467012' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4087071098370467012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4087071098370467012'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/03/mysql-stored-procedure.html' title='mysql stored procedure 에 유니코드를 인자로 넘기기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7699219446583663332</id><published>2011-01-26T00:11:00.003+09:00</published><updated>2011-01-26T00:29:55.435+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kindle'/><title type='text'>킨들3 관련 링크 몇개</title><content type='html'>&lt;a href="http://www.instapaper.com/"&gt;http://www.instapaper.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kinstant.com/"&gt;http://kinstant.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kindlefeeder.com/"&gt;http://www.kindlefeeder.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://foosoft.net/mangle/"&gt;http://foosoft.net/mangle/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;인스타페이퍼만 써본 상태.&lt;br /&gt;나머지는.. 흠. 일단 적어는 두는데 내가 쓸일은 아마 없을듯?&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;&lt;a href="http://wiki.mobileread.com/wiki/Visual_Kindle_Guide"&gt;http://wiki.mobileread.com/wiki/Visual_Kindle_Guide&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.mobileread.com/wiki/MOBI"&gt;http://wiki.mobileread.com/wiki/MOBI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;&lt;a href="http://hackage.haskell.org/package/pandoc"&gt;pandoc&lt;/a&gt; 이 현재 epub 는 지원하는데 mobi 는 미지원. 흠...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7699219446583663332?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7699219446583663332/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7699219446583663332' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7699219446583663332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7699219446583663332'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/01/3_26.html' title='킨들3 관련 링크 몇개'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7638563544700157675</id><published>2011-01-25T23:29:00.000+09:00</published><updated>2011-01-25T23:29:24.112+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kindle'/><category scheme='http://www.blogger.com/atom/ns#' term='ebook'/><title type='text'>킨들3 지른거 도착</title><content type='html'>누트1 은 무용지물이 된지 오래.&lt;br /&gt;한동안 지하철에서 익뮤로 글읽으면서 아이패드2 를 기다렸는데&lt;br /&gt;지난 20일경에 그냥 킨들3 wifi 버전을 질렀다.&lt;br /&gt;그지새퀴라 케이스 없이 본체만 달랑.&lt;br /&gt;&lt;br /&gt;대략 185$ 인가 뜬거 같고..&lt;br /&gt;오늘(25일) 배송이 온걸 보니...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;우왕ㅋ굳ㅋ&lt;br /&gt;사길잘했군.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7638563544700157675?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7638563544700157675/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7638563544700157675' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7638563544700157675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7638563544700157675'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/01/3.html' title='킨들3 지른거 도착'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4669103007698266084</id><published>2011-01-12T14:26:00.000+09:00</published><updated>2011-01-12T14:26:52.965+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>mysql 에  stored procedure 쓰는건 고통스럽네.</title><content type='html'>&lt;a href="http://bugs.mysql.com/bug.php?id=11918"&gt;SP does not accept variables in LIMIT clause&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;형편없는 에러메시지,디버깅,프로파일링 힘든건 뭐 그렇다 치더라도&lt;br /&gt;오늘 보니 sp 안에서 limit 문을 쓰는게 너무 제약이 심하다.&lt;br /&gt;검색해보니 이문제는 2005년부터 제시된것인데 2010년에서나 해결된듯.&lt;br /&gt;커멘트 읽어보면 이 이슈처리 자체가 매우 병신같음.&lt;br /&gt;&lt;br /&gt;우리는 아직 5.1 을 쓰고 있어서 여전히 문제가남은 상태.&lt;br /&gt;5.5 로 올리거나 저기서 소개된대로 sp 안에서 sql 만들어 쓰거나 아니면 그냥 일부 경우에는 sp 안쓰거나 식으로 해결해야 할것 같은데 세가지 다 짜증나네.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;당연히 지원될거라고 생각했던게 안되서 시간을 버려야 한다니..&lt;br /&gt;다음번엔 mysql + sp 조합은 피해야겠다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4669103007698266084?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4669103007698266084/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4669103007698266084' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4669103007698266084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4669103007698266084'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/01/mysql-stored-procedure.html' title='mysql 에  stored procedure 쓰는건 고통스럽네.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7735745583054084854</id><published>2011-01-04T01:09:00.000+09:00</published><updated>2011-01-04T01:09:16.285+09:00</updated><title type='text'>redis mingw 포팅 링크</title><content type='html'>&lt;a href="https://github.com/dmajkic/redis"&gt;https://github.com/dmajkic/redis&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;redis 는 win32 쪽에서 쓰기엔 껄쩍지근 하겠군.&lt;br /&gt;API 형태나 소스가 그리 길지 않다는점, internal 문서를 제공한다는 점 등등이 맘에 드는데..&lt;br /&gt;아쉽군.&lt;br /&gt;이쪽 문서 읽다보니 libevent 나 libev 를 쓰지 않고 독자구현 했던데 후에 한번 구경해보자.&lt;br /&gt;위 링크에 언급된 redis 포트가 iocp 까지 붙여놨는지는 확인 안해봤다.&lt;br /&gt;아마 안했겠지..&lt;br /&gt;&lt;br /&gt;참고로 이쪽 뒤져보다가 mongodb 의 네트웍 처리가 궁금해서 잠깐 코드 읽어봤는데 그냥 select 에 소켓당 쓰레드 모델을 썼네... 근데 이친구들은 boost 류파라서 후에 asio 붙여줄듯. 주석에도 언급이 있다...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7735745583054084854?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7735745583054084854/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7735745583054084854' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7735745583054084854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7735745583054084854'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2011/01/redis-mingw.html' title='redis mingw 포팅 링크'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6233401482843202030</id><published>2010-12-31T12:20:00.001+09:00</published><updated>2011-01-06T00:29:58.097+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><title type='text'>NoSQL 구현체 비교</title><content type='html'>&lt;a href="http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis"&gt;Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase comparison &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;좋은글.&lt;br /&gt;mongodb 도입을 검토하다 만적이 있는데 다음엔 redis 를 검토해봐야할듯.&lt;br /&gt;&lt;br /&gt;추가. 2011/01/06&lt;br /&gt;&lt;a href="http://blog.nahurst.com/visual-guide-to-nosql-systems"&gt;Visual Guide to NoSQL Systems &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6233401482843202030?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6233401482843202030/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6233401482843202030' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6233401482843202030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6233401482843202030'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/nosql.html' title='NoSQL 구현체 비교'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6215570426830125321</id><published>2010-12-30T19:44:00.000+09:00</published><updated>2010-12-30T19:44:20.721+09:00</updated><title type='text'>잼나는 디버깅 스토리</title><content type='html'>&lt;a href="http://patrickthomson.tumblr.com/post/2499755681/the-best-debugging-story-ive-ever-heard"&gt;The Best Debugging Story I’ve Ever Heard &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.reddit.com/r/programming/comments/et880/the_best_debugging_story_ive_ever_heard/"&gt;reddit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;반전 쩐다.&lt;br /&gt;지하철서 정말 잼나게 읽은 글.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6215570426830125321?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6215570426830125321/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6215570426830125321' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6215570426830125321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6215570426830125321'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/blog-post_30.html' title='잼나는 디버깅 스토리'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3053924744479173269</id><published>2010-12-29T21:07:00.000+09:00</published><updated>2010-12-29T21:07:39.794+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='watchdog'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='inittab'/><category scheme='http://www.blogger.com/atom/ns#' term='upstart'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>upstart 를 이용해서 daemon 죽었을때 다시 띄우기</title><content type='html'>&lt;a href="http://upstart.ubuntu.com/"&gt;http://upstart.ubuntu.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;서버등을 돌리다가 죽는경우 다시 띄우거나 하는 작업이 필요한데 개발중에는 &lt;a href="http://yoonkn.blogspot.com/2010/12/repeatsh.html"&gt;repeat.sh&lt;/a&gt; 등을 만들어서 쓰고 있지만 데모용으로 띄울경우는 init 등에서의 작업이 필요. ubuntu 가 가진 upstart 를 쓸때의 간단한 사용법을 적어둔다.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;/tmp/a.out 에 데몬이 있다고 가정해보자.&lt;/li&gt;&lt;li&gt;/etc/init/foo.conf 작성&lt;br /&gt;description "shit"&lt;br /&gt;exec /tmp/a.out&lt;br /&gt;respawn&lt;/li&gt;&lt;li&gt;sudo &lt;b&gt;initctl reload-configuration&lt;/b&gt; 으로 foo.conf 읽고&lt;/li&gt;&lt;li&gt;sudo &lt;b&gt;start&lt;/b&gt; foo 로 프로세스 돌리고&lt;/li&gt;&lt;li&gt;&lt;b&gt;initctl status&lt;/b&gt; foo 로 확인&lt;/li&gt;&lt;li&gt;sudo &lt;b&gt;stop&lt;/b&gt; foo 로 프로세스 정지&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;좀더 상세한 사항은 init(5), initctl 등의 manpage 참고&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3053924744479173269?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3053924744479173269/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3053924744479173269' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3053924744479173269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3053924744479173269'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/upstart-daemon.html' title='upstart 를 이용해서 daemon 죽었을때 다시 띄우기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4641361780466621018</id><published>2010-12-28T13:10:00.000+09:00</published><updated>2010-12-28T13:10:04.459+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='tmux'/><title type='text'>GNU screen</title><content type='html'>&lt;a href="http://www.yoonkn.com/gnu-screen"&gt;이전위키에 있던 내용&lt;/a&gt;을 옮겨왔다.&lt;br /&gt;&lt;a href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt; 도 한번 써보고 싶은데 당장 급해서 일단 screen 쓰다가 옮겨놓은것. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;관련링크&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://oldpie.yoonkn.com/cgi-bin/moin.cgi/GNU_screen" rel="nofollow"&gt;http://oldpie.yoonkn.com/cgi-bin/moin.cgi/GNU_screen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gnu_screen" rel="nofollow"&gt;http://en.wikipedia.org/wiki/Gnu_screen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kr.sun.com/developers/solaris/techdocs/gnu_screen.html" rel="nofollow"&gt;http://kr.sun.com/developers/solaris/techdocs/gnu_screen.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gentoo-wiki.com/TIP_Using_screen" rel="nofollow"&gt;http://gentoo-wiki.com/TIP_Using_screen&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a href="" name="TOC-2"&gt;&lt;/a&gt;외워둘만한명령들&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;도움말은 &lt;b&gt;C-a ?&lt;/b&gt;&lt;/li&gt;&lt;li&gt;screen 상태에서 &lt;b&gt;C-a C-d&lt;/b&gt; 로 디태치, &lt;b&gt;screen -ls&lt;/b&gt; 로 세션들을 확인하고 &lt;b&gt;screen -r&lt;/b&gt; 세션이름 을 통해 resume&lt;/li&gt;&lt;li&gt;만약 디태치를 하는것을 깜박하고 장비앞을 떠났다면 &lt;b&gt;screen -d&lt;/b&gt; 를 통해서 screen 세션 외부에서 디태치 가능&lt;/li&gt;&lt;li&gt;로깅이 필요하면 &lt;b&gt;C-a H &lt;/b&gt;현 한화면만 잡으려면 &lt;b&gt;C-a h&lt;/b&gt;&lt;/li&gt;&lt;li&gt;새 창을 열려면 &lt;b&gt;C-a c&lt;/b&gt; 또는 screen 안에서 screen vi 등으로 실행&lt;/li&gt;&lt;li&gt;창간의 전환은 &lt;b&gt;C-a C-a&lt;/b&gt;, &lt;b&gt;C-a n&lt;/b&gt;, &lt;b&gt;C-a C-p&lt;/b&gt;, 등으로 앞뒤로 움직이거나 &lt;b&gt;C-a "&lt;/b&gt; 로 리스팅해서 전환 또는 &lt;b&gt;C-a 숫자&lt;/b&gt; 로 전환&lt;/li&gt;&lt;li&gt;C-a 를 프로세스에 보내려면 &lt;b&gt;C-a a&lt;/b&gt;&lt;/li&gt;&lt;li&gt;브레이크를 보내려면 &lt;b&gt;C-a C-b&lt;/b&gt;&lt;/li&gt;&lt;li&gt;clear 하려면&lt;b&gt; C-a C&lt;/b&gt;&lt;/li&gt;&lt;li&gt;현재 창의 정보는 &lt;b&gt;C-a i&lt;/b&gt;&lt;/li&gt;&lt;li&gt;리플레시하려면 &lt;b&gt;C-a l&lt;/b&gt;&lt;/li&gt;&lt;li&gt;창을 나누려면 &lt;b&gt;C-a S&lt;/b&gt; 나뉜 창간에 포커스 이동은 &lt;b&gt;C-a TAB&lt;/b&gt; 현재창만 남기려면 &lt;b&gt;C-a Q &lt;/b&gt;현재창을 닫으려면&lt;b&gt; C-a X&lt;/b&gt;&lt;/li&gt;&lt;li&gt;copy 하려면 &lt;b&gt;C-a [&lt;/b&gt; paste 하려면 &lt;b&gt;C-a ]&lt;/b&gt; 이쪽은 좀 복잡한 기능들이 많이 붙어있다.&lt;/li&gt;&lt;/ul&gt;이외에도 존내 많은 기능과 바인딩들이 있다. C-a 때문에 &lt;a href="http://www.yoonkn.com/emacs"&gt;emacs&lt;/a&gt; 와 바인딩이 겹치는게 좀 피곤해서 잘 안쓰지만 외부장비에 접속했을경우엔 아주 도움되는 유틸리티.&lt;br /&gt;&lt;h2&gt;&lt;a href="" name="TOC-.screenrc"&gt;&lt;/a&gt;.screenrc&lt;/h2&gt;&lt;a href="http://gentoo-wiki.com/TIP_Using_screen" rel="nofollow"&gt;http://gentoo-wiki.com/TIP_Using_screen&lt;/a&gt; 에서 따왔다.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: courier new,monospace; font-size: xx-small;"&gt;startup_message off&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: xx-small;"&gt;hardstatus   alwayslastline&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: xx-small;"&gt;hardstatus  string '%{gk}[ %{G}%H %{g}][%= %{wk}%?%-Lw%?%{=b kR}(%{W}%n*%f  %t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]%{=b C}[ %m/%d  %c ]%{W}'&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4641361780466621018?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4641361780466621018/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4641361780466621018' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4641361780466621018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4641361780466621018'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/gnu-screen.html' title='GNU screen'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4108386956655180909</id><published>2010-12-24T13:14:00.000+09:00</published><updated>2010-12-24T13:14:50.077+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coroutine'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>python, yield 를 이용한 코루틴</title><content type='html'>&lt;a href="http://yoonkn.blogspot.com/2010/12/twisteddeferinlinecallbacks.html"&gt;이전글&lt;/a&gt; 작성하고 어떻게 그코드가 돌아가나 했더니 언젠가부터 yield 가 값을 리턴해줄수 있게 됐네.&lt;br /&gt;&lt;a href="http://www.python.org/dev/peps/pep-0342/"&gt;http://www.python.org/dev/peps/pep-0342/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;즉 yield 로 빠져나간 흐름을 받은 곳에서 send(값) 를 불러주면 yield 의결과로 그 값이 리턴되고 throw(예외) 를 불러주면 yield 했던 그자리에서 예외가 떨어지게 된다.&lt;br /&gt;&lt;br /&gt;우왕굿.&lt;br /&gt;&lt;br /&gt;generator 의 복사가 가능한지 좀더 찾아봐야겠다...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4108386956655180909?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4108386956655180909/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4108386956655180909' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4108386956655180909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4108386956655180909'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/python-yield.html' title='python, yield 를 이용한 코루틴'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4350327083417275994</id><published>2010-12-24T12:24:00.003+09:00</published><updated>2010-12-24T12:40:47.091+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='Highlight'/><category scheme='http://www.blogger.com/atom/ns#' term='SyntaxHighlighter'/><title type='text'>blogger 에 코드하이라이팅 적용</title><content type='html'>&lt;a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html"&gt;http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html&lt;/a&gt; &lt;br /&gt;를 참고했다.&lt;br /&gt;&lt;br /&gt;나중에 검색할일을 생각해서 간단히 사용법만 적어둔다.&lt;br /&gt;참고로 lisp brush 는 &lt;a href="https://github.com/knuthaug/sh-lisp"&gt;https://github.com/knuthaug/sh-lisp&lt;/a&gt; 에서 따온것.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;pre class="brush: html"&gt;blahblah&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: python"&gt;def foo():&lt;br /&gt;    pass&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: lisp"&gt;(defun foo () &lt;br /&gt;  nil)&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4350327083417275994?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4350327083417275994/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4350327083417275994' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4350327083417275994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4350327083417275994'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/blogger.html' title='blogger 에 코드하이라이팅 적용'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5663298422612361332</id><published>2010-12-23T17:04:00.000+09:00</published><updated>2010-12-23T17:04:08.322+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>우분투 타이틀바 버튼 오른쪽으로 붙이기</title><content type='html'>&lt;a href="http://ubuntuforums.org/showthread.php?p=8941691"&gt;http://ubuntuforums.org/showthread.php?p=8941691&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5663298422612361332?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5663298422612361332/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5663298422612361332' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5663298422612361332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5663298422612361332'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/blog-post_23.html' title='우분투 타이틀바 버튼 오른쪽으로 붙이기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2984673267054335946</id><published>2010-12-23T16:11:00.000+09:00</published><updated>2010-12-23T16:11:43.803+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>mysql memory engine 제약이 많네..</title><content type='html'>&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html"&gt;http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이걸 쓰는게 요구사항에 맞는지 좀더 생각해봐야할듯.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2984673267054335946?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2984673267054335946/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2984673267054335946' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2984673267054335946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2984673267054335946'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/mysql-memory-engine.html' title='mysql memory engine 제약이 많네..'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5003465013617964957</id><published>2010-12-22T17:04:00.002+09:00</published><updated>2010-12-22T17:05:07.676+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='textcube'/><title type='text'>텍스트큐브에서 블로거 로</title><content type='html'>비밀글 처리 병신같네.&lt;br /&gt;소스넣는방법부터 찾아봐야겠다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5003465013617964957?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5003465013617964957/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5003465013617964957' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5003465013617964957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5003465013617964957'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/blog-post_22.html' title='텍스트큐브에서 블로거 로'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-577591694162201657</id><published>2010-12-22T15:37:00.002+09:00</published><updated>2010-12-23T13:58:04.395+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>repeat.sh 만들어봤다.</title><content type='html'>종종 쓰이네&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: firebrick;"&gt;#&lt;/span&gt;&lt;span style="color: firebrick;"&gt;! /usr/bin/&lt;/span&gt;&lt;span style="color: #a020f0;"&gt;env&lt;/span&gt;&lt;span style="color: firebrick;"&gt; bash&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: sienna;"&gt;SLEEP&lt;/span&gt;=1&lt;br /&gt;&lt;span style="color: sienna;"&gt;COUNT&lt;/span&gt;=1&lt;br /&gt;&lt;span style="color: #a020f0;"&gt;while&lt;/span&gt; [ 1 ] ; &lt;span style="color: #a020f0;"&gt;do&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #7a378b;"&gt;echo&lt;/span&gt; &lt;span style="color: #8b2252;"&gt;"repeat($COUNT th): "&lt;/span&gt; $&lt;span style="color: sienna;"&gt;@&lt;/span&gt;&lt;br /&gt;    $&lt;span style="color: sienna;"&gt;@&lt;/span&gt;&lt;br /&gt;    sleep $&lt;span style="color: sienna;"&gt;SLEEP&lt;/span&gt;&lt;br /&gt;    let COUNT++&lt;br /&gt;&lt;span style="color: #a020f0;"&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-577591694162201657?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/577591694162201657/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=577591694162201657' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/577591694162201657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/577591694162201657'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/repeatsh.html' title='repeat.sh 만들어봤다.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2537226522978603406</id><published>2010-12-17T13:10:00.000+09:00</published><updated>2010-12-22T13:04:04.179+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ulimit'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ulimit 값 변경해주기</title><content type='html'>리눅스 설치때마다 한번씩 해주는 작업이라 항상 가물가물하다.&lt;br /&gt;이번에 적어두자.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://posidev.com/blog/2009/06/04/set-ulimit-parameters-on-ubuntu/"&gt;http://posidev.com/blog/2009/06/04/set-ulimit-parameters-on-ubuntu/&lt;/a&gt; 가 원문.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;/etc/security/limits.conf 에 적당히 내용 추가&lt;br /&gt;yoonkn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; soft &amp;nbsp;&amp;nbsp; nofile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 20000 &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;yoonkn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hard &amp;nbsp;&amp;nbsp; nofile &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 65000&lt;br /&gt;yoonkn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; soft &amp;nbsp;&amp;nbsp; core &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 100000 &lt;br /&gt;yoonkn &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hard &amp;nbsp;&amp;nbsp; core &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 100000 &lt;/li&gt;&lt;li&gt;/etc/pam.d/common-session 에 아래 내용 추가&lt;br /&gt;session required pam_limits.so&lt;/li&gt;&lt;li&gt;reboot&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2537226522978603406?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2537226522978603406/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2537226522978603406' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2537226522978603406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2537226522978603406'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/ulimit-%EA%B0%92-%EB%B3%80%EA%B2%BD%ED%95%B4%EC%A3%BC%EA%B8%B0.html' title='ulimit 값 변경해주기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2720975954972412940</id><published>2010-12-17T12:30:00.000+09:00</published><updated>2010-12-22T13:04:02.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gevent'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>gevent, 하나의 소켓을 두개의 그린렛이 공유할때 한쪽이 소켓을 닫아버리면?</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ol_75jFEpck?fs=1&amp;amp;hl=ko_KR"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ol_75jFEpck?fs=1&amp;amp;hl=ko_KR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;돌다리는 두들겨야 제맛.&lt;br /&gt;&lt;br /&gt;[code python]&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;# &lt;br /&gt;# gevent 사용시 하나의 그린렛이 소켓에 대고 뭔가를 읽으려고 블럭중인데&lt;br /&gt;# 다른 그린렛이 그 소켓을 닫아버릴경우 어떤일이 생기는가를 테스트해본 코드.&lt;br /&gt;#&lt;br /&gt;# 결론만 적자면&lt;br /&gt;# victim 과 killer 가 sock 을 공유하고 victim 이 sock 에대고 블러킹&lt;br /&gt;# recv 를 하는 도중에 killer 가 sock 을 닫아버리면 victim 쪽에서는&lt;br /&gt;# recv 가 "" 를 리턴해주는 형태로 진행.&lt;br /&gt;&lt;br /&gt;import gevent&lt;br /&gt;import gevent.socket&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def victim(sock):&lt;br /&gt;&amp;nbsp; &amp;nbsp; print("victim started")&lt;br /&gt;&amp;nbsp; &amp;nbsp; buf = sock.recv(1024)&lt;br /&gt;&amp;nbsp; &amp;nbsp; print("victim ended")&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 외부에서 소켓을 닫을경우 recv 가 "" 를 리턴해준다. gracefully&lt;br /&gt;&amp;nbsp; &amp;nbsp; # closed 된 상황으로 인식하고 진행하면 되겠군.&lt;br /&gt;&amp;nbsp; &amp;nbsp; assert type(buf) == str and buf == ""&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 혹시나 끊어진 sock 에 대고 send 를 하면 EBADF 가 떨어진다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def killer(sock, n):&lt;br /&gt;&amp;nbsp; &amp;nbsp; print("killer started")&lt;br /&gt;&amp;nbsp; &amp;nbsp; gevent.sleep(n)&lt;br /&gt;&amp;nbsp; &amp;nbsp; print("killer shoots")&lt;br /&gt;&amp;nbsp; &amp;nbsp; sock.close()&lt;br /&gt;&amp;nbsp; &amp;nbsp; print("killer ended")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 공유할 소켓&lt;br /&gt;&amp;nbsp; &amp;nbsp; sock = gevent.socket.create_connection(("127.0.0.1",7777))&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 소켓읽다 뒤질놈&lt;br /&gt;&amp;nbsp; &amp;nbsp; gevent.spawn(victim, sock)&lt;br /&gt;&amp;nbsp; &amp;nbsp; # n 초 뒤에 소켓 죽일놈&lt;br /&gt;&amp;nbsp; &amp;nbsp; gevent.spawn(killer, sock, 1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; # join 걸기 귀찮아서 그냥 슬립으로&lt;br /&gt;&amp;nbsp; &amp;nbsp; gevent.sleep(3)&lt;br /&gt;[/code] &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2720975954972412940?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2720975954972412940/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2720975954972412940' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2720975954972412940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2720975954972412940'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/gevent-%ED%95%98%EB%82%98%EC%9D%98-%EC%86%8C%EC%BC%93%EC%9D%84-%EB%91%90%EA%B0%9C%EC%9D%98-%EA%B7%B8%EB%A6%B0%EB%A0%9B%EC%9D%B4-%EA%B3%B5%EC%9C%A0%ED%95%A0%EB%95%8C-%ED%95%9C%EC%AA%BD%EC%9D%B4-%EC%86%8C%EC%BC%93%EC%9D%84.html' title='gevent, 하나의 소켓을 두개의 그린렛이 공유할때 한쪽이 소켓을 닫아버리면?'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-406154344156821147</id><published>2010-12-16T21:58:00.000+09:00</published><updated>2010-12-22T13:04:00.868+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idutils'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>emacs, python 에서 id-utils 사용</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/F3RYvO2X0Oo?fs=1&amp;amp;hl=ko_KR"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/F3RYvO2X0Oo?fs=1&amp;amp;hl=ko_KR" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;간단히 적어둔다.&lt;br /&gt;리눅스환경에서만 테스트 됐음. 윈도에서는 map 파일을 어떻게 찾을지 모르겠네. 매번 실행시 인자로 주면 되긴 하겠는데...&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;파이썬스캐너가 없어서 .py 는 기본설정으로 실행시 ignore 되버림.&lt;/li&gt;&lt;li&gt;/usr/share/misc/id-lang.map 를 열어서 *.py 를 text 로 취급하도록 수정. man mkid 참고.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;이제 mkid 가 python 소스들을 읽고 ID 파일을 남기게 되었다.&lt;/li&gt;&lt;li&gt;emacs 쪽에서 idutils.el 세팅 &lt;a target="_blank" href="http://www.gnu.org/software/idutils/manual/html_node/Emacs-gid-interface.html"&gt;이글&lt;/a&gt; 참고&lt;/li&gt;&lt;li&gt;익숙한 키인 M-. 에 바인딩했다. ctags 는 버리고 gid 로 대체해보려는건데.. 흠. 바보짓일수도?&lt;br /&gt;(defun use-idutils-as-tagging-tool ()&lt;br /&gt;&amp;nbsp; (local-set-key "\M-." 'gid))&lt;br /&gt;(add-hook 'python-mode-hook 'use-idutils-as-tagging-tool)&lt;/li&gt;&lt;li&gt;이제 M-. 으로 심볼 찾아 돌아다니는게 가능해졌는데 소스 수정후 mkid 를 불러줘야 하는 불편함이 있다.&lt;/li&gt;&lt;li&gt;mkid 를 적당한때 부르는 방법이야 많겠지만 내가 당장 원하는 모양은 원하는 시점에 키 몇개 누르면 mkid 가 실행되는것.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;anything 을 이용해서 프로젝트관리를 하는 편인데 이중에 mkid 실행하기 메뉴를 추가해줬다. 저 함수는 더 깔끔하게 짜는 방법이 있을거 같은데 당장은 저코드만 떠오르네.&lt;br /&gt;(defun yoonkn-anything-projects-mkid (name)&lt;br /&gt;&amp;nbsp; (let ((curdir default-directory)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (prjdir (yoonkn-anything-projects-get-dir name)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; (unwind-protect&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (progn&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (cd prjdir)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (call-process "mkid"))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (cd curdir))))&lt;br /&gt;(defvar anything-my-source-yoonkn-projects&lt;br /&gt;&amp;nbsp; '((name . "내 프로젝트들")&lt;br /&gt;&amp;nbsp; &amp;nbsp; (candidates . yoonkn-anything-projects-candidates)&lt;br /&gt;&amp;nbsp; &amp;nbsp; (action . (("dired 실행하기" . yoonkn-anything-projects-dired)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ("psvn 실행하기"&amp;nbsp; . yoonkn-anything-projects-psvn)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ("mkid 실행하기"&amp;nbsp; . yoonkn-anything-projects-mkid)))))&lt;br /&gt;&lt;/li&gt;&lt;li&gt;이제 mkid 돌리는것도 간단히 실행가능. 우왕ㅋ굳ㅋ&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;추가. 2010/12/17&lt;br /&gt;집에서 windows7 환경에 idutils 를 돌려보니 에러나더군. 씁. gnu global 이 text 도 지원하면 좋을텐데 누군가 메일링리스트에 글을 남긴건 봤는데 흐지부지 된듯 하더군.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-406154344156821147?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/406154344156821147/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=406154344156821147' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/406154344156821147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/406154344156821147'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/emacs-python-%EC%97%90%EC%84%9C-id-utils-%EC%82%AC%EC%9A%A9.html' title='emacs, python 에서 id-utils 사용'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7093511087313458984</id><published>2010-12-14T11:41:00.000+09:00</published><updated>2010-12-22T13:03:59.344+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>mercurial 리파지토리를 dropbox 로 관리중인데 일부 리파지토리가 깨졌다</title><content type='html'>오늘 리눅스 세팅하면서 내 개인 리파지토리에서 클론을 해대다가 깨진것 발견.&lt;br /&gt;흠. 검색해보니 나만 겪는 문제는 아닌듯하다.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://forums.dropbox.com/topic.php?id=5579"&gt;http://forums.dropbox.com/topic.php?id=5579&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://stackoverflow.com/questions/1964347/mercurial-and-i-guess-git-with-dropbox-any-drawbacks"&gt;http://stackoverflow.com/questions/1964347/mercurial-and-i-guess-git-with-dropbox-any-drawbacks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;리파지토리 보관할 다른 방법을 찾아봐야겠다.&lt;br /&gt;집에 다시 서버를 돌려야 하나?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7093511087313458984?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7093511087313458984/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7093511087313458984' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7093511087313458984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7093511087313458984'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/12/mercurial-%EB%A6%AC%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC%EB%A5%BC-dropbox-%EB%A1%9C-%EA%B4%80%EB%A6%AC%EC%A4%91%EC%9D%B8%EB%8D%B0-%EC%9D%BC%EB%B6%80.html' title='mercurial 리파지토리를 dropbox 로 관리중인데 일부 리파지토리가 깨졌다'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8858254451505660189</id><published>2010-11-03T20:36:00.000+09:00</published><updated>2010-12-22T13:03:53.849+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greenlet'/><category scheme='http://www.blogger.com/atom/ns#' term='gevent'/><category scheme='http://www.blogger.com/atom/ns#' term='coroutine'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>gevent 를 이용한 에코, 채팅서버 예제</title><content type='html'>그냥 한번 테스트 해볼라고 끄적여봤다.&lt;br /&gt;현재는 twisted 기반으로 개발중인데.. 너무 덩치큰놈이라 쓰기가 좀 꺼려져서.. 사실 twisted 도 gevent 도 부하걸렸을때 문제가 없을지.. 그다지 믿음이 안간다. 뭐 좀더 지나서 테스트 시작해보면 알게 되겠지. 어쨌건 gevent 를 실무에 쓸 생각은 현재로선 거의 없는 상태.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gevent 에 대해 생각나는대로 적어둔다&lt;br /&gt;&lt;ol&gt;&lt;li&gt;처음엔 stackless python 을 써볼까 했는데 아무래도 마이너한 구현체라 생각만으로 그쳤다.&lt;/li&gt;&lt;li&gt;코루틴 구현체도 몇개 더있던데 적당히 검색하다보니 gevent 가 좀더 눈에 띄길래 이놈을 골랐다.&lt;/li&gt;&lt;li&gt;libevent 기반이라 윈도에서 쓰긴 좀 그렇다. select 의 압박. 음 지금은 다를라나? 그래도 .exe 형태의 패키지를 제공해서 libevent 빌딩하는 삽질은 안해도 된다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;당장 윈도기준으로 PC 를 쓰는중이라 스트레스 테스트 코드는 안만들었음.&lt;/li&gt;&lt;li&gt;당연한 얘기지만 &lt;span style="font-weight: bold;"&gt;코딩이 존나 편해진다. 그냥 컨넥션당 쓰레드 하나 쓰는 식으로 짜면 된다.&lt;/span&gt; 아래 chat 코드 예제에서 login 을 async 로 짠다고 생각해보자. "너누구냐" 보내는 코드, 응답읽는 코드, "누구안녕" 보내는 코드가 사방으로 흩어진다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;하지만 async 방식으로 짜던 습관이 남아있으면 존내 어색함.&lt;/li&gt;&lt;li&gt;아래 코드엔 없지만 멍키패칭이 존내 편함.&lt;/li&gt;&lt;li&gt;뒤져보면 벤치마킹이 여기저기 있는데.. twisted 보단 성능이 훨씬 좋은편.&lt;/li&gt;&lt;li&gt;아래코드중 register/unregister 는 세션간 참조를 위해 적당한곳에 모아두기위한 작업인데 좀 짜다만 코드라 거슬린다.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;[code python]&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;# &lt;br /&gt;# gevent 를 테스트하기 위한 코드&lt;br /&gt;# echo() 또는 chat() 를 불러서 에코서버나 챗서버를 띄울수있다.&lt;br /&gt;# 여러가지로 테스트 해보고 괜찮으면 사용을 해보자.&lt;br /&gt;#&lt;br /&gt;# 일단 컨셉은 session 을 상속받아서 소켓처리를 해주는 코드만 짜주면 되도록 하는것&lt;br /&gt;# 좀더 신경써줄부분은&lt;br /&gt;#&lt;br /&gt;# 1. server.run 에서 그냥 start 를 부르게 해서 블러킹 막고 여러 서버를 동시에 돌릴수 있게 수정&lt;br /&gt;# 2. session.mother.sessions 를 통해 다른 세션에 접근하는 방식이 적절한지 생각해볼것.&lt;br /&gt;# &lt;br /&gt;&lt;br /&gt;import gevent&lt;br /&gt;import gevent.server&lt;br /&gt;import gevent.socket&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def LOG(fmt, *args):&lt;br /&gt;&amp;nbsp; &amp;nbsp; print(str(fmt) % args)&lt;br /&gt;&lt;br /&gt;class InvalidSessionNameError(StandardError):&lt;br /&gt;&amp;nbsp; &amp;nbsp; pass&lt;br /&gt;class DuplicatedSessionNameError(StandardError):&lt;br /&gt;&amp;nbsp; &amp;nbsp; pass&lt;br /&gt;class UnknownSessionNameError(StandardError):&lt;br /&gt;&amp;nbsp; &amp;nbsp; pass&lt;br /&gt;&lt;br /&gt;class server:&lt;br /&gt;&amp;nbsp; &amp;nbsp; """연결을 받아서 적당한 세션을 까고 그 세션들을 기억해두는&lt;br /&gt;&amp;nbsp; &amp;nbsp; 놈. 상속받아 쓰지 않고 기능을 추가해 나가는 식으로 만들었다. &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; """&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; def __init__(self, session_class, addr=("0.0.0.0",9413), max_session = 10):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.session_class&amp;nbsp; = session_class&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.listen_address = addr&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.max_session &amp;nbsp;&amp;nbsp; = max_session&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.server &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = gevent.server.StreamServer(addr, self.handle)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.sessions &amp;nbsp; &amp;nbsp; &amp;nbsp; = {}&lt;br /&gt;&amp;nbsp; &amp;nbsp; def run(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOG("listen at %s",self.listen_address)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.server.serve_forever()&lt;br /&gt;&amp;nbsp; &amp;nbsp; def handle(self, sock, addr):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOG("new connection from %s", addr)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 더이상 세션을 받을수 있는지 확인해보자&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if len(self.sessions) &amp;gt;= self.max_session:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sock.close()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c = self.session_class(self, sock, addr)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c.run()&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; # &lt;br /&gt;&amp;nbsp; &amp;nbsp; # 이하는 세션목록을 관리하는 함수들, 아마 점점 커질텐데 어느정도&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 커지면 session_manager 등으로 뽑아내는것도 고려해보자&lt;br /&gt;&amp;nbsp; &amp;nbsp; # &lt;br /&gt;&amp;nbsp; &amp;nbsp; def add_session(self, si):&amp;nbsp; # si means session instance&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 해당 세션이름이 이미 있다면 뭔가 잘못된것&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sname = si.session_name&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if sname in self.sessions:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; raise DuplicatedSessionNameError(sname)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 세션목록에 추가&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.sessions[sname] = si&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOG("add_session %s [%d/%d]", sname, len(self.sessions), self.max_session)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return True&lt;br /&gt;&amp;nbsp; &amp;nbsp; def remove_sesion(self, si):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sname = si.session_name&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if sname in self.sessions:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; del self.sessions[sname]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOG("remove_session %s [%d/%d]", sname, len(self.sessions), self.max_session)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; raise UnknownSessionNameError(sname)&lt;br /&gt;&lt;br /&gt;class session:&lt;br /&gt;&amp;nbsp; &amp;nbsp; """실제 소켓을 물고 읽고 쓰고 할 놈.&lt;br /&gt;&amp;nbsp; &amp;nbsp; run 을 상속받아 구현하되 아래 순서를 신경쓸것&lt;br /&gt;&amp;nbsp; &amp;nbsp; 1. 세션의 고유이름을 결정할것, 예를들어 ID 를 받는다던지 등등 이는 세션목록의 키값으로 쓰이니 주의깊게 결정.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 2. 이 고유이름을 session_name 필드에 채울것. 이후는 이 값을 손대지 않는다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 3. session_name 이 채워진 후에는 register 를 부를것&lt;br /&gt;&amp;nbsp; &amp;nbsp; 4. 필요한 작업&lt;br /&gt;&amp;nbsp; &amp;nbsp; 5. 모든 작업이 끝나면 소켓을 닫고&lt;br /&gt;&amp;nbsp; &amp;nbsp; 6. unregister 를 부를것.&lt;br /&gt;&amp;nbsp; &amp;nbsp; """&lt;br /&gt;&amp;nbsp; &amp;nbsp; def __init__(self, mother, sock, peer):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.mother = mother&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.sock = sock&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.name = None&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; def run(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pass&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; def register(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not self.session_name:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; raise InvalidSessionNameError()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return self.mother.add_session(self)&lt;br /&gt;&amp;nbsp; &amp;nbsp; def unregister(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not self.session_name:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; raise InvalidSessionNameError()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.mother.remove_sesion(self)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def echo():&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 실제 사용할때는 session 을 적당히 상속받고 &lt;br /&gt;&amp;nbsp; &amp;nbsp; class echo(session):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def run(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.session_name = str(self.sock)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.register()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.loop()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.unregister()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def loop(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while True:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buf = self.sock.recv(1024)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if buf:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.sock.send(buf)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOG("disconnected %s", self.session_name)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 서버에 이 클래스를 넘긴후 run 부르면 된다&lt;br /&gt;&amp;nbsp; &amp;nbsp; s = server(echo)&lt;br /&gt;&amp;nbsp; &amp;nbsp; s.run()&lt;br /&gt;&lt;br /&gt;def chat():&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 세션간에 서로 참조를 하는 예제&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 클라가 처음 연결 물었을때 ID 를 물어보고 그 ID 를 세션키 삼아서 세션을 관리하도록 했다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; # 현재는 별기능 없고 전체챗만 가능&lt;br /&gt;&amp;nbsp; &amp;nbsp; class chat(session):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def run(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userid = self.login()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.session_name = userid&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.register()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.loop()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.unregister()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def login(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.sock.send("type your name\r\n") &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; userid = self.readline_dirty()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.sock.send("hello %s\r\n" % userid)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return userid&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def loop(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.hello_everybody()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while True:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; msg = self.readline_dirty()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.with_all_sessions(lambda k,v: v.sock.send("%s says: %s\r\n" % (self.session_name, msg)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; except:&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; # readline_dirty 가 예외질을 해서 적절히&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; pass&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.goodbye_everybody()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def hello_everybody(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.with_all_sessions(lambda k,v: v.sock.send("*** %s joined\r\n" % self.session_name))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def goodbye_everybody(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.with_all_sessions(lambda k,v: v.sock.send("*** %s left\r\n" % self.session_name))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def with_all_sessions(self, fun):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 사실상 server 쪽에 위치해야 하는 함수인데 일단 예제니까.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 그냥 for 쓰는게 더 보기 좋지만 self.mother.sessions 로 접근하는게 후에 바뀔수 있으니 함수 하나로 모아뒀다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for k,v in self.mother.sessions.iteritems():&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fun(k,v)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def readline_dirty(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # makefile 을 통해서 readline 을 쓰는게 가능한데 예제코드라 그냥 이짓을 했다&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buf = ""&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while True:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tmp = self.sock.recv(1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if tmp:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if tmp == "\n":&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; &amp;nbsp; return buf.strip()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&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; &amp;nbsp; buf += tmp&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; raise StandardError("readline error")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; s = server(chat)&lt;br /&gt;&amp;nbsp; &amp;nbsp; s.run()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&amp;nbsp; &amp;nbsp; #echo()&lt;br /&gt;&amp;nbsp; &amp;nbsp; chat() &amp;nbsp; &lt;br /&gt;[/code]&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8858254451505660189?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8858254451505660189/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8858254451505660189' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8858254451505660189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8858254451505660189'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/11/gevent-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%97%90%EC%BD%94-%EC%B1%84%ED%8C%85%EC%84%9C%EB%B2%84-%EC%98%88%EC%A0%9C.html' title='gevent 를 이용한 에코, 채팅서버 예제'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-1328771293173094658</id><published>2010-10-21T15:01:00.000+09:00</published><updated>2010-12-22T13:03:52.389+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='quicklisp'/><title type='text'>quicklisp 좋네</title><content type='html'>&lt;a target="_blank" href="http://www.quicklisp.org/"&gt;http://www.quicklisp.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;유사한놈들이 몇가지 있지만 윈도우에서 쓰긴 어려워서 수작업으로 다운받는 식으로 쓰곤 했는데 저놈은 윈도에서도 그럴듯하게 돌아간다. 잘 기억해두자.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-1328771293173094658?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/1328771293173094658/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=1328771293173094658' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1328771293173094658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1328771293173094658'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/10/quicklisp-%EC%A2%8B%EB%84%A4.html' title='quicklisp 좋네'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8936953828249029089</id><published>2010-10-01T20:47:00.000+09:00</published><updated>2010-12-22T13:03:50.993+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foxmarks'/><category scheme='http://www.blogger.com/atom/ns#' term='xmarks'/><title type='text'>xmarks 가 살아나나..</title><content type='html'>&lt;a target="_blank" href="http://blog.xmarks.com/?p=1945"&gt;http://blog.xmarks.com/?p=1945&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;에버노트 유료유저가 2% 정도였군...&lt;br /&gt;흠.&lt;br /&gt;기억해둘만한 수치다.&lt;br /&gt;dropbox 수치도 궁금해 지는데 찾아보면 나올라나?&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://gigaom.com/2010/03/26/case-studies-in-freemium-pandora-dropbox-evernote-automattic-and-mailchimp/"&gt;http://gigaom.com/2010/03/26/case-studies-in-freemium-pandora-dropbox-evernote-automattic-and-mailchimp/&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8936953828249029089?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8936953828249029089/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8936953828249029089' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8936953828249029089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8936953828249029089'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/10/xmarks-%EA%B0%80-%EC%82%B4%EC%95%84%EB%82%98%EB%82%98.html' title='xmarks 가 살아나나..'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7062485080856527484</id><published>2010-09-28T23:17:00.000+09:00</published><updated>2010-12-22T13:03:49.660+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foxmarks'/><category scheme='http://www.blogger.com/atom/ns#' term='xmarks'/><title type='text'>xmarks 가 문닫다니</title><content type='html'>&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/djw05/xmarks_shutting_down_in_jan/"&gt;http://www.reddit.com/r/programming/comments/djw05/xmarks_shutting_down_in_jan/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;reddit, YC news 등등 난리났군&lt;br /&gt;현재 메인링크는 내려간 상태라 reddit 링크 걸어둔다.&lt;br /&gt;&lt;br /&gt;foxmarks 시절부터 정말 잘 쓰던 놈이고 dropbox 처럼 한번 깔고 잊어버리면 되는 킹왕짱 서비스였는데 정말 아쉽다.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7062485080856527484?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7062485080856527484/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7062485080856527484' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7062485080856527484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7062485080856527484'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/09/xmarks-%EA%B0%80-%EB%AC%B8%EB%8B%AB%EB%8B%A4%EB%8B%88.html' title='xmarks 가 문닫다니'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7942503517734136436</id><published>2010-08-25T17:33:00.000+09:00</published><updated>2010-12-22T13:03:46.490+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C4127'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>do {...} while(0) 와 C4127 워닝</title><content type='html'>&lt;a target="_blank" href="http://cnicholson.net/2009/03/stupid-c-tricks-dowhile0-and-c4127/"&gt;http://cnicholson.net/2009/03/stupid-c-tricks-dowhile0-and-c4127/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;참고하자.&lt;br /&gt;난 위글중 덧글에서 제시한 false 를 리턴해주는 인라인 함수를 쓰는 방식을 사용중.&lt;br /&gt;&lt;br /&gt;음 역시 워닝레벨 높이면 여러모로 피곤하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;아래쪽 덧글에 false 리턴하는 인라인 함수를 부르는 코드가 최적화되면서 날아가지 않고 바이너리에 남는 다는 말이 있네. 좀더 읽어보고 써야 겠다.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7942503517734136436?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7942503517734136436/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7942503517734136436' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7942503517734136436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7942503517734136436'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/08/do-while0-%EC%99%80-c4127-%EC%9B%8C%EB%8B%9D.html' title='do {...} while(0) 와 C4127 워닝'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3660296758895835333</id><published>2010-08-11T15:40:00.000+09:00</published><updated>2010-12-22T13:03:43.581+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mockup'/><category scheme='http://www.blogger.com/atom/ns#' term='Pencil'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>GUI 프로토타이핑 툴들</title><content type='html'>오리지날 위키에 정리가 잘 되어있다.&lt;br /&gt;&lt;a target="_blank" href="http://c2.com/cgi/wiki?GuiPrototypingTools"&gt;http://c2.com/cgi/wiki?GuiPrototypingTools&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;무료이고 코딩없이(비개발자가) 사용가능해야 한다는 조건으로 몇개 찾아봤는데&lt;br /&gt;pencil 이 가장 나아보인다.&lt;br /&gt;&lt;a target="_blank" href="http://pencil.evolus.vn/en-US/Home.aspx"&gt;http://pencil.evolus.vn&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3660296758895835333?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3660296758895835333/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3660296758895835333' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3660296758895835333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3660296758895835333'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/08/gui-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9D%B4%ED%95%91-%ED%88%B4%EB%93%A4.html' title='GUI 프로토타이핑 툴들'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-1694793665440410624</id><published>2010-07-09T14:51:00.000+09:00</published><updated>2010-12-22T13:03:42.212+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='predefined'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='msvc'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><title type='text'>C/C++ predefined macro</title><content type='html'>&lt;a target="_blank" href="http://predef.sourceforge.net/"&gt;http://predef.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이거 항상 급할때 찾으면 잘 안보이네&lt;br /&gt;여기도 적어둔다&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-1694793665440410624?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/1694793665440410624/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=1694793665440410624' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1694793665440410624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1694793665440410624'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/07/cc-predefined-macro.html' title='C/C++ predefined macro'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-656718800286477099</id><published>2010-07-09T04:08:00.000+09:00</published><updated>2010-12-22T13:03:39.559+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win32'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='win32API'/><title type='text'>haskell 로 Win32 HelloWorld 만들어봤다..</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;haskell 에 Win32 패키지가 어느정도 써먹을수 있는지 궁금해서 google 에서 win32 api hello world 코드를 찾아내서 haskell 로 옮겨봤다. 다시 생각해보면 미친짓이었음.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.codepedia.com/1/Win32APIHelloWorld"&gt;http://www.codepedia.com/1/Win32APIHelloWorld&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p id="more-279-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '279-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-279-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-279-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;    &lt;pre&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;--&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;http://www.codepedia.com/1/Win32APIHelloWorld&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;haskell 에 Win32 패키지가 있길래 대강 구글링해서 찾은 아래 코드를&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;haskell 로 옮겨보려고 시도해봤다.  창을 띄우긴 했지만 여러모로&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;문제가 남은 상태..&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;Win32 패키지로 GUI 코딩하는건 미친짓이다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;C++ 로 api 써서 창띄우는것도 짜증나는 일인데..&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Control.Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Control.Monad&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Foreign&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Graphics.Win32&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;System.Exit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;System.Win32&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Data.Bits&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;시작부터 어려웠다. ClassName 만드는데 mkClassName 이 쓰인다는거&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;알아내는것부터 시작해서 hInstance 얻어오기 등등..&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;--&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;어쨌거나 기본적인 win32 어플을 돌리기 위한 RegiserClass,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;CreateWindow, ShowWindow, UpdateWindow, GetMessage, DispatchMessge&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;등은 모두 불러 쓸수 있다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;  &lt;br /&gt;  inst       &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; getModuleHandle &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;       &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;WinMain 은 인자로 주지만 여기선 그런거 없다.&lt;br /&gt;&lt;/span&gt;  className  &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; newTString &lt;span style="color: rgb(139, 34, 82);"&gt;"Hello"&lt;/span&gt;            &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;이거 메모리 안새나? 코드 따라가보면 runRegionT 까지 떨어지는데 저게 뭔지 당최 모르겠네.. 아 mkClassName 이라고 unsafe 함수도 있으니 기억해두자&lt;br /&gt;&lt;/span&gt;  atom       &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; register inst className       &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;리턴받아봐야 쓸모없지만 코드를 이쁘게 할라고..&lt;br /&gt;&lt;/span&gt;  hwnd       &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; create inst className 400 300 &lt;span style="color: rgb(139, 34, 82);"&gt;"안녕"&lt;/span&gt; wndProc&lt;br /&gt;  wasVisible &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; showWindow hwnd sW_SHOWNORMAL &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;마찬가지 리턴받을 필요 없지만..&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: rgb(34, 139, 34);"&gt;()&lt;/span&gt;         &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; updateWindow hwnd&lt;br /&gt;  messagePump hwnd&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;윈도 클래스 등록&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;register&lt;/span&gt; inst className &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(160, 32, 240);"&gt;let&lt;/span&gt; style    &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; foldr1 (&lt;span style="color: rgb(160, 82, 45);"&gt;.|.&lt;/span&gt;) [cS_VREDRAW, cS_HREDRAW]&lt;br /&gt;      icon     &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;        &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;loadIcon&lt;br /&gt;&lt;/span&gt;      cursor   &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;        &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;loadCursor&lt;br /&gt;&lt;/span&gt;      brush    &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;        &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;getStockBrush,...&lt;br /&gt;&lt;/span&gt;      menuName &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;  registerClass (style, inst, icon, cursor, brush, menuName, className)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;윈도 생성&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;create&lt;/span&gt; inst className width height title wndProc &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(160, 32, 240);"&gt;let&lt;/span&gt; wndName &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; title&lt;br /&gt;      style   &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; wS_OVERLAPPEDWINDOW&lt;br /&gt;      x       &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;      y       &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;      w       &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Just&lt;/span&gt; width&lt;br /&gt;      h       &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Just&lt;/span&gt; height&lt;br /&gt;      parent  &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;      menu    &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Nothing&lt;/span&gt;&lt;br /&gt;      proc    &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; wndProc&lt;br /&gt;  &lt;span style="color: rgb(160, 32, 240);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;    createWindow className wndName style x y w h parent menu inst proc&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;메시지 펌프, getMessage 리턴값보고 깔끔하게 종료하는 부분은 못짰음&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;messagePump&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;HWND&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;IO&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;messagePump&lt;/span&gt; hwnd &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; allocaMessage loop&lt;br /&gt;  &lt;span style="color: rgb(160, 32, 240);"&gt;where&lt;/span&gt; loop wm &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; forever &lt;span style="color: rgb(160, 82, 45);"&gt;$&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;          getMessage wm (&lt;span style="color: rgb(34, 139, 34);"&gt;Just&lt;/span&gt; hwnd) &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;음 종료처리를 어떻게 하지? getMessage 에서 FALSE 리턴 주기 전에 익셉션이 떨어져버린다. 예외 잡아야 하나?&lt;br /&gt;&lt;/span&gt;          dispatchMessage wm&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;윈도 프로시져.. 씨바 존내 성가심. WM_PAINT 에 뭔가 그럴듯한거 뿌리려다 그냥 포기했다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;wndProc&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;WindowClosure&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;wndProc&lt;/span&gt; hwnd wm wparam lparam &lt;br /&gt;  &lt;span style="color: rgb(160, 82, 45);"&gt;|&lt;/span&gt; wm &lt;span style="color: rgb(160, 82, 45);"&gt;==&lt;/span&gt; wM_DESTROY &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;어라.. postQuitMessage 가 없다.&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;postMessage 도 없다.&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;소스 뒤져보면 postMessage 는 TODO 로 표기되어있다...&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;그리고 WM_QUIT 보내면 getMessage 에서 FALSE 떨어질줄 알았는데 여전히 익셉션만 잡힌다...&lt;br /&gt;&lt;/span&gt;    sendMessage hwnd wM_QUIT 0 0&lt;br /&gt;    print &lt;span style="color: rgb(139, 34, 82);"&gt;"quit"&lt;/span&gt;&lt;br /&gt;    return 0&lt;br /&gt;    &lt;br /&gt;  &lt;span style="color: rgb(160, 82, 45);"&gt;|&lt;/span&gt; wm &lt;span style="color: rgb(160, 82, 45);"&gt;==&lt;/span&gt; wM_PAINT &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; &lt;br /&gt;    allocaPAINTSTRUCT &lt;span style="color: rgb(160, 82, 45);"&gt;$&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;\&lt;/span&gt;ps &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;      withDC hwnd ps &lt;span style="color: rgb(160, 82, 45);"&gt;$&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;\&lt;/span&gt;dc &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;어라.. drawText 뭐 이런게 안보인다. 만만한 도형이나 몇개 그려보자&lt;br /&gt;&lt;/span&gt;        rc &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; getClientRect hwnd&lt;br /&gt;        brush &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; createSolidBrush &lt;span style="color: rgb(160, 82, 45);"&gt;$&lt;/span&gt; rgb 100 100 100&lt;br /&gt;        fillRect dc rc brush&lt;br /&gt;        deleteBrush brush&lt;br /&gt;      &lt;br /&gt;        brush &lt;span style="color: rgb(160, 82, 45);"&gt;&amp;lt;-&lt;/span&gt; createSolidBrush &lt;span style="color: rgb(160, 82, 45);"&gt;$&lt;/span&gt; rgb 200 200 200&lt;br /&gt;        fillRect dc (10,10,100,100) brush&lt;br /&gt;        deleteBrush brush&lt;br /&gt;        return 1&lt;br /&gt;    &lt;br /&gt;  &lt;span style="color: rgb(160, 82, 45);"&gt;|&lt;/span&gt; otherwise &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt;&lt;br /&gt;    defWindowProc (&lt;span style="color: rgb(34, 139, 34);"&gt;Just&lt;/span&gt; hwnd) wm wparam lparam&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;begin..end 는 전형적인 bracket 사용케이스겠지. 근데 이걸 쓰니 읽기가 더 흉하다?&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;withDC&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;HWND&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;LPPAINTSTRUCT&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; (&lt;span style="color: rgb(34, 139, 34);"&gt;HDC&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;IO&lt;/span&gt; a) &lt;span style="color: rgb(160, 82, 45);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;IO&lt;/span&gt; a&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;withDC&lt;/span&gt; hwnd ps body  &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; bracket open close body &lt;span style="color: rgb(160, 32, 240);"&gt;where&lt;/span&gt;&lt;br /&gt;  open &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; beginPaint hwnd ps&lt;br /&gt;  close &lt;span style="color: rgb(160, 32, 240);"&gt;_&lt;/span&gt; &lt;span style="color: rgb(160, 82, 45);"&gt;=&lt;/span&gt; endPaint hwnd ps&lt;br /&gt;&lt;/pre&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-656718800286477099?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/656718800286477099/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=656718800286477099' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/656718800286477099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/656718800286477099'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/07/haskell-%EB%A1%9C-win32-helloworld-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B4%A4%EB%8B%A4.html' title='haskell 로 Win32 HelloWorld 만들어봤다..'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6990985944905776004</id><published>2010-07-07T20:11:00.000+09:00</published><updated>2010-12-22T13:03:38.209+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msvc'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>msvc 디버깅 커맨드 윈도우</title><content type='html'>&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/c785s0kz.aspx"&gt;http://msdn.microsoft.com/en-us/library/c785s0kz.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;간단히 말해서 gdb 에서 call fun() 을 하려면 visual studio 에서는 ? fun() 하면 된다.&lt;br /&gt;visual studio 는 거의 안써서 매번 까먹음ㅋ&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6990985944905776004?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6990985944905776004/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6990985944905776004' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6990985944905776004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6990985944905776004'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/07/msvc-%EB%94%94%EB%B2%84%EA%B9%85-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EC%9C%88%EB%8F%84%EC%9A%B0.html' title='msvc 디버깅 커맨드 윈도우'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8678311510082531603</id><published>2010-07-05T13:05:00.000+09:00</published><updated>2010-12-22T13:03:35.290+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>emacs-for-python</title><content type='html'>&lt;a target="_blank" href="http://gabrielelanaro.github.com/emacs-for-python/"&gt;http://gabrielelanaro.github.com/emacs-for-python/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;저놈을 쓰고 싶은 욕구는 당장 없지만 &lt;a target="_blank" href="http://divmod.org/trac/wiki/DivmodPyflakes"&gt;PyFlakes&lt;/a&gt; 라는놈이 눈에 보이길래 적어둔다.&lt;br /&gt;pycheck, pylint 모두 써봤는데.. 다음엔 저놈 한번 써보자.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8678311510082531603?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8678311510082531603/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8678311510082531603' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8678311510082531603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8678311510082531603'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/07/emacs-for-python.html' title='emacs-for-python'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-9069601637265559197</id><published>2010-06-25T13:36:00.000+09:00</published><updated>2010-12-22T13:03:33.631+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grep'/><title type='text'>AstroGrep</title><content type='html'>&lt;a target="_blank" href="http://astrogrep.sourceforge.net/"&gt;http://astrogrep.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;보통은 gnu global, cscope 등의 태그 프로그램이나 hgtk 의 검색기능을 쓰지만&lt;br /&gt;가끔 급하게 내가 관리하지 않는, 그것도 생소한 언어의 소스들을 뒤져볼때가 있다.&lt;br /&gt;그럴때 윈도 상황이라면 xp 의 검색기능을 종종 썼었는데..&lt;br /&gt;&lt;br /&gt;윈도7 검색기능은 병신이 됐더라.&lt;br /&gt;급히 파일내검색을 하고싶은데(grep) win7 은 정말 머저리 같이 돌더군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;적절히 뒤져서&lt;br /&gt;&lt;a target="_blank" href="http://superuser.com/questions/60173/how-to-search-inside-files-in-windows-7"&gt;http://superuser.com/questions/60173/how-to-search-inside-files-in-windows-7&lt;/a&gt;&lt;br /&gt;에서 AstroGrep 이란걸 알게되서 사용중.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-9069601637265559197?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/9069601637265559197/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=9069601637265559197' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/9069601637265559197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/9069601637265559197'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/astrogrep.html' title='AstroGrep'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4156650148645612372</id><published>2010-06-23T17:09:00.000+09:00</published><updated>2010-12-22T13:03:32.175+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msgpack'/><title type='text'>MessagePack, Extremely efficient object serialization library for cross-language communication</title><content type='html'>&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Bencoding"&gt;bencoding&lt;/a&gt; 을 즐겨 쓰는 편인데 이놈은 좀 컴팩트한맛이 덜해서 튜닝을 해야 하나 했는데..&lt;br /&gt;마침 이런게 보이네. 다음엔 이놈을 써보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://msgpack.org/"&gt;http://msgpack.org/&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4156650148645612372?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4156650148645612372/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4156650148645612372' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4156650148645612372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4156650148645612372'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/messagepack-extremely-efficient-object.html' title='MessagePack, Extremely efficient object serialization library for cross-language communication'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8798250854764966943</id><published>2010-06-11T13:07:00.000+09:00</published><updated>2010-12-22T13:03:30.728+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Less'/><title type='text'>less 로 ansi color 포함된 텍스트 읽기</title><content type='html'>개발시엔 로그에 ansi color 를 써서 눈에 편하도록 남기는걸 좋아하는데 그냥 콘솔로 뿌리면서 보기엔 좋지만 파일에 남긴거 볼땐 좀 불편하다.&lt;br /&gt;&lt;br /&gt;음 더 적을 시간이 없군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;결론&lt;br /&gt;less -R 파일&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8798250854764966943?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8798250854764966943/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8798250854764966943' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8798250854764966943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8798250854764966943'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/less-%EB%A1%9C-ansi-color-%ED%8F%AC%ED%95%A8%EB%90%9C-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%9D%BD%EA%B8%B0.html' title='less 로 ansi color 포함된 텍스트 읽기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2590215570547503060</id><published>2010-06-08T17:44:00.000+09:00</published><updated>2010-12-22T13:03:29.327+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='cmake'/><title type='text'>cmake 로 버전 컨트롤 리비전 매번 따오기</title><content type='html'>make 때는 어렵지 않았는데 cmake 는 좀 성가시네&lt;br /&gt;아래 링크 한번 읽어보자.&lt;br /&gt;&lt;a target="_blank" href="http://www.mail-archive.com/cmake@cmake.org/msg25922.html"&gt;http://www.mail-archive.com/cmake@cmake.org/msg25922.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;우리프로젝트에 아직 적용하지 않은상태.&lt;br /&gt;후에 필요하면 위 방법 시도해보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2590215570547503060?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2590215570547503060/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2590215570547503060' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2590215570547503060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2590215570547503060'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/cmake-%EB%A1%9C-%EB%B2%84%EC%A0%84-%EC%BB%A8%ED%8A%B8%EB%A1%A4-%EB%A6%AC%EB%B9%84%EC%A0%84-%EB%A7%A4%EB%B2%88-%EB%94%B0%EC%98%A4%EA%B8%B0.html' title='cmake 로 버전 컨트롤 리비전 매번 따오기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-1120540369866567182</id><published>2010-06-08T13:41:00.000+09:00</published><updated>2010-12-22T13:03:27.908+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dump'/><category scheme='http://www.blogger.com/atom/ns#' term='core'/><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='minidump'/><category scheme='http://www.blogger.com/atom/ns#' term='Crash'/><title type='text'>crashrpt, A crash reporting system for Windows applications</title><content type='html'>&lt;a target="_blank" href="http://code.google.com/p/crashrpt/"&gt;http://code.google.com/p/crashrpt/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;크래쉬리포팅기능이 필요해서 sf.net 에서 crash 등으로 검색하다 건진거. ( 어라 다시 검색해보니 잘 안보이네. 소스포지 말고 구글쪽에서 건진듯 하군? 기억력감퇴가 심하군.. )&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.codeproject.com/KB/applications/BugTrap.aspx"&gt;bugtrap&lt;/a&gt; 등도 있지만 문서가 괜찮아 보이길래 저놈을 써보기로 했다.&lt;br /&gt;클라쪽 모듈은 아주 간단히 붙였고 이제 서버쪽을 좀 둘러봐야 하는데...&lt;br /&gt;&lt;br /&gt;귀찮군.. 덤프난거 파일로 떨어지던데 테스터들한테 그냥 그거 레드마인에 올리라고 할까?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://code.google.com/p/crashrpt/wiki/FAQ"&gt;FAQ&lt;/a&gt; 쪽에 유사한 툴들을 모아뒀는데 기억해두자. 메뉴얼 어딘가에 장단점을 비교해 둔 내용도 있으니 찾아서 읽어보고..&lt;br /&gt;&lt;a target="_blank" href="http://crashrpt.sourceforge.net/docs/html/automating_crash_report_processing.html"&gt;자동화툴&lt;/a&gt;도 제공하는 모양이니 나중에 배포가 시작되면 읽어보자.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-1120540369866567182?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/1120540369866567182/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=1120540369866567182' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1120540369866567182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1120540369866567182'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/crashrpt-crash-reporting-system-for.html' title='crashrpt, A crash reporting system for Windows applications'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6234601218129089891</id><published>2010-06-03T18:07:00.000+09:00</published><updated>2010-12-22T13:03:26.575+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='battery'/><title type='text'>배터리 관련 지식들</title><content type='html'>&lt;a target="_blank" href="http://www.batteryuniversity.com"&gt;http://www.batteryuniversity.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;보통 관심사는 리튬이온 오래쓰기 일텐데 &lt;a target="_blank" href="http://www.batteryuniversity.com/parttwo-34.htm"&gt;http://www.batteryuniversity.com/parttwo-34.htm&lt;/a&gt; 를 참고해보자.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6234601218129089891?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6234601218129089891/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6234601218129089891' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6234601218129089891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6234601218129089891'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/%EB%B0%B0%ED%84%B0%EB%A6%AC-%EA%B4%80%EB%A0%A8-%EC%A7%80%EC%8B%9D%EB%93%A4.html' title='배터리 관련 지식들'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2466201307517386364</id><published>2010-06-01T12:01:00.000+09:00</published><updated>2010-12-22T13:03:24.033+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><title type='text'>TakeoffGW, cygwin 스타일(gui 셋업 유틸리티) mingw 설치본</title><content type='html'>&lt;a target="_blank" href="http://takeoffgw.sourceforge.net/"&gt;http://takeoffgw.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;오픈소스좀 깔다보면 mingw 가 대여섯벌 깔리는데 이걸로 통일좀 됐으면 좋겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;방금설치해봤는데 생각보다 덩치가 크네.&lt;br /&gt;git 도 포함되어있길래 msys-git 을 일단 언인스톨 했다.&lt;br /&gt;앞으로 이놈 위주로 설치를 해보자.&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;깔려있던 gimp 를 지우고 TakeoffGW 의 것으로 대체해보려고 했는데 아직 좀 어색하네.&lt;br /&gt;gimp.exe 는 실행시 죽고 버전붙은놈을 실행해야 하는 등..&lt;br /&gt;&lt;a target="_blank" href="http://sourceforge.net/apps/mediawiki/takeoffgw/index.php?title=TODO"&gt;http://sourceforge.net/apps/mediawiki/takeoffgw/index.php?title=TODO &lt;/a&gt;&lt;br /&gt;에 보면 런처만들 생각을 하고있는것 같으니 해결되겠지.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2466201307517386364?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2466201307517386364/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2466201307517386364' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2466201307517386364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2466201307517386364'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/06/takeoffgw-cygwin-%EC%8A%A4%ED%83%80%EC%9D%BCgui-%EC%85%8B%EC%97%85-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-mingw.html' title='TakeoffGW, cygwin 스타일(gui 셋업 유틸리티) mingw 설치본'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3456258141375201142</id><published>2010-05-24T11:57:00.000+09:00</published><updated>2010-12-22T13:03:22.519+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>wtf - What a Terrible Failure</title><content type='html'>&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/c6u6f/new_android_22_froyo_api_logwtf/"&gt;http://www.reddit.com/r/programming/comments/c6u6f/new_android_22_froyo_api_logwtf/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;구글놈들 센스 좋네&lt;br /&gt;나는 assert 안에 욕을 쓰는 편인데..&lt;br /&gt;&lt;br /&gt;[code cpp]&lt;br /&gt;assert(!"damn");&lt;br /&gt;assert(!"wtf");&lt;br /&gt;assert(!"fuck!");&lt;br /&gt;[/code]&lt;br /&gt;등등을 즐겨 쓰는 편 -_-&lt;br /&gt;&lt;br /&gt;wtf 는 이제 여러군데서 쓰이기 시작할테니 assert 에 숨기지 않아도 될듯.&lt;br /&gt;아싸&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3456258141375201142?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3456258141375201142/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3456258141375201142' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3456258141375201142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3456258141375201142'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/05/wtf-what-terrible-failure.html' title='wtf - What a Terrible Failure'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3741312003806840051</id><published>2010-05-12T15:10:00.000+09:00</published><updated>2010-12-22T13:03:21.236+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>Gource, 버전 컨트롤 비쥬얼라이저</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NjUuAuBcoqs&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NjUuAuBcoqs&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;a target="_blank" href="http://code.google.com/p/gource/"&gt;http://code.google.com/p/gource/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;동영상만 보면 뭔지 알수있다.&lt;br /&gt;우리소스에 돌려보니 재미남!&lt;br /&gt;간만에 &lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/c0mk0/gource_the_subversion_visualizer_this_is_really/"&gt;reddit&lt;/a&gt; 구경하다 건진거&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3741312003806840051?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3741312003806840051/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3741312003806840051' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3741312003806840051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3741312003806840051'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/05/gource-%EB%B2%84%EC%A0%84-%EC%BB%A8%ED%8A%B8%EB%A1%A4-%EB%B9%84%EC%A5%AC%EC%96%BC%EB%9D%BC%EC%9D%B4%EC%A0%80.html' title='Gource, 버전 컨트롤 비쥬얼라이저'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4597249959254557413</id><published>2010-04-23T17:03:00.000+09:00</published><updated>2010-12-22T13:03:18.697+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UAC'/><title type='text'>UAC, User Account Control</title><content type='html'>windows7 을 써보니 좀 성가신게 생겼네. program files 아래 writing 이 기본적으로 막혀있어서 자동업데이트나 로깅이나 등등을 기존과는 좀 다르게 해야 하더라. vista 때부터 이게 성가시단 소문은 들었는데 내가 윈도에서 코딩하게 될줄이야 그땐 몰랐지... 어쨋건 관련 글을 좀 찾아봤다.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://technet.microsoft.com/ko-kr/library/cc700775.aspx"&gt;Windows Vista의 사용자 계정 컨트롤(User Account Control : UAC) – 누구를 위한 기능인가? 그리고 왜?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/User_Account_Control"&gt;wikipedia:User_Account_Control&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/ko-kr/library/bb384691%28VS.90%29.aspx"&gt;/MANIFESTUAC(매니페스트에 UAC 정보 포함)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;내래 주로 cmake&amp;nbsp; 를 쓰니까 이렇게 링커옵션을 추가해서 실행시 권한올리란 창이 뜨는것까지 확인해봤다.&lt;br /&gt;[code]&lt;br /&gt;# requireAdministrator&lt;br /&gt;set_target_properties(main PROPERTIES LINK_FLAGS &lt;br /&gt;&amp;nbsp; "/MANIFESTUAC:level='requireAdministrator'"&lt;br /&gt;)&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;물론 이거 존내 성가시니 가능하면 낮은 권한만으로 모든 작업이 해결되도록 해야겠지.&lt;br /&gt;그렇다고 개인폴더에 설치를 해서 자동업데이트 하는건 다른 계정 유저에 문제가 있을테고..&lt;br /&gt;vista 이후 스페셜폴더 들이 어떻게 변경/추가됐는지 함 찾아봐야 겠다.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4597249959254557413?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4597249959254557413/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4597249959254557413' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4597249959254557413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4597249959254557413'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/04/uac-user-account-control.html' title='UAC, User Account Control'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7156007602571306204</id><published>2010-04-14T16:32:00.000+09:00</published><updated>2010-12-22T13:03:15.492+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win32'/><category scheme='http://www.blogger.com/atom/ns#' term='psdk'/><category scheme='http://www.blogger.com/atom/ns#' term='winsdk'/><title type='text'>플래폼 SDK? 윈도우 SDK?</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9dfWzp7rYR4&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9dfWzp7rYR4&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;내가 윈도코딩하던 시절은 그냥 플래폼 SDK 였는데 지금은 닷넷 SDK 와 함께&amp;nbsp; 윈도 SDK 로 합쳐진 모양.&lt;br /&gt;정확한 용어를 알고 사용해야겠지.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Microsoft_Windows_SDK"&gt;http://en.wikipedia.org/wiki/Microsoft_Windows_SDK&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The difference between these three SDKs lies in their area of specialization: &lt;i&gt;Platform SDK&lt;/i&gt; specializes in developing applications for &lt;a href="http://en.wikipedia.org/wiki/Windows_2000" title="Windows 2000"&gt;Windows 2000&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Windows_XP" title="Windows XP"&gt;XP&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Windows_Server_2003" title="Windows Server 2003"&gt;Windows Server 2003&lt;/a&gt;. &lt;i&gt;.NET Framework SDK&lt;/i&gt; is dedicated to developing applications for &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework_1.1" title=".NET Framework 1.1" class="mw-redirect"&gt;.NET Framework 1.1&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework_2.0" title=".NET Framework 2.0" class="mw-redirect"&gt;.NET Framework 2.0&lt;/a&gt;. &lt;i&gt;Windows SDK&lt;/i&gt; is the successor of the two and supports developing applications for Windows XP, &lt;a href="http://en.wikipedia.org/wiki/Windows_Vista" title="Windows Vista"&gt;Windows Vista&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Windows_7" title="Windows 7"&gt;Windows 7&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Windows_Server_2008" title="Windows Server 2008"&gt;Windows Server 2008&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework_3.0" title=".NET Framework 3.0" class="mw-redirect"&gt;.NET Framework 3.0&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework_3.5" title=".NET Framework 3.5" class="mw-redirect"&gt;.NET Framework 3.5&lt;/a&gt;.&lt;sup id="cite_ref-1" class="reference"&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows_SDK#cite_note-1"&gt;&lt;span&gt;[&lt;/span&gt;2&lt;span&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;It contains extensive &lt;a href="http://en.wikipedia.org/wiki/Documentation" title="Documentation"&gt;documentation&lt;/a&gt; and nearly 1000 samples.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;분명 내기억에는 플래폼 SDK 이고 버전도 연도로 붙던것으로 기억하는데 최근들어 뒤져보니 WinSDK 7.0 뭐 이런식으로 불리고 있길래 궁금해서 찾아봤다.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7156007602571306204?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7156007602571306204/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7156007602571306204' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7156007602571306204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7156007602571306204'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/04/%ED%94%8C%EB%9E%98%ED%8F%BC-sdk-%EC%9C%88%EB%8F%84%EC%9A%B0-sdk.html' title='플래폼 SDK? 윈도우 SDK?'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8680178248753354450</id><published>2010-04-14T15:31:00.000+09:00</published><updated>2010-12-22T13:03:14.164+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snapin'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows7'/><title type='text'>windows 7 에어로 스냅인 어케 끄는겨?</title><content type='html'>WM_SIZING 받아 조절해서 일정 비율에 맞게 리사이징 되도록 했는데 이 빌어먹을 스냅인 이란 새 기능은 이걸 뛰어넘어서 리사이징을 해버리네. 여기저기 검색해도 유저입장에서 끄는 방법(제어판, 레지스트리등등)만 나오고..&lt;br /&gt;&lt;br /&gt;열심히 msdn 을 뒤져서 아래 페이지를 찾았는데(고생했다. snapin 은 너무 일반적인 단어라 검색이 힘들고 레지스트리 수정방법에서 이런 기능을 윈도우 어래인징 이라고 부르는걸 알게되서 이걸로 검색해낸것)&lt;br /&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ms724947%28VS.85%29.aspx"&gt;SystemParametersInfo Function&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SPI_SETWINARRANGING, SPI_SETSNAPSIZING 를 쓰면 뭔가 될거 같은데 저놈의 값을 아직 알수가 없네. 다음번 플래폼 SDK 가 나올때까지 일단 보류.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아 그리고 참고로.. 보통 에어로 기능이라고 하는것에 대해서는 DWM 으로 검색하면 된다.&lt;br /&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa969538%28VS.85%29.aspx"&gt;Enable and Control DWM Composition&lt;/a&gt; 읽어보자&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;흠 &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en"&gt;WinSDK 7.0&lt;/a&gt; 을 받는중... 이었는데 취소. &lt;a target="_blank" href="http://blogs.msdn.com/windowssdk/archive/2010/04/07/coming-soon-win-sdk-for-windows-7-and-net-4.aspx"&gt;곧 7.1 이 나온다 하니&lt;/a&gt; 기다렸다가 해결해보자.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8680178248753354450?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8680178248753354450/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8680178248753354450' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8680178248753354450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8680178248753354450'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/04/windows-7-%EC%97%90%EC%96%B4%EB%A1%9C-%EC%8A%A4%EB%83%85%EC%9D%B8-%EC%96%B4%EC%BC%80-%EB%81%84%EB%8A%94%EA%B2%A8.html' title='windows 7 에어로 스냅인 어케 끄는겨?'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4086726431375077639</id><published>2010-04-04T19:26:00.000+09:00</published><updated>2010-12-22T13:03:10.544+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HASH'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>hash 벤치마크</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/P2H6mpUnsLI&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/P2H6mpUnsLI&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;재미난 벤치마크네.&lt;br /&gt;적어둔다.&lt;br /&gt;난 주로 boost 쪽의 unordered 들을 쓰는 편.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://incise.org/hash-table-benchmarks.html"&gt;http://incise.org/hash-table-benchmarks.html&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/bhxwh/hash_table_benchmarks_google_sparsedense_hash_map/"&gt;reddit&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4086726431375077639?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4086726431375077639/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4086726431375077639' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4086726431375077639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4086726431375077639'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/04/hash-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%81%AC.html' title='hash 벤치마크'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3632228892400756225</id><published>2010-04-01T01:23:00.000+09:00</published><updated>2010-12-22T13:03:09.099+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cscope'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>window 에서 emacs 와 cscope 사용을 위한 준비</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/86JiKQXFi64&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/86JiKQXFi64&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;전에도 위키등에 몇번 적었는데 이번에 새로 세팅을 하게되서 최소한의 절차만 적어둔다. &lt;br /&gt;후에 내가 읽어보는게 목적.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;cscope 다운로드&lt;br /&gt;&lt;a target="_blank" href="http://code.google.com/p/cscope-win32/"&gt;http://code.google.com/p/cscope-win32/&lt;/a&gt;&lt;br /&gt;이번에 다시 뒤져보니 win32 port 가 다시 진행되는듯? 이전엔 16.0 이던가 하는 이상한 버전으로 오랫동안 멈춰있어서 쓰기가 좀 거북했었는데.. 우왕굿.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xcscope.el 세팅&lt;br /&gt;나야 emacs 설정들을 mercurial 로 관리하고 있고 리파지토리를 dropbox 로 들고있으니 새로 받을 일은 없지만 적어둔다.&lt;br /&gt;[code]&lt;br /&gt;(require 'xcscope)[/code]&lt;/li&gt;&lt;li&gt;cscope-indexer 설치&lt;br /&gt;나는 주로 c:/bin 또는 c:/opt/bin 에 넣어둔다. 이쪽 툴들도 dropbox 에 짱박아야 겠군...&lt;br /&gt;&lt;p id="more-257-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '257-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-257-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-257-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code]&lt;br /&gt;#! /bin/sh&lt;br /&gt;###############################################################################&lt;br /&gt;#&lt;br /&gt;# File: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cscope-indexer&lt;br /&gt;# RCS: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; $Header: /cvs/root/cscope/cscope/contrib/xcscope/cscope-indexer,v 1.1.1.1 2002/01/09 18:50:30 umeshv Exp $&lt;br /&gt;# Description:&amp;nbsp; Script to index files for cscope&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; This script generates a list of files to index&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; (cscope.out), which is then (optionally) used to&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; generate a cscope database.&amp;nbsp; You can use this script&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; to just build a list of files, or it can be used to&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; build a list and database.&amp;nbsp; This script is not used to&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; just build a database (skipping the list of files&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; step), as this can be simply done by just calling&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; "cscope -b".&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; Normally, cscope will do its own indexing, but this&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; script can be used to force indexing.&amp;nbsp; This is useful&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; if you need to recurse into subdirectories, or have&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; many files to index (you can run this script from a&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; cron job, during the night).&amp;nbsp; It is especially useful&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; for large projects, which can contstantly have source&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; files added and deleted; by using this script, the&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; changing sources files are automatically handled.&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; Currently, any paths containing "/CVS/" or "/RCS/" are&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; stripped out (ignored).&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; This script is written to use only basic shell features, as&lt;br /&gt;# &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; not all shells have advanced features.&lt;br /&gt;#&lt;br /&gt;# Author: &amp;nbsp; &amp;nbsp; &amp;nbsp; Darryl Okahata&lt;br /&gt;# Created: &amp;nbsp; &amp;nbsp;&amp;nbsp; Thu Apr 27 17:12:14 2000&lt;br /&gt;# Modified: &amp;nbsp; &amp;nbsp; Tue Jun 19 09:47:45 2001 (Darryl Okahata) darrylo@soco.agilent.com&lt;br /&gt;# Language: &amp;nbsp; &amp;nbsp; Shell-script&lt;br /&gt;# Package: &amp;nbsp; &amp;nbsp;&amp;nbsp; N/A&lt;br /&gt;# Status: &amp;nbsp; &amp;nbsp; &amp;nbsp; Experimental&lt;br /&gt;#&lt;br /&gt;# (C) Copyright 2000, Darryl Okahata, all rights reserved.&lt;br /&gt;#&lt;br /&gt;###############################################################################&lt;br /&gt;#&lt;br /&gt;# Usage:&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp; &amp;nbsp; cscope-indexer [ -v ] [-f database_file ] [-i list_file ] [ -l ] [ -r ]&lt;br /&gt;#&lt;br /&gt;# where:&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp; &amp;nbsp; -f database_file&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Specifies the cscope database file (default: cscope.out).&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp; &amp;nbsp; -i list_file&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Specifies the name of the file into which the list of files&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; to index is placed (default: cscope.files).&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp; &amp;nbsp; -l&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Suppress the generation/updating of the cscope database&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; file.&amp;nbsp; Only a list of files is generated.&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp; &amp;nbsp; -r&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Recurse into subdirectories to locate files to index.&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Without this option, only the current directory is&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; searched.&lt;br /&gt;#&lt;br /&gt;# &amp;nbsp; &amp;nbsp; -v&lt;br /&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Be verbose.&amp;nbsp; Output simple progress messages.&lt;br /&gt;#&lt;br /&gt;#&lt;br /&gt;###############################################################################&lt;br /&gt;set -e&lt;br /&gt;&lt;br /&gt;# May have to edit this:&lt;br /&gt;PATH="/usr/local/bin:/sbin:/usr/sbin:/bin:/usr/bin:$PATH"&lt;br /&gt;export PATH&lt;br /&gt;&lt;br /&gt;LIST_ONLY=&lt;br /&gt;DIR='.'&lt;br /&gt;LIST_FILE='cscope.files'&lt;br /&gt;DATABASE_FILE='cscope.out'&lt;br /&gt;RECURSE=&lt;br /&gt;VERBOSE=&lt;br /&gt;export DIR RECURSE &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Need to pass these to subprocesses&lt;br /&gt;&lt;br /&gt;while [ -n "$1" ]&lt;br /&gt;do&lt;br /&gt;&amp;nbsp; &amp;nbsp; case "$1" in&lt;br /&gt;&amp;nbsp; &amp;nbsp; -f)&lt;br /&gt;&amp;nbsp; &amp;nbsp; if [ "X$2" = "X" ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; then&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; echo "$0: No database file specified" &amp;gt;&amp;amp;2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; fi&lt;br /&gt;&amp;nbsp; &amp;nbsp; DATABASE_FILE="$2"&lt;br /&gt;&amp;nbsp; &amp;nbsp; shift&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -i)&lt;br /&gt;&amp;nbsp; &amp;nbsp; if [ "X$2" = "X" ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; then&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; echo "$0: No list file specified" &amp;gt;&amp;amp;2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; fi&lt;br /&gt;&amp;nbsp; &amp;nbsp; LIST_FILE="$2"&lt;br /&gt;&amp;nbsp; &amp;nbsp; shift&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -l)&lt;br /&gt;&amp;nbsp; &amp;nbsp; LIST_ONLY=1&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -r)&lt;br /&gt;&amp;nbsp; &amp;nbsp; RECURSE=1&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; -v)&lt;br /&gt;&amp;nbsp; &amp;nbsp; VERBOSE=1&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; *)&lt;br /&gt;&amp;nbsp; &amp;nbsp; DIR="$1"&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; esac&lt;br /&gt;&amp;nbsp; &amp;nbsp; shift&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;cd $DIR&lt;br /&gt;&lt;br /&gt;if [ "X$VERBOSE" != "X" ]&lt;br /&gt;then&lt;br /&gt;&amp;nbsp; &amp;nbsp; echo "Creating list of files to index ..."&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;(&lt;br /&gt;&amp;nbsp; &amp;nbsp; if [ "X$RECURSE" = "X" ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; then&lt;br /&gt;&amp;nbsp; &amp;nbsp; # Ugly, inefficient, but it works.&lt;br /&gt;&amp;nbsp; &amp;nbsp; for f in *&lt;br /&gt;&amp;nbsp; &amp;nbsp; do&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; echo "$DIR/$f"&lt;br /&gt;&amp;nbsp; &amp;nbsp; done&lt;br /&gt;&amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; find $DIR \( -type f -o -type l \)&lt;br /&gt;&amp;nbsp; &amp;nbsp; fi&lt;br /&gt;) | \&lt;br /&gt;&amp;nbsp; &amp;nbsp; egrep -i '\.([chly](xx|pp)*|cc|hh)$' | \&lt;br /&gt;&amp;nbsp; &amp;nbsp; sed -e '/\/CVS\//d' -e '/\/RCS\//d' -e 's/^\.\///' | \&lt;br /&gt;&amp;nbsp; &amp;nbsp; sort &amp;gt; $LIST_FILE&lt;br /&gt;&lt;br /&gt;if [ "X$VERBOSE" != "X" ]&lt;br /&gt;then&lt;br /&gt;&amp;nbsp; &amp;nbsp; echo "Creating list of files to index ... done"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ "X$LIST_ONLY" != "X" ]&lt;br /&gt;then&lt;br /&gt;&amp;nbsp; &amp;nbsp; exit 0&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ "X$VERBOSE" != "X" ]&lt;br /&gt;then&lt;br /&gt;&amp;nbsp; &amp;nbsp; echo "Indexing files ..."&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;cscope -b -i $LIST_FILE -f $DATABASE_FILE&lt;br /&gt;&lt;br /&gt;if [ "X$VERBOSE" != "X" ]&lt;br /&gt;then&lt;br /&gt;&amp;nbsp; &amp;nbsp; echo "Indexing files ... done"&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;[/code]&lt;/div&gt;&lt;/li&gt;&lt;li&gt;cscope-indexer 가 쉘스크립트이므로 &lt;a target="_blank" href="http://www.mingw.org/wiki/MSYS"&gt;msys&lt;/a&gt; shell 을 깔아준다. &lt;br /&gt;나야 어차피 &lt;a target="_blank" href="http://www.mingw.org"&gt;mingw&lt;/a&gt; 를 자주 쓰니 문제 없지만 혹시나 cscope 때문에 쉘까지 까는게 싫다면 다른 방식으로 스크립트를 만들면 해결될듯. 목록만들고 cscope -b 돌리는게 전부다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;emacs 가 cscope-indexer 를 실행할수 있도록 cscope-indexer.bat 파일을 만든다. 역시 c:/bin 또는 c:/opt/bin 을 애용중&lt;br /&gt;[code]&lt;br /&gt;C:\msys\1.0\bin\sh cscope-indexer %1 %2 %3 %4 %5 %6 %7 %8 %9[/code]&lt;/li&gt;&lt;li&gt;시스템헤더랄까? 윈도쪽에선 뭐라고 해야 하나 어쨌건 프로젝트마다 공통적으로 쓰는 헤더들을 찾도록 cscope-database-regexps 를 지정해준다. 아래는 간단한 예제&lt;br /&gt;[code]&lt;br /&gt;(setq cscope-database-regexps&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; '(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; 이런식으로 추가해 나가자. 상세한것은 C-h v cscope-database-regexps&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ("C:/HOME/src/foo/src"&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (t)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ("C:/HOME/src/foo/extlibs"))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; more&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; default&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ("."&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; (t)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ("C:/Boost/include/boost-1_42/boost")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ("C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ("C:/Program Files/Microsoft Visual Studio 9.0/VC/include")&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; t)))[/code]&lt;/li&gt;&lt;li&gt;위에서 지정한 세개의 기본검색 경로에 각각 cscope.out 을 만들어준다. 간단히 emacs 에서 C-c s I 로 지정해줘도 되지만 C++ 표준헤더의 경우 확장자가 없어서 이방법으로는 누락이 되니 직접 cscope.files 를 만들고 이를 통해 cscope.out 을 뽑는 수고를 해야 한다. gnu find 등을 쓰면 간단.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;우왕ㅋ굳ㅋ&lt;br /&gt;현재 나는 gnu global 이 주력 태깅툴이고 cscope 는 cscope-database-regexps 때문에 프로젝트 외부 코드를 따라갈때 쓴다. 즉 어떤 프로젝트 루트가 foo 일때 foo 이하는 빌드시 gtags 를 매번 돌려서 태깅을 해두고 코딩시 내가 찾으려는 심볼이 프로젝트 내부의 것인지 외부것인지 정도는 머리속에 들어있으니 상황따라 global, cscope 를 구분해서 쓰는 편.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3632228892400756225?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3632228892400756225/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3632228892400756225' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3632228892400756225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3632228892400756225'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/04/window-%EC%97%90%EC%84%9C-emacs-%EC%99%80-cscope-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%A4%80%EB%B9%84.html' title='window 에서 emacs 와 cscope 사용을 위한 준비'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4391084266794769356</id><published>2010-03-27T01:34:00.000+09:00</published><updated>2010-12-22T13:03:07.688+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sucks'/><title type='text'>옥션 개놈들</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NEBSDpsUmwA&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NEBSDpsUmwA&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;이 병신들 결국 계정 전부 털렸네&lt;br /&gt;애초에 일부만 털렸다는거 자체가 말이 안되지.&lt;br /&gt;&lt;br /&gt;옥션이나 네이버나 모두 이나라 IT 가 병신임을 증명하는 존재들이다.&lt;br /&gt;애초에 주민등록번호로 회원가입을 받기 시작한 놈들이 문제고&lt;br /&gt;저걸 고칠생각 없이 지금까지 답습한놈들도 상병신이고&lt;br /&gt;각 사이트마다 민번 까라면 까고 암호는 동일하게 넣는 유저들도 병신이다.&lt;br /&gt;&lt;br /&gt;또다른 병신들은 password&amp;nbsp; 필드 길이제한을 짧게 주는 놈들&lt;br /&gt;적어도 20바이트는 줘라 염병&lt;br /&gt;특수문자도 받아 처먹게 하고.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4391084266794769356?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4391084266794769356/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4391084266794769356' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4391084266794769356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4391084266794769356'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/%EC%98%A5%EC%85%98-%EA%B0%9C%EB%86%88%EB%93%A4.html' title='옥션 개놈들'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8106184143400269811</id><published>2010-03-26T20:00:00.000+09:00</published><updated>2010-12-22T13:03:06.380+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='valgrind'/><title type='text'>Microsoft Application Verifier</title><content type='html'>&lt;br /&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rCDc38hdikk&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rCDc38hdikk&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?familyid=c4a25ab9-649d-4a1b-b4a7-c9d8b095df18&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=c4a25ab9-649d-4a1b-b4a7-c9d8b095df18&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이런게 있었네.&lt;br /&gt;valgrind 정도의 기능을 원하는데.. 일단 함 써보자.&lt;br /&gt;&lt;br /&gt;사용법은 &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa480483.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa480483.aspx&lt;/a&gt; 또는 그냥 appverif.exe 실행&lt;br /&gt;당연히 valgrind 만큼 편하진 않은데 로우리소스 테스트등 재미난게 보인다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;으음...&lt;br /&gt;그닥 맘에 드는 툴은 아니네.&lt;br /&gt;그래도 기억해두자.&lt;br /&gt;&lt;br /&gt;추가&lt;br /&gt;&lt;a target="_blank" href="http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows"&gt;http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows&lt;/a&gt;&lt;br /&gt;도 적어둔다. 주로 상용툴 야그라 나랑 무관하지만.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://code.google.com/p/google-perftools/"&gt;google perftools&lt;/a&gt; 로 heap 만이라도 체크해볼까? 흠&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8106184143400269811?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8106184143400269811/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8106184143400269811' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8106184143400269811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8106184143400269811'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/microsoft-application-verifier.html' title='Microsoft Application Verifier'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7840453905128848050</id><published>2010-03-21T18:31:00.000+09:00</published><updated>2010-12-22T13:03:05.119+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FireGesture'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>파이어폭스 검색 사이트 등록, 파이어제스쳐 RD 기능</title><content type='html'>&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vNoAZbbw3cE&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vNoAZbbw3cE&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;사무실에서는 영어사전을 깔아서 쓰고있는데 집에까지 깔기는 싫고.. 어쩌다 검색할일이 있지만 집에선 키보드위에 손올리고 있는일이 적으니 마우스만으로 해야했다. 사무실이야 손이 키보드에 붙어있으니 파폭 키워드 검색으로 대부분 해결을 하지만...&lt;br /&gt;&lt;br /&gt;그래서 파이어제스쳐중 RD 기능을 쓰기로 헀다. &lt;br /&gt;&lt;a target="_blank" href="http://mycroft.mozdev.org/"&gt;http://mycroft.mozdev.org/&lt;/a&gt;&lt;br /&gt;을통해 네이버영어사전을 등록하고 단어 선택후 RD 긁으면 끝.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7840453905128848050?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7840453905128848050/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7840453905128848050' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7840453905128848050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7840453905128848050'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/%ED%8C%8C%EC%9D%B4%EC%96%B4%ED%8F%AD%EC%8A%A4-%EA%B2%80%EC%83%89-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%93%B1%EB%A1%9D-%ED%8C%8C%EC%9D%B4%EC%96%B4%EC%A0%9C%EC%8A%A4%EC%B3%90-rd-%EA%B8%B0%EB%8A%A5.html' title='파이어폭스 검색 사이트 등록, 파이어제스쳐 RD 기능'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-998589936198126903</id><published>2010-03-19T20:34:00.000+09:00</published><updated>2010-12-22T13:03:03.803+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmake'/><title type='text'>cmake, visual studio 사용자를 위해서 솔루션 뽑아주는 배치파일</title><content type='html'>나야 nmake, jom 류를 쓰지만 다른이들은 스튜디오를 주로 쓰니 아래 배치파일을 만들어 mkbld.bat 등으로 이름지어서 소스트리에 포함했다. bootstrap.bat 등이 더 적당한 이름이겠지만..&lt;br /&gt;&lt;br /&gt;bld 를 만들고 그안에 debug, release 를 각각 만들어서 솔루션을 만들어주는 구조.&lt;br /&gt;솔루션만들거면 디버그 릴리즈 구분하지 않아도 되는데 그럴경우 install 명령이 릴리즈 타겟만 설치하려고 하는 문제가 있어서 (버그인가?) 이런 형태로 사용하게 됐다.&lt;br /&gt;&lt;br /&gt;bld 디렉토리는 는 hg 등에서 ignore 해주는것 잊지말자.&lt;br /&gt;&lt;br /&gt;[code]&lt;br /&gt;@echo off&lt;br /&gt;if exist bld (&lt;br /&gt;&amp;nbsp;&amp;nbsp; goto err&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;mkdir bld&lt;br /&gt;cd bld&lt;br /&gt;&lt;br /&gt;mkdir debug&lt;br /&gt;cd debug&lt;br /&gt;cmake -D CMAKE_CONFIGURATION_TYPES:string=Debug ..\..&lt;br /&gt;&lt;br /&gt;cd ..&lt;br /&gt;mkdir release&lt;br /&gt;cd release&lt;br /&gt;cmake -D CMAKE_CONFIGURATION_TYPES:string=Release ..\..&lt;br /&gt;&lt;br /&gt;cd ..\..&lt;br /&gt;goto exit&lt;br /&gt;&lt;br /&gt;:err&lt;br /&gt;@echo bld directory exists&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;:exit&lt;br /&gt;@echo on&lt;br /&gt;[/code]&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-998589936198126903?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/998589936198126903/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=998589936198126903' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/998589936198126903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/998589936198126903'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/cmake-visual-studio-%EC%82%AC%EC%9A%A9%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%B4%EC%84%9C-%EC%86%94%EB%A3%A8%EC%85%98-%EB%BD%91%EC%95%84%EC%A3%BC%EB%8A%94.html' title='cmake, visual studio 사용자를 위해서 솔루션 뽑아주는 배치파일'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-190341842224014691</id><published>2010-03-18T20:43:00.000+09:00</published><updated>2010-12-22T13:03:02.411+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nmake'/><category scheme='http://www.blogger.com/atom/ns#' term='cmake'/><category scheme='http://www.blogger.com/atom/ns#' term='jom'/><title type='text'>jom, nmake 에 -j 기능(병렬 컴파일) 구현한놈 우왕ㅋ굳ㅋ</title><content type='html'>cmake &lt;a target="_blank" href="http://www.cmake.org/files/v2.8/CMakeChangeLog-2.8.1"&gt;릴리즈노트&lt;/a&gt;를 읽다가 NMake Makefiles JOM 제네레이터가 추가된걸 보고 궁금해서 뒤져보니 우왕ㅋ굳ㅋ 이놈이 바로 nmake 에 -j 붙인놈이네.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://labs.trolltech.com/blogs/2009/03/27/speeding-up-visual-c-qt-builds/"&gt;http://labs.trolltech.com/blogs/2009/03/27/speeding-up-visual-c-qt-builds/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://qt.gitorious.org/qt-labs/jom"&gt;http://qt.gitorious.org/qt-labs/jom&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="ftp://ftp.qt.nokia.com/jom/jom.zip"&gt;다운로드&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;바로 테스트 해봤는데 시간 줄어드는거 측정까진 못해보고 코어 여러개 쓰는것만 확인했다.&lt;br /&gt;&lt;a target="_blank" href="http://yoonkn.textcube.com/245"&gt;바로 얼마전에 찾다가 못찾았는데&lt;/a&gt; 이제라도 찾았으니 다행.&lt;br /&gt;&lt;br /&gt;그나저나 cmake 로 솔루션 만들어서 본격적으로 다른이들과 같이 써보니 문제가 좀 많네.&lt;br /&gt;나야 nmake 나 jom 쓰면 쾌적하지만 &lt;br /&gt;헐..&lt;br /&gt;솔루션쪽까지 만들어주는건 꽤나 성가시다.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-190341842224014691?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/190341842224014691/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=190341842224014691' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/190341842224014691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/190341842224014691'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/jom-nmake-%EC%97%90-j-%EA%B8%B0%EB%8A%A5%EB%B3%91%EB%A0%AC-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EA%B5%AC%ED%98%84%ED%95%9C%EB%86%88-%EC%9A%B0%EC%99%95%E3%85%8B%EA%B5%B3%E3%85%8B.html' title='jom, nmake 에 -j 기능(병렬 컴파일) 구현한놈 우왕ㅋ굳ㅋ'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6953173397051173937</id><published>2010-03-18T19:24:00.000+09:00</published><updated>2010-12-22T13:03:00.993+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>mercurial subrepo</title><content type='html'>&lt;a target="_blank" href="http://mercurial.selenic.com/wiki/subrepos"&gt;http://mercurial.selenic.com/wiki/subrepos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;리소스가 덩치가 너무 커서 subrepo 를 이용 소스코드와 리소스를 분리해봤다.&lt;br /&gt;근데 subrepo 쓰기가 좀 까다롭네. 아래쪽 리파지토리에서 푸쉬를 한후 위쪽 리파지토리에서 커밋을 해줘야 한다. 이 커밋을 잊지말자.&lt;br /&gt;&lt;br /&gt;그리고 버그인지 clone 직후 default-path 가 이상하게 들어있다.( 패스구분자가 / 와 \ 가 섞인다) 현재는 매번 clone 후 수작업으로 손보고 있긴 한데... 뭐 수정되겠지&lt;br /&gt;&lt;br /&gt;두가지만 기억해두자.&lt;br /&gt;&amp;nbsp; 상위리포에서 커밋 잊지말것.&lt;br /&gt;&amp;nbsp; hg debugsub 명령 기억해둘것.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6953173397051173937?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6953173397051173937/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6953173397051173937' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6953173397051173937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6953173397051173937'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/mercurial-subrepo.html' title='mercurial subrepo'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7900532360452627160</id><published>2010-03-12T01:53:00.000+09:00</published><updated>2010-12-22T13:02:59.669+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmake'/><title type='text'>cmake, 서브프로젝트간 의존성 추적이 좀 부족해보인다.</title><content type='html'>예를들어 최상위 CMakeLists.txt 는 아래 세개의 서브프로젝트를 가진다.&lt;br /&gt;[code]&lt;br /&gt;add_subdirectory(foo)&lt;br /&gt;add_subdirectory(bar)&lt;br /&gt;add_subdirectory(main)&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;foo, bar 는 라이브러리를, main 은 실행파일을 만드는데 main 에는 bar 를 링크해야 하고 bar 에는 foo 를 링크해야 한다. 뭐 사실상 라이브러리간 링크가 아니고 main 에 foo, bar 모두 링크해야 하지만 main 쪽에서 봤을때는 bar 만 보이고 foo 는 bar 뒤에 딸려오는 놈이라고 볼수있다. 즉 의미상 foo -&amp;gt; bar, bar -&amp;gt; main 의 관계가 생긴다.&lt;br /&gt;&lt;br /&gt;foo 의 CmakeLists.txt 는 간단.&lt;br /&gt;&lt;br /&gt;[code]&lt;br /&gt;project(foo)&lt;br /&gt;add_library(foo foo.c)&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;bar 를 빌드할때는 foo 가 필요하다.&lt;br /&gt;[code]&lt;br /&gt;project(bar)&lt;br /&gt;add_library(bar bar.c)&lt;br /&gt;&lt;br /&gt;include_directories(${foo_SOURCE_DIR})&lt;br /&gt;link_directories(${foo_BINARY_DIR})&lt;br /&gt;target_link_libraries(bar foo)&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;main 을 빌드할때는 bar 만 명시해주면 foo 는 cmake 가 알아서 붙여준다.&lt;br /&gt;[code]&lt;br /&gt;project(main)&lt;br /&gt;add_executable(main main.c)&lt;br /&gt;&lt;br /&gt;include_directories(${bar_SOURCE_DIR})&lt;br /&gt;link_directories(${bar_BINARY_DIR})&lt;br /&gt;target_link_libraries(main bar) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // bar 가 필요하면 bar 에 필요한 foo 도 딸려온다.&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;우왕굿.&lt;br /&gt;그럴듯 해보인다.&lt;br /&gt;main 은 직접적인 의존성이 걸린 bar&amp;nbsp; 만 신경쓰면 되고 foo 는 존재조차 알 필요 없다.&lt;br /&gt;&lt;br /&gt;하지만 저런식의 구성이 될경우 bar 는 foo 의 헤더를 인클루드 해서 main 에 까지 노출하는 경우가 태반이다. 즉 main 쪽에서 foo 쪽의 헤더를 찾아야 하고 cmake&amp;nbsp; 는 링크 의존성은 줄줄이 해결해 주지만 인클루드 의존성은 해결해주지 않는다..&lt;br /&gt;&lt;br /&gt;결국 main 의 CMakeLists.txt 에서 bar 뒤에 숨은 foo 에 접근을 해야할 필요가 생긴다&lt;br /&gt;[code]&lt;br /&gt;project(main)&lt;br /&gt;add_executable(main main.c)&lt;br /&gt;&lt;br /&gt;include_directories(${foo_SOURCE_DIR}) &amp;nbsp; &amp;nbsp;&amp;nbsp; # 갓댐!&lt;br /&gt;&lt;br /&gt;include_directories(${bar_SOURCE_DIR})&lt;br /&gt;link_directories(${bar_BINARY_DIR})&lt;br /&gt;target_link_libraries(main bar)&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;흠. 뭔가 맘에 안드는 모양새다. bjam 은 include 의존성도 잘 풀어줬던걸로 기억나는데.. 뭐 cmake 가 계속 조금씩 나아지고 있으니 언젠가 방법이 나오겠지. 아니면 link_libraries 가 버려지고 target_link_libraries 가 나온것처럼 다른 명령어가 이미 추가됐을지도.. 는 아직(2.8 버전) 아닌거 같다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;흠 위에서 link_directories 를 매번 해줬는데 안해줘도 된다. target_link_libraries 가 알아서 경로까지 가져온다. boost 던가가 msvc 에서는 link_directories 를 해줘야 돌아서 버릇삼아 적은건데.. 후에 수정하자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7900532360452627160?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7900532360452627160/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7900532360452627160' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7900532360452627160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7900532360452627160'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/cmake-%EC%84%9C%EB%B8%8C%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%B0%84-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%B6%94%EC%A0%81%EC%9D%B4-%EC%A2%80-%EB%B6%80%EC%A1%B1%ED%95%B4%EB%B3%B4%EC%9D%B8%EB%8B%A4.html' title='cmake, 서브프로젝트간 의존성 추적이 좀 부족해보인다.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2196783322361995349</id><published>2010-03-09T16:33:00.000+09:00</published><updated>2010-12-22T13:02:58.478+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win32'/><category scheme='http://www.blogger.com/atom/ns#' term='Ogre3D'/><category scheme='http://www.blogger.com/atom/ns#' term='win32API'/><title type='text'>ogre, 비율을 유지하며 리사이징하기</title><content type='html'>이게 몇년만의 서브클래싱이냐?&lt;br /&gt;win32 API 들이 아직도 기억나는게 신기하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그럴듯한 창모드 어플을 만드려면 리사이징이 자연스러워야 하는데 ogre 쪽에선 이걸 해주는 코드를 못찾았다. 윈도이벤트리스너 라고 리스너를 달아서 windowMoved, windowResized 등을 받는게 가능하긴 한데 리사이즈 된 뒤의 이벤트를 받는 거라 내가 원하는 동작을 하기엔 좀 무리가 있었다. 하지만 이 놈은 windowClosed 등 유용한 이벤트들이 떨어지니 어차피 코딩을 해야할놈이긴 하다.. 이쪽 코드는 블로그에 적어두진 않겠지만 필요하면&amp;nbsp; WindowEventUtilities 와 WindowEventListener 클래스를 참고해보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;결국 내가 원하는 WM_SIZING 처리를 위해서는.. 서브클래싱을 해야했다. 헐 추억의 서브클래싱. WindowEventUtilities 가 wndProc 을 들고있으니 적절히 참고하면서 아래 코드를 만들었다. 아래 코드는 아직 리사이징이 좀 어색한게 남아있는데.. 일단 여기 적어둔다.&lt;br /&gt;&lt;br /&gt;아 리사이징 가장 어색한게 window7 에서 사이징을 하면 모서리에 붙어버리는듯한 동작이 나오던데.. 간만에 msdn 좀 뒤져봐야겠다.&lt;br /&gt;&lt;br /&gt;[code cpp]&lt;br /&gt;typedef LRESULT (*WindowProcType)(HWND,UINT,WPARAM,LPARAM);&lt;br /&gt;WindowProcType oldWndProc;&lt;br /&gt;static void subclassRenderWindow(RenderWindow* w);&lt;br /&gt;static LRESULT wndProc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam);&lt;br /&gt;&lt;br /&gt;void subclassRenderWindow(RenderWindow* w)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(oldWndProc) return;&lt;br /&gt;&amp;nbsp; &amp;nbsp; HWND handle;&lt;br /&gt;&amp;nbsp; &amp;nbsp; w-&amp;gt;getCustomAttribute("WINDOW", &amp;amp;handle);&lt;br /&gt;&amp;nbsp; &amp;nbsp; oldWndProc = (WindowProcType)SetWindowLong(handle, GWL_WNDPROC, (DWORD)&amp;amp;wndProc);&lt;br /&gt;};&lt;br /&gt;LRESULT wndProc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; // WindowEventUtilities::_WndProc 에 의하면 WM_CREATE 보다 WM_SIZE&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 가 먼저 떨어질수도 있다네. 그랬던가? 어쨌건 저놈이 관련처리를&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 해주고 있으니 나도 그코드를 퍼올렸다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; // RenderWindow* w = (RenderWindow*)GetWindowLongPtr(wnd,GWLP_USERDATA);&lt;br /&gt;&amp;nbsp; &amp;nbsp; // if(!w) return oldWndProc(wnd, msg, wparam, lparam);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; switch(msg)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 최소 사이즈 지정&lt;br /&gt;&amp;nbsp; &amp;nbsp; case WM_GETMINMAXINFO:&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MINMAXINFO* mmi = (MINMAXINFO*)lparam;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mmi-&amp;gt;ptMinTrackSize.x = 800;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mmi-&amp;gt;ptMinTrackSize.y = 600;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 아 씨댕 생각보다 복잡한 코드를 만들어야 하네.&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 어느위치로 땡기는지에 따라 달리 계산해줘야 한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 조건을 좀더 합치는것도 되겠지만 아직 부자연스러운 움직임이 있어 그냥 둬본다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; case WM_SIZING:&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const double ratio = 1.33333;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RECT* rc = (RECT*)lparam;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int width = rc-&amp;gt;right - rc-&amp;gt;left;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int height = rc-&amp;gt;bottom - rc-&amp;gt;top;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(wparam == WMSZ_LEFT || wparam == WMSZ_RIGHT)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int h = static_cast&amp;lt;int&amp;gt;(width / ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;bottom = rc-&amp;gt;top + h;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if(wparam == WMSZ_TOP || wparam == WMSZ_BOTTOM)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int w = static_cast&amp;lt;int&amp;gt;(height * ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;right = rc-&amp;gt;left + w;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if(wparam == WMSZ_TOPLEFT || wparam == WMSZ_BOTTOMLEFT)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int w = static_cast&amp;lt;int&amp;gt;(height * ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;left = rc-&amp;gt;right - w;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if(wparam == WMSZ_TOPRIGHT || wparam == WMSZ_BOTTOMRIGHT)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int w = static_cast&amp;lt;int&amp;gt;(height * ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;right = rc-&amp;gt;left + w;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return FALSE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; default:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; return oldWndProc(wnd, msg, wparam, lparam);&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style="font-weight: bold;" size="4"&gt;2010/07/08 추가.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;와.. 이게 생각보다 빡치는 문제였네.&lt;br /&gt;이전 코드는 비율만 맟춰본 거였고.. 사실상 크기를 정확히 맟추려면 약간의 보정을 해줘야 한다. WM_SIZING 시 떨어지는 rect 는 스크린좌표이기 때문에 내가 원하는 크기가 800*600 이라고 해서 800*600 으로 맟춰버리면 윈도우가 그려주는 넌클라이언트 영역들때문에 800*600 에서 조금씩 짤린 크기가 되버린다. 이런 경우를 위해 AdjustWindwRect(Ex) 함수가 있는데.. CreateWindow 가 오우거안에 숨어있어서 ( D3DRenderWindow::create 참고 ).. 내가 원하던 클라이언트 사이즈와 만들어진 윈도우의 스크린 사이즈의 차이를 기억해뒀다가 sizing 시 보정해주는 방법을 썼다.&lt;br /&gt;&lt;br /&gt;아래는 코드 일부,&amp;nbsp; 내가 원했던 크기와 실제 만들어진 크기의 차이를 기억해 두는 함수&lt;br /&gt;[code cpp]&lt;br /&gt;void FerrariApp::prepareSizing()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; HWND handle;&lt;br /&gt;&amp;nbsp; &amp;nbsp; getRenderWindow()-&amp;gt;getCustomAttribute("WINDOW", &amp;amp;handle);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; int wantedWidth&amp;nbsp; = config.getVideoWidth();&lt;br /&gt;&amp;nbsp; &amp;nbsp; int wantedHeight = config.getVideoHeight();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RECT rc;&lt;br /&gt;&amp;nbsp; &amp;nbsp; GetWindowRect(handle, &amp;amp;rc);&lt;br /&gt;&amp;nbsp; &amp;nbsp; int realWidth&amp;nbsp; = rc.right - rc.left;&lt;br /&gt;&amp;nbsp; &amp;nbsp; int realHeight = rc.bottom - rc.top;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; adjustSize_.first&amp;nbsp; = realWidth - wantedWidth;&lt;br /&gt;&amp;nbsp; &amp;nbsp; adjustSize_.second = realHeight - wantedHeight;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; trace("adjustSize_ %d %d\n", adjustSize_.first, adjustSize_.second);&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;다시 코드 일부, 처음 적었던 코드에 위에서 기억해둔 사이즈를 보정해주는 코드를 추가한것&lt;br /&gt;[code cpp]&lt;br /&gt;LRESULT FerrariApp::onSizing(HWND hwnd, WPARAM wparam, LPARAM lparam)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; const double ratio = static_cast&amp;lt;double&amp;gt;(config.getVideoWidth()) / static_cast&amp;lt;double&amp;gt;(config.getVideoHeight());&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RECT* rc = (RECT*)lparam;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;left &amp;nbsp; += adjustSize_.first&amp;nbsp; / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;top &amp;nbsp;&amp;nbsp; += adjustSize_.second / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;right&amp;nbsp; -= adjustSize_.first&amp;nbsp; / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;bottom -= adjustSize_.second / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; double width = rc-&amp;gt;right - rc-&amp;gt;left;&lt;br /&gt;&amp;nbsp; &amp;nbsp; double height = rc-&amp;gt;bottom - rc-&amp;gt;top;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(wparam == WMSZ_LEFT || wparam == WMSZ_RIGHT)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int h = static_cast&amp;lt;int&amp;gt;(width / ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;bottom = rc-&amp;gt;top + h;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; else if(wparam == WMSZ_TOP || wparam == WMSZ_BOTTOM)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int w = static_cast&amp;lt;int&amp;gt;(height * ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;right = rc-&amp;gt;left + w;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; else if(wparam == WMSZ_TOPLEFT || wparam == WMSZ_BOTTOMLEFT)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int w = static_cast&amp;lt;int&amp;gt;(height * ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;left = rc-&amp;gt;right - w;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; else if(wparam == WMSZ_TOPRIGHT || wparam == WMSZ_BOTTOMRIGHT)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int w = static_cast&amp;lt;int&amp;gt;(height * ratio);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rc-&amp;gt;right = rc-&amp;gt;left + w;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;left &amp;nbsp; -= adjustSize_.first&amp;nbsp; / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;top &amp;nbsp;&amp;nbsp; -= adjustSize_.second / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;right&amp;nbsp; += adjustSize_.first&amp;nbsp; / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rc-&amp;gt;bottom += adjustSize_.second / 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; return FALSE;&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;아직도 좀 어색하게 돌아가는데 천천히 잡아보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2196783322361995349?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2196783322361995349/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2196783322361995349' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2196783322361995349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2196783322361995349'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/ogre-%EB%B9%84%EC%9C%A8%EC%9D%84-%EC%9C%A0%EC%A7%80%ED%95%98%EB%A9%B0-%EB%A6%AC%EC%82%AC%EC%9D%B4%EC%A7%95%ED%95%98%EA%B8%B0.html' title='ogre, 비율을 유지하며 리사이징하기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8267801608316120157</id><published>2010-03-08T18:10:00.000+09:00</published><updated>2010-12-22T13:02:57.295+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ogre'/><title type='text'>ogre, alt enter 로 창모드 전체모드 전환</title><content type='html'>오늘부로 오우거 1.7 로 갈아탔다.&lt;br /&gt;cmake 기본지원에 boost 를 같이 배포하더군.&lt;br /&gt;외부라이브러리를 껴서 배포하는건 좀 병신짓인데... 편하긴 하지만.. 흠&lt;br /&gt;어쨌건 기존 내가 쓰던 cmake 파일을 FindOgre.cmake 를 쓰도록 적절히 수정하고&lt;br /&gt;몇가지 api 가 바뀐게 있어서(제길) 조금 수정해주니 내가 지금껏 만들던 예제들은 잘 돌더라.&lt;br /&gt;아직 오류가 남아있어서 종료처리가 비정상이긴 한데..&lt;br /&gt;&lt;br /&gt;어쨌건 전체화면 전환 코드나 적어둔다.&lt;br /&gt;렌더윈도우에서 크기를 얻어서 전체화면/창모드 만 바꾸는 코드&lt;br /&gt;[code cpp]&lt;br /&gt;&amp;nbsp; &amp;nbsp; void toggleFullscreen()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned int width,height,color;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int left,top;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RenderWindow* w = app_-&amp;gt;getRenderWindow();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; w-&amp;gt;getMetrics(width,height,color,left,top);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; w-&amp;gt;setFullscreen(!w-&amp;gt;isFullScreen(),&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; &amp;nbsp;&amp;nbsp; width,&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; &amp;nbsp;&amp;nbsp; height);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;OIS 에서 alt-enter 를 받는건 enter 를 받은 시점에서 alt 를 검사하면 된다. &lt;br /&gt;[code cpp]&lt;br /&gt;&amp;nbsp; &amp;nbsp; virtual bool keyPressed(const OIS::KeyEvent&amp;amp; e)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(e.key)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case OIS::KC_ESCAPE:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; keepRendering_ = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case OIS::KC_RETURN:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(keyboard_-&amp;gt;isModifierDown(OIS::Keyboard::Alt))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; toggleFullscreen();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8267801608316120157?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8267801608316120157/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8267801608316120157' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8267801608316120157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8267801608316120157'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/ogre-alt-enter-%EB%A1%9C-%EC%B0%BD%EB%AA%A8%EB%93%9C-%EC%A0%84%EC%B2%B4%EB%AA%A8%EB%93%9C-%EC%A0%84%ED%99%98.html' title='ogre, alt enter 로 창모드 전체모드 전환'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6203678575179204073</id><published>2010-03-05T21:06:00.000+09:00</published><updated>2010-12-22T13:02:55.955+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ogre3D'/><title type='text'>ogre, archive 관련 작업을 시작하기위한 테스트 코드</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;예를들어 foo 라는 포맷을 정의하고 이를 ogre 가 처리하도록 하려면 아래 세개의 클래스를 구현하고&lt;br /&gt;&lt;ol&gt;&lt;li&gt;FooArchive : 디렉토리 처리? 뭐 그런거라고 보자&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FooArchiveFactory : 보일러플레이트&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FooDataStream : 파일스트림 처리? 그렇게 생각하면 굳&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;이중 FooArchiveFactory 를 ArchiveManager 에 등록한 후에&lt;br /&gt;리소스매니저를 통해 리소스에 접근이 가능하다.&lt;br /&gt;&lt;br /&gt;아직 파일포맷에 대해서 생각하지는 않았지만 위와 같은 과정을 테스트해보기 위한 코드를 만들어보고 적어둔다.&lt;br /&gt;&lt;br /&gt;fooarchive.hpp 는 위 세 클래스의 선언을 모두 담았다.&lt;br /&gt;&lt;p id="more-247-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '247-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-247-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-247-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code cpp]&lt;br /&gt;// 예를들어 foo 타입의 아카이브를 지원하려면&lt;br /&gt;// 아래 세개의 클래스를 만들고&lt;br /&gt;//&amp;nbsp; 1. FooArchive&lt;br /&gt;//&amp;nbsp; 2. FooArchiveFactory&lt;br /&gt;//&amp;nbsp; 3. FooDataStream&lt;br /&gt;//&lt;br /&gt;// FooArchiveFactory 를 ArchiveManager 에 등록한후&lt;br /&gt;// 리소스매니저를 통해 쓰면 된다.&lt;br /&gt;#pragma once&lt;br /&gt;#ifndef _FOOARCHIVE_H_&lt;br /&gt;#define _FOOARCHIVE_H_&lt;br /&gt;&lt;br /&gt;#include &amp;lt;OgrePrerequisites.h&amp;gt;&lt;br /&gt;#include &amp;lt;OgreArchive.h&amp;gt;&lt;br /&gt;#include &amp;lt;OgreArchiveFactory.h&amp;gt;&lt;br /&gt;&lt;br /&gt;class FooArchive : public Ogre::Archive&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp; &amp;nbsp; FooArchive(const Ogre::String name, const Ogre::String&amp;amp; archType);&lt;br /&gt;&amp;nbsp; &amp;nbsp; ~FooArchive();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; bool isCaseSensitive() const { return true; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void load();&lt;br /&gt;&amp;nbsp; &amp;nbsp; void unload();&lt;br /&gt;&amp;nbsp; &amp;nbsp; bool isReadOnly() const { return true; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; Ogre::DataStreamPtr open(const Ogre::String&amp;amp; filename) const;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Ogre::StringVectorPtr list(bool recursive=true, bool dirs=false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; Ogre::FileInfoListPtr listFileInfo(bool recursive = true, bool dirs = false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; Ogre::StringVectorPtr find(const Ogre::String&amp;amp; pattern, bool recursive = true, bool dirs = false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; Ogre::FileInfoListPtr findFileInfo(const Ogre::String&amp;amp; pattern, bool recursive = true, bool dirs = false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; bool exists(const Ogre::String&amp;amp; filename);&lt;br /&gt;&amp;nbsp; &amp;nbsp; time_t getModifiedTime(const Ogre::String&amp;amp; filename);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class FooArchiveFactory : public Ogre::ArchiveFactory&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp; &amp;nbsp; virtual ~FooArchiveFactory();&lt;br /&gt;&amp;nbsp; &amp;nbsp; const Ogre::String&amp;amp; getType() const;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Ogre::Archive *createInstance(const Ogre::String&amp;amp; name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; void destroyInstance(Ogre::Archive* arch);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class FooDataStream : public Ogre::DataStream&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp; &amp;nbsp; FooDataStream(const Ogre::String&amp;amp; name);&lt;br /&gt;&amp;nbsp; &amp;nbsp; size_t read(void* buf, size_t count);&lt;br /&gt;&amp;nbsp; &amp;nbsp; void skip(long count);&lt;br /&gt;&amp;nbsp; &amp;nbsp; void seek(size_t pos);&lt;br /&gt;&amp;nbsp; &amp;nbsp; size_t tell() const;&lt;br /&gt;&amp;nbsp; &amp;nbsp; bool eof() const;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void close();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; &amp;nbsp; size_t idx_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; char &amp;nbsp; buf_[26];&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#endif /* _FOOARCHIVE_H_ */&lt;br /&gt;[/code]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;fooarchive.cpp 는 FooArchive 클래스의 구현만 담았다.&lt;br /&gt;&lt;p id="more-247-1" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '247-1','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-247-1').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-247-1" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code cpp]&lt;br /&gt;#include "fooarchive.hpp"&lt;br /&gt;#include &amp;lt;OgreStringVector.h&amp;gt;&lt;br /&gt;using namespace Ogre;&lt;br /&gt;&lt;br /&gt;FooArchive::FooArchive(const Ogre::String name, const Ogre::String&amp;amp; archType) : Archive(name, archType)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FooArchive::~FooArchive()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FooArchive::load()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;void FooArchive::unload()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;DataStreamPtr FooArchive::open(const String&amp;amp; filename) const&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return DataStreamPtr(new FooDataStream(filename));&lt;br /&gt;}&lt;br /&gt;StringVectorPtr FooArchive::list(bool recursive, bool dirs)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 걍 적당히 파일 두개를 가지고 있는셈 친다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; StringVectorPtr v(new StringVector);&lt;br /&gt;&amp;nbsp; &amp;nbsp; v-&amp;gt;push_back("1.foo");&lt;br /&gt;&amp;nbsp; &amp;nbsp; v-&amp;gt;push_back("2.foo");&lt;br /&gt;&amp;nbsp; &amp;nbsp; return v;&lt;br /&gt;}&lt;br /&gt;FileInfoListPtr FooArchive::listFileInfo(bool recursive, bool dirs)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 음 채울 정보가 많네. 그냥 빈거 줘본다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 원래는 이놈을 먼저 구현하고 list 를 구현해야 겠구나.&lt;br /&gt;&amp;nbsp; &amp;nbsp; FileInfoListPtr fil(new FileInfoList);&lt;br /&gt;&amp;nbsp; &amp;nbsp; return fil;&lt;br /&gt;}&lt;br /&gt;StringVectorPtr FooArchive::find(const String&amp;amp; pattern, bool recursive, bool dirs)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return StringVectorPtr(new StringVector);&lt;br /&gt;}&lt;br /&gt;FileInfoListPtr FooArchive::findFileInfo(const String&amp;amp; pattern, bool recursive, bool dirs)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return FileInfoListPtr(new FileInfoList);&lt;br /&gt;}&lt;br /&gt;bool FooArchive::exists(const String&amp;amp; filename)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return filename == "1.foo" || filename == "2.foo";&lt;br /&gt;}&lt;br /&gt;time_t FooArchive::getModifiedTime(const String&amp;amp; filename)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;fooarchivefactory.cpp 는 FooArchvieFactory 클래스의 구현만 담았다.&lt;br /&gt;&lt;p id="more-247-2" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '247-2','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-247-2').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-247-2" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code cpp]&lt;br /&gt;#include "fooarchive.hpp"&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;using namespace Ogre;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;FooArchiveFactory::~FooArchiveFactory()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;const String&amp;amp; FooArchiveFactory::getType() const&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; static const String s = "foo";&lt;br /&gt;&amp;nbsp; &amp;nbsp; return s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Archive* FooArchiveFactory::createInstance(const String&amp;amp; name)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; // OGRE_NEW 등을 제공하는 모양인데 그냥 new 썼다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; return new FooArchive(name, "foo");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void FooArchiveFactory::destroyInstance(Ogre::Archive* arch)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; delete arch;&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;foodatastream.cpp 는 FooDataStream 클래스의 구현만 담았다. 이쪽은 대강 구현한거라 버그가 많을듯. 어차피 내용 붙이면 모두 새로구현해야한다.&lt;br /&gt;&lt;p id="more-247-3" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '247-3','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-247-3').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-247-3" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code cpp]&lt;br /&gt;#include "fooarchive.hpp"&lt;br /&gt;#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;FooDataStream::FooDataStream(const Ogre::String&amp;amp; name) : DataStream(name)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 어차피 예제 아닌가 그냥 적당히 고정 버퍼를 박았다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; mSize = sizeof(buf_);&lt;br /&gt;&amp;nbsp; &amp;nbsp; idx_ = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(size_t i = 0; i &amp;lt; mSize; ++i)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buf_[i] = 'a'+i;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;size_t FooDataStream::read(void* buf, size_t count)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; int readlen = min(count, mSize - idx_);&lt;br /&gt;&amp;nbsp; &amp;nbsp; memcpy(buf, buf_ + idx_, readlen);&lt;br /&gt;&amp;nbsp; &amp;nbsp; idx_ += readlen;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return readlen;&lt;br /&gt;}&lt;br /&gt;void FooDataStream::skip(long count)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; idx_ += count;&lt;br /&gt;&amp;nbsp; &amp;nbsp; idx_ = min(idx_, mSize);&lt;br /&gt;}&lt;br /&gt;void FooDataStream::seek(size_t pos)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(pos &amp;lt; mSize)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; idx_ = pos;&lt;br /&gt;}&lt;br /&gt;size_t FooDataStream::tell() const&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return idx_;&lt;br /&gt;}&lt;br /&gt;bool FooDataStream::eof() const&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; return idx_ == mSize;&lt;br /&gt;}&lt;br /&gt;void FooDataStream::close()&lt;br /&gt;{ &amp;nbsp;&amp;nbsp; &lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;archive.cpp 는 위 세 클래스를 써먹는 예제를 담았다. 등록하는 코드도 봐두자..&lt;br /&gt;&lt;p id="more-247-4" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '247-4','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-247-4').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-247-4" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code cpp]&lt;br /&gt;#include "fooarchive.hpp"&lt;br /&gt;#include &amp;lt;Ogre.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;using namespace Ogre;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;class OgreApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp; &amp;nbsp; OgreApp()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // root 를 만들기 전에는 ArchiveFactory 등록이 불가?&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_ = new Root("", "");&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 이제 등록가능하겠지&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 등록이 포인터를 등록하는 스타일이라 이걸 언제 delete 해줘야&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 하는지 애매한데 코드를 읽어보니 (1.6.4) delete 는 불러주지&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 않는다. 따라서 밖에서 포인터를 들고있다가 때되면(root&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 지운후가 되겠지) 지워주는 수고를 해줘야 한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; faf_ = new FooArchiveFactory;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ArchiveManager&amp;amp; am = ArchiveManager::getSingleton();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; am.addArchiveFactory(faf_);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // foo 타입을 처리하는 아카이브팩토리를 등록했으니 이제 foo 타입 리소스 추가가 가능할것이다&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResourceGroupManager&amp;amp; rgm = ResourceGroupManager::getSingleton();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rgm.addResourceLocation("noname", "foo", "nogroup");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rgm.initialiseAllResourceGroups();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // loadResourceGroup 을 하면 리소스를 완전히&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 로딩한다는데.. 지금 예제에선 별 의미가 없긴 하군.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rgm.loadResourceGroup("nogroup");&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 이제 리소스이름들을 읽어보자&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // FooArchive 의 list 정도가 불리겠지?&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; StringVectorPtr v = rgm.listResourceNames("nogroup");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(StringVector::const_iterator i = v-&amp;gt;begin(); i != v-&amp;gt;end(); ++i)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; "name: " &amp;lt;&amp;lt; *i &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 이제 실제로 리소스에 접근을 해보자&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(StringVector::const_iterator i = v-&amp;gt;begin(); i != v-&amp;gt;end(); ++i)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; *i &amp;lt;&amp;lt; " ==&amp;gt; " &amp;lt;&amp;lt; rgm.openResource(*i, "nogroup")-&amp;gt;getAsString() &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; ~OgreApp()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete root_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete faf_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; &amp;nbsp; Root* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; root_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; FooArchiveFactory* faf_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; OgreApp app; &amp;nbsp;&amp;nbsp; &lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;위 소스들을 빌드하는데 쓰인 CMakeLists.txt 의 일부. 아래 언급된 link_ogre3d_all() 매크로는 다른 파일에 있는데 적지 않았다.&lt;br /&gt;&lt;p id="more-247-5" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '247-5','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-247-5').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-247-5" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;[code]&lt;br /&gt;project(archive)&lt;br /&gt;link_ogre3d_all()&lt;br /&gt;add_library(fooarchive fooarchive.cpp fooarchivefactory.cpp foodatastream.cpp)&lt;br /&gt;add_executable(archive archive.cpp)&lt;br /&gt;target_link_libraries(archive fooarchive)&lt;br /&gt;[/code]&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6203678575179204073?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6203678575179204073/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6203678575179204073' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6203678575179204073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6203678575179204073'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/03/ogre-archive-%EA%B4%80%EB%A0%A8-%EC%9E%91%EC%97%85%EC%9D%84-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0%EC%9C%84%ED%95%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C.html' title='ogre, archive 관련 작업을 시작하기위한 테스트 코드'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3471361583926045404</id><published>2010-02-24T18:10:00.000+09:00</published><updated>2010-12-22T13:02:54.628+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>인수인계를 위해 남겨둔 최소한의 .emacs 파일</title><content type='html'>퇴사전 PC 정리중인데 인수인계가 늦어져서 간단히 코드와 문서를 보여줄수있을 정도의 .emacs 를 만들었다. emacs 안에 워낙 잡스러운것들을 들고있다보니 이런 작업도 하게 됐네&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;내가 필요했던것은&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;소스브라우징을 위한 &amp;nbsp;gtags, cscope&lt;/li&gt;&lt;li&gt;잡스런 파일을 숨긴 dired&lt;/li&gt;&lt;li&gt;ido&lt;/li&gt;&lt;li&gt;F5 로 커맨드창 실행&lt;/li&gt;&lt;li&gt;alt-F5 로 탐색기 실행&lt;/li&gt;&lt;li&gt;문서를 org 로 썼기 때문에 org&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그래서 ~/.emacs.d 에 gtags.el xcscope.el 만 넣어두고 .emacs 에 아래 코드만 남기고 나머진 모두 삭제했다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Gulim; line-height: normal; font-size: medium; "&gt;&lt;div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "&gt;&lt;pre&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;최소한의 el 들은 이곳에 넣어둔다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;add-to-list 'load-path &lt;span style="color: rgb(188, 143, 143); "&gt;"~/.emacs.d"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;cscope 설정&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;require&lt;/span&gt; '&lt;span style="color: rgb(95, 158, 160); "&gt;xcscope&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;gtags 설정, gtags.el 이 필요&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;load &lt;span style="color: rgb(188, 143, 143); "&gt;"gtags"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;add-hook 'c-mode-common-hook &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;lambda&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;()&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;gtags-mode 1&lt;span style="color: rgb(204, 204, 204); "&gt;)))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;global-set-key &lt;span style="color: rgb(188, 143, 143); "&gt;"\C-c\M-."&lt;/span&gt; 'gtags-find-rtag&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;defun&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); "&gt;yoonkn%search-project-by-gtags&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;()&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;interactive&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;if&lt;/span&gt; current-prefix-arg&lt;br /&gt;      &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;yoonkn-grep-project&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;gtags-find-pattern&lt;span style="color: rgb(204, 204, 204); "&gt;)))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;add-hook 'gtags-mode-hook&lt;br /&gt;          '&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;lambda&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;()&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;local-set-key &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;kbd &lt;span style="color: rgb(188, 143, 143); "&gt;"C-S-f"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;                            'yoonkn%search-project-by-gtags&lt;span style="color: rgb(204, 204, 204); "&gt;)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;dired 쪽 설정은 가지고있는게 좋겠군.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;require&lt;/span&gt; '&lt;span style="color: rgb(95, 158, 160); "&gt;dired-x&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;defun&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); "&gt;add-to-dired-omit-files&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;pattern&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;setq dired-omit-files&lt;br /&gt;        &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;concat dired-omit-files&lt;br /&gt;                &lt;span style="color: rgb(188, 143, 143); "&gt;"&lt;/span&gt;&lt;span style="color: rgb(188, 143, 143); font-weight: bold; "&gt;\\&lt;/span&gt;&lt;span style="color: rgb(188, 143, 143); font-weight: bold; "&gt;|&lt;/span&gt;&lt;span style="color: rgb(188, 143, 143); "&gt;"&lt;/span&gt;&lt;br /&gt;                pattern&lt;span style="color: rgb(204, 204, 204); "&gt;)))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;mapc #'add-to-dired-omit-files&lt;br /&gt;      '&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(188, 143, 143); "&gt;"\\`\\."&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`semantic.cache\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\.elc\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`tags\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`TAGS\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`GPATH\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`GRTAGS\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`GSYMS\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`GTAGS\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`cscope.out\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`cscope.files\\'"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(188, 143, 143); "&gt;"\\`cscope.index\\'"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;add-hook 'dired-mode-hook '&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;lambda&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;()&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;dired-omit-mode 1&lt;span style="color: rgb(204, 204, 204); "&gt;)))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;when&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;eq system-type 'windows-nt&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;setq ls-lisp-verbosity &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;delq 'uid ls-lisp-verbosity&lt;span style="color: rgb(204, 204, 204); "&gt;))&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;setq ls-lisp-verbosity &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;delq 'gid ls-lisp-verbosity&lt;span style="color: rgb(204, 204, 204); "&gt;)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;ido 도 필요하겠다&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;require&lt;/span&gt; '&lt;span style="color: rgb(95, 158, 160); "&gt;ido&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;ido-mode t&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;ido-everywhere 1&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;setq ido-use-filename-at-point 'guess&lt;br /&gt;      ido-use-url-at-point t&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;F5 로 터미널&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;when&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;eq system-type 'windows-nt&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;global-set-key [&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;f5&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;]&lt;br /&gt;                  '&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;lambda&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;()&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;interactive&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;w32-shell-execute &lt;span style="color: rgb(188, 143, 143); "&gt;"OPEN"&lt;/span&gt;&lt;br /&gt;                                        &lt;span style="color: rgb(188, 143, 143); "&gt;"cmd"&lt;/span&gt;&lt;br /&gt;                                        &lt;span style="color: rgb(188, 143, 143); "&gt;"/K echo hello"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;))))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;alt-F5 로 탐색기&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;when&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;eq system-type 'windows-nt&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;global-set-key [&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;meta f5&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;]&lt;br /&gt;                  '&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;lambda&lt;/span&gt; &lt;span style="color: rgb(204, 204, 204); "&gt;()&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;interactive&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;                     &lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;w32-shell-execute &lt;span style="color: rgb(188, 143, 143); "&gt;"OPEN"&lt;/span&gt; default-directory&lt;span style="color: rgb(204, 204, 204); "&gt;))))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;;;; &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34); "&gt;문서를 org 모드로 주로 남기기 때문에 이 모드도 필요하겠다&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240); "&gt;require&lt;/span&gt; '&lt;span style="color: rgb(95, 158, 160); "&gt;org&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204); "&gt;(&lt;/span&gt;setq org-hide-leading-stars t&lt;span style="color: rgb(204, 204, 204); "&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3471361583926045404?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3471361583926045404/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3471361583926045404' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3471361583926045404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3471361583926045404'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/%EC%9D%B8%EC%88%98%EC%9D%B8%EA%B3%84%EB%A5%BC-%EC%9C%84%ED%95%B4-%EB%82%A8%EA%B2%A8%EB%91%94-%EC%B5%9C%EC%86%8C%ED%95%9C%EC%9D%98-emacs-%ED%8C%8C%EC%9D%BC.html' title='인수인계를 위해 남겨둔 최소한의 .emacs 파일'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6572446811409705840</id><published>2010-02-23T15:08:00.000+09:00</published><updated>2010-12-22T13:02:53.326+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ccache'/><category scheme='http://www.blogger.com/atom/ns#' term='msvc'/><title type='text'>msvc 에서 빌드 빠르게 하는 방법은 없나</title><content type='html'>소스레벨에서의 노력이나 하드웨어적인 노력(램드라이브등)말고 ccache 나 make -j 같은녀석.&lt;br /&gt;PCH 는 몇가지 제약때문에 내가 싫어하고..&lt;br /&gt;인크레디빌드는 상용이라 제외고..&lt;br /&gt;&lt;br /&gt;여기저기 둘러봤는데 적절한 대안이 안보이네.&lt;br /&gt;&lt;br /&gt;일단 ccache 대용은.. msvc 용 ccache 가 만들어진적은 있는것 같은데 유지보수가 안되는거 같고&lt;br /&gt;&lt;br /&gt;make -j 옵션 대용은 &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb385193.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb385193.aspx&lt;/a&gt; 에 /MP 란 옵션이 있는데 이게 다른 여러 옵션들이랑 쫑나네. 당장 내가 가진 솔루션에 적용해보면 /Gm 이랑 쫑난다. &lt;br /&gt;이거말고 프로젝트별 병렬빌드도 있는데 그건 너무 병신같군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;음..&lt;br /&gt;일단 여기까지만 하고 접어두지만&lt;br /&gt;후에 다시 찾아봐야 할거같다.&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;&lt;a target="_blank" href="http://yoonkn.textcube.com/252"&gt;http://yoonkn.textcube.com/252&lt;/a&gt; 확인해보자. JOM!!!!!!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6572446811409705840?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6572446811409705840/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6572446811409705840' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6572446811409705840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6572446811409705840'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/msvc-%EC%97%90%EC%84%9C-%EB%B9%8C%EB%93%9C-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EC%97%86%EB%82%98.html' title='msvc 에서 빌드 빠르게 하는 방법은 없나'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2988075187942741868</id><published>2010-02-23T12:50:00.000+09:00</published><updated>2010-12-22T13:02:52.065+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='treemap'/><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><title type='text'>트리맵</title><content type='html'>지금 블로그에 이미지가 안올라가네 나중에 추가하고..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;callgrind 의 출력을 보면서 유용하겠구나 느꼈었는데 이걸 트리맵이라고 하는군.&lt;br /&gt;기억해두자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Treemap"&gt;http://en.wikipedia.org/wiki/Treemap&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.cs.umd.edu/hcil/treemap-history/"&gt;http://www.cs.umd.edu/hcil/treemap-history/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://windirstat.info/"&gt;http://windirstat.info/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/b2qmn/reddit_programmers_i_want_a_program_that_can/"&gt;reddit&lt;/a&gt; 에서 보게된김에 찾아본거.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2988075187942741868?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2988075187942741868/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2988075187942741868' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2988075187942741868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2988075187942741868'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/%ED%8A%B8%EB%A6%AC%EB%A7%B5.html' title='트리맵'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5254735387279668309</id><published>2010-02-23T11:41:00.000+09:00</published><updated>2010-12-22T13:02:50.789+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SlideShow'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>PLT scheme slideshow 에서 한글 출력시 첫 단어 이후 글씨들이 높낮이가 다른점</title><content type='html'>그냥 폰트지정하면 된다.&lt;br /&gt;괜히 궁금해져서 문서 뒤져봤네.&lt;br /&gt;&lt;br /&gt;예제코드.&lt;br /&gt;폰트지정하는 코드가 핵심.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#lang slideshow&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;current-main-font &lt;span style="color: rgb(188, 143, 143);"&gt;"malgun"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;slide &lt;br /&gt; &lt;span style="color: rgb(218, 112, 214);"&gt;#:title&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;"안녕"&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;t &lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;number-&amp;gt;string &lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;current-font-size&lt;span style="color: rgb(204, 204, 204);"&gt;)))&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;t &lt;span style="color: rgb(188, 143, 143);"&gt;"폰트 높낮이가 왜 다르냐"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;t &lt;span style="color: rgb(188, 143, 143);"&gt;"정말 눈에 거슬린다"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;)&lt;/span&gt;&lt;br /&gt; 'next&lt;br /&gt; &lt;span style="color: rgb(204, 204, 204);"&gt;(&lt;/span&gt;t &lt;span style="color: rgb(188, 143, 143);"&gt;"폰트를 지정해주니 해결됐엉"&lt;/span&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5254735387279668309?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5254735387279668309/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5254735387279668309' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5254735387279668309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5254735387279668309'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/plt-scheme-slideshow-%EC%97%90%EC%84%9C-%ED%95%9C%EA%B8%80-%EC%B6%9C%EB%A0%A5%EC%8B%9C-%EC%B2%AB-%EB%8B%A8%EC%96%B4-%EC%9D%B4%ED%9B%84.html' title='PLT scheme slideshow 에서 한글 출력시 첫 단어 이후 글씨들이 높낮이가 다른점'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8821299749377188633</id><published>2010-02-22T18:27:00.000+09:00</published><updated>2010-12-22T13:02:49.531+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='사직서'/><category scheme='http://www.blogger.com/atom/ns#' term='사표'/><title type='text'>음 사직서..</title><content type='html'>2003년, 실제론 2002년 12월경 부터 다니던 회사에 사표를 내고 나니 기분이 묘하구나.&lt;br /&gt;&lt;br /&gt;이제 게임개발자가 되어야 한다는 사실도 놀랍고&lt;br /&gt;별다른 서포트 없이 삽질로 게임을 빨리 만들어야 한다는게 정말 우울하다.&lt;br /&gt;&lt;br /&gt;생각해보면 나도 어릴적 FC-150 만질때부터 게임프로그래밍에 관심이 있어서 프로그래머를 하겠다고 마음먹은 놈이긴 한데 이제와서 새시작을 해야 한다니 두렵군.&lt;br /&gt;&lt;br /&gt;한동안 고생을 하게 될거 같은데&lt;br /&gt;내몸이 견뎌줬으면 좋겠네.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8821299749377188633?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8821299749377188633/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8821299749377188633' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8821299749377188633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8821299749377188633'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/%EC%9D%8C-%EC%82%AC%EC%A7%81%EC%84%9C.html' title='음 사직서..'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6511020829413435611</id><published>2010-02-21T16:13:00.000+09:00</published><updated>2010-12-22T13:02:48.273+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ogre3D'/><title type='text'>ogre3d 창모드일때 마우스 처리에 대해서 조금 적어둔다</title><content type='html'>OIS 를 non exclusive 모드로 돌리는것은 아래 링크대로 코드 추가&lt;br /&gt;&lt;a target="_blank" href="http://www.ogre3d.org/wiki/index.php/Using_OIS#Non-exclusive_input"&gt;http://www.ogre3d.org/wiki/index.php/Using_OIS#Non-exclusive_input&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[code cpp]&lt;br /&gt;&amp;nbsp; &amp;nbsp; paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));&lt;br /&gt;&amp;nbsp; &amp;nbsp; paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));&lt;br /&gt;&amp;nbsp; &amp;nbsp; paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));&lt;br /&gt;&amp;nbsp; &amp;nbsp; paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;그리고 기존 MouseMoved 에서 상대좌표로 마우스무브 인젝션 하던것을 절대좌표로 포지션 인젝션. 흠. 애초에 왜 상대좌표 썼는지는 원코드 쓴이에게 물어봐야 겠는데 분위기 보니 오우거 샘플이 원래 저걸 쓴모양인듯.&lt;br /&gt;&lt;br /&gt;[code cpp]&lt;br /&gt;OgreFramework::getSingletonPtr()-&amp;gt;m_pGUISystem-&amp;gt;injectMousePosition(evt.state.X.abs, evt.state.Y.abs);&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;아 그리고 시스템 마우스 커서가 남아있으니 숨기는 코드도 필요. 적당히 ShowCursor 불러주면 끝. 이거 그다기 깔끔한 처리는 아닌데 다른 방법을 찾지 못했다.&lt;br /&gt;[code cpp]&lt;br /&gt;::ShowCursor(FALSE);&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6511020829413435611?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6511020829413435611/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6511020829413435611' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6511020829413435611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6511020829413435611'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/ogre3d-%EC%B0%BD%EB%AA%A8%EB%93%9C%EC%9D%BC%EB%95%8C-%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%B2%98%EB%A6%AC%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%A1%B0%EA%B8%88-%EC%A0%81%EC%96%B4%EB%91%94%EB%8B%A4.html' title='ogre3d 창모드일때 마우스 처리에 대해서 조금 적어둔다'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7732898701312150004</id><published>2010-02-17T11:40:00.000+09:00</published><updated>2010-12-22T13:02:46.956+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>드랍박스 잘나가네</title><content type='html'>&lt;a target="_blank" href="http://blog.dropbox.com/?p=339"&gt;http://blog.dropbox.com/?p=339&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;mac 유저가 20% 나 된다는게 놀라움&lt;br /&gt;그리고 안습의 리눅스.&lt;br /&gt;글로벌 서비스와는 거리가 먼 우리나라.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7732898701312150004?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7732898701312150004/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7732898701312150004' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7732898701312150004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7732898701312150004'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/%EB%93%9C%EB%9E%8D%EB%B0%95%EC%8A%A4-%EC%9E%98%EB%82%98%EA%B0%80%EB%84%A4.html' title='드랍박스 잘나가네'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-592381118545092420</id><published>2010-02-16T21:29:00.000+09:00</published><updated>2010-12-22T13:02:45.647+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>mzscheme 아주 간단히 임베딩 해서 빌드만 해봤다.</title><content type='html'>s7 을 ogre 에 대강 붙여보니 잘 돌더라.&lt;br /&gt;뭐 이정도만 되도 내가 쓰기엔 문제 없는데 괜히 오버해서 mzscheme 을 구경해봤다.&lt;br /&gt;&lt;br /&gt;scheme. common lisp 을 모두 쳐도 PLT scheme 만큼 유지보수가 잘되고 윈도까지 지원하는게 드물어서 그냥 붙여본건데.. 흠 용량도 크고 붙이기도 쉽지 않고 그다지 끌리질 않네. 차라리 ecl 쪽이 좀더 끌리는듯. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;문서는&lt;br /&gt;http://docs.plt-scheme.org/inside/index.html&lt;br /&gt;를참고했고&lt;br /&gt;&lt;br /&gt;빌드에 쓴 CMakeLists.txt 는&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;cmake_minimum_required&lt;/span&gt;(VERSION 2.8)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;(WIN32)&lt;br /&gt;  &lt;span style="color: rgb(178, 34, 34);"&gt;# PLT 경로&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;(PLTDIR &lt;span style="color: rgb(188, 143, 143);"&gt;"C:/Program Files/PLT"&lt;/span&gt; CACHE PATH &lt;span style="color: rgb(188, 143, 143);"&gt;"PLT scheme dir"&lt;/span&gt;)&lt;br /&gt;  &lt;span style="color: rgb(178, 34, 34);"&gt;# -I, CFAGS, LDFLAGS 등 기본설정&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;include_directories&lt;/span&gt;(&lt;span style="color: rgb(188, 143, 143);"&gt;"${PLTDIR}/include"&lt;/span&gt;)&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;link_directories&lt;/span&gt;(&lt;span style="color: rgb(188, 143, 143);"&gt;"${PLTDIR}/lib/msvc"&lt;/span&gt;)&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;link_libraries&lt;/span&gt;(libmzsch3m_6ncc9s)&lt;br /&gt;  &lt;span style="color: rgb(178, 34, 34);"&gt;# 빌드후 테스팅을 편하게 하려고 dll 복사해줬다&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;configure_file&lt;/span&gt;(&lt;span style="color: rgb(188, 143, 143);"&gt;"${PLTDIR}/lib/libmzsch3m_6ncc9s.dll"&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;"${CMAKE_CURRENT_BINARY_DIR}"&lt;/span&gt; COPYONLY)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;()&lt;br /&gt;  &lt;span style="color: rgb(178, 34, 34);"&gt;# 지금은 윈도우 사용중이라.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;endif&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;필수&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add_definitions&lt;/span&gt;(/DMZ_PRECISE_GC=1)&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;base.i 가 소스리스트에 포함되어있고&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add_executable&lt;/span&gt;(a a.cpp base.i)&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;base.i 는 요 커맨드에 의해서 생성.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;PLT 문서는 .c 를 쓰는데 그럴경우 cmake 에서 좀 피곤하게 돌기때문에 .i 로 바꿨다.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add_custom_command&lt;/span&gt;(&lt;br /&gt;  OUTPUT base.i&lt;br /&gt;  COMMAND ${PLTDIR}/mzc --c-mods base.i ++lib scheme/base&lt;br /&gt;  WORKING_DIRECTORY &lt;span style="color: rgb(188, 143, 143);"&gt;"${CMAKE_CURRENT_SOURCE_DIR}"&lt;/span&gt;&lt;br /&gt;  )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;그리고 테스트로작성한 a.cpp 는 ( 위 문서의 코드를 그냥 베낀 정도의 코드 )&lt;br /&gt;[code cpp]&lt;br /&gt;#include "scheme.h"&lt;br /&gt;#include "base.i"               // mzc 가 생성한놈 원 문서는 .c 를 쓰지만 난 빌드편하게 하려다 보니 .i 썼다&lt;br /&gt;&lt;br /&gt;static int run(Scheme_Env* e, int argc, char* argv[]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;    // main 을 후킹해서 돌아가는 스타일&lt;br /&gt;    return scheme_main_setup(1, run, argc, argv);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// 아.. 드럽다. s7 이나 tiny_scheme 같은 경우는 대강 문서 보고 헤더&lt;br /&gt;// 구경하면서 쓰는게 가능한데 이놈은 그렇질 못하다. 가비지콜렉션&lt;br /&gt;// 때문인데... 흠. 문서를 좀더 읽기 전에 달려들었다간 낭패보기 쉽겠다.&lt;br /&gt;static int run(Scheme_Env* e, int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;    Scheme_Object* v;&lt;br /&gt;    &lt;br /&gt;    MZ_GC_DECL_REG(2);&lt;br /&gt;    MZ_GC_VAR_IN_REG(0, e);&lt;br /&gt;    MZ_GC_VAR_IN_REG(1, v);&lt;br /&gt;    MZ_GC_REG();&lt;br /&gt;&lt;br /&gt;    declare_modules(e);         // base.i 에서 나온거&lt;br /&gt;&lt;br /&gt;    v = scheme_intern_symbol("scheme/base");&lt;br /&gt;    scheme_namespace_require(v);&lt;br /&gt;&lt;br /&gt;    v = scheme_eval_string("(+ 1 2 3)", e);&lt;br /&gt;    if(SCHEME_INTP(v))&lt;br /&gt;        printf("result: %d\n", SCHEME_INT_VAL(v));&lt;br /&gt;&lt;br /&gt;    MZ_GC_UNREG();&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;br /&gt;참고로 이렇게 떨어진 a.exe 는 Release 빌드시 대략 556KB, 저 따라다녀야 하는 dll 은 2.5 MB&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-592381118545092420?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/592381118545092420/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=592381118545092420' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/592381118545092420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/592381118545092420'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/mzscheme-%EC%95%84%EC%A3%BC-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%9E%84%EB%B2%A0%EB%94%A9-%ED%95%B4%EC%84%9C-%EB%B9%8C%EB%93%9C%EB%A7%8C-%ED%95%B4%EB%B4%A4%EB%8B%A4.html' title='mzscheme 아주 간단히 임베딩 해서 빌드만 해봤다.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-1217876830573761885</id><published>2010-02-13T23:14:00.000+09:00</published><updated>2010-12-22T13:02:44.413+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ccl'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>clozure common lisp 세팅</title><content type='html'>그냥 몇가지 적어둔다.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;뜰때 읽는 파일이 ccl-init.lisp 인데 내가 환경변수 HOME 을 잡아둔 곳에서 읽지 않고 내문서 그쪽에서 읽는다. $HOME 읽는 프로그램들 중(*nix 쪽에서 나온 놈들)에 이렇게 돌아가는건 처음보네. 아.. 허긴 이놈은 mac 출신이구나. 어쨌건 ccl 띄운후 (user-homedir-pathname) 를 확인해보면 알수있다.&lt;/li&gt;&lt;li&gt;위 경로에 ccl-init.lisp 을 만들고 아래 코드로 c:/opt/lisp 아래의 asdf 패키지들을 찾도록 했다. 아래 코드는 &lt;a target="_blank" href="http://paste.lisp.org/display/83926"&gt;http://paste.lisp.org/display/83926&lt;/a&gt; 에서 가져온것&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;require&lt;/span&gt; '&lt;span style="color: rgb(95, 158, 160);"&gt;asdf&lt;/span&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;defun&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;setup-registry&lt;/span&gt; &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;directory-path&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;format t &lt;span style="color: rgb(188, 143, 143);"&gt;"; adding components under ~A to asdf registry~%"&lt;/span&gt; directory-path&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;mapc &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;lambda&lt;/span&gt; &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;asd-pathname&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;br /&gt;          &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;pushnew &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;make-pathname &lt;span style="color: rgb(218, 112, 214);"&gt;:name&lt;/span&gt; nil&lt;br /&gt;                                  &lt;span style="color: rgb(218, 112, 214);"&gt;:type&lt;/span&gt; nil&lt;br /&gt;                                  &lt;span style="color: rgb(218, 112, 214);"&gt;:version&lt;/span&gt; nil &lt;br /&gt;                                  &lt;span style="color: rgb(218, 112, 214);"&gt;:defaults&lt;/span&gt; asd-pathname&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;br /&gt;                   asdf:*central-registry*&lt;br /&gt;                  &lt;span style="color: rgb(218, 112, 214);"&gt;:test&lt;/span&gt; #'equal&lt;span style="color: rgb(217, 217, 217);"&gt;))&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;directory &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;merge-pathnames #p&lt;span style="color: rgb(188, 143, 143);"&gt;"**/*.asd"&lt;/span&gt; directory-path&lt;span style="color: rgb(217, 217, 217);"&gt;))))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;setup-registry #p&lt;span style="color: rgb(188, 143, 143);"&gt;"c:/opt/lisp/"&lt;/span&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;asdf-install 이 지원되는 모양인데.. 난 수작업을 하는편.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://read-eval-print.blogspot.com/2009/06/clozure-cl-windows.html"&gt;http://read-eval-print.blogspot.com/2009/06/clozure-cl-windows.html&lt;/a&gt; 를 보면 인코딩 세팅하는 코드도 나와있다. 지금은 그냥 돌려본거라 이건 테스트 안해봤는데 한글윈도에서 코딩하려면 반드시 필요하겠지. 파일인코딩은 euc-kr, 그외는 utf-8 식으로..&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;setf ccl:*default-external-format*&lt;br /&gt;      &lt;span style="color: rgb(217, 217, 217);"&gt;(&lt;/span&gt;ccl:make-external-format &lt;span style="color: rgb(218, 112, 214);"&gt;:character-encoding&lt;/span&gt; &lt;span style="color: rgb(218, 112, 214);"&gt;:utf-8&lt;/span&gt;&lt;br /&gt;                                &lt;span style="color: rgb(218, 112, 214);"&gt;:line-termination&lt;/span&gt; &lt;span style="color: rgb(218, 112, 214);"&gt;:dos&lt;/span&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;br /&gt;      ccl:*default-file-character-encoding* &lt;span style="color: rgb(218, 112, 214);"&gt;:utf-8&lt;/span&gt;&lt;br /&gt;      ccl:*default-socket-character-encoding* &lt;span style="color: rgb(218, 112, 214);"&gt;:utf-8&lt;/span&gt;&lt;span style="color: rgb(217, 217, 217);"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;패키지 몰아서 받는건 아래 링크 통해서 하고있다. libcl 자체가 패키지관리기능을 가지고 있지만 난 그냥 저거 압축만 풀어서 쓰고있는 상태.&lt;br /&gt;&lt;a target="_blank" href="http://libcl.com/"&gt;http://libcl.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-1217876830573761885?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/1217876830573761885/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=1217876830573761885' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1217876830573761885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1217876830573761885'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/clozure-common-lisp-%EC%84%B8%ED%8C%85.html' title='clozure common lisp 세팅'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-9155387833511131286</id><published>2010-02-09T20:06:00.000+09:00</published><updated>2010-12-22T13:02:40.795+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boost'/><category scheme='http://www.blogger.com/atom/ns#' term='coroutine'/><category scheme='http://www.blogger.com/atom/ns#' term='asio'/><title type='text'>boost asio coroutine 샘플</title><content type='html'>&lt;a target="_blank" href="http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/examples.html"&gt;http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/examples.html&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/example/http/server4/coroutine.hpp"&gt;http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/example/http/server4/coroutine.hpp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;일단 링크만 적어둔다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;&lt;a target="_blank" href="http://www.crystalclearsoftware.com/soc/coroutine/"&gt;http://www.crystalclearsoftware.com/soc/coroutine/&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-9155387833511131286?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/9155387833511131286/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=9155387833511131286' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/9155387833511131286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/9155387833511131286'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/02/boost-asio-coroutine-%EC%83%98%ED%94%8C.html' title='boost asio coroutine 샘플'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8018258453095645805</id><published>2010-01-30T20:47:00.000+09:00</published><updated>2010-12-22T13:02:39.540+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>mercurial, 로컬에서만 ignore 하기</title><content type='html'>필요없는 파일은 맞는데 .hgignore 에 넣기는 후달릴때 쓰는 방법&lt;br /&gt;&lt;a target="_blank" href="http://mercurial.selenic.com/wiki/TipsAndTricks#Ignore_files_in_local_working_copy_only"&gt;참고&lt;/a&gt; 에 소개되어있다. hg st 때렸을때 깔끔하게 프롬프트만 떨어지게 하고 쓰자. 무시하고 살다보면 add 를 까먹기도 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;워킹카피내의 .hg/hgrc 에 아래내용 추가하고 hgignore 작성하면 끝.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[ui]&lt;br /&gt;ignore = /path/to/repo/.hg/hgignore&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8018258453095645805?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8018258453095645805/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8018258453095645805' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8018258453095645805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8018258453095645805'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/01/mercurial-%EB%A1%9C%EC%BB%AC%EC%97%90%EC%84%9C%EB%A7%8C-ignore-%ED%95%98%EA%B8%B0.html' title='mercurial, 로컬에서만 ignore 하기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-1870355628959292868</id><published>2010-01-27T23:50:00.000+09:00</published><updated>2010-12-22T13:02:35.657+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><category scheme='http://www.blogger.com/atom/ns#' term='Highlight'/><category scheme='http://www.blogger.com/atom/ns#' term='codehighlight'/><title type='text'>어라 코드하이라이트 지원하네</title><content type='html'>환경설정 보다 알았네&lt;br /&gt;그런데 &lt;a target="_blank" href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes"&gt;지원언어&lt;/a&gt;가 많지 않다.&lt;br /&gt;&lt;br /&gt;음.. 그냥 지금처럼 emacs 에서 html 뽑아서 붙이는쪽이 끌리는데..&lt;br /&gt;어쨌건 기억해 두자.&lt;br /&gt;&lt;br /&gt;여태껏 집에서 돌리던 리파지토리 서버를 내리고 &lt;a target="_blank" href="http://yoonkn.textcube.com/229"&gt;드랍박스에서 리파지토리를 돌리고 있어서&lt;/a&gt; 전처럼 필요할때 집에 로그인해서 코드를 꺼내가기 힘들어졌으니 앞으로 코드조각들을 블로그에 올려둬야 할 판인데 자주 써먹게되겠군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;오우거 시작코드를 스크래치부터 짜보고 있는데 그 코드 올려본다.&lt;br /&gt;&lt;br /&gt;[code cpp]&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp; 흠. 외부데이타를 읽을게 많아서 초기기동이 상당히 성가시다.&lt;br /&gt;&amp;nbsp; setupResourceLocations() 함수를 참고해보자.&lt;br /&gt;*/&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;#include "Ogre.h"&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;using namespace Ogre;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class MyFrameListener : public FrameListener&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp; &amp;nbsp; virtual bool frameStarted(const FrameEvent&amp;amp; e)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; virtual bool frameEnded(const FrameEvent&amp;amp; e)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class OgreApp&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp; &amp;nbsp; OgreApp()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupLog();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupRoot();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupRenderWindow();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupSceneManager();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupCamera();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupViewport();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupResourceLocations();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; createScene();&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; virtual ~OgreApp()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete root_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete logMgr_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void run()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(true)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!root_-&amp;gt;renderOneFrame())&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; messageLoop();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void addFrameListener(FrameListener* fl)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_-&amp;gt;addFrameListener(fl);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp; &amp;nbsp; LogManager* &amp;nbsp; logMgr_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Root* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RenderWindow* window_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; SceneManager* sceneMgr_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Camera* &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Viewport* &amp;nbsp; &amp;nbsp; vp_;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupLog()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logMgr_ = new LogManager;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LogManager::getSingleton().createLog("ogre.log", true, true, false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logMgr_-&amp;gt;setLogDetail(LL_BOREME);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupRoot()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_ = new Root("", "");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loadPlugin("RenderSystem_Direct3D9");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loadPlugin("Plugin_OctreeSceneManager"); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_-&amp;gt;setRenderSystem(*root_-&amp;gt;getAvailableRenderers()-&amp;gt;begin());&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_-&amp;gt;initialise(false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void loadPlugin(const char* name)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string n = name;&lt;br /&gt;#if _DEBUG&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; n += "_d";&lt;br /&gt;#endif&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_-&amp;gt;loadPlugin(n);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupRenderWindow()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_-&amp;gt;getRenderSystem()-&amp;gt;setConfigOption("Full Screen", "No");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; root_-&amp;gt;getRenderSystem()-&amp;gt;setConfigOption("Video Mode", "1024 x 768 @ 32-bit colour");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; window_ = root_-&amp;gt;createRenderWindow("Manual Ogre Window", 1024, 768, false, 0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupSceneManager()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sceneMgr_ = root_-&amp;gt;createSceneManager(ST_GENERIC, "MySceneManager");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupCamera()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_ = sceneMgr_-&amp;gt;createCamera("MainCam");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Z 방향으로 500 거리에 카메라 위치&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_-&amp;gt;setPosition(Vector3(0,0,500));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Z 쪽으로 향하게&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_-&amp;gt;lookAt(Vector3(0,0,-300));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_-&amp;gt;setAspectRatio(1.33333f);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_-&amp;gt;setNearClipDistance(5);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cam_-&amp;gt;setFarClipDistance(1000);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupViewport()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vp_ = window_-&amp;gt;addViewport(cam_);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vp_-&amp;gt;setBackgroundColour(ColourValue(0,0,0));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void setupResourceLocations()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //addResourceLocation("/packs/OgreCore.zip", "Zip", "Boostrap");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addResourceLocation("/materials/programs", "FileSystem", "General");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addResourceLocation("/materials/scripts", "FileSystem", "General");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addResourceLocation("/materials/textures", "FileSystem", "General");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addResourceLocation("/models", "FileSystem", "General");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); // 그룹별로 초기화도 가능하다 기억해두자.&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void addResourceLocation(const char* name, const char* type, const char* group)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const char* ogrehome = getenv("OGRE_HOME");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!ogrehome) throw runtime_error("need OGRE_HOME env");&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResourceGroupManager::getSingleton().addResourceLocation(string(ogrehome) + "/media" + name,&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; type,&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; group); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; void createScene()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sceneMgr_-&amp;gt;setAmbientLight(ColourValue(0.5,0.5,0.5));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Light* l = sceneMgr_-&amp;gt;createLight("MainLight");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; l-&amp;gt;setPosition(20,80,50);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Entity* ent = sceneMgr_-&amp;gt;createEntity("head", "ogrehead.mesh");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //ent-&amp;gt;setMaterialName("Examples/EnvMappedRustySteel");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sceneMgr_-&amp;gt;getRootSceneNode()-&amp;gt;createChildSceneNode()-&amp;gt;attachObject(ent);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; void messageLoop()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MSG msg;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(PeekMessage(&amp;amp;msg, NULL, 0, 0,&amp;nbsp; PM_REMOVE))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TranslateMessage(&amp;amp;msg);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DispatchMessage(&amp;amp;msg);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; MyFrameListener fl;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; OgreApp app;&lt;br /&gt;&amp;nbsp; &amp;nbsp; app.addFrameListener(&amp;amp;fl);&lt;br /&gt;&amp;nbsp; &amp;nbsp; app.run();&lt;br /&gt;}&lt;br /&gt;[/code]&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-1870355628959292868?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/1870355628959292868/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=1870355628959292868' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1870355628959292868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/1870355628959292868'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/01/%EC%96%B4%EB%9D%BC-%EC%BD%94%EB%93%9C%ED%95%98%EC%9D%B4%EB%9D%BC%EC%9D%B4%ED%8A%B8-%EC%A7%80%EC%9B%90%ED%95%98%EB%84%A4.html' title='어라 코드하이라이트 지원하네'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2350550839573462911</id><published>2010-01-26T11:23:00.000+09:00</published><updated>2010-12-22T13:02:34.418+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='S7'/><title type='text'>s7, 간단한 scheme 구현</title><content type='html'>&lt;a target="_blank" href="https://ccrma.stanford.edu/software/snd/snd/s7.html"&gt;https://ccrma.stanford.edu/software/snd/snd/s7.html&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="https://ccrma.stanford.edu/software/snd/"&gt;https://ccrma.stanford.edu/software/snd/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/arvdl/choosing_a_game_scripting_language/"&gt;http://www.reddit.com/r/programming/comments/arvdl/choosing_a_game_scripting_language/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;중 s7 언급을 보고 알았다. &lt;br /&gt;다음에 스크립트 올릴일 있으면 tinyscheme 말고 이놈 한번 써보자.&lt;br /&gt;&lt;br /&gt;후에 이게 기억나길..&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2350550839573462911?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2350550839573462911/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2350550839573462911' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2350550839573462911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2350550839573462911'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/01/s7-%EA%B0%84%EB%8B%A8%ED%95%9C-scheme-%EA%B5%AC%ED%98%84.html' title='s7, 간단한 scheme 구현'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8102919345553284407</id><published>2010-01-25T12:15:00.000+09:00</published><updated>2010-12-22T13:02:33.140+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndrive'/><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='skydrive'/><category scheme='http://www.blogger.com/atom/ns#' term='Livemesh'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>무료 웹하드류 서비스에 mercurial 리파지토리 올리는 시도중</title><content type='html'>흠. 집에 항상 켜두는 PC 가 있어서 거기 colinux 를 깔고 hg 서버로 활용했는데 이제 그렇게 쓰기 힘들게 됐다. 그래서 전부터 생각해오던 몇가지 대안을 테스트중.&lt;br /&gt;&lt;br /&gt;1. 유료 웹호스팅 활용.&lt;br /&gt;몇몇 호스팅의 경우 계정에 hg 설치가 가능해서.. 충분히 써먹을수 있지만 난 돈이 없다. &lt;br /&gt;&lt;br /&gt;2. svn, hg 무료 호스팅 서비스&lt;br /&gt;용량 작거나 라이센스 제한.&lt;br /&gt;&lt;br /&gt;3. N 드라이브&lt;br /&gt;네이버 서비스인데, 드라이브가 N 으로 잡혀서 콘솔에서 쓰기 쉬운게 매력적.. 이라고 생각했었지만 hg clone 부터 실패하더라. 흠. 제길슨.&lt;br /&gt;&lt;br /&gt;4. 드랍박스&lt;br /&gt;헐 이미 다른용도로 용량을 거의 다 쓰고 있어서.. 그리고 무료계정은 2기가를 주는데 그다지 넉넉치 못하다. 그래도 가장 나아보인다.&lt;br /&gt;&lt;br /&gt;5. 라이브메쉬&lt;br /&gt;현재 라이브메쉬로 hg 리파지토리 폴더를 동기화중.. 느리고 동기화가 얼마나 진행됐는지 알기 어려운데.. 흠 달리 대안이 없으니 일단 이걸 써볼 예정. 하지만 리눅스 미지원때문에&lt;br /&gt;오래 쓰진 못할것같다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;으음.. 전에 S3 에 리파지토리 올리는거 찾아보다가 말았는데 다시 뒤져보자.&lt;br /&gt;유료라 쓰진 않겠지만..&lt;br /&gt;&lt;br /&gt;아.. skydrive 도 한번 고려해보자.. 이쪽은 서드파티 클라이언트들을 좀 뒤져봐야 겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2010/01/26&lt;br /&gt;흠 mesh 는 좀 요상하네. 분명 수정을 했는데 싱크가 되지 않고 있더라.. 음.. 5G 는 매력적인데 어차피 리눅 미지원이니 별 고민없이 드랍박스로 세팅했다. 현재 드랍박스에 동기화중.&lt;br /&gt;존내 느린건 마찬가지...&lt;br /&gt;언제 짬내서 보너스용량 받아 챙겨야겠다.&lt;br /&gt;&lt;a target="_blank" href="https://www.dropbox.com/referrals/NTEyOTUzMjE5"&gt;https://www.dropbox.com/referrals/NTEyOTUzMjE5&lt;/a&gt;&lt;br /&gt;적어둬야지..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2010/02/02&lt;br /&gt;push 중 lock 됐다는 에러가 뜨던데 &lt;a target="_blank" href="http://stackoverflow.com/questions/12865/mercurial-stuck-waiting-for-lock"&gt;이글&lt;/a&gt;을 참고하여 .hg/store/lock 을 지워버렸다.&lt;br /&gt;흠. 집에서 PC 를 끌때 동기화가 잘 안된건가???&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8102919345553284407?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8102919345553284407/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8102919345553284407' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8102919345553284407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8102919345553284407'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/01/%EB%AC%B4%EB%A3%8C-%EC%9B%B9%ED%95%98%EB%93%9C%EB%A5%98-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%97%90-mercurial-%EB%A6%AC%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC-%EC%98%AC%EB%A6%AC%EB%8A%94-%EC%8B%9C%EB%8F%84%EC%A4%91.html' title='무료 웹하드류 서비스에 mercurial 리파지토리 올리는 시도중'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-8182572385049995881</id><published>2010-01-21T17:51:00.000+09:00</published><updated>2010-12-22T13:02:31.954+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boost'/><category scheme='http://www.blogger.com/atom/ns#' term='serial'/><category scheme='http://www.blogger.com/atom/ns#' term='asio'/><title type='text'>boost asio 를 이용 serialport 로 테스트용 바이트시퀀스를 줄줄이 싸봤다.</title><content type='html'>보드쪽에서 시리얼 읽는게 좀 이상하길래 만들어본 테스트 코드.&lt;br /&gt;&lt;br /&gt;처음엔 haskell 로 짰는데( &lt;a target="_blank" href="http://hackage.haskell.org/package/serialport"&gt;serialport&lt;/a&gt; 라고, haskell 에서 win32 시리얼 포트를 지원하는 라이브러리가 나온게 본기억이 나서 ) ㅋㅋㅋ 잘 안되더라. send 가 묘하게 느리던데.. 업무상 필요한 작업이라 삽질 그만두고 바로 C++ 로 짜버렸다.&lt;br /&gt;&lt;br /&gt;테스트한 시나리오가.. C++ 로 0x00 부터 0xFF 를 줄기차게 날리고 보드쪽에서 매번 한바이트읽을때마다 기존 값하고 1 차이나는지 비교한.. 단순히 한방향 통신만 하는 코드라서 시리얼포트에서 읽거나 하는 코드는 들어있지 않다.&lt;br /&gt;&lt;br /&gt;뭐 사실 그냥 asio 사용하고 다를거하나 없고 set_option 의 사용법 정도나 봐두면 되겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;boost/asio.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;exception&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;using&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;namespace&lt;/span&gt; &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(160, 32, 240);"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(95, 158, 160);"&gt;boost&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;asio&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;io_service&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;io_service&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;시리얼포트 열고&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(95, 158, 160);"&gt;boost&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;asio&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;serial_port&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;s&lt;/span&gt;(io_service, &lt;span style="color: rgb(188, 143, 143);"&gt;"COM4"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: rgb(95, 158, 160);"&gt;boost&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;asio&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;serial_port&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;baud_rate&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;baud_rate&lt;/span&gt;(9600);        &lt;br /&gt;        s.set_option(baud_rate);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(95, 158, 160);"&gt;boost&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;asio&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;deadline_timer&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;t&lt;/span&gt;(io_service);&lt;br /&gt;        &lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;buf&lt;/span&gt;[1] = {0};&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: rgb(160, 32, 240);"&gt;while&lt;/span&gt;(&lt;span style="color: rgb(95, 158, 160);"&gt;true&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;한바이트씩 보내자&lt;br /&gt;&lt;/span&gt;            s.write_some(&lt;span style="color: rgb(95, 158, 160);"&gt;boost&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;asio&lt;/span&gt;::buffer(buf, &lt;span style="color: rgb(160, 32, 240);"&gt;sizeof&lt;/span&gt;(buf)));&lt;br /&gt;            cout &amp;lt;&amp;lt; &lt;span style="color: rgb(160, 32, 240);"&gt;static_cast&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&amp;gt;(buf[0]) &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;0x00 부터 0xFF 까지 보내면 되겠지.&lt;br /&gt;&lt;/span&gt;            buf[0]++;            &lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;잠시 쉬자.&lt;br /&gt;&lt;/span&gt;            t.expires_from_now(&lt;span style="color: rgb(95, 158, 160);"&gt;boost&lt;/span&gt;::&lt;span style="color: rgb(95, 158, 160);"&gt;posix_time&lt;/span&gt;::milliseconds(5));&lt;br /&gt;            t.wait();&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        io_service.run();&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: rgb(160, 32, 240);"&gt;catch&lt;/span&gt;(exception&amp;amp; e)&lt;br /&gt;    {&lt;br /&gt;        cerr &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; endl;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-8182572385049995881?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/8182572385049995881/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=8182572385049995881' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8182572385049995881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/8182572385049995881'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/01/boost-asio-%EB%A5%BC-%EC%9D%B4%EC%9A%A9-serialport-%EB%A1%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9A%A9.html' title='boost asio 를 이용 serialport 로 테스트용 바이트시퀀스를 줄줄이 싸봤다.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4513141885959522647</id><published>2010-01-18T12:26:00.000+09:00</published><updated>2010-12-22T13:02:30.696+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmake'/><title type='text'>cmake, 실행하는데 여러 파일이 필요한놈한테 파일 모아주기</title><content type='html'>퇴원후 첫글이네 흠.&lt;br /&gt;&lt;br /&gt;ogre 1.6 을 구경하고있는데 이게 빌드후 실행시 여려가지 dll 하고 리소스 들이 필요하더라.&lt;br /&gt;리소스는 복사하긴 좀 덩치가 커서 코드내에서 $OGRE_HOME 을 기준으로 찾게했고 ( 보통 cfg 를 쓰도록 구성되어있는데 이건 내취향이 아니다. 적어도 샘플수준 코드라면 이런저런 파일을 들고다니는건 귀찮기만 할 뿐. 코드에 박는게 속편하다.) 그외 dll 들은 적당히 복사를 해서 쓰도록 했다.&lt;br /&gt;&lt;br /&gt;어쨌건 정리해두면 먼저 exe, dll 들이 모이는 디렉토리를 만들고 cmake 가 만드는 출력을 이쪽으로 돌렸다. 아.. ogre 쪽 dll 도 복사하도록 추가했다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/out)&lt;br /&gt;set_output_dir(${CMAKE_BINARY_DIR}/out)&lt;br /&gt;copy_ogre_dlls(${CMAKE_BINARY_DIR}/out)&lt;/blockquote&gt;&lt;br /&gt;위에서 아래두줄은 내가만든 매크로.. 소스는 요렇다.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# 컴파일 결과를 한곳으로.&lt;br /&gt;# cmake 로 dll 들을 서브프로젝트로 만들경우 exe 와 다른 디렉토리에 떨어져 불편하니 이걸 써먹자.&lt;br /&gt;# 예)&lt;br /&gt;# set_output_dir(${CMAKE_BINARY_DIR}/out) &lt;br /&gt;macro(set_output_dir dir)&lt;br /&gt;&amp;nbsp; set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${dir} CACHE PATH "Single Directory for all Libraries")&lt;br /&gt;&amp;nbsp; set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir} CACHE PATH "Single Directory for all Executables")&lt;br /&gt;&amp;nbsp; set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${dir} CACHE PATH "Single Directory for all static libraries")&lt;br /&gt;endmacro(set_output_dir dir)&lt;br /&gt;&lt;br /&gt;macro(filecopy src dst)&lt;br /&gt;&amp;nbsp; configure_file("${src}" "${dst}" COPYONLY)&lt;br /&gt;endmacro(filecopy src dst)&lt;br /&gt;&lt;br /&gt;macro(copy_ogre_dlls dir)&lt;br /&gt;&amp;nbsp; if(CMAKE_BUILD_TYPE MATCHES Debug)&lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/debug/OgreMain_d.dll" "${dir}")&lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/debug/RenderSystem_Direct3D9_d.dll" "${dir}")&lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/debug/Plugin_OctreeSceneManager_d.dll" "${dir}")&lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/debug/OIS_d.dll" "${dir}") &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; else()&lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/release/OgreMain.dll" "${dir}")&lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/release/RenderSystem_Direct3D9.dll" "${dir}") &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/release/Plugin_OctreeSceneManager.dll" "${dir}") &lt;br /&gt;&amp;nbsp; &amp;nbsp; filecopy("${OGRE_HOME}/bin/release/OIS.dll" "${dir}")&lt;br /&gt;&amp;nbsp; endif()&lt;br /&gt;endmacro(copy_ogre_dlls dir)&lt;/blockquote&gt;&lt;br /&gt;흠, 참고로 ogre 샘플제작을 편하게 하려고 만든 매크로도 걍 적어둔다..&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;macro(link_ogre3d target)&lt;br /&gt;&amp;nbsp; if(CMAKE_BUILD_TYPE MATCHES Debug)&lt;br /&gt;&amp;nbsp; &amp;nbsp; target_link_libraries("${target}" OgreMain_d OIS_d)&lt;br /&gt;&amp;nbsp; else()&lt;br /&gt;&amp;nbsp; &amp;nbsp; target_link_libraries("${target}" OgreMain OIS)&lt;br /&gt;&amp;nbsp; endif()&amp;nbsp; &lt;br /&gt;endmacro(link_ogre3d target)&lt;br /&gt;&lt;br /&gt;macro(link_ogre3d_all)&lt;br /&gt;&amp;nbsp; if(CMAKE_BUILD_TYPE MATCHES Debug)&lt;br /&gt;&amp;nbsp; &amp;nbsp; link_libraries("${target}" OgreMain_d OIS_d)&lt;br /&gt;&amp;nbsp; else()&lt;br /&gt;&amp;nbsp; &amp;nbsp; link_libraries("${target}" OgreMain OIS)&lt;br /&gt;&amp;nbsp; endif()&amp;nbsp; &lt;br /&gt;endmacro(link_ogre3d_all)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;흠 추가로, 원래 configure_file 을 쓰지 않고 cmake -E 를 써보려고 했는데 그쪽은 좀 성가셔서 하다 말았다. configure_file 은 cmake 가 실행되는 시점에 복사를 하는거라 흠.. 정확히 내가 원하는 동작은 아닌데.. 뭐 별수없지.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아.. ogre 에 대해서도 좀 적어둔다.&lt;br /&gt;흠 3D 는 전혀 모르지만 접근하는데 큰 무리는 없더라. 물론 3D 를 모르니 의미없는 접근이지만. 어쨌건 예제들이 간단한 프레임웍들을 끼고있어서 scratch 에서부터 시작하는게 좀 짜증났다. cfg 등을 남발하는 구조도 초기접근시 좀 더러웠고.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4513141885959522647?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4513141885959522647/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4513141885959522647' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4513141885959522647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4513141885959522647'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2010/01/cmake-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%EB%8D%B0-%EC%97%AC%EB%9F%AC-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C%EB%86%88%ED%95%9C%ED%85%8C-%ED%8C%8C%EC%9D%BC-%EB%AA%A8%EC%95%84%EC%A3%BC%EA%B8%B0.html' title='cmake, 실행하는데 여러 파일이 필요한놈한테 파일 모아주기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-334873435746974784</id><published>2009-11-18T22:06:00.000+09:00</published><updated>2010-12-22T13:02:28.280+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='원피스'/><category scheme='http://www.blogger.com/atom/ns#' term='게임'/><category scheme='http://www.blogger.com/atom/ns#' term='링크'/><category scheme='http://www.blogger.com/atom/ns#' term='대항해시대'/><title type='text'>대항해시대4 PK 원피스 모드</title><content type='html'>&lt;a target="_blank" href="http://blog.naver.com/clamp0615/140093921039"&gt;http://blog.naver.com/clamp0615/140093921039&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://blog.naver.com/clamp0615/170000096995"&gt;http://blog.naver.com/clamp0615/170000096995&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;우왕ㅋ굳ㅋ&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-334873435746974784?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/334873435746974784/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=334873435746974784' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/334873435746974784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/334873435746974784'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/11/%EB%8C%80%ED%95%AD%ED%95%B4%EC%8B%9C%EB%8C%804-pk-%EC%9B%90%ED%94%BC%EC%8A%A4-%EB%AA%A8%EB%93%9C.html' title='대항해시대4 PK 원피스 모드'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2454158693391442782</id><published>2009-11-11T19:15:00.000+09:00</published><updated>2010-12-22T13:02:26.987+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='go'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>google go</title><content type='html'>&lt;a target="_blank" href="http://golang.org/"&gt;http://golang.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/a3184/go_an_experimental_language_from_google/"&gt;reddit&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://developers.slashdot.org/story/09/11/11/0210212/Go-Googles-New-Open-Source-Programming-Language"&gt;/.&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Go_%28programming_language%29"&gt;wikipedia&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;으음.. 만든분들이 화려하다. 뭐 그이전에 구글이 내놨다는것만으로도 시끄러워지겠군.&lt;br /&gt;&lt;br /&gt;시스템 프로그래밍 언어라는데 별로 그런 느낌은 못받겠다. ffi 도 아직 완전하지 않은 모양이고.. 가비지 컬렉션.. 흠.&lt;br /&gt;&lt;br /&gt;뭣보다 현재 내가 윈도위주로 작업중인데 윈도버전은 없는 상태.&lt;br /&gt;나중에나 구경을 해보자.&lt;br /&gt;&lt;br /&gt;아 &lt;a target="_blank" href="http://golang.org/doc/go_lang_faq.html"&gt;Language Design FAQ&lt;/a&gt; 는 당장 읽어봐야 겠다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;&lt;a target="_blank" href="http://code.google.com/p/go/issues/detail?id=9"&gt;이미 Go! 라는 이름을 가진 언어를 개발한 이의 태클. 으 웃겨&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;추가&lt;br /&gt;&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/a3l91/what_is_so_special_about_google_go/"&gt;뭐그리잘났냐&lt;/a&gt; 에는 배울게 많으니 구경해보자.&lt;br /&gt;&lt;br /&gt;추가&lt;br /&gt;&lt;div style="text-align: center; clear: both;"&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rKnDgT73v8s&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rKnDgT73v8s&amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2454158693391442782?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2454158693391442782/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2454158693391442782' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2454158693391442782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2454158693391442782'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/11/google-go.html' title='google go'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7222951184091004203</id><published>2009-11-09T11:08:00.000+09:00</published><updated>2010-12-22T13:02:25.770+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gamedev'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='Unreal'/><title type='text'>언리얼 엔진..</title><content type='html'>&lt;a target="_blank" href="http://udk.com/"&gt;http://udk.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;지난주던가에 풀렸다.&lt;br /&gt;풀렸다곤 해도 소스가 풀린건 아닌거 같고 게임쪽이라 나완 무관하지만&lt;br /&gt;그래도 저게 꽤나 비싼걸로 아는데.. 함 구경해볼만할거같다.&lt;br /&gt;&lt;br /&gt;라이센스를 제대로 읽어보진 않았는데 오픈소스 로그라이크들이 저걸 쓸수 있으려나?&lt;br /&gt;GPL 쪽하곤 당연 안섞일것 같은데..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;링크추가. &lt;br /&gt;&lt;a target="_blank" href="http://www.reddit.com/r/udk/"&gt;http://www.reddit.com/r/udk/&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7222951184091004203?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7222951184091004203/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7222951184091004203' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7222951184091004203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7222951184091004203'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/11/%EC%96%B8%EB%A6%AC%EC%96%BC-%EC%97%94%EC%A7%84.html' title='언리얼 엔진..'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7776813659234012115</id><published>2009-11-03T15:39:00.000+09:00</published><updated>2010-12-22T13:02:24.442+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='누트'/><category scheme='http://www.blogger.com/atom/ns#' term='NUUT'/><category scheme='http://www.blogger.com/atom/ns#' term='ebook'/><title type='text'>pdf 를 txt 로 변환해서 nuut 로 읽는 방법 적어둔다.</title><content type='html'>오늘 아이리버 스토리를 구경했는데 흠... 괜찮군.&lt;br /&gt;일찍산 내가 병신이지.&lt;br /&gt;이넘들은 누트2 나오면서 누트1은 아예 신경 끈것 같고. 헐&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;어쨌건 비싸게산 누트를 써먹어야 하니까.. pdf 를 txt 로 변환하고 euc-kr 로 바꾸는 방법을 적어둔다(리눅스에서). 사실 pdf 읽기는 거의 포기하고 html 을 txt 로 바꿔서 읽는것 위주로 활용했는데 pdf 쪽도 어떻게든 읽어봐야겠다.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;pdftotext &lt;/span&gt;로 pdf 를 text 로 변환&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iconv -f utf-8 -t euc-kr//TRANSLIT&lt;/span&gt; foo.txt &amp;gt; bar.txt 로 euc-kr 로 변환.. 누트1은 유니코드 지원따윈 없다.. 제길슨&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;텍스트만 뽑아내는거라.. 기술문서 읽는건 거의 불가능.&lt;br /&gt;허무하군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7776813659234012115?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7776813659234012115/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7776813659234012115' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7776813659234012115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7776813659234012115'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/11/pdf-%EB%A5%BC-txt-%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%B4%EC%84%9C-nuut-%EB%A1%9C-%EC%9D%BD%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%A0%81%EC%96%B4%EB%91%94%EB%8B%A4.html' title='pdf 를 txt 로 변환해서 nuut 로 읽는 방법 적어둔다.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3856270960812132411</id><published>2009-10-28T18:34:00.000+09:00</published><updated>2010-12-22T13:02:22.953+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>토치라이트 우왕ㅋ굳ㅋ</title><content type='html'>오오..&lt;br /&gt;이건 예전에 졸라 잼나게 했던 Fate 스타일 게임.&lt;br /&gt;너무나 닮은거 보니 뭔가 연관이 있는듯.&lt;br /&gt;&lt;br /&gt;어쨌건 dll 들 보면 CEGUI 에 Ogre 등 오픈소스들이 쓰였네.&lt;br /&gt;언제 구경이나 해보자&lt;br /&gt;&lt;a target="_blank" href="http://www.ogre3d.org/"&gt;http://www.ogre3d.org/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.cegui.org.uk/wiki/index.php/Main_Page"&gt;http://www.cegui.org.uk/wiki/index.php/Main_Page&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.fmod.org/"&gt;http://www.fmod.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;페이트 개발자가 참여했다는군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3856270960812132411?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3856270960812132411/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3856270960812132411' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3856270960812132411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3856270960812132411'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/10/%ED%86%A0%EC%B9%98%EB%9D%BC%EC%9D%B4%ED%8A%B8-%EC%9A%B0%EC%99%95%E3%85%8B%EA%B5%B3%E3%85%8B.html' title='토치라이트 우왕ㅋ굳ㅋ'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-43422594110047429</id><published>2009-10-16T18:12:00.000+09:00</published><updated>2010-12-22T13:02:20.657+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deque'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>deque 를 이용한 간단한 버퍼</title><content type='html'>이런게 종종 필요하지.&lt;br /&gt;급히 필요해서 테스트겸 만들어본 코드.&lt;br /&gt;c++ 자주 안쓰게되서 레퍼런스 안보곤 못짜겠더군.&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;deque&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iterator&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;using&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;namespace&lt;/span&gt; &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;* &lt;span style="color: rgb(184, 134, 11);"&gt;p1&lt;/span&gt; = &lt;span style="color: rgb(188, 143, 143);"&gt;"abcde"&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;* &lt;span style="color: rgb(184, 134, 11);"&gt;p2&lt;/span&gt; = &lt;span style="color: rgb(188, 143, 143);"&gt;"fghij"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(160, 32, 240);"&gt;typedef&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;deque&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&amp;gt; &lt;span style="color: rgb(34, 139, 34);"&gt;buf_t&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;buf_t&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;buf&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;먼저 p1 을 넣어보자&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;보통 네트웍에서 읽는 값은 이렇게 버퍼에 쌓아두고 본다.&lt;br /&gt;&lt;/span&gt;    copy(p1,&lt;br /&gt;         p1+strlen(p1),&lt;br /&gt;         &lt;span style="color: rgb(34, 139, 34);"&gt;back_insert_iterator&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(34, 139, 34);"&gt;buf_t&lt;/span&gt;&amp;gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;buf&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;이제 버퍼에서 일부를 꺼내보자&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;이때는 원하는 모양만큼 가려서 꺼내면 된다.&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;만약 패킷완성이 덜됐다면 skip 하던가 하면 되겠지.&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;tmp&lt;/span&gt;[3];&lt;br /&gt;    copy(buf.begin(),&lt;br /&gt;         buf.begin()+3,&lt;br /&gt;         tmp);&lt;br /&gt;    cout &amp;lt;&amp;lt; tmp &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;버퍼에서 일부를 삭제해보자&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;패킷하나를 전부 읽었다면 버퍼에서 뽑아내야겠지.&lt;br /&gt;&lt;/span&gt;    buf.erase(buf.begin(),&lt;br /&gt;              buf.begin()+3);&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;남은 버퍼를 확인해보자&lt;br /&gt;&lt;/span&gt;    copy(buf.begin(),&lt;br /&gt;         buf.end(),&lt;br /&gt;         &lt;span style="color: rgb(34, 139, 34);"&gt;ostream_iterator&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&amp;gt;(cout, &lt;span style="color: rgb(188, 143, 143);"&gt;""&lt;/span&gt;));&lt;br /&gt;    cout &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;음. 계속해서 패킷이 도착하겠지&lt;br /&gt;&lt;/span&gt;    copy(p2,&lt;br /&gt;         p2+strlen(p2),&lt;br /&gt;         &lt;span style="color: rgb(34, 139, 34);"&gt;back_insert_iterator&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(34, 139, 34);"&gt;buf_t&lt;/span&gt;&amp;gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;buf&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;남은 버퍼 찍어보자&lt;br /&gt;&lt;/span&gt;    copy(buf.begin(),&lt;br /&gt;         buf.end(),&lt;br /&gt;         &lt;span style="color: rgb(34, 139, 34);"&gt;ostream_iterator&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&amp;gt;(cout, &lt;span style="color: rgb(188, 143, 143);"&gt;""&lt;/span&gt;));&lt;br /&gt;    cout &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;끝&lt;br /&gt;&lt;/span&gt;    cout &amp;lt;&amp;lt; &lt;span style="color: rgb(188, 143, 143);"&gt;"ok"&lt;/span&gt; &amp;lt;&amp;lt; endl;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-43422594110047429?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/43422594110047429/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=43422594110047429' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/43422594110047429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/43422594110047429'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/10/deque-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%B2%84%ED%8D%BC.html' title='deque 를 이용한 간단한 버퍼'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5752876194246237927</id><published>2009-10-14T15:13:00.000+09:00</published><updated>2010-12-22T13:02:19.402+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='koei'/><category scheme='http://www.blogger.com/atom/ns#' term='무쌍'/><title type='text'>북두무쌍?!</title><content type='html'>&lt;a target="_blank" href="http://koeitecmo.info/new/"&gt;http://koeitecmo.info/new/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style="font-size: 9pt;" color="black"&gt;YOUはSHOCK&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;아 시바&lt;br /&gt;엑박사야하나&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5752876194246237927?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5752876194246237927/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5752876194246237927' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5752876194246237927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5752876194246237927'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/10/%EB%B6%81%EB%91%90%EB%AC%B4%EC%8C%8D.html' title='북두무쌍?!'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7201929458225643396</id><published>2009-10-09T11:33:00.000+09:00</published><updated>2010-12-22T13:02:18.101+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>gdb 7.0</title><content type='html'>&lt;a target="_blank" href="http://www.reddit.com/r/programming/comments/9rzt1/gdb_70_out_lots_of_new_features/"&gt;http://www.reddit.com/r/programming/comments/9rzt1/gdb_70_out_lots_of_new_features/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;좀 짱인듯.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7201929458225643396?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7201929458225643396/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7201929458225643396' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7201929458225643396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7201929458225643396'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/10/gdb-70.html' title='gdb 7.0'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3363621081574652947</id><published>2009-10-02T16:37:00.000+09:00</published><updated>2010-12-22T13:02:16.950+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><title type='text'>GNU screen 사용법 위키에서 백업</title><content type='html'>&lt;a target="_blank" href="http://oldpie.yoonkn.com/cgi-bin/moin.cgi/GNU_screen"&gt;http://oldpie.yoonkn.com/cgi-bin/moin.cgi/GNU_screen&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;오래전에 적어둔것 옮겨둔다. 저쪽 계정이 얼마 안남았다..&lt;br /&gt;&lt;br /&gt;&lt;h1 id="head-ea47d27a8d7152173ddc6248b3341ba49300f57c"&gt;screen&lt;/h1&gt;&lt;p class="line867"&gt;&lt;a href="http://oldpie.yoonkn.com/cgi-bin/moin.cgi/Xming"&gt;Xming&lt;/a&gt; 으로 &lt;a href="http://oldpie.yoonkn.com/cgi-bin/moin.cgi/Emacs"&gt;Emacs&lt;/a&gt; 를 띄워서 원격작업하는 현재에는 별 필요가 없는 툴인데 대강만든 프로그램을 서버쪽에 띄워서 오래 돌려야 한다던가 하는 경우가 자주 있어서 이럴때를 위한 screen 사용방법 정리 &lt;/p&gt;&lt;p class="line874"&gt;원래는 좀더 간단한 attach(detach 던가??? 기억이...) 라는놈이 있는데 내 장비에 기본설치가 안되어있고 또 screen 이 더 유명한놈이라 이놈을 적어둔다. &lt;/p&gt;&lt;div&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;  &lt;td&gt;&lt;p class="line862"&gt; screen 실행 &lt;/p&gt;&lt;/td&gt;  &lt;td&gt;&lt;p class="line862"&gt; screen &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;&lt;p class="line862"&gt; 세션 detach &lt;/p&gt;&lt;/td&gt;  &lt;td&gt;&lt;p class="line862"&gt; C-a C-d &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;&lt;p class="line862"&gt; 세션 list &lt;/p&gt;&lt;/td&gt;  &lt;td&gt;&lt;p class="line862"&gt; screen -ls &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;&lt;p class="line862"&gt; 세션 resume &lt;/p&gt;&lt;/td&gt;  &lt;td&gt;&lt;p class="line862"&gt; screen -r 어쩌구.저쩌구.모시기 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p class="line874"&gt;그냥 프로세스 띄우는 정도면 위 네가지만 알면 충분. 더 상세한 기능은 man page 가 아주 잘되어있다. &lt;/p&gt;&lt;p class="line874"&gt;가끔 로깅도 필요한 경우가 있는데 이때는 &lt;/p&gt;&lt;div&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;  &lt;td&gt;&lt;p class="line862"&gt; toggle logging &lt;/p&gt;&lt;/td&gt;  &lt;td&gt;&lt;p class="line862"&gt; C-a H &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p class="line874"&gt;참고로 요놈이랑 자주 쓰게될 스크립트 &lt;/p&gt;&lt;ul&gt;&lt;li style="list-style-type: none;"&gt;&lt;pre&gt;#! /bin/bash&lt;br /&gt;&lt;br /&gt;while [ 1 ]&lt;br /&gt;do&lt;br /&gt;        echo "TICK!"&lt;br /&gt;        python chviewmon.py&lt;br /&gt;        sleep 5&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="line867"&gt;&lt;/p&gt;&lt;h1 id="head-6680fd67af0e11e80c90aaaec353ed907efe8926"&gt;참고링크&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;p class="line862"&gt;헐 이미 잘 정리되어있었네 &lt;a class="http" href="http://kr.sun.com/developers/solaris/techdocs/gnu_screen.html"&gt;http://kr.sun.com/developers/solaris/techdocs/gnu_screen.html&lt;/a&gt; 를 참고하자. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class="line891"&gt;&lt;a class="http" href="http://kldp.org/node/18744"&gt;http://kldp.org/node/18744&lt;/a&gt; 이것도 좋음  &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3363621081574652947?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3363621081574652947/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3363621081574652947' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3363621081574652947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3363621081574652947'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/10/gnu-screen-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%9C%84%ED%82%A4%EC%97%90%EC%84%9C-%EB%B0%B1%EC%97%85.html' title='GNU screen 사용법 위키에서 백업'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-4199201395927095332</id><published>2009-10-01T18:03:00.000+09:00</published><updated>2010-12-22T13:02:15.572+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='upnp'/><title type='text'>벨킨 공유기 UPnP AddPortMapping 문제</title><content type='html'>upnp 를 위해 덩치큰 라이브러리를 가져다 쓰지 않고 직접 짰는데 이게 테스트에 쓴 다른 공유기들(Intel UPnP SDK&amp;nbsp; 기반) 에선 문제 없지만 벨킨 공유기에서는 문제가 생기더라.&lt;br /&gt;&lt;br /&gt;결론만 적자면 내가 평소 http 프로토콜을 직접 짜야 할 경우 보통 1.0 기반으로 만드는 편인데 이번에도 역시 1.0 기반으로 리퀘스트를 했고 벨킨 공유기는 이걸 에러로 취급해준것.&lt;br /&gt;&lt;br /&gt;SOAP 이 HTTP 1.1 위에서 돌아야만 했던가? 흠 지금껏 이런 문제는 본적이 없는데&lt;br /&gt;나중에 이것좀 찾아보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;어 참고로 지금 UPnP 로 포트매핑 하는거 대강 순서나 적어둘까&lt;br /&gt;&lt;ol&gt;&lt;li&gt;디스커버리&lt;/li&gt;&lt;li&gt;찾았으면 디스크립션 읽어오고&lt;/li&gt;&lt;li&gt;그중에서 컨트롤 URL 을 파싱해서&lt;/li&gt;&lt;li&gt;먼저 DeletePortMapping 으로 이전 포트포워딩 정보가 있으면 지워주고&lt;/li&gt;&lt;li&gt;AddPortMapping 으로 포트매핑 추가&lt;/li&gt;&lt;/ol&gt;음. 몇몇 공유기는 AddPortMapping 을 반복해서 불러도, 즉 기존에 뚫린거 또 뚫어 달라고 해도 별말없이 뚫어주는놈도 있고 어떤놈은 이미 뚫었다고 에러주는 경우도 있다. 따라서 뚫기전에 뚫은것 지워달라는 패킷을 추가한것. &lt;br /&gt;&lt;br /&gt;정석대로라면 먼저 뚫어보고 이미 뚫려있다고 응답해오면 상황판단을 해서 뚫은것 지우고 다시 뚫거나 등등의 처리를 해야 하겠지만 흠. 일단 걍 막무가내로 뚫어버렸다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아..&lt;br /&gt;문제가 생긴 공유기는 벨킨 F5D8236-4 v2 였다.&lt;br /&gt;지금은 꺼놔서 펌웨어 버전은 못적겠군.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-4199201395927095332?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/4199201395927095332/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=4199201395927095332' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4199201395927095332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/4199201395927095332'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/10/%EB%B2%A8%ED%82%A8-%EA%B3%B5%EC%9C%A0%EA%B8%B0-upnp-addportmapping-%EB%AC%B8%EC%A0%9C.html' title='벨킨 공유기 UPnP AddPortMapping 문제'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5570141460646098523</id><published>2009-09-03T13:03:00.000+09:00</published><updated>2010-12-22T13:02:13.146+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Unicode'/><title type='text'>python 에서 유니코드 스트링을 일반 스트링으로 바꾸기</title><content type='html'>제목이 좀 이상한데 어쨌건 필요한 상황은 이렇다.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bencode 사용중&lt;/li&gt;&lt;li&gt;bencode 의 string 타입은 의미상 바이너리 타입을 의미한다.&lt;/li&gt;&lt;li&gt;그런데 파이썬2.6 의 문자열 타입은 string 하고 unicode&lt;/li&gt;&lt;li&gt;파이썬 bencode 구현은 string 만 받게 되어있다. 이게 사실 당연한거.&lt;/li&gt;&lt;li&gt;u"aaa" 등 유니코드를 bencode 하려면 추가 삽질이 필요하다.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;그래서 이렇게 하면 된다.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;utf-8 타입의 문자열 x 를 x.encode("utf-8") 를 이용해서 string 타입으로&lt;/li&gt;&lt;li&gt;다시 유니코드 타입으로 돌리려면 unicode(z, "utf-8") 로&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;음 시간이 없으니 그냥 코드로 대신&lt;br /&gt;&amp;nbsp; &amp;nbsp; s = u"나나나나"&lt;br /&gt;&amp;nbsp; &amp;nbsp; e = bencode(s.encode("utf-8"))&lt;br /&gt;&amp;nbsp; &amp;nbsp; d = bdecode(e)&lt;br /&gt;&amp;nbsp; &amp;nbsp; x = unicode(d, "utf-8")&lt;br /&gt;&amp;nbsp; &amp;nbsp; print s == x&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5570141460646098523?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5570141460646098523/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5570141460646098523' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5570141460646098523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5570141460646098523'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/09/python-%EC%97%90%EC%84%9C-%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C-%EC%8A%A4%ED%8A%B8%EB%A7%81%EC%9D%84-%EC%9D%BC%EB%B0%98-%EC%8A%A4%ED%8A%B8%EB%A7%81%EC%9C%BC%EB%A1%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0.html' title='python 에서 유니코드 스트링을 일반 스트링으로 바꾸기'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5006077407503992545</id><published>2009-08-31T22:37:00.000+09:00</published><updated>2010-12-22T13:02:12.010+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><title type='text'>Software Engineering Radio | The Podcast for Professional Software Developers</title><content type='html'>&lt;a target="_blank" href="http://www.se-radio.net/"&gt;http://www.se-radio.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;아아..&lt;br /&gt;영어...&lt;br /&gt;영어...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5006077407503992545?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5006077407503992545/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5006077407503992545' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5006077407503992545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5006077407503992545'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/software-engineering-radio-podcast-for.html' title='Software Engineering Radio | The Podcast for Professional Software Developers'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-3659013047768005978</id><published>2009-08-29T06:40:00.000+09:00</published><updated>2010-12-22T13:02:09.648+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>wxHaskell 로 쪼금 복잡한 코드</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/0/146/attach/XYubG0Hr2J.png" style="width:408px;height:383px;" alt=""  /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;간단한 프로토콜 테스터를 짜는중인데 생긴건 챗 클라이언트 혹은 메신저 같이 생긴놈이다.위쪽 넓은 텍스트컨트롤에서는 서버가 보내오는 입력을 눈에 편한 형태로 보여주고 아래쪽 작은 텍스트에딧에 내가 적절히 보낼 패킷을 입력할수있다.&lt;br /&gt;&lt;br /&gt;저 패킷 모양을 눈에 익숙하게 보여주기/입력하기 위해서 &lt;a target="_blank" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/language-python"&gt;language-python&lt;/a&gt; 패키지 까지 가져다 썼지만 뭐 이건 중요한게 아니고..( 파서를 직접 짜는것 보다 Python 파서를 재활용하는게 더 편했다. )&lt;br /&gt;&lt;br /&gt;어쨌건 위처럼 만들고 나니 반복되는 패킷입력을 매번 키보드로 하고 있는게 좀 한심해서 아래쪽에 버튼을 붙여야할 필요성도 생겼다. 그러니까 패킷1, 패킷2 ... 란 버튼들이 줄줄이 붙어있고 그걸 누르면 패킷이 바로 전송 되던가 아니면 입력창에 채워졌으면 편할거란 생각이 들었다.&lt;br /&gt;&lt;br /&gt;게다가 이 버튼들은 상황따라 바뀌기 때문에(테스트할 대상에 따라 자주쓰는 패킷이 달라질테니) 코드안에 박기는 뭐하고 바이너리밖에 설정파일로 뽑아야만 했다.(동적으로 바뀐다는건 아니고 그냥 실행시 결정된다는 의미로 적었다. 나중에 동적으로 버튼을 제어할 일도 생기겠지. 그땐 흠 &lt;a target="_blank" href="http://hackage.haskell.org/package/hslua"&gt;hslua&lt;/a&gt; 를 써볼까?)&lt;br /&gt;&lt;br /&gt;뭐 필요한 사항은 대강 정리가 됐고..&lt;br /&gt;이제 어떻게 했는지를 적자면&lt;br /&gt;&lt;br /&gt;먼저 설정파일은.. 흠 맘에 드는 라이브러리를 못찾아서 (기존 라이브러리는 너무 덩치크거나, 쓰기가 좀 어색하거나..) 그냥 내가 단순히 짜버렸다. haskell 입문서 보면 나오는 간단한 수준으로 짠거라 아주 일부만 여기 적어둔다&lt;br /&gt;&lt;p id="more-210-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '210-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-210-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-210-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;&lt;pre&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;type&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Config&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; [(&lt;span style="color: rgb(34, 139, 34);"&gt;String&lt;/span&gt;, &lt;span style="color: rgb(34, 139, 34);"&gt;String&lt;/span&gt;)]&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;readConfig&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;String&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Config&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;readConfig&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; map (split &lt;span style="color: rgb(188, 143, 143);"&gt;'='&lt;/span&gt;) &lt;span style="color: rgb(184, 134, 11);"&gt;.&lt;/span&gt; filter (&lt;span style="color: rgb(188, 143, 143);"&gt;'='&lt;/span&gt;&lt;span style="color: rgb(184, 134, 11);"&gt;`elem`&lt;/span&gt;) &lt;span style="color: rgb(184, 134, 11);"&gt;.&lt;/span&gt; lines'&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;readConfigFile&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;FilePath&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;IO&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Config&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;readConfigFile&lt;/span&gt; path &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; liftM readConfig &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; readFile path&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;이제 wx 쪽 코드를 만져야 하는데.. 흠.. 다소 삽질한 끝에 아래같은 모양의 함수를 만들었다.&lt;br /&gt;&lt;p id="more-210-1" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '210-1','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-210-1').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-210-1" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;makeButtonPanelFromConfigFile&lt;/span&gt; path parent input &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;  config  &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; readConfigFile path&lt;br /&gt;  bp      &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; panel parent &lt;span style="color: rgb(34, 139, 34);"&gt;[]&lt;/span&gt;&lt;br /&gt;  buttons &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; forM config (&lt;span style="color: rgb(184, 134, 11);"&gt;\&lt;/span&gt;(k,v) &lt;span style="color: rgb(184, 134, 11);"&gt;-&amp;gt;&lt;/span&gt; button bp [text       &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; k,&lt;br /&gt;                                               on command &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; set input [text &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; v]])&lt;br /&gt;  set bp [layout &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; row 3 (map widget buttons)]&lt;br /&gt;  return bp&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;패널을 만들어서 패널에 버튼을 적절히 박아주고 패널을 리턴하는 함수. 흠. 저 프라퍼티가 어떻게 구현된건지 함 찾아봐야 겠네. 정말 묘하구먼.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;음 이건 지금 코드를 정리해서 위의 내용을 담은 최소 실행 코드. 나중에 이걸 볼때 실행되는 코드가 없으면 난감하겠지.. 소켓쪽이나 등등 많이 덜어냈기 때문에 딱히 어디 쓸수있는 코드는 아니다.&lt;br /&gt;&lt;p id="more-210-2" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '210-2','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-210-2').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-210-2" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;    &lt;pre&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Graphics.UI.WX&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Network.Socket&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Control.Monad&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;System.IO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; start gui&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;makeButtonPanelFromConfig&lt;/span&gt; config parent input &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;  bp      &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; panel parent &lt;span style="color: rgb(34, 139, 34);"&gt;[]&lt;/span&gt;&lt;br /&gt;  buttons &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; forM config (&lt;span style="color: rgb(184, 134, 11);"&gt;\&lt;/span&gt;(k,v) &lt;span style="color: rgb(184, 134, 11);"&gt;-&amp;gt;&lt;/span&gt; button bp [text       &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; k,&lt;br /&gt;                                               on command &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; set input [text &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; v]])&lt;br /&gt;  set bp [layout &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; row 3 (map widget buttons)]&lt;br /&gt;  return bp&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;config&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; [(&lt;span style="color: rgb(188, 143, 143);"&gt;"헤헤"&lt;/span&gt;, &lt;span style="color: rgb(188, 143, 143);"&gt;"헤헤가 눌렸어"&lt;/span&gt;),&lt;br /&gt;          (&lt;span style="color: rgb(188, 143, 143);"&gt;"히히"&lt;/span&gt;, &lt;span style="color: rgb(188, 143, 143);"&gt;"히히가 눌렸어"&lt;/span&gt;),&lt;br /&gt;          (&lt;span style="color: rgb(188, 143, 143);"&gt;"멍멍"&lt;/span&gt;, &lt;span style="color: rgb(188, 143, 143);"&gt;"멍멍멍멍"&lt;/span&gt;)]&lt;br /&gt;         &lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;gui&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;  f      &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; frame [text &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;"저수준 프로토콜 테스터를 짜기위한 첫걸음"&lt;/span&gt;]&lt;br /&gt;  output &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; textCtrl f &lt;span style="color: rgb(34, 139, 34);"&gt;[]&lt;/span&gt;&lt;br /&gt;  input  &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; entry f &lt;span style="color: rgb(34, 139, 34);"&gt;[]&lt;/span&gt;&lt;br /&gt;  bp     &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; makeButtonPanelFromConfig config f input&lt;br /&gt;  set input [on command &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; appendText output &lt;span style="color: rgb(184, 134, 11);"&gt;=&amp;lt;&amp;lt;&lt;/span&gt; get input text]&lt;br /&gt;  set f [layout &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; fill &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; column 5  [fill &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; minsize (sz 400 300) &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; widget output,&lt;br /&gt;                                     hfill &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; widget input,&lt;br /&gt;                                     hfill &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; widget bp]]&lt;br /&gt;  focusOn input  &lt;/pre&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-3659013047768005978?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/3659013047768005978/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=3659013047768005978' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3659013047768005978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/3659013047768005978'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/wxhaskell-%EB%A1%9C-%EC%AA%BC%EA%B8%88-%EB%B3%B5%EC%9E%A1%ED%95%9C-%EC%BD%94%EB%93%9C.html' title='wxHaskell 로 쪼금 복잡한 코드'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7673401607944110484</id><published>2009-08-28T17:20:00.000+09:00</published><updated>2010-12-22T13:02:08.494+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='비누'/><category scheme='http://www.blogger.com/atom/ns#' term='소독제'/><title type='text'>손소독제 Hand sanitizer</title><content type='html'>&lt;a target="_blank" href="http://en.wikipedia.org/wiki/Hand_sanitizer"&gt;http://en.wikipedia.org/wiki/Hand_sanitizer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;으흠. 비누보다 좋은것으로 묘사되어있네.&lt;br /&gt;사실일까?&lt;br /&gt;질러볼까?&lt;br /&gt;&lt;br /&gt;링크추가&lt;br /&gt;&lt;a target="_blank" href="http://synapse.koreamed.org/Synapse/Data/PDFData/0006JKAN/jkan-38-39.pdf"&gt;http://synapse.koreamed.org/Synapse/Data/PDFData/0006JKAN/jkan-38-39.pdf&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7673401607944110484?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7673401607944110484/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7673401607944110484' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7673401607944110484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7673401607944110484'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/%EC%86%90%EC%86%8C%EB%8F%85%EC%A0%9C-hand-sanitizer.html' title='손소독제 Hand sanitizer'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-5146766372329885703</id><published>2009-08-28T15:29:00.000+09:00</published><updated>2010-12-22T13:02:07.349+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='autohotkey'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>emacs 에서 autohotkey 를 이용해서 IDE 에 빌드명령 내리기(키입력 보내기)</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;IDE 하고 컴파일러가 한몸이라 커맨드라인으론 실행하지 못하는 경우도 있네&lt;br /&gt;그런경우를 위해서 emacs 에서 빌드할수 있도록 오토핫키를 이용한 간단한 스크립트를 만들어봤다. &lt;br /&gt;&lt;br /&gt;덧붙여 나는 빌드시에 태깅 업데이트되는것을 좋아 하니 먼저 태그 업데이트 후에 이 오토핫키 스크립트를 실행하는 배치파일로 작성했다. 이걸로 emacs 에서 F7 하나로 빌드가 가능해졌다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;먼저 build.cmd&lt;br /&gt;&lt;p id="more-208-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '208-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-208-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-208-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;pushd C:\src\blahblah\src&lt;br /&gt;global -u&lt;br /&gt;popd&lt;br /&gt;start build.ahk&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;그리고 build.ahk&lt;br /&gt;별거없다. 그냥 타이틀을 이용해서 창을 찾아서 F7 보내주는게 전부&lt;br /&gt;&lt;p id="more-208-1" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '208-1','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-208-1').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-208-1" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;IfWinExist FuckingIDE&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; WinActivate&lt;br /&gt;&amp;nbsp; &amp;nbsp; Send {F7}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; ;MsgBox, IDE 안떴어 병신아&lt;br /&gt;&amp;nbsp; &amp;nbsp; Run c:\opt\fucking\fuckingIDE.exe&lt;br /&gt;&amp;nbsp; &amp;nbsp; Sleep 1000&lt;br /&gt;&amp;nbsp; &amp;nbsp; WinActivate&lt;br /&gt;&amp;nbsp; &amp;nbsp; Send {F7}&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-5146766372329885703?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/5146766372329885703/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=5146766372329885703' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5146766372329885703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/5146766372329885703'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/emacs-%EC%97%90%EC%84%9C-autohotkey-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-ide-%EC%97%90-%EB%B9%8C%EB%93%9C%EB%AA%85%EB%A0%B9.html' title='emacs 에서 autohotkey 를 이용해서 IDE 에 빌드명령 내리기(키입력 보내기)'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2658726509779471670</id><published>2009-08-27T00:35:00.000+09:00</published><updated>2010-12-22T13:02:06.171+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>wxHaskell 로 처음 만들어본 샘플 프로그램</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;우선 스샷 박아두고&lt;br /&gt;&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;img src="http://ss.textcube.com/blog/0/146/attach/XNYn3hktuX.png" style="width:379px;height:193px;" alt=""  /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; 소스부터 적어두고&lt;br /&gt;&lt;p id="more-207-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '207-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-207-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-207-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;&lt;pre&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Graphics.UI.WX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; start hello&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;hello&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;  f &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; frame [text &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;"아래쪽에 뭐라 치고 입력 버튼 누르면 위쪽으로 출력"&lt;/span&gt;]&lt;br /&gt;  o &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; textCtrl f &lt;span style="color: rgb(34, 139, 34);"&gt;[]&lt;/span&gt;&lt;br /&gt;  i &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; entry f &lt;span style="color: rgb(34, 139, 34);"&gt;[]&lt;/span&gt;&lt;br /&gt;  b &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; button f [text &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;"입력"&lt;/span&gt;, on command &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; procInput i o]&lt;br /&gt;  set i [on command &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; procInput i o]&lt;br /&gt;  set f [layout &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; margin 5 &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; column 5 [ fill  &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; widget o,&lt;br /&gt;                                         hfill &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; row 5 [hfill &lt;span style="color: rgb(184, 134, 11);"&gt;$&lt;/span&gt; widget i, widget b]]]&lt;br /&gt;  &lt;span style="color: rgb(160, 32, 240);"&gt;where&lt;/span&gt; procInput i o &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;          userInput &lt;span style="color: rgb(184, 134, 11);"&gt;&amp;lt;-&lt;/span&gt; get i text&lt;br /&gt;          &lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt; null userInput&lt;br /&gt;             &lt;span style="color: rgb(160, 32, 240);"&gt;then&lt;/span&gt; return &lt;span style="color: rgb(34, 139, 34);"&gt;()&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: rgb(160, 32, 240);"&gt;else&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;do&lt;/span&gt;&lt;br /&gt;               set o [text &lt;span style="color: rgb(34, 139, 34);"&gt;:~&lt;/span&gt; (&lt;span style="color: rgb(184, 134, 11);"&gt;++&lt;/span&gt;userInput) &lt;span style="color: rgb(184, 134, 11);"&gt;.&lt;/span&gt; (&lt;span style="color: rgb(184, 134, 11);"&gt;++&lt;/span&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"\r\n"&lt;/span&gt;)]&lt;br /&gt;               set i [text &lt;span style="color: rgb(34, 139, 34);"&gt;:=&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;""&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;몇가지 느낀점들 &lt;br /&gt;&lt;ol&gt;&lt;li&gt;레이아웃 잡기 짱난다. 그래도 ghci 로 바로 실행 가능하니 다행. 정말 복잡한 레이아웃 잡으려면 wxWidget 쪽 문서까지 뒤져봐야 할것 같다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;문서 읽기 어렵다. 어떤 컨트롤이 어떤 프라퍼티를 가졌는지 보려면 먼저 그 컨토롤이 어떤 클래스에 속하는지 보고 그 클래스의 도움말을 찾아보자. 예를들어 위에서 사용자입력을 받을때 쓴 위젯 (entry 로 만든) 은 Commanding 클래스의 멤버라는걸 문서에서 확인하고 엔터를 칠때 뭔가 하고싶으면 command 를 지정하면 되겠구나.. 해서 코딩해본것.&lt;/li&gt;&lt;li&gt;property 라는 것 때문에 퓨어 펑셔널한 라이브러리 라곤 할수가 없을것 같네. OOP 에서 멤버를 바꾸듯이 쉽게 속성을 읽고 쓸수 있다. 뭐 이런 스타일이 더 익숙하지. 퓨어 펑셔널 GUI 가 가능하긴 한가?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;this 에 해당하는 뭐 그런걸 못찾아서 좀 어색하다. 예를들어 위 코드에서 i &amp;lt;- entry f [] 부분에서 command 속성을 지정하고 자기 자신을 포인팅 하는 방법을 몰라서(모른다기 보단 그런 방법은 없지).. 일단 i 를 만들고 아래쪽에서 set 으로 속성을 지정해줬다. 코드가 좀 복잡해지면 위젯들을 먼저 왕창 생성해두고 프라퍼티를 줄줄이 수정하는 식으로 짜야 할거 같군?&lt;/li&gt;&lt;li&gt;위젯에 위젯 올려서 그걸 쓰는 식으로 모듈화를 해야 하는데 예를들어 위 코드로 치면 i 와 b 를 묶어서 inputControls 뭐 이런식으로 묶어야 했는데 못했네. 이건 다음번에.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2658726509779471670?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2658726509779471670/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2658726509779471670' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2658726509779471670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2658726509779471670'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/wxhaskell-%EB%A1%9C-%EC%B2%98%EC%9D%8C-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B8-%EC%83%98%ED%94%8C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8.html' title='wxHaskell 로 처음 만들어본 샘플 프로그램'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-7219579972412069278</id><published>2009-08-26T22:51:00.000+09:00</published><updated>2010-12-22T13:02:04.876+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxwindow'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='wxwidget'/><category scheme='http://www.blogger.com/atom/ns#' term='wxhaskell'/><title type='text'>win32, haskell 에서 gui 는 wxHaskell 가 시작하기 좋군.</title><content type='html'>간단한 프로토콜 테스트 클라이언트를 haskell 로 짜보려고 준비중이다.&lt;br /&gt;원래 콘솔로 만들까 했는데 트래픽이 좀 되니 콘솔로는 부족해서 GUI 를 붙여볼 생각.&lt;br /&gt;&lt;br /&gt;처음에는 Gtk2Hs 를 고려해봤는데 이게 windows 에서는 설치가 매우 곤란했다. 지금 쓰는게 haskell platform 인데 이게 설치경로에 공백이 들어가있어서 gtk2hs 의 configure 가 에러를 뱉는다. haskell platform 만든애들이 이문제 때문에 설치경로를 바꿨다가 Gtk2Hs 쪽에서 해결하라고 다시 원복하는 바람에 이게 허공에 뜬 이슈가 됐다. Gtk2Hs 쪽 에도 이슈로 올라와있지만 조용하고...&lt;br /&gt;&lt;br /&gt;뭐 저문제 말고도 여러문제가 있길래 설치하다 결국 꽥&lt;br /&gt;&lt;br /&gt;반면에 wx haskell 쪽은 최신 버전에 맞는 바이너리 설치본을 제공해서(Gtk2Hs 쪽 바이너리 설치본은 ghc 구버전용) 설치가 깔끔하더라.&lt;br /&gt;&lt;br /&gt;아.. qt 쪽도 haskell 바인딩 라이브러리가 있는데 그쪽은 시도도 안해봤다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;펑셔널 GUI 라니 어떻게 짜야 하는지 상상도 안되네.&lt;br /&gt;어쨌건 wx window 를 배우기 위해서는 아래 링크들을 띄워두고 놀아보자.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://haskell.org/haskellwiki/WxHaskell"&gt;http://haskell.org/haskellwiki/WxHaskell&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://en.wikibooks.org/wiki/Haskell/GUI"&gt;http://en.wikibooks.org/wiki/Haskell/GUI&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://wxhaskell.sourceforge.net/doc/"&gt;http://wxhaskell.sourceforge.net/doc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;추가.&lt;br /&gt;으흠.. &lt;a target="_blank" href="http://haskell.org/haskellwiki/WxHaskell/FAQ"&gt;FAQ&lt;/a&gt; 에 의하면 멀티쓰레드지원이 아직 안된다는 말이 있네.. 헐..&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-7219579972412069278?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/7219579972412069278/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=7219579972412069278' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7219579972412069278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/7219579972412069278'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/win32-haskell-%EC%97%90%EC%84%9C-gui-%EB%8A%94-wxhaskell-%EA%B0%80-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0.html' title='win32, haskell 에서 gui 는 wxHaskell 가 시작하기 좋군.'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-2556511949505591540</id><published>2009-08-25T02:03:00.000+09:00</published><updated>2010-12-22T13:02:03.656+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iostream'/><category scheme='http://www.blogger.com/atom/ns#' term='prompt'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++ 에서 표준입출력을 이용한 간단한 프롬프트 입출력 코드</title><content type='html'>&lt;script src='http://ss.textcube.com/service/blog/script/blogger.js' type='text/javascript'&gt;&lt;/script&gt;예전에 &lt;a target="_blank" href="http://yoonkn.textcube.com/136"&gt;asio 통해서 tcp 위에서 콘솔 다루는 코드&lt;/a&gt;를 적은적이 있었는데&lt;br /&gt;이번엔 표준입출력쪽에서 이런기능이 필요해서 따로 만들어두고 일단 여기 적어둔다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;console.hpp&lt;br /&gt;&lt;p id="more-205-0" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '205-0','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-205-0').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-205-0" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;    &lt;pre&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#if&lt;/span&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;n&lt;/span&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;def&lt;/span&gt; CONSOLE_HPP&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#define&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;CONSOLE_HPP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;operator() 를 부르면 계속 루프를 돌면서 표준출력으로 prompt 를 찍고&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;표준입력으로 받은 문자열을 command_line_handler 에 넘겨 리턴된 값을&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;찍어준다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;template&lt;/span&gt; &amp;lt;&lt;span style="color: rgb(160, 32, 240);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;T&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;class&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;console&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;console&lt;/span&gt;(&lt;span style="color: rgb(34, 139, 34);"&gt;T&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;command_line_handler&lt;/span&gt;, &lt;span style="color: rgb(160, 32, 240);"&gt;const&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;* &lt;span style="color: rgb(184, 134, 11);"&gt;prompt&lt;/span&gt;)&lt;br /&gt;            : command_line_handler_(command_line_handler),&lt;br /&gt;              prompt_(prompt)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;operator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;()&lt;/span&gt;()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(160, 32, 240);"&gt;while&lt;/span&gt;(1)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::cout &amp;lt;&amp;lt; prompt_;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;line&lt;/span&gt;[2048];&lt;br /&gt;            &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::cin.getline(line, &lt;span style="color: rgb(160, 32, 240);"&gt;sizeof&lt;/span&gt;(line));&lt;br /&gt;            &lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;(*line == &lt;span style="color: rgb(188, 143, 143);"&gt;'\0'&lt;/span&gt;) &lt;span style="color: rgb(160, 32, 240);"&gt;continue&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::cout &amp;lt;&amp;lt; command_line_handler_(line) &amp;lt;&amp;lt; &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::endl;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;T&lt;/span&gt;                  &lt;span style="color: rgb(184, 134, 11);"&gt;command_line_handler_&lt;/span&gt;;&lt;br /&gt;    &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;string&lt;/span&gt;        &lt;span style="color: rgb(184, 134, 11);"&gt;prompt_&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;이건 console 에 넘길수있는 커맨드라인 핸들러 예제 복사생성이&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;가능하고 ostream 에 &amp;lt;&amp;lt; 로 넘길수있는 타입을 리턴하는 operator() 만&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;가지고있으면 된다. 어떤 상태를 들고있게 하려면 아래처럼 생성자를&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;// &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;활용하자.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;struct&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;prefixed_echo&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;string&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;prefix_&lt;/span&gt;;&lt;br /&gt;        &lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;prefixed_echo&lt;/span&gt;(&lt;span style="color: rgb(160, 32, 240);"&gt;const&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;* &lt;span style="color: rgb(184, 134, 11);"&gt;prefix&lt;/span&gt;) : prefix_(prefix)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: rgb(95, 158, 160);"&gt;std&lt;/span&gt;::&lt;span style="color: rgb(34, 139, 34);"&gt;string&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;operator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;()&lt;/span&gt;(&lt;span style="color: rgb(160, 32, 240);"&gt;const&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;* &lt;span style="color: rgb(184, 134, 11);"&gt;cmd&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt; prefix_ + cmd;&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#endi&lt;/span&gt;&lt;/pre&gt;  &lt;/div&gt;&lt;br /&gt;이건 예제&lt;br /&gt;&lt;p id="more-205-1" class="moreless_fold" style="color: #000000; padding: 0 0 0 10px;"&gt;&lt;span style="cursor: pointer;" onclick="if (window.TC$PRIV_toggleMoreLessBlogger != undefined) {TC$PRIV_toggleMoreLessBlogger(this, '205-1','펼쳐두기..','접어두기..'); return false;} else {document.getElementById('content-205-1').style.display='';}"&gt;      펼쳐두기..&lt;/span&gt;&lt;/p&gt;  &lt;div id="content-205-1" class="moreless_content" style="display: none; border: 1px dashed #cccccc; background-color: #f3f3f3; margin: 0 10px padding: 5px;"&gt;    &lt;pre&gt;&lt;span style="color: rgb(218, 112, 214);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(188, 143, 143);"&gt;"console.hpp"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(34, 139, 34);"&gt;console&lt;/span&gt;&amp;lt;prefixed_echo&amp;gt; &lt;span style="color: rgb(184, 134, 11);"&gt;c&lt;/span&gt;(prefixed_echo(&lt;span style="color: rgb(188, 143, 143);"&gt;"echo: "&lt;/span&gt;), &lt;span style="color: rgb(188, 143, 143);"&gt;"# "&lt;/span&gt;);&lt;br /&gt;    c();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-2556511949505591540?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/2556511949505591540/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=2556511949505591540' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2556511949505591540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/2556511949505591540'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/c-%EC%97%90%EC%84%9C-%ED%91%9C%EC%A4%80%EC%9E%85%EC%B6%9C%EB%A0%A5%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%BD%94%EB%93%9C.html' title='C++ 에서 표준입출력을 이용한 간단한 프롬프트 입출력 코드'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4787189274939091009.post-6309898993000550977</id><published>2009-08-21T16:32:00.000+09:00</published><updated>2010-12-22T13:02:01.363+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RecordWildCards'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>haskell 확장 RecordWildCards</title><content type='html'>&lt;a target="_blank" href="http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#disambiguate-fields"&gt;메뉴얼&lt;/a&gt; 참고&lt;br /&gt;NamedFieldPuns 확장하고 같이 쓰면 타이핑 줄이는데 도움이 많이 되겠네 &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;쌩기초 문법만 알고 있는 상태에서 haskell 코드 구경하다 이런 문법을 만나면 정말 난감하다. lisp 이면 매크로를 따라갈수라도 있지. haskell 의 경우 좀 덩치큰 소스는 확장을 여러개 해서 LANGUAGE 프라그마가 여러개 나오는데 해당 소스의 신기한 문법이 도대체 어디서 나온건지 알수가 없다...&lt;br /&gt;&lt;br /&gt;뭐 천천히 구경을 계속해보자.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;{-&lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# LANGUAGE RecordWildCards #-}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;많은 필드를 가진 레코드가 있을때&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;data&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;C&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;C&lt;/span&gt; {&lt;br /&gt;      a &lt;span style="color: rgb(184, 134, 11);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Int&lt;/span&gt;,&lt;br /&gt;      b &lt;span style="color: rgb(184, 134, 11);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Int&lt;/span&gt;,&lt;br /&gt;      c &lt;span style="color: rgb(184, 134, 11);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Int&lt;/span&gt;,&lt;br /&gt;      d &lt;span style="color: rgb(184, 134, 11);"&gt;::&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;Int&lt;/span&gt;&lt;br /&gt;      } &lt;span style="color: rgb(160, 32, 240);"&gt;deriving&lt;/span&gt; (&lt;span style="color: rgb(34, 139, 34);"&gt;Show&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;원래대로라면 미칠듯한 타이핑을 해야한다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;f&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;C&lt;/span&gt;{a&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;a, b&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;b, c&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;c, d&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;d} &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; a&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;b&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;c&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;d&lt;br /&gt;       &lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;.. 으로 모든 필드를 읽어올수있다.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;g&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;C&lt;/span&gt;{&lt;span style="color: rgb(184, 134, 11);"&gt;..&lt;/span&gt;} &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; a&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;b&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;c&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;d&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;일부만 패턴을 주는것도 가능&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;h&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;C&lt;/span&gt;{a&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;1,&lt;span style="color: rgb(184, 134, 11);"&gt;..&lt;/span&gt;} &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; b&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;c&lt;span style="color: rgb(184, 134, 11);"&gt;+&lt;/span&gt;d&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;-- &lt;/span&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;헐 이런짓도 가능.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;i&lt;/span&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(34, 139, 34);"&gt;C&lt;/span&gt; {a&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;1,&lt;span style="color: rgb(184, 134, 11);"&gt;..&lt;/span&gt;}&lt;br /&gt;    &lt;span style="color: rgb(160, 32, 240);"&gt;where&lt;/span&gt; b&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;2&lt;br /&gt;          c&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;3&lt;br /&gt;          d&lt;span style="color: rgb(184, 134, 11);"&gt;=&lt;/span&gt;4&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4787189274939091009-6309898993000550977?l=yoonkn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoonkn.blogspot.com/feeds/6309898993000550977/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4787189274939091009&amp;postID=6309898993000550977' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6309898993000550977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4787189274939091009/posts/default/6309898993000550977'/><link rel='alternate' type='text/html' href='http://yoonkn.blogspot.com/2009/08/haskell-%ED%99%95%EC%9E%A5-recordwildcards.html' title='haskell 확장 RecordWildCards'/><author><name>yoonkn</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_C_gIkoXY2Qw/TRGrw7_KpeI/AAAAAAAAAAc/oKDX_A9yKt0/S220/osaka.png'/></author><thr:total>0</thr:total></entry></feed>
