<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>ohyecloudy programming notesohyecloudy programming notes</title>
	
	<link>http://ohyecloudy.com/pnotes</link>
	<description />
	<lastBuildDate>Mon, 17 Jun 2013 02:41:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/opnote" /><feedburner:info uri="opnote" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>[리뷰] Are We There Yet? - Rich Hickey - OO는 시간 개념 없네.</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/wczphJ6CvSo/1807</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1807#comments</comments>
		<pubDate>Sun, 16 Jun 2013 23:00:14 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[프로그래밍 일반]]></category>
		<category><![CDATA[infoQ]]></category>
		<category><![CDATA[object oriented]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[rich hickey]]></category>
		<category><![CDATA[객체지향]]></category>
		<category><![CDATA[리치 히키]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1807</guid>
		<description><![CDATA[객체지향(Object Oriented) 자체가 가진 복잡성의 원인은 뭘까? 그 원인을 찾아보고 해결할 수 있는 다른 모델을 제시한다. 발표자는 리치 히키(Rich Hickey). Clojure를 만든 사람이다. 명확하게 정의하지 않아 괴롭히는 개념이 하나 있다. 바로 시간. 객체 지향(Object Oriented)에는 시간이란 개념이 없다. 이 발표에서 가장 인상적이었다. 이 개념에 대한 설명이 주제이기도 하고. 진짜 없을까? 아예 없는 걸까? 그건 아니다. 명확한 개념 [...]<div class='yarpp-related-rss yarpp-related-none'>

No related posts.
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><img alt="" src="https://lh4.googleusercontent.com/-quICiSoyBbo/UWpvzVmYabI/AAAAAAAARFQ/Nhqu72xK60c/s640/image.png" width="640" height="477" /></p>
<p>객체지향(Object Oriented) 자체가 가진 <strong>복잡성의 원인</strong>은 뭘까? 그 원인을 찾아보고 해결할 수 있는 다른 모델을 제시한다. 발표자는 <a href="https://twitter.com/richhickey" target="_blank">리치 히키(Rich Hickey)</a>. <a href="http://clojure.org/" target="_blank">Clojure</a>를 만든 사람이다.</p>
<p>명확하게 정의하지 않아 괴롭히는 개념이 하나 있다. 바로 시간. <strong>객체 지향(Object Oriented)에는 시간이란 개념이 없다.</strong> 이 발표에서 가장 인상적이었다. 이 개념에 대한 설명이 주제이기도 하고.</p>
<p><span id="more-1807"></span></p>
<p>진짜 없을까? 아예 없는 걸까? 그건 아니다. 명확한 개념 정의를 안 했을 뿐이다. 프로그램에서 공통으로 사용하는 <strong>보편적인 시간대</strong>가 있다. 바로 메인 스레드(thread)의 타임라인이다.</p>
<p><strong>병행 프로그래밍(concurrent programming)에서 이 시간대가 깨진다.</strong> 시간을 구성하는 건 인과 관계를 맺은 값들. 즉 변화가 시간대를 구성하는 재료가 된다. 스레드마다 변화를 각기 주도하기 때문에 보편적인 시간대가 깨지게 된다. 계산은 상관없으나 리소스에 접근하는 게 문제다. 시간대를 맞춰줘야 한다. 하나의 시간대로 복귀하는 건 어떻게 하나? 바로 <strong><a href="http://en.wikipedia.org/wiki/Lock_(computer_science)" target="_blank">Lock</a> 메커니즘. 시간대를 맞추는 데 사용</strong>한다.</p>
<p><strong>시각을 넓힐 수 있는 좋은 발표자료</strong>. clojure 관심 여부를 떠나서 추천하고 싶다. 약점을 알게 되면 이해가 더 깊어진다. 이 발표가 객체지향이 가진 약점을 내게 알려줬다. 명확히 정의하면 주변이 명료해지는 시간이란 개념도 배웠다.</p>
<p><code> </code></p>
<p>참고</p>
<ul>
<li><a href="http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey" target="_blank">Are We There Yet? - InfoQ</a></li>
<li><a href="http://wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf" target="_blank">Are We There Yet? - slide</a></li>
<li><a href="https://groups.google.com/forum/?fromgroups#!topic/lisp-korea/rrtpwHsWNkE" target="_blank">박상규님 코멘트 - Lisp를 좋아하는 사람들의 그룹</a></li>
<li><a href="http://www.flyingmachinestudios.com/programming/the-unofficial-guide-to-rich-hickeys-brain/" target="_blank">The Unofficial Guide to Rich Hickey's Brain - Flying Machine Studios</a></li>
</ul>
<p><code> </code></p>
<p>주요 슬라이드와 간단한 코멘트.</p>
<p style="text-align: center;"><img alt="" src="https://lh4.googleusercontent.com/-_WfvHd0A1hY/UWpvz2m6EHI/AAAAAAAAR9s/Xf6uii6Cy50/s640/image.jpg" width="640" height="475" /></p>
<p>OO에는 시간이란 개념이 존재하지 않는다.</p>
<p style="text-align: center;"><img alt="" src="https://lh5.googleusercontent.com/-R1v_qWEsCWw/UWpv0t0cssI/AAAAAAAAR94/VD3KJrNd964/s640/image.jpg" width="640" height="475" /></p>
<p>실제 entity와 identity를 결합했다.</p>
<p style="text-align: center;"><img alt="" src="https://lh4.googleusercontent.com/-BsfhnXawaJ4/UWpv0TJYJiI/AAAAAAAAR-E/yRfIxAP2oMQ/s640/image.jpg" width="640" height="470" /></p>
<p>미래는 과거로부터 만들어진다. 이런 과정을 process라고 부른다. 시간은 연속된 process 이벤트들로 만들어진다.</p>
<p style="text-align: center;"><img alt="" src="https://lh3.googleusercontent.com/-PTH-5wExeBU/UWpvyn5e22I/AAAAAAAARE4/rtr1jDNYcWY/s640/image.png" width="640" height="475" /></p>
<p>identity는 상상의 entity이다. 인과 관계를 맺은 값들의 시리즈를 결합해서 만든다.</p>
<p style="text-align: center;"><img alt="" src="https://lh3.googleusercontent.com/-GyA9tcLtIbs/UWpvzqYyMMI/AAAAAAAAR-o/QTb75gksAAo/s640/image.jpg" width="640" height="476" /></p>
<p style="text-align: center;"><img alt="" src="https://lh3.googleusercontent.com/-Ofs3eLn83eo/UWpvyiOOjAI/AAAAAAAAR-0/UsurW0lLzCE/s640/image.jpg" width="640" height="475" /></p>
<p><a href="http://en.wikipedia.org/wiki/Compare-and-swap" target="_blank">CAS (compare and swap)</a>와 agent를 시간 건축물 관점에서 본다.</p>
<p style="text-align: center;"><img alt="" src="https://lh3.googleusercontent.com/-zgD2l1K0P9o/UWpvzOC0iII/AAAAAAAAR_A/G47kudNJLs0/s640/image.jpg" width="640" height="476" /></p>
<p style="text-align: center;"><img alt="" src="https://lh5.googleusercontent.com/-4_BnwGDVDj8/UWpv1Plq_XI/AAAAAAAARGA/KCVSK_l3Fwk/s640/image.png" width="640" height="476" /></p>
<p>타임 라인이 여러 개 있을 때, <a href="http://en.wikipedia.org/wiki/Software_transactional_memory" target="_blank">STM (Software transactional memory)</a></p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss yarpp-related-none'>
<p>No related posts.</p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=wczphJ6CvSo:hKAbeq_kqjw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=wczphJ6CvSo:hKAbeq_kqjw:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=wczphJ6CvSo:hKAbeq_kqjw:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/wczphJ6CvSo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1807/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1807</feedburner:origLink></item>
		<item>
		<title>vim과 함께한 1년 - 절벽을 기어오른 보람이 있다. 만족한다.</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/rvFXcSWOGjI/1799</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1799#comments</comments>
		<pubDate>Wed, 12 Jun 2013 23:00:42 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[능률적인 프로그래머]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[Evil]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[vi]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[Vimium]]></category>
		<category><![CDATA[vimrc]]></category>
		<category><![CDATA[VsVim]]></category>
		<category><![CDATA[XVim]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1799</guid>
		<description><![CDATA[vim과 함께 한지 1년이 넘었다. vi 그래프에 나오는 절벽을 기어올랐다. 정보 많다. 당연하다. 장수 프로그램이니깐. 내부 도움말도 있고 인터넷 정보도 넘친다. 하지만 처음 시작하고 왠지 겁이 좀 날 때는 신호 대 잡음비가 가장 적은 책이 효과가 좋다. 그래서 고른 책이 손에 잡히는 Vim. 한 권 보고 나니 익숙해짐 가속도가 생겼다. 맥 에어. vim을 익히는 게 된 결정적인 [...]<div class='yarpp-related-rss'>

Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/997' rel='bookmark' title='손에 잡히는 Vim - 처음 시작하는데, 딱 좋은 책이다.'>손에 잡히는 Vim - 처음 시작하는데, 딱 좋은 책이다.</a></li>
</ol>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://unix.stackexchange.com/questions/986/vim-vs-emacs-and-no-this-is-not-a-flame-war"><img alt="" src="https://lh6.googleusercontent.com/-E6tdofuTEzQ/UbheYUJMBJI/AAAAAAAAR8g/usDS8JSM7Ws/s800/editor-learning-curve.png" width="600" height="400" /></a></p>
<p>vim과 함께 한지 1년이 넘었다. <strong>vi 그래프에 나오는 절벽을 기어올랐다.</strong></p>
<p>정보 많다. 당연하다. 장수 프로그램이니깐. 내부 도움말도 있고 인터넷 정보도 넘친다. 하지만 처음 시작하고 왠지 겁이 좀 날 때는 <strong>신호 대 잡음비가 가장 적은 책이 효과가 좋다. 그래서 고른 책이 <a href="http://ohyecloudy.com/pnotes/archives/997" target="_blank">손에 잡히는 Vim</a>.</strong> 한 권 보고 나니 익숙해짐 가속도가 생겼다.</p>
<p><span id="more-1799"></span></p>
<p><strong>맥 에어. vim을 익히는 게 된 결정적인 원인</strong>이다. 만약 집에서 데스크톱을 더 많이 사용했다면 vim 없이도 편하게 잘살고 있을 것이다. 더 콕 찍어 말하자면 <strong>화살표 키</strong>. 오른쪽 밑이라 손목이 꺾이고 크기도 참 소심해 불편하다. 나도 몰랐는데, 화살표 키를 많이 사용하더라. 누를 때마다 짜증이 나서 적어도 문서 편집을 할 때는 사용을 안 하는 방법을 찾게 됐다. 그때 걸린 게 vim.</p>
<p>지금은 vim 마니아가 됐다. 가장 큰 장벽이었던 입력 모드(insert mode)와 명령 모드(command mode) 분리. 이것 때문에 vim 적응이 어려웠는데, <strong>지금은 모드 분리는 vim을 이끈 최고의 결정이라 생각한다. 왜냐면 <a href="http://takac.github.io/2013/01/30/vim-grammar/" target="_blank">vim 문법(Vim Grammar)</a>을 만든 토양이기 때문이다.</strong> Ctrl, Alt와 같은 키를 섞어서 입력하게 할 수 있겠지만 3d5w와 같은 걸 매번 같이 누르면서 입력한다 생각하면 끔찍하다. 편집을 위한 문법. vim을 사용하기 전까진 생각도 못해봤다. 익숙해지면 이것만큼 편한 것도 없다.</p>
<p>에디터는 버릴 수 있겠는데, <strong>vim 문법을 못 버리겠다. 이 개념에 익숙해지니 너무 편하다.</strong> 나만 이렇게 생각하는 게 아니다. vim 선배들 대부분이 이렇게 생각한다. 어떻게 알 수 있느냐면 vim 플러그인이 없는 환경을 찾아보기 힘들기 때문이다. 난 현재 visual studio에는 <a href="http://visualstudiogallery.msdn.microsoft.com/59ca71b3-a4a3-46ca-8fe1-0e90e3f79329" target="_blank">VsVim</a>, Xcode에는 <a href="https://github.com/JugglerShu/XVim" target="_blank">XVim</a>, chrome에는 <a href="https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=en" target="_blank">Vimium</a>을 사용 중이다. 아 그리고 clojure 때문에 조금씩 쓰고 있는 Emacs에는 <a href="http://www.emacswiki.org/emacs/Evil" target="_blank">Evil</a>을 사용하고 있다.</p>
<p><a href="https://github.com/ohyecloudy/dotfiles/blob/master/vim/vimrc" target="_blank">vim 설정 파일을 github 저장소</a>에 관리한다. 목적은 뻔하지. 어떤 곳에서든 같은 설정을 사용하려고 만들었다. <a href="https://github.com/" target="_blank">github</a>를 사용 안 해봤다면 vimrc를 관리하면서 경험해보는 것도 괜찮다.</p>
<p>멀티 플랫폼을 지원하는 괜찮은 에디터가 많다. 그래서 다른 사람에게 추천하긴 망설여진다. 하지만 난 배우길 잘했단 생각이 든다. OS를 바꿔도 에디터 만큼은 겁나지 않고 과거보다 문서 편집 효율도 높아졌다. 최근에 <a href="https://github.com/andstudy/forge/wiki" target="_blank">아꿈사 스터디 위키</a>를 정리했는데, 아마 vim이 아니었으면 더 오래 고통스럽게 작업을 했을 것이다. vim에 만족한다.</p>
<p><code> </code></p>
<p>도움이 되는 자료들.</p>
<ul>
<li><a href="http://vimcasts.org/" target="_blank">vimcasts</a> - 엄청나게 잘 다루는 아저씨가 주제를 하나씩 설명한다. 재미있게 배울 수 있다.</li>
<li><a href="http://superuser.com/questions/tagged/vim" target="_blank">SuperUser - StackExchange #vim</a> - 최근 질문을 RSS로 구독 중. 답변에서도 배우는 기능이 많다.</li>
</ul>
<p>:wq</p>
<p>&nbsp;</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/997' rel='bookmark' title='손에 잡히는 Vim - 처음 시작하는데, 딱 좋은 책이다.'>손에 잡히는 Vim - 처음 시작하는데, 딱 좋은 책이다.</a></li>
</ol></p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=rvFXcSWOGjI:ZbqNnBJFlsg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=rvFXcSWOGjI:ZbqNnBJFlsg:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=rvFXcSWOGjI:ZbqNnBJFlsg:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/rvFXcSWOGjI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1799/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1799</feedburner:origLink></item>
		<item>
		<title>[발표자료] 페리 수열 (Farey Sequence) - 바보 셈(freshman sum)을 한 원소가 다음에 등장하는 재미있는 수열</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/K7a5n-eV0To/1785</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1785#comments</comments>
		<pubDate>Sat, 08 Jun 2013 05:21:21 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[발표자료]]></category>
		<category><![CDATA[수학]]></category>
		<category><![CDATA[euler's phi function]]></category>
		<category><![CDATA[Euler's totient function]]></category>
		<category><![CDATA[farey sequence]]></category>
		<category><![CDATA[freshman sum]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[mediant]]></category>
		<category><![CDATA[project euler]]></category>
		<category><![CDATA[slide]]></category>
		<category><![CDATA[slideshare]]></category>
		<category><![CDATA[바보 셈]]></category>
		<category><![CDATA[오일러 피 함수]]></category>
		<category><![CDATA[페리수열]]></category>
		<category><![CDATA[프로젝트오일러]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1785</guid>
		<description><![CDATA[페리 수열(Farey sequence) from Jongbin Oh 프로젝트 오일러(Project Euler) 문제를 풀다가 알게 됐다. 바보 셈(freshman sum)을 한 원소가 다음에 등장하는 재미있는 수열. 페리 수열 길이를 바로 구할 때, 사용하는 Euler's totient function. 증명을 공부하다 보니 Chinese Remainder Theorem (중국인의 나머지 정리)를 알아야 해. 이걸 또 증명하다보니 Extended Euclidean algorithm (확장된 유클리드 호제법)을 공부해야 한다. 휴 더 깊어졌으면 위험할 [...]<div class='yarpp-related-rss'>

Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/373' rel='bookmark' title='[발표자료] 오차가 적은 일정 세우기 - 프로그래머 입장'>[발표자료] 오차가 적은 일정 세우기 - 프로그래머 입장</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/1704' rel='bookmark' title='부호가 다른 두 수를 모듈로 연산(modulo operation)할 때, 결과 값 부호는?'>부호가 다른 두 수를 모듈로 연산(modulo operation)할 때, 결과 값 부호는?</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/1098' rel='bookmark' title='[발표자료|windows via c/c++] 4장 프로세스'>[발표자료|windows via c/c++] 4장 프로세스</a></li>
</ol>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><iframe style="border: 1px solid #CCC; border-width: 1px 1px 0; margin-bottom: 5px;" src="http://www.slideshare.net/slideshow/embed_code/22642424?rel=0" height="486" width="597" allowfullscreen="" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br />
<a title="페리 수열(Farey sequence)" href="http://www.slideshare.net/ohyecloudy/farey-sequence" target="_blank">페리 수열(Farey sequence)</a> from <a href="http://www.slideshare.net/ohyecloudy" target="_blank">Jongbin Oh</a></p>
<p><a href="http://projecteuler.net/" target="_blank">프로젝트 오일러(Project Euler)</a> 문제를 풀다가 알게 됐다. <strong>바보 셈(freshman sum)</strong>을 한 원소가 다음에 등장하는 재미있는 수열.</p>
<p>페리 수열 길이를 바로 구할 때, 사용하는 <a href="http://en.wikipedia.org/wiki/Euler%27s_totient_function" target="_blank">Euler's totient function</a>. 증명을 공부하다 보니 <a href="http://en.wikipedia.org/wiki/Chinese_remainder_theorem" target="_blank">Chinese Remainder Theorem (중국인의 나머지 정리)</a>를 알아야 해. 이걸 또 증명하다보니 <a href="http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm" target="_blank">Extended Euclidean algorithm (확장된 유클리드 호제법)</a>을 공부해야 한다. <strong>휴 더 깊어졌으면 위험할 뻔했어.</strong> 이해하느라 꽤 시간을 썼다. 하나씩 블로그에 올릴 예정.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/373' rel='bookmark' title='[발표자료] 오차가 적은 일정 세우기 - 프로그래머 입장'>[발표자료] 오차가 적은 일정 세우기 - 프로그래머 입장</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/1704' rel='bookmark' title='부호가 다른 두 수를 모듈로 연산(modulo operation)할 때, 결과 값 부호는?'>부호가 다른 두 수를 모듈로 연산(modulo operation)할 때, 결과 값 부호는?</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/1098' rel='bookmark' title='[발표자료|windows via c/c++] 4장 프로세스'>[발표자료|windows via c/c++] 4장 프로세스</a></li>
</ol></p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=K7a5n-eV0To:0RpcVvkGbKA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=K7a5n-eV0To:0RpcVvkGbKA:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=K7a5n-eV0To:0RpcVvkGbKA:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/K7a5n-eV0To" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1785/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1785</feedburner:origLink></item>
		<item>
		<title>부호가 다른 두 수를 모듈로 연산(modulo operation)할 때, 결과 값 부호는?</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/drD-eOxduPY/1704</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1704#comments</comments>
		<pubDate>Thu, 23 May 2013 23:00:47 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[수학]]></category>
		<category><![CDATA[floored division]]></category>
		<category><![CDATA[gcd]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[modulo]]></category>
		<category><![CDATA[modulus]]></category>
		<category><![CDATA[truncated division]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1704</guid>
		<description><![CDATA[모듈로 연산, modulo(modulus) operation? 나머지를 구하는 연산이다. 즉, 일 때, 이 된다.   퀴즈 제대로 구현한 걸까? n이 양수일 때는 문제가 없어 보인다. 1,3,5,... 다 1이 나오니깐. 그럼 n이 음수면 어떻게 될까? 즉, 는 -1일까? 1일까? C++11에선 -1이다. 피제수(dividend) 부호를 따라간다. C+11에서 표준으로 정해졌기 때문에 C++98에서는 컴파일러 마음이다. 난 VS2008에서 테스트했는데, -1이 나오더라. 그래서 저 구현은 [...]<div class='yarpp-related-rss yarpp-related-none'>

No related posts.
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a title="thirty two. by sylvia kay., on Flickr" href="http://www.flickr.com/photos/misspointypants/5408900248/"><img alt="thirty two." src="http://farm6.staticflickr.com/5298/5408900248_c47e554c9e_z.jpg" width="640" height="480" /></a></p>
<h2>모듈로 연산, modulo(modulus) operation?</h2>
<p><strong>나머지를 구하는 연산</strong>이다. 즉,  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_d0345a4c95f9c3abf1f19511cf7f9eed.gif' style='vertical-align: middle; border: none; ' class='tex' alt="a = n \times q + r" /></span><script type='math/tex'>a = n \times q + r</script>  일 때,  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_22b2a0811b16a95c7ec07ada1a239e71.gif' style='vertical-align: middle; border: none; padding-bottom:1px;' class='tex' alt="a \bmod n = r" /></span><script type='math/tex'>a \bmod n = r</script> 이 된다.</p>
<p><code> </code></p>
<h2>퀴즈</h2>
<pre class="brush: cpp; title: ; notranslate">
bool is_odd(int n) {
    return n % 2 == 1;
}
</pre>
<p><strong>제대로 구현한 걸까?</strong></p>
<p><span id="more-1704"></span></p>
<p>n이 양수일 때는 문제가 없어 보인다. 1,3,5,... 다 1이 나오니깐. 그럼 <strong>n이 음수면 어떻게 될까?</strong> 즉,  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_4b02556a0a65c8d92764da4fddabec7a.gif' style='vertical-align: middle; border: none; ' class='tex' alt="-3\bmod2" /></span><script type='math/tex'>-3\bmod2</script> 는 -1일까? 1일까?</p>
<p><strong>C++11에선 -1</strong>이다. <strong>피제수(dividend) 부호를 따라간다.</strong> C+11에서 표준으로 정해졌기 때문에 C++98에서는 컴파일러 마음이다. 난 VS2008에서 테스트했는데, -1이 나오더라.</p>
<p>그래서 저 구현은 잘못됐다. n이 -1, -3, ... 일 때, 모듈로 연산 값은 -1이 되고 false를 리턴한다.</p>
<pre class="brush: cpp; title: ; notranslate">
bool is_odd(int n) {
    return n % 2 != 0;
}
</pre>
<p>모듈로 연산 값 부호가 n에 따라 결정되므로 n 부호를 보고 분기를 타서 결과를 계산하거나 <strong>0과 비교</strong>하면 된다.<code><br />
</code></p>
<p><code> </code></p>
<h2>truncated division, floored division</h2>
<p> <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_d0345a4c95f9c3abf1f19511cf7f9eed.gif' style='vertical-align: middle; border: none; ' class='tex' alt="a = n \times q + r" /></span><script type='math/tex'>a = n \times q + r</script> 에서  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_7694f4a66316e53c8cdd9d9954bd611d.gif' style='vertical-align: middle; border: none; padding-bottom:1px;' class='tex' alt="q" /></span><script type='math/tex'>q</script> 를 <strong>어떻게 구하느냐에 따라 부호가 피제수 혹은 제수(divisor)를 따라가게 된다.</strong></p>
<p><strong>truncated division</strong>은  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_87fba8e6f207205ad5b29659697b9eeb.gif' style='vertical-align: middle; border: none; ' class='tex' alt="q = trunc(a / n)" /></span><script type='math/tex'>q = trunc(a / n)</script> 로 구한다. 즉, 버린다.  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_0e8bfa5c44fb416696091f5e8834da6b.gif' style='vertical-align: middle; border: none; ' class='tex' alt="q=trunc(-3/2)=-1" /></span><script type='math/tex'>q=trunc(-3/2)=-1</script> 이 되고 계산하면  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_eb464f38011c391f1c2456a0c69911f0.gif' style='vertical-align: middle; border: none; padding-bottom:1px;' class='tex' alt="r = -1" /></span><script type='math/tex'>r = -1</script> 이 된다. 음수일 때, 소수점 이하를 버려서 나머지가 없는 해(solution)보다 큰 정수가 몫(quotient)이 된다. 그래서 나머지는 음수가 된다. 결국, 모듈로 연산 값 <strong>부호는 피제수를 따라간다.</strong></p>
<p><strong>floored division</strong>은  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_6c7e9bed3a15ffac94c8a7cbb0f96257.gif' style='vertical-align: middle; border: none; ' class='tex' alt="q = \left\lfloor {a \over n} \right\rfloor" /></span><script type='math/tex'>q = \left\lfloor {a \over n} \right\rfloor</script> 로 구한다. 버림과 다르게 내림이다.  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_86476c5b091398b05e6bfe74b52f7cf5.gif' style='vertical-align: middle; border: none; ' class='tex' alt="q=\left\lfloor {-3 \over 2} \right\rfloor = -2" /></span><script type='math/tex'>q=\left\lfloor {-3 \over 2} \right\rfloor = -2</script> 가 되고 계산하면  <span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_448e1a0554e7a44653db21090441fea3.gif' style='vertical-align: middle; border: none; padding-bottom:1px;' class='tex' alt="r = 1" /></span><script type='math/tex'>r = 1</script> 이 된다. truncated division과 다르게 해(solution)보다 더 작은 정수가 몫이 된다. 그래서 나머지는 양수. 결국, <strong>부호는 제수를 따라간다. </strong><a href="http://wolfr.am/10RoD2M" target="_blank">참고로 Wolfram Alpha에서 이 방법을 사용</a>.</p>
<p>이 두 방법 외에 나머지를 0 또는 양수로 만드는 Euclidean definition도 있다.</p>
<p><code> </code></p>
<h2>mod 정의를 봐야 한다.</h2>
<p><p style='text-align:center;'><span class='MathJax_Preview'><img src='http://ohyecloudy.com/pnotes/wp-content/plugins/latex/cache/tex_d1fee959bea71060a2464f7812f7fd9f.gif' style='vertical-align: middle; border: none;' class='tex' alt="\begin{array}{lcl} \gcd(a,0) = a\\ \gcd(a,b) = \gcd(b, a \,\mathrm{mod}\, b) \\ where\, a\mathrm{mod}\, b = a - b \left\lfloor {a \over b} \right\rfloor\end{array}" /></span><script type='math/tex;  mode=display'>\begin{array}{lcl} \gcd(a,0) = a\\ \gcd(a,b) = \gcd(b, a \,\mathrm{mod}\, b) \\ where\, a\mathrm{mod}\, b = a - b \left\lfloor {a \over b} \right\rfloor\end{array}</script></p></p>
<p><a href="http://en.wikipedia.org/wiki/Greatest_common_divisor" target="_blank">유클리드 호제법(Euclid's algorithm)</a>이다. <strong> floored division을 쓴다고 정의</strong>했다.</p>
<pre class="brush: clojure; title: ; notranslate">
; clojure
(defn gcd [a b]
  (if (zero? a)
    b
    (recur (mod b a) a)))
</pre>
<p>그래 mod. 별 생각 없이 구현했다. 하지만 음수가 들어가니 나오는 gcd 값에 멘붕. 찾아보니 mod도 있고 rem도 있네. 그래 mod는 모듈로 연산. rem은 나머지를 구하는 연산. 엥? 둘이 갖지 않나? 뭐가 다른 거지? 아~ 두 가지 구현을 다 했고 그걸 구분하려고 이렇게 이름을 지었구나. <strong>mod는 피제수 부호를 따라가고 rem은 제수 부호를 따라간다.</strong> gcd를 구할 땐, floored division을 사용해야 하므로 rem을 사용해야 한다.</p>
<p>참고: <a href="http://en.wikipedia.org/wiki/Modulo_operation" target="_blank">Modulo operation - wikipedia</a></p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss yarpp-related-none'>
<p>No related posts.</p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=drD-eOxduPY:XEIBPb6cQx4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=drD-eOxduPY:XEIBPb6cQx4:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=drD-eOxduPY:XEIBPb6cQx4:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/drD-eOxduPY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1704/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1704</feedburner:origLink></item>
		<item>
		<title>4clojure - 빈칸을 채우며 클로저(clojure)를 배우자.</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/uWhYR7bt_5w/1690</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1690#comments</comments>
		<pubDate>Thu, 02 May 2013 23:00:28 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[프로그래밍 일반]]></category>
		<category><![CDATA[4clojure]]></category>
		<category><![CDATA[koan]]></category>
		<category><![CDATA[클로저]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1690</guid>
		<description><![CDATA[새로운 언어를 배우고 있다. 바로 클로저(clojure). 2년 정도 꾸준히 공부해 볼 생각이다. 일 년에 새로운 언어 하나는 아무리 생각해봐도 무리. 그렇게 말한 아자씨들은 지금 실천하고 있을까? 그래서 대충 보고 묵혀놨던 프로그래밍 클로저를 최근에 다 봤다. 물론 최대한 코드를 많이 짜면서 책을 읽었다. github에 hello-clojure 프로젝트를 만들고 책에 나온 내용에 대한 unit test 코드를 짰다. 이제 조그만 장난감 [...]<div class='yarpp-related-rss'>

Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1658' rel='bookmark' title='프로그래밍 클로저 (Programming Clojure) - 훌륭한 입문서. 1판이라 아쉽지만'>프로그래밍 클로저 (Programming Clojure) - 훌륭한 입문서. 1판이라 아쉽지만</a></li>
</ol>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a title="Flickr에서 eigenhombre님의 4clojure problems" href="http://www.flickr.com/photos/eigenhombre/7327822864/"><img alt="4clojure problems" src="http://farm9.staticflickr.com/8144/7327822864_95f5330ce2_z.jpg" width="640" height="480" /></a></p>
<p><strong>새로운 언어를 배우고 있다. 바로 </strong><strong>클로저(clojure).</strong> 2년 정도 꾸준히 공부해 볼 생각이다. 일 년에 새로운 언어 하나는 아무리 생각해봐도 무리. 그렇게 말한 아자씨들은 지금 실천하고 있을까?</p>
<p>그래서 대충 보고 묵혀놨던 <a href="http://ohyecloudy.com/pnotes/archives/1658" target="_blank">프로그래밍 클로저</a>를 최근에 다 봤다. 물론 최대한 코드를 많이 짜면서 책을 읽었다. <a href="https://github.com/ohyecloudy/hello-clojure" target="_blank">github에 hello-clojure</a> 프로젝트를 만들고 책에 나온 내용에 대한 unit test 코드를 짰다. <strong>이제 조그만 장난감 프로젝트를 시작할 차례다. 현업에서 사용 안 하는 언어기 때문에 필수.</strong></p>
<p>장난감 프로젝트를 하기 전 예열이 필요했다. 아직 클로저가 많이 낯설기도 하고. <del>심시티를 하려고 점심시간을 비워놨건만 서버가 개판이라서</del> 점심시간에 할 놀이도 필요했고. 그래. <strong>이럴 땐, <a href="http://projecteuler.net/" target="_blank">프로젝트 오일러</a> 문제가 딱이지. 그러던 차에 <a href="http://www.4clojure.com/" target="_blank">4clojure</a> 사이트를 알게 됐다.</strong></p>
<p><span id="more-1690"></span></p>
<p style="text-align: center;"><a href="https://picasaweb.google.com/lh/photo/8U4tk9uVSV7-qX5JXOHIrBjKjL_S5HiV0-13YIuHFbQ?feat=embedwebsite"><img alt="" src="https://lh5.googleusercontent.com/-igl64r6yRFs/UYJj33Vr94I/AAAAAAAARWU/ruJ2l2SDgJs/s800/image.png" width="617" height="337" /></a></p>
<p><strong>빈칸 채우기 문제.</strong> 테스트를 통과하는 함수를 짜면 된다. 짜서 제출하고 위에서부터 녹색불이 하나씩 켜지는 걸 보는 재미가 쏠쏠하다.</p>
<p>core-functions, destructuring, higher-order-functions, seqs, ... 꼭 알아야 하는 주제들로 구성했다. 여기에 알고리즘 문제까지. 난 특히 특정 함수 안 쓰고 풀어야 하는 문제가 재미있었다.</p>
<p style="text-align: center;"><a href="http://www.4clojure.com/user/ohyecloudy"><img alt="" src="https://lh4.googleusercontent.com/-NRTFvGTfKoI/UYJcwdDU_SI/AAAAAAAARV4/_HWAnOePC1o/s800/image.png" width="311" height="157" /></a></p>
<p>총 153문제. 현재 Easy까지 풀었다.</p>
<p>똑같은 문제를 다른 사람은 어떻게 풀었을까? <strong>문제 풀이도 공부되지만 잘하는 사람 풀이를 보는 것도 정말 공부가 많이 된다.</strong> <a href="http://www.4clojure.com/user/maximental" target="_blank">maximental</a> 아저씨 추천. 이 사람 해답을 보며 배우는 재미가 쏠쏠했다. <a href="http://www.slideshare.net/SangKyuPark1/ss-18350615" target="_blank">클로져 소개 강의</a>를 한 <a href="http://www.4clojure.com/user/psk810" target="_blank">psk810</a>님도 추천. 153문제 다 푼 사람이 별로 없는데, 이 분도 다 풀었다.</p>
<pre class="brush: clojure; title: ; notranslate">
;; ohyecloudy solution to Trees into tables
;; https://4clojure.com/problem/146

(fn 1
  (reduce
    merge
    (map (fn [k v]
           (reduce
             merge
             {}
             (map #(assoc {} (vector k %1) %2) (keys v) (vals v))))
         (keys c)
         (vals c))))

; maximental solution:
; 아아. for 내부에서도 중복 바인딩이 가능하다.

#(into {} (for [[i j] % [k l] j] [[i k] l]))
</pre>
<p>위키에 풀 때마다 다른 해답을 보며 정리를 하는데, <strong>내가 젤 어렵게 풀고 있어.</strong></p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1658' rel='bookmark' title='프로그래밍 클로저 (Programming Clojure) - 훌륭한 입문서. 1판이라 아쉽지만'>프로그래밍 클로저 (Programming Clojure) - 훌륭한 입문서. 1판이라 아쉽지만</a></li>
</ol></p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=uWhYR7bt_5w:YtSFfMcSiok:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=uWhYR7bt_5w:YtSFfMcSiok:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=uWhYR7bt_5w:YtSFfMcSiok:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/uWhYR7bt_5w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1690/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1690</feedburner:origLink></item>
		<item>
		<title>내부 툴은 소프트웨어 회사의 DNA이다 - Building an army of robots 발표자료에서</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/GNJ11nBCC0s/1664</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1664#comments</comments>
		<pubDate>Tue, 09 Apr 2013 23:00:57 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[로그]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[DNA]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[internal-tool]]></category>
		<category><![CDATA[내부툴]]></category>
		<category><![CDATA[문화]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1664</guid>
		<description><![CDATA[Building an army of robots by Kyle Neath. github 내부 툴을 소개한 발표자료. github 아저씨들은 발표자료 참 잘 만든다. hubot, janky, play, ... 공개한 내부 툴도 많은데, 다 이유가 있었다. 바로 내부 툴은 문화이고 더 나아가 DNA라는 철학을 가지고 있기 때문. 매니저가 없고 재택근무가 많은 근무환경 때문이겠지. 처음에 이렇게 생각했다. 그런데 좀 더 생각해보니 아니다. 투자하는 내부 툴 기능이 [...]<div class='yarpp-related-rss'>

Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1114' rel='bookmark' title='[리뷰] How GitHub Uses GitHub to Build GitHub - github 개발 방식 엿보기.'>[리뷰] How GitHub Uses GitHub to Build GitHub - github 개발 방식 엿보기.</a></li>
</ol>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><img alt="" src="https://lh3.googleusercontent.com/-SdP4kVZLqHc/UWFL98puNSI/AAAAAAAARBk/JuJxNM5mZ_g/s640/internal.png" width="640" height="358" /></p>
<p><a href="https://speakerdeck.com/kneath/building-an-army-of-robots" target="_blank">Building an army of robots by Kyle Neath</a>. <strong><a href="https://github.com/" target="_blank">github</a> 내부 툴을 소개</strong>한 발표자료. github 아저씨들은 발표자료 참 잘 만든다.</p>
<p><a href="https://github.com/github/hubot" target="_blank">hubot</a>, <a href="https://github.com/github/janky" target="_blank">janky</a>, <a href="https://github.com/play/play" target="_blank">play</a>, ... 공개한 내부 툴도 많은데, 다 이유가 있었다. 바로 <strong>내부 툴은 문화이고 더 나아가 DNA라는 철학</strong>을 가지고 있기 때문.</p>
<p><span id="more-1664"></span></p>
<p>매니저가 없고 재택근무가 많은 근무환경 때문이겠지. 처음에 이렇게 생각했다. 그런데 좀 더 생각해보니 아니다. <strong>투자하는 내부 툴 기능이 달라질 뿐이지 내부 툴에 대한 투자 자체에 영향을 주는 건 아니다.</strong> 그래 근무 환경이 아니라 문화이고 DNA라는 철학이 내부 툴에 대한 투자로 이어진다.</p>
<p>그래서 그런지 이런 발표자료나 소스코드로 내부 툴 정보도 열심히 알린다. <strong>문화이기 때문에 그리고 그런 문화는 좋은 인재를 빨아당기기 때문</strong>이다.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1114' rel='bookmark' title='[리뷰] How GitHub Uses GitHub to Build GitHub - github 개발 방식 엿보기.'>[리뷰] How GitHub Uses GitHub to Build GitHub - github 개발 방식 엿보기.</a></li>
</ol></p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=GNJ11nBCC0s:3RtOZtJIQbY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=GNJ11nBCC0s:3RtOZtJIQbY:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=GNJ11nBCC0s:3RtOZtJIQbY:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/GNJ11nBCC0s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1664/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1664</feedburner:origLink></item>
		<item>
		<title>프로그래밍 클로저 (Programming Clojure) - 훌륭한 입문서. 1판이라 아쉽지만</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/DdOdmKwi-Es/1658</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1658#comments</comments>
		<pubDate>Sun, 07 Apr 2013 23:00:19 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[clojure]]></category>
		<category><![CDATA[책]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[리스프]]></category>
		<category><![CDATA[클로저]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1658</guid>
		<description><![CDATA[컴퓨터 프로그램의 구조와 해석(SICP), 해커와 화가 책을 통해 Lisp에 대한 빠심을 계속 충전해왔다. 이제 그 막연한 빠심을 실체화해야 할 시기. 표현력이 강한 언어를 배우고 싶었다. 그래서 찍어 놨던 언어가 바로 Lisp. 제대로 공부하고 싶었으나 실용성 때문에 망설였다. 분명 언어와 그 철학을 배우면서 얻는 것도 많겠지만, 무엇보다 필요할 때 적극 활용할 수 있는 언어를 원했다. 그러던 중에 발견한 클로저. [...]<div class='yarpp-related-rss'>

Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1226' rel='bookmark' title='Game Programming Gems 7 - 대충 보기'>Game Programming Gems 7 - 대충 보기</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/439' rel='bookmark' title='해커와 화가 - 좋은 프로그래밍 언어는 유화 물감과 비슷하다'>해커와 화가 - 좋은 프로그래밍 언어는 유화 물감과 비슷하다</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/727' rel='bookmark' title='The Art of Computer Programming 1 (TAOCP 1)'>The Art of Computer Programming 1 (TAOCP 1)</a></li>
</ol>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: right;"><img alt="" src="https://lh5.googleusercontent.com/-RVaq4xkUmVQ/UVwayRzX1sI/AAAAAAAAQ_0/LHNNbAelZtU/s288/clojure.jpg" width="229" height="288" /></p>
<p><a href="http://ohyecloudy.com/pnotes/archives/55" target="_blank">컴퓨터 프로그램의 구조와 해석(SICP)</a>, <a href="http://ohyecloudy.com/pnotes/archives/439" target="_blank">해커와 화가</a> 책을 통해 <strong>Lisp에 대한 빠심을 계속 충전</strong>해왔다. 이제 그 막연한 빠심을 실체화해야 할 시기.</p>
<p>표현력이 강한 언어를 배우고 싶었다. 그래서 찍어 놨던 언어가 바로 Lisp. 제대로 공부하고 싶었으나 실용성 때문에 망설였다. 분명 언어와 그 철학을 배우면서 얻는 것도 많겠지만, 무엇보다 필요할 때 적극 활용할 수 있는 언어를 원했다. 그러던 중에 발견한 클로저.<strong> JVM 기반 언어다. <a href="http://en.wikipedia.org/wiki/Dialect_(computing)" target="_blank">Lisp dialect</a>다. 이쯤 되면 망설일 이유가 없다.</strong></p>
<p><span id="more-1658"></span></p>
<p><strong>클로저 입문서로 제격</strong>이다. 자바 호출, 데이터를 시퀀스로 다루기, 함수형 프로그래밍, 병행성, 매크로, 다중 메서드 등 알아야 할 요소를 쉽게 설명한다. 다만 2010년에 나온 책이라 clojure 1.0 기준으로 설명한다. <a href="http://pragprog.com/book/shcloj2/programming-clojure" target="_blank">번역판이 없는 2판은 1.3 기준</a>. 현재 버전은 1.5이다. 그래서 추가된 피처에 대한 공부(protocols, datatypes, ..)는 따로 해야 한다.</p>
<p><a href="https://github.com/ohyecloudy/hello-clojure" target="_blank">github에 hello-clojure 저장소</a>를 만들고 테스트 코드를 만들면서 공부했다. 책을 보며 공부하는데 이 방법이 가장 효과적인 것 같다.</p>
<p>PS: 요즘은 <a href="http://www.4clojure.com/" target="_blank">4Clojure</a> 문제를 풀고 있고 1.5까지 따라잡은 뒤, 개인 장난감 프로젝트를 시작할 예정이다.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1226' rel='bookmark' title='Game Programming Gems 7 - 대충 보기'>Game Programming Gems 7 - 대충 보기</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/439' rel='bookmark' title='해커와 화가 - 좋은 프로그래밍 언어는 유화 물감과 비슷하다'>해커와 화가 - 좋은 프로그래밍 언어는 유화 물감과 비슷하다</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/727' rel='bookmark' title='The Art of Computer Programming 1 (TAOCP 1)'>The Art of Computer Programming 1 (TAOCP 1)</a></li>
</ol></p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=DdOdmKwi-Es:0DU9tx2-oec:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=DdOdmKwi-Es:0DU9tx2-oec:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=DdOdmKwi-Es:0DU9tx2-oec:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/DdOdmKwi-Es" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1658/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1658</feedburner:origLink></item>
		<item>
		<title>iPad 프로그래밍 스터디 회고</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/CISdY9qfF3o/1653</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1653#comments</comments>
		<pubDate>Wed, 03 Apr 2013 23:00:21 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[로그]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[모임]]></category>
		<category><![CDATA[스터디]]></category>
		<category><![CDATA[윙스터디]]></category>
		<category><![CDATA[제이알스터디]]></category>
		<category><![CDATA[토즈]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1653</guid>
		<description><![CDATA[4개월간 아이패드 스터디에 참여했다. 아꿈사가 아닌 다른 스터디 모임에. 다른 스터디는 어떻게 진행되나 궁금했기 때문이다. iOS 쪽 스터디 모임을 찾아보니 생각보다 없었다. 모두가 노트북을 들고 와서 실습 위주로 공부했다. 안 그래도 바랬던 방식인데, Xcode가 익숙하지 않았기 때문. 직접 타이핑하면서 공부하니 확실히 이해는 잘 됐다. 몰랐던 Xcode 기능도 많이 알게 됐고. 하지만 너무 오래 걸린다. 3주 정도 [...]<div class='yarpp-related-rss yarpp-related-none'>

No related posts.
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a title="Flickr에서 bradhardy님의 Study Group" href="http://www.flickr.com/photos/29278459@N06/2733261802/"><img alt="Study Group" src="http://farm4.staticflickr.com/3065/2733261802_0692fc3fce_z.jpg?zz=1" width="640" height="294" /></a></p>
<p><a href="http://cafe.naver.com/bruskim" target="_blank">4개월간 아이패드 스터디</a>에 참여했다. <a href="http://cafe.naver.com/architect1" target="_blank">아꿈사</a>가 아닌 다른 스터디 모임에. 다른 스터디는 어떻게 진행되나 궁금했기 때문이다. iOS 쪽 스터디 모임을 찾아보니 생각보다 없었다.</p>
<p><strong>모두가 노트북을 들고 와서 실습 위주로 공부</strong>했다. 안 그래도 바랬던 방식인데, Xcode가 익숙하지 않았기 때문. 직접 타이핑하면서 공부하니 확실히 이해는 잘 됐다. 몰랐던 Xcode 기능도 많이 알게 됐고. <strong>하지만 너무 오래 걸린다.</strong> 3주 정도 한 챕터만 한때도 있었다. 이렇게 너무 오래 걸리니깐 결국 문서로 코드를 전달하고 copy &amp; paste로 진행하게 된다.</p>
<p><span id="more-1653"></span></p>
<p><a href="https://github.com/ohyecloudy/ipad-programming-book-chap12" target="_blank">난 12장 발표.</a> 거의 마지막 발표였는데, <strong>코드를 직접 짜며 진행하는 스터디에선 버전 컨트롤 시스템을 활용하면 편할 것 같았다.</strong> Xcode에선 git을 지원해서 github에 만들었다. 그리고 챕터에서 설명하는 코드에만 집중할 수 있게 <a href="https://github.com/ohyecloudy/ipad-programming-book-chap12/commit/bd049ecec540fbd51a0660b7c9ad4e5576cec1c9" target="_blank">나머지를 구현하고 TODO 주석을 달고 커밋</a>. <a href="https://github.com/ohyecloudy/ipad-programming-book-chap12/commit/a827661d8a2ff5a2821e768c06e267cb8a587695" target="_blank">구현하고 DONE 주석으로 바꾼 뒤 커밋</a>. 이런 식으로 구성했다. 그리고 간편하게 진행하려고<strong> step0, step1, .. 식으로 브랜치</strong>를 만들었다. 각자 구현을 해보다가 어느 정도 시간이 지나면 구현된 브랜치를 checkout해서 확인해보면 되니깐. 그리고 <a href="https://github.com/ohyecloudy/ipad-programming-book-chap12/blob/master/README.md" target="_blank">대략적인 설명을 하는 문서</a>가 필요했는데, 여기엔 markdown을 사용했다. 챕터 내용이 간단해서 저장소를 구성하는데 시간이 별로 안 걸렸다.</p>
<p><a href="http://www.toz.co.kr/index.htm" target="_blank">토즈</a>만 가다가 이번에 처음으로 <a href="http://www.wingstudy.com/" target="_blank">윙스터디</a>, <a href="http://www.jrstudy.com/" target="_blank">제이알스터디</a>에 가봤다. 싼 장소에서 하고 남는 돈을 스터디가 끝난 뒤 먹는 <strong>점심 식사비에 보탠다</strong>. 장소에 더 돈을 쓰는 것보다 낫네.</p>
<p>처음 온 사람을 챙기는 게 서툴더라. 하긴 생각해보니 나도 처음 온 사람을 잘 못 챙겼던 것 같다. 이거 은근히 어려워.</p>
<p>&nbsp;</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss yarpp-related-none'>
<p>No related posts.</p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=CISdY9qfF3o:2Tc0Mw6Lh0E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=CISdY9qfF3o:2Tc0Mw6Lh0E:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=CISdY9qfF3o:2Tc0Mw6Lh0E:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/CISdY9qfF3o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1653/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1653</feedburner:origLink></item>
		<item>
		<title>[프로그래머.훌륭한습관] 어제 동료가 커밋한 코드 읽기</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/680w4TDDdxk/1629</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1629#comments</comments>
		<pubDate>Sun, 17 Feb 2013 23:00:38 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[훌륭한 습관]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[code reading]]></category>
		<category><![CDATA[great_habit]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1629</guid>
		<description><![CDATA[아침에 출근하면 가장 먼저 하는 일. 전날 커밋된 코드를 읽는다. 물론 읽는 건 내 코드가 아니라 동료가 커밋한 코드. 처음에는 코드를 읽을 때, 2~3시간을 썼다. 코드를 읽는 것도 중요하지만 이렇게 시간을 써버리면 곤란하다. 왜냐하면, 아직 내 역할은 코드 품질 유지보다는 생산 쪽이기 때문이다. 물론 모든 프로그래머는 둘 다 신경을 써야 한다. 하지만 역할이 한쪽으로 더 치우쳐 [...]<div class='yarpp-related-rss'>

Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1407' rel='bookmark' title='[프로그래머.훌륭한습관] 시작하며'>[프로그래머.훌륭한습관] 시작하며</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/1435' rel='bookmark' title='[프로그래머.훌륭한습관] 코드 commit(submit, check-in) 전에 diff'>[프로그래머.훌륭한습관] 코드 commit(submit, check-in) 전에 diff</a></li>
</ol>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a title="Flickr에서 steve caddy님의 computer_cat_08" href="http://www.flickr.com/photos/stevecaddy/474543000/"><img alt="computer_cat_08" src="http://farm1.staticflickr.com/223/474543000_672910df52_z.jpg?zz=1" width="640" height="480" /></a></p>
<p><strong>아침에 출근하면 가장 먼저 하는 일.</strong> 전날 커밋된 코드를 읽는다. 물론 읽는 건 내 코드가 아니라 동료가 커밋한 코드.</p>
<p>처음에는 코드를 읽을 때, 2~3시간을 썼다. 코드를 읽는 것도 중요하지만 이렇게 시간을 써버리면 곤란하다. 왜냐하면, 아직 내 역할은 코드 품질 유지보다는 생산 쪽이기 때문이다. 물론 모든 프로그래머는 둘 다 신경을 써야 한다. 하지만 역할이 한쪽으로 더 치우쳐 있기 마련이다. 현재 나는 생산 쪽에 더 치우쳐 있다. 그래서 원칙을 세웠다. <strong>길어야 40분. 초과하면 커밋 코멘트만 보거나 내 업무와 연관된 코드만 읽는다.</strong></p>
<p><span id="more-1629"></span></p>
<p>다른 사람이 짠 코드를 많이 읽어라. 참 많이 듣는 조언이다. 경력이 쌓이면 으레 이런 조언을 한다. 코드를 많이 읽는 프로그래머도 이런 조언을 하고 안 읽는 프로그래머도 이런 조언을 한다. 그래 왜 읽어야 하는지 설명을 안 해도 될 만큼 모두 중요성을 알고 있다. 자~ 이제 유명한 오픈 소스 프로젝트를 찾아보자. <strong>하지만 가까운 데도 금광이 있다. 바로 나와 같이 일하는 동료가 짠 코드.</strong> 코드를 읽는 능력도 향상되고 업무에도 바로 도움이 된다. 우선 동료 코드를 읽는 것부터 시작하자.</p>
<p><strong>이렇게 짜니깐 쉽게 읽을 수 있구나.</strong> 이런 문제를 나는 되게 어렵게 풀었는데, <strong>이렇게 우아하게 해결할 수 있구나.</strong> 이건 처음 보는 단어다. 사전으로 찾아보니 이런 뜻이 있네. <strong>이 단어 적절해 보인다.</strong> 등등을 나는 지난 1년간 동료 코드를 읽으면서 배웠다. 정말 읽기 힘든 코드가 있기도 한데, 자책을 안 해도 된다. 그 코드는 당사자도 1~2주 후면 읽는데 애를 먹을 것이기 때문에.</p>
<p>여기에 덧붙여 같이 일하는 <strong>동료 성향을 알 수도 있다.</strong> 빠르게 해결하고 반복하면서 품질을 높여가는 동료. 느리지만 견고하게 문제를 해결하는 동료. 속도 우선. 견고함 우선. 이후 막혔을 때, 성향을 파악하고 있으면 조언을 구하기도 좋다.</p>
<p>그리고 <strong>팀 퍼포먼스도 알 수 있다.</strong> 내가 읽을 수 없는 양이 커밋되는 게 맞는데, 읽을 만하다. 와! 내 실력이 좋아졌구나. 하지만 착각이다. 팀 퍼포먼스가 낮아질 때, 이런 현상을 겪는다.</p>
<blockquote class="twitter-tweet" width="550" lang="ko"><p>이제 아침에 안 하면 너무 찝찝하다. 1년 전부터 했는데, 이제 습관이 만들어진 것 같다. 프로그래머 습관으로 곧 블로그에 포스팅할 예정.</p>
<p>&mdash; 오종빈(Jongbin Oh) (@ohyecloudy) <a href="https://twitter.com/ohyecloudy/status/296438106498953216">2013년 1월 30일</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>아침에 코드를 읽는데, 쓸 시간이 부족했다. 그래서 바로 업무를 시작하려고 했는데, <strong>너무 찝찝하더라. 아~ 습관이 만들어졌구나.</strong> 2011년 말에 시작했으니 1년이 조금 넘었다.</p>
<p>이렇게 <strong>매일 보다 보면 왜 체크인 전에 diff를 떠야 하는지 알게 된다.</strong> <a title="[프로그래머.훌륭한습관] 코드 commit(submit, check-in) 전에 diff" href="http://ohyecloudy.com/pnotes/archives/1435" target="_blank">[프로그래머.훌륭한습관] 코드 commit(submit, check-in) 전에 diff</a> 에서 썼듯이 커밋 전에 diff를 떠보는 걸 강조하는 것도 코드를 읽는데, 너무 방해되기 때문이다.</p>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss'>
<p>Related posts:<ol>
<li><a href='http://ohyecloudy.com/pnotes/archives/1407' rel='bookmark' title='[프로그래머.훌륭한습관] 시작하며'>[프로그래머.훌륭한습관] 시작하며</a></li>
<li><a href='http://ohyecloudy.com/pnotes/archives/1435' rel='bookmark' title='[프로그래머.훌륭한습관] 코드 commit(submit, check-in) 전에 diff'>[프로그래머.훌륭한습관] 코드 commit(submit, check-in) 전에 diff</a></li>
</ol></p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=680w4TDDdxk:LhIKtk-Ilec:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=680w4TDDdxk:LhIKtk-Ilec:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=680w4TDDdxk:LhIKtk-Ilec:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/680w4TDDdxk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1629/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1629</feedburner:origLink></item>
		<item>
		<title>Insomniac의 LunaServer - disk 접근과 undo/redo를 책임지는 로컬 서버</title>
		<link>http://feedproxy.google.com/~r/opnote/~3/-qX2Y_3A-6I/1619</link>
		<comments>http://ohyecloudy.com/pnotes/archives/1619#comments</comments>
		<pubDate>Sun, 27 Jan 2013 23:00:54 +0000</pubDate>
		<dc:creator>ohyecloudy</dc:creator>
				<category><![CDATA[게임 개발]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[game tool]]></category>
		<category><![CDATA[insomniac]]></category>
		<category><![CDATA[redo]]></category>
		<category><![CDATA[undo]]></category>

		<guid isPermaLink="false">http://ohyecloudy.com/pnotes/?p=1619</guid>
		<description><![CDATA[disk 접근과 undo/redo를 책임지는 로컬 서버를 만든다. 이게 핵심 아이디어다. 왜 이런 생각을 못했을까? 장점이 많아 보인다. 이런 로컬 서버는 단순해서 안정적이다. 다른 툴에 비해 나이도 많은 것도 안정화에 도움을 주는 편. undo/redo 스택을 LunaServer에 저장해 다른 툴에서 발생하는 크래시로부터 적어도 데이터는 지킬 수 있다. 확실히 생산성에 도움을 주겠구나. 전담하는 만큼 LunaServer 결함이 치명적으로 작용하지만 얻을 [...]<div class='yarpp-related-rss yarpp-related-none'>

No related posts.
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><img alt="" src="https://lh5.googleusercontent.com/-O3I0SqgYQoA/T7CN98kxoWI/AAAAAAAAMJM/uVwunO8OQkY/s640/Pieket_Developing_Imperfect_Software_01.png" /></p>
<p><strong>disk 접근과 undo/redo를 책임지는 로컬 서버</strong>를 만든다. 이게 핵심 아이디어다. 왜 이런 생각을 못했을까? 장점이 많아 보인다.</p>
<p><span id="more-1619"></span></p>
<p>이런 로컬 서버는 단순해서 안정적이다. 다른 툴에 비해 나이도 많은 것도 안정화에 도움을 주는 편. <strong>undo/redo 스택을 LunaServer에 저장해 다른 툴에서 발생하는 크래시로부터 적어도 데이터는 지킬 수 있다.</strong> 확실히 생산성에 도움을 주겠구나.</p>
<p>전담하는 만큼 LunaServer 결함이 치명적으로 작용하지만 <strong>얻을 수 있는 장점이 더 많아 보인다. </strong></p>
<p>참고:</p>
<ul>
<li><a href="http://ohyecloudy.com/doku.php?id=public:conference:gdc_2012:programming#developing_imperfect_softwarehow_to_prepare_for_production_pipeline_failure" target="_blank">GDC2012 - Developing Imperfect Software: How to Prepare for Production Pipeline Failure</a></li>
<li><a href="http://www.itshouldjustworktm.com/?p=875" target="_blank">A Client/Server Tools Architecture - Ron Pieket</a><a href="http://ohyecloudy.com/doku.php?id=public:conference:gdc_2012:programming#developing_imperfect_softwarehow_to_prepare_for_production_pipeline_failure" target="_blank"><br />
</a></li>
</ul>
<div class="acc_license"><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /></a></div><!--<rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><Work rdf:about=""><license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></Work><License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"><requires rdf:resource="http://creativecommons.org/ns#Attribution" /><permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><permits rdf:resource="http://creativecommons.org/ns#Distribution" /><permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /><prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /><requires rdf:resource="http://creativecommons.org/ns#Notice" /></License></rdf:RDF>--><div class='yarpp-related-rss yarpp-related-none'>
<p>No related posts.</p>
<img src='http://yarpp.org/pixels/f1a693819f15643b3ee5806001fce957'/>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/opnote?a=-qX2Y_3A-6I:yIK-0tq1Ogc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/opnote?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/opnote?a=-qX2Y_3A-6I:yIK-0tq1Ogc:SnHDqse7sAQ"><img src="http://feeds.feedburner.com/~ff/opnote?i=-qX2Y_3A-6I:yIK-0tq1Ogc:SnHDqse7sAQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/opnote/~4/-qX2Y_3A-6I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://ohyecloudy.com/pnotes/archives/1619/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://ohyecloudy.com/pnotes/archives/1619</feedburner:origLink></item>
	</channel>
</rss>
