<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Dev.Nuri. [developer.world]</title>
		<link>http://devnuri.com/</link>
		<description>the developer&#039;s workspace</description>
		<language>ko</language>
		<pubDate>Mon, 21 Jul 2008 03:14:30 +0900</pubDate>
		<generator>Textcube 1.5.3.1 : Adamantine</generator>
		<image>
		<title>Dev.Nuri. [developer.world]</title>
		<url>http://devnuri.com/attach/1/1268399713.gif</url>
		<link>http://devnuri.com/</link>
		<width>180</width>
		<height>35</height>
		<description>the developer&#039;s workspace</description>
		</image>
		<item>
			<title>Google Interview</title>
			<link>http://devnuri.com/9</link>
			<description>아침에 갑자기 옆 자리의 Jian이 자기 오늘 Google Internship 인터뷰가 있다고 전화 좀 써도 되겠느냐고 한다. 상관없다고 했더니 나중에 보니 Speaker phone 해놓고 인터뷰를 진행해서 우연히 인터뷰 진행을 다 들었다. &lt;br /&gt;&lt;br /&gt;처음에 자기 누구라고 하고 어떤 질문부터 원하느냐고 물어봤던 거 같다. Jian이 레쥬메에 Logic이 강하다고 썼던지 Logic에 관련해서 물어볼까? 하자 Jian 약간 당황... 특별히 Logic 쪽이 아니라 일반적인 알고리즘에서 어쩌고저쩌고 궁색한 변명...(으로 들림 나한텐) 레쥬메를 쭉 훑으면서 간략히 몇 개 질문하더니 &lt;br /&gt;&lt;br /&gt;Google: Can you describe your work? 라고 본격적으로 인터뷰에 들어간다. &lt;br /&gt;Jian: 주절주절... Machine Learning... P2P &lt;br /&gt;나: (저 쉐이 나랑 수업들으면서 텀프로젝트 한 거 가지고 지금 박사 첫 주제로 하고 있는데. 문제는 제가 찾고 실제 ML 적용하는 거랑 코딩 핵심 부분은 거의 내가 하고 쩝. 같이 follow up 할래? 할 때 할 걸 그랬나? ㅋㅋ)&lt;br /&gt;&lt;br /&gt;대충 한 얘기를 듣고 Jian이 저번에 방문했던 googler 가 자기네 무슨 일이랑 비슷하다고 하면서 구글 뉴스에서 뭐랑 비슷하다고 부가 설명을 붙인다... &lt;br /&gt;나: (음.. 이런 거 괜찮네. 대화가 부드럽군)&lt;br /&gt;&lt;br /&gt;그러고는 바로 본격적인 알고리즘 질문에 들어간다.&lt;br /&gt;Google: How would you design an algorithm that reverses a double linked list? 그러면서 Please think out loud so that I can ... 하던데 간단하게 너의 사고 과정을 그대로 따라가 보고 싶다는 거다. &lt;br /&gt;Jian: reverse를 어떻게 정의할래?&lt;br /&gt;얘기를 하는 걸 들어보니 Jian이 흐름을 잘 잡은 것 같다. 그런데 얘기를 하며 발전해가는 과정이 굉장히 자연스럽다. 여러 가지 가정이나 문제에서 정의되지 않은 것들에 대한 얘기부터 시작해서 구체적인 알고리즘까지 발전. &lt;br /&gt;&lt;br /&gt;그러고는 각종 에러 케이스나 boundary conditaion, trivial case 등까지 많은 걸 고려한다.&lt;br /&gt;Google: Does it cover every possible case? One of the cases I tried to build on was this. It&#039;s truly an error case, but .... 하고는 만약 중간에 어떤 포인터가 어떤 엉뚱한 주소를 가리키고 있다면 어떤 일이 발생하고 그런 경우를 어떻게 처리할 것인가 하고 물어본다.&lt;br /&gt;Jian이 C++ RTTI 관련 이야기를 한다. 내 생각에 여러 라이브러리를 쓰면 pointer validity 테스트를 할 수 있는 매크로나 함수들이 보통 제공되는데 그런 거에 대한 언급이라든지 몇 가지가 더 언급됐으면 더 좋았을 듯한데 잘 얘기하고 끝내는 것 같다.&lt;br /&gt;&lt;br /&gt;Google: Do you have any question for me?&lt;br /&gt;Jian: 너 뭐하니?&lt;br /&gt;Google: 자세히는 얘기 못 하고 아주 개략적으로만 얘기해주께.....&lt;br /&gt;Jian Why most of your products are beta?&lt;br /&gt;나: (맞아.. 나도 항상 궁금했었는데)&lt;br /&gt;Google: They are not finished. They are not ready to scale up to the World.
For example. gmail can handle millions of users, but not billions of
users yet.&lt;br /&gt;
Jian: .....&lt;br /&gt;Google: I can&#039;t answer the question because HR won&#039;t let me. &lt;br /&gt;Jian: How do you evaluate our conversation?&lt;br /&gt;Google: I can&#039;t answer the question. The intern coordinator will contact you and give you details.&lt;br /&gt;&lt;br /&gt;전체 인터뷰는 한 45분 정도? 여러 가지 이슈들을 잘 풀어내어서 실제 인터뷰는 한 30분 내에 끝났던 거 같고 나머지는 (내가 보기에는) 그냥 잡담 -.-;; 이게 1차고 다른팀에서 2차로 인터뷰를 한 시간 후에 다시 했다.&lt;br /&gt;&lt;br /&gt;전에 아래와 같은 인터뷰 관련 동영상을 본 적 있는데 비슷한 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://channel9.msdn.com/ShowPost.aspx?PostID=18472&quot;  title=&quot;Zoe Goldring and Gretchen Ledgard - What is it like to interview at Microsoft?  &quot; target=&quot;_blank&quot;&gt;Zoe Goldring and Gretchen Ledgard - What is it like to interview at Microsoft?&lt;/a&gt;  (&lt;a href=&quot;http://wm.microsoft.com/ms/msnse/0408/23062/Recruiting/Zoe_Gretchen_Recruiting_Part1_MBR.wmv&quot;  title=&quot;Zoe Goldring and Gretchen Ledgard - What is it like to interview at Microsoft?  &quot;&gt;Video&lt;/a&gt;)&lt;br /&gt;&lt;a href=&quot;http://channel9.msdn.com/ShowPost.aspx?PostID=18718&quot;  title=&quot;Zoe Goldring and Gretchen Ledgard - Riding the Recruiting Shuttle&quot; target=&quot;_blank&quot;&gt;Zoe Goldring and Gretchen Ledgard - Riding the Recruiting Shuttle&lt;/a&gt; (&lt;a href=&quot;http://wm.microsoft.com/ms/msnse/0408/23062/Recruiting/Zoe_Gretchen_Recruiting_Part2_MBR.wmv&quot;  title=&quot;Zoe Goldring and Gretchen Ledgard - What is it like to interview at Microsoft?  &quot;&gt;Video&lt;/a&gt;)&lt;br /&gt;&lt;a href=&quot;http://channel9.msdn.com/ShowPost.aspx?PostID=19171&quot;  title=&quot;Gary Daniels and Evan Goldring - Mock whiteboard problem&quot; target=&quot;_blank&quot;&gt;Gary Daniels and Evan Goldring - Mock whiteboard problem&lt;/a&gt; (&lt;a href=&quot;http://wm.microsoft.com/ms/msnse/0408/23062/Recruiting/Zoe_Gretchen_Recruiting_Part3_MBR.wmv&quot;  title=&quot;Gary Daniels and Evan Goldring - Mock whiteboard problem&quot;&gt;Video&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>분석육분</category>
			<author>(호빵맨)</author>
			<guid>http://devnuri.com/9</guid>
			<comments>http://devnuri.com/9#entry9comment</comments>
			<pubDate>Fri, 25 Jan 2008 04:07:55 +0900</pubDate>
		</item>
		<item>
			<title>변수초기화</title>
			<link>http://devnuri.com/8</link>
			<description>&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;&lt;br /&gt;class A {&lt;br /&gt;...&lt;br /&gt;int max_length;&lt;br /&gt;...&lt;br /&gt;void build() {&lt;br /&gt;    ...&lt;br /&gt;    if (length&amp;gt;max_length) max_length=length;&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;void check();&lt;br /&gt;};&lt;br /&gt; &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;머리를 벽에 헤딩하고 싶다...&lt;br /&gt;&lt;br /&gt;중간 과정에서 어떤 자료 구조의 max_length가 나중에 필요해서 그 걸 만들 때 max_length를 구하게 하는 간단한 코드인데 나중에 check()에서 실제로 자료 구조 다시 돌면서 구한 max length와 죽어라도 안 맞는 것이다. 머냐...어디가 잘못됐지? 꽤 오랜 시간 헤메다 보니 크헐... max_length 가 초기화가 안돼서 생긴 문제였다. check 안에서 체크할 때는 지역 변수로 0으로 초기화하니 올바르게 계산되었고 max_length는 클래스 생성시 나 메쏘드 안에서 초기화를 안해줘서 엄청 큰 쓰레기 값이 들어가서 그 값이 계속 끝까지 남아 있었던 버그... 우후... 내가 죽어야지... 처음 클래스 만들 때 만든 멤버들은 모두 올바르게 초기화를 해줬으면서 중간에 max_length를 추가하면서 그냥 코딩했구나.. Java에서 멤버는 디폴트로 초기화가 0으로 되어서 무의식적으로 그냥 변수만 추가했다고 자위를 해본다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;멤버나 변수 꼭 초기화 합시다!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;초기화? 0으로만 하면 되겠지...하고 습관적으로 그렇게 하다가는 큰 코 다친다. &lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;&lt;br /&gt;int min_size = 0;&lt;br /&gt;...&lt;br /&gt;min_size = min(size, min_size);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;이렇게 초기화를 잘못해줘서 버그 만든 경험도 기억이 난다. 이렇게 구한 min_size값이 대부분 우연히 맞는 값일 경운 나중에 더 골때리게 발견될 것이다. 이거 의외로 만만히 볼 문제가 아니다.&lt;br /&gt;&lt;br /&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>버그양성소</category>
			<author>(호빵맨)</author>
			<guid>http://devnuri.com/8</guid>
			<comments>http://devnuri.com/8#entry8comment</comments>
			<pubDate>Wed, 23 Jan 2008 14:52:33 +0900</pubDate>
		</item>
		<item>
			<title>Map class</title>
			<link>http://devnuri.com/4</link>
			<description>어설픈 C++보다는 Java의 성능이 오히려 뛰어나 전에 놀랐던 기억에 이번 구현할 프로그램에서는 라이브러리 벤치마킹부터 하고 들어가기로 했다. 뭐 한두 시간 안에 해야 할 거니 너무 거창하게 할 순 없고 간단한 Map 클래스 성능 테스트만... 우연히 발견한 Google sparse map과 dense map 클래스, 그리고 STL map 클래스. 한 100,000개 정도의 정수 만 가지고 random build, random probing, 그리고 iteration 으로 대충 테스트 해보았다.&lt;br /&gt;&lt;br /&gt;Sparse Map: Insertion TM: 0.09 sec, Search TM: 0.11 sec, Iteration TM: 0 sec&lt;br /&gt;Dense&amp;nbsp; Map: Insertion TM: 0.03 sec, Search TM: 0.02 sec, Iteration TM: 0.02 sec&lt;br /&gt;STL &amp;nbsp;&amp;nbsp; &amp;nbsp; Map: Insertion TM: 0.06 sec, Search TM: 0.12 sec, Iteration TM: 0.03 sec&lt;br /&gt;전체 Map iostream으로 save: 0.49 sec&lt;br /&gt;전체 Map C fprintf로 save: 0.11 sec&lt;br /&gt;&lt;br /&gt;Sparse map은 매우 memory efficient 하여 한 엔트리당 1`2 bits&lt;br /&gt;Dense map은 빠른 대신 데이터 크기의 2~3배 오버헤드?&lt;br /&gt;&lt;br /&gt;google sparse hash distribution의 공식 documentation에 있는 내용과 크게 다르지 않다.&lt;br /&gt;&lt;PRE&gt;Average over 10000000 iterations&lt;br /&gt;&lt;br /&gt;SPARSE_HASH_MAP:&lt;br /&gt;map_grow                  665 ns&lt;br /&gt;map_predict/grow          303 ns&lt;br /&gt;map_replace               177 ns&lt;br /&gt;map_fetch                 117 ns&lt;br /&gt;map_remove                192 ns&lt;br /&gt;memory used in map_grow    84.3956 Mbytes&lt;br /&gt;&lt;br /&gt;DENSE_HASH_MAP:&lt;br /&gt;map_grow                   84 ns&lt;br /&gt;map_predict/grow           22 ns&lt;br /&gt;map_replace                18 ns&lt;br /&gt;map_fetch                  13 ns&lt;br /&gt;map_remove                 23 ns&lt;br /&gt;memory used in map_grow   256.0000 Mbytes&lt;br /&gt;&lt;br /&gt;STANDARD HASH_MAP:&lt;br /&gt;map_grow                  162 ns&lt;br /&gt;map_predict/grow          107 ns&lt;br /&gt;map_replace                44 ns&lt;br /&gt;map_fetch                  22 ns&lt;br /&gt;map_remove                124 ns&lt;br /&gt;memory used in map_grow   204.1643 Mbytes&lt;br /&gt;&lt;br /&gt;STANDARD MAP:&lt;br /&gt;map_grow                  297 ns&lt;br /&gt;map_predict/grow          282 ns&lt;br /&gt;map_replace               113 ns&lt;br /&gt;map_fetch                 113 ns&lt;br /&gt;map_remove                238 ns&lt;br /&gt;memory used in map_grow   236.8081 Mbytes&lt;SPAN style=&quot;FONT-FAMILY: Dotum,Verdana,AppleGothic,Sans-serif&quot;&gt;&lt;br /&gt;&lt;br /&gt;SGI STL implementaion의 메모리 usage가 dense hash map에 비해 &lt;br /&gt;크게 차이 없으므로 &lt;/SPAN&gt;전체적인 결과는 일단 dense hash map에 맞춰 구현하되 &lt;br /&gt;나중에 다른 구현을 지정할 수 있도록 해야겠다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>CPP</category>
			<category>benchmark</category>
			<category>cpp</category>
			<category>map structure</category>
			<author>(호빵맨)</author>
			<guid>http://devnuri.com/4</guid>
			<comments>http://devnuri.com/4#entry4comment</comments>
			<pubDate>Mon, 07 Jan 2008 07:18:50 +0900</pubDate>
		</item>
		<item>
			<title>Vim ? Emacs ? CDT?</title>
			<link>http://devnuri.com/3</link>
			<description>오랜만에 C++ 을 써야 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;될&lt;/span&gt;할 거 같아서 이번에 linux에서 좀 더 개발 환경을 잘 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;셋팅&lt;/span&gt;세팅해 볼까 하고 C++이랑 궁합이 잘 맞는 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;에디터&lt;/span&gt;편집기를 조사를 좀 해봤다. 상용이나 여러 플랫폼에서 이용 가능하지 않을 걸 제외하고 나니 대충 남는 게 Vim, &lt;span style=&quot;text-decoration: line-through;&quot;&gt;Emacs 랑&lt;/span&gt;Emacs랑 CDT? &lt;span style=&quot;text-decoration: line-through;&quot;&gt;셋팅&lt;/span&gt;세팅이 가벼운 걸로 하려고 보니 역시 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;Vim 인 듯&lt;/span&gt;Vim인 듯. &lt;span style=&quot;text-decoration: line-through;&quot;&gt;잠시 동안의&lt;/span&gt;잠깐의 복습을 통해 보니 역시 &lt;br /&gt;&lt;ul&gt;&lt;li&gt;마우스에 손을 델 필요가 없는 키보드 별천지의 그 맛&lt;/li&gt;&lt;li&gt;linux 환경과의 자연스러운 융화&lt;/li&gt;&lt;/ul&gt;는 Vi 계열을 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;따라 올&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;따라올&lt;/span&gt; 자가 없는 듯 하다듯하다. 처음엔 WISWYG 계열 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;에디터&lt;/span&gt;편집기를를 오래 쓰던 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;습관 대로&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;습관대로&lt;/span&gt; 커서나 마우스에 자동 손이 가더니 한두 시간 정도의 적응 과정을 거치고 나니 가끔 마우스로 가는 손이 그렇게 무겁게 느껴질 수가 없다. 창 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;전환 조차도&lt;/span&gt;전환조차도 큰 동작처럼 느껴지는 이 게으름의 맛(?)이란! 하지만 고급 기능을 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;몰라서 인 지&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;몰라서인 지&lt;/span&gt; 몇 가지 Eclipse에서 쓰던 기능들이 아쉽다. 뭐 auto completion 기능 같은 것도 내가 사랑하는 기능이기는 하지만 그래. 없어도 뭐. 정말 아쉬운 기능들은&lt;br /&gt;&lt;ul&gt;&lt;li&gt;refactoring 기능. 예를 들어 변수나 펑션 이름을 바꾼다고 할 때 단순히 텍스트 레벨의 치환이 아닌 context를 인식한 replace 기능은 정말 아쉽다.&lt;/li&gt;&lt;li&gt;call hierarchy. 이런 것도 Vim 에서도 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;찾아 보면&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;찾아보면&lt;/span&gt;있을 &lt;span style=&quot;text-decoration: line-through;&quot;&gt;듯 한데&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;듯한데&lt;/span&gt;..&lt;/li&gt;&lt;/ul&gt;특히 copy &amp;amp; paste, replace 등의 실수로 엄청난 버그들을 숨겨 놓는 경우가 많은 나의 경우엔 Eclipse 리팩토링 기능의 지원은 Vim 의 초간편함을 상쇄하고도 남음이다. 결국 실제 코딩에 들어가서 얼마 안되서 Eclipse C++ plugin인 CDT update... Vim 에도 이런 고급 기능이 지원되는 plugin 어디 없나? 있을 듯도 한데... 쩝.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;쓰고나서 맞춤법 검사기를 돌려 봤더니 허걱... NARAINFOTECH 맞춤법 검사기 짱! 우리말 맞춤법 검사 인터넷에서 이렇게 잘 되는 거 처음 봤다. 기념으로 지저분하지만 틀린 맞춤법 표시하는 이 센스 ㅋ&lt;br /&gt;&lt;br /&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>CPP</category>
			<author>(호빵맨)</author>
			<guid>http://devnuri.com/3</guid>
			<comments>http://devnuri.com/3#entry3comment</comments>
			<pubDate>Fri, 04 Jan 2008 14:47:24 +0900</pubDate>
		</item>
		<item>
			<title>Function Pointer 예제</title>
			<link>http://devnuri.com/2</link>
			<description>&lt;P&gt;function pointer tutorial의 첫 단락을 보고 간단한 예제를 만들어 보았습니다.&lt;/P&gt;
&lt;P&gt;클래스 A는 fpShout라는 function pointer를 member variable로 가지고 있습니다.&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;class A{&lt;br /&gt;    private:&lt;br /&gt;        void (*fpShout)();&lt;br /&gt;    public:&lt;br /&gt;        A() { fpShout = NULL; };&lt;br /&gt;        void setShout(void (*fpFunc)()) { fpShout = fpFunc; };&lt;br /&gt;        void Shout()&lt;br /&gt;        {&lt;br /&gt;            if (fpShout == NULL)&lt;br /&gt;                cout &amp;lt;&amp;lt; “fpShout is NULL” &amp;lt;&amp;lt; endl;&lt;br /&gt;            else&lt;br /&gt;                fpShout();&lt;br /&gt;        };&lt;br /&gt;};&lt;/code&gt;&lt;/pre&gt;&lt;/P&gt;
&lt;P&gt;전역으로 ShoutA()와 ShoutB()라는 함수를 선언하고 정의합니다.&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;void ShoutA() { cout &amp;lt;&amp;lt; “A” &amp;lt;&amp;lt; endl; };&lt;br /&gt;void ShoutB() { cout &amp;lt;&amp;lt; “B” &amp;lt;&amp;lt; endl; };&lt;/code&gt;&lt;/pre&gt;&lt;/P&gt;
&lt;P&gt;클래스 B는 member variable로 클래스 A를 가지고 있으며 &amp;nbsp;Shout()를 호출하면 자신의 메소드인 ShoutC()를 A에게 세팅하여 A의 Shout()를 호출합니다.&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;class B&lt;br /&gt;{&lt;br /&gt;    private:&lt;br /&gt;        static void ShoutC() { cout &amp;lt;&amp;lt; “C” &amp;lt;&amp;lt; endl; };&lt;br /&gt;        A a;&lt;br /&gt;    public:&lt;br /&gt;        void Shout()&lt;br /&gt;        {&lt;br /&gt;            a.setShout(&amp;amp;ShoutC);&lt;br /&gt;            a.Shout();&lt;br /&gt;        };&lt;br /&gt;};&lt;/code&gt;&lt;/pre&gt;&lt;/P&gt;
&lt;P&gt;main함수에서는 먼저 fpShout에 아무 것도 할당하지 않은 상태로 A의 인스턴스의 Shout()를 호출하고, 그 후 전역 함수인 ShoutA()와 ShoutB()를 각각 할당한 후 A의 Shout()를 호출합니다. 마지막으로 B의 인스턴스에 대해 Shout()를 호출합니다.&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;int main()&lt;br /&gt;{&lt;br /&gt;    A a;&lt;br /&gt;    a.Shout();&lt;br /&gt;    a.setShout(&amp;amp;ShoutA);&lt;br /&gt;    a.Shout();&lt;br /&gt;    a.setShout(&amp;amp;ShoutB);&lt;br /&gt;    a.Shout();&lt;br /&gt;    B b;&lt;br /&gt;    b.Shout();&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/P&gt;
&lt;P&gt;function pointer를 member variable로 가질 경우 먼저 NULL로 설정한 후 항상 NULL 체크를 한 후에 실행될 수 있도록 해야 합니다.&lt;/P&gt;
&lt;P&gt;위 code를 컴파일해서 실행해 보면 아래와 같은 결과가 나옵니다.&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;P&gt;fpShout is NULL&lt;br /&gt;A&lt;br /&gt;B&lt;br /&gt;C&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>CPP</category>
			<category>C++</category>
			<category>function pointer</category>
			<author>(exedra)</author>
			<guid>http://devnuri.com/2</guid>
			<comments>http://devnuri.com/2#entry2comment</comments>
			<pubDate>Wed, 12 Dec 2007 17:23:11 +0900</pubDate>
		</item>
		<item>
			<title>C++ Quiz</title>
			<link>http://devnuri.com/1</link>
			<description>간단한 퀴즈입니다. &lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;cout &amp;lt;&amp;lt; &quot;Hello World!&quot; &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;C++ 책 1장부터 우리가 사용하는 cout의 정체는 뭘까요? &lt;br /&gt;1) class &lt;br /&gt;2) object &lt;br /&gt;3) function &lt;br /&gt;4) template &lt;br /&gt;5) keyword &lt;br /&gt;6) none of the above&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>CPP</category>
			<category>C++</category>
			<author>(호빵맨)</author>
			<guid>http://devnuri.com/1</guid>
			<comments>http://devnuri.com/1#entry1comment</comments>
			<pubDate>Wed, 12 Dec 2007 14:44:45 +0900</pubDate>
		</item>
	</channel>
</rss>
