<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>roadster</title>
	<link>http://roadster.egloos.com</link>
	<description>개발하면서 느꼈던 점</description>
	<language>ko</language>
	<pubDate>Tue, 04 Mar 2008 06:21:09 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>roadster</title>
		<url>http://pds.egloos.com/logo/1/  </url>
		<link>http://roadster.egloos.com</link>
		<width>80</width>
		<height>80</height>
		<description>개발하면서 느꼈던 점</description>
	</image>
  	<item>
		<title><![CDATA[ swapable queue ]]> </title>
		<link>http://roadster.egloos.com/4199854</link>
		<guid>http://roadster.egloos.com/4199854</guid>
		<description>
			<![CDATA[ 
  <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%; FONT-FAMILY: 맑은 고딕">멀티쓰레드<span lang="EN-US"> IO</span>를 하다보면<span lang="EN-US"> N</span>개의 쓰레드에서<span lang="EN-US"> IO</span>작업을 하고</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">하나의 로직쓰레드에서<span lang="EN-US"> IO</span>가 끝난 데이터를 처리하는 작업을 하는 경우가 있다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕"><span lang="EN-US">(</span>대표적인 방식이<span lang="EN-US"> IOCP)</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><span style="FONT-SIZE: 100%; FONT-FAMILY: 맑은 고딕">&nbsp;</span></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕"><span lang="EN-US">(여러개의 <span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: '맑은 고딕'; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA">IO쓰레드와 하나의 로직쓰레드를 사용하는 이유를 알고 싶으면 아래의 참고를 참고...)</span></span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;<br><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕"><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">보통 이런 방식을 사용할 때 동기화를 하기 위해서 사용하는 방식은 내가 써본 바로는 크게 두가지가 있었다<span lang="EN-US">.</span></span></p><p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt 38pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore"><span style="FONT-SIZE: 100%">l</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 100%">실시간 동기화</span></p><p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: -20pt; mso-para-margin-left: 0gd; mso-list: l0 level2 lfo1"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore"><span style="FONT-SIZE: 100%">n</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 100%">큐에서 원소를 빼낼 때 마다 락을 걸어서 동기화하는 방법<span lang="EN-US">.</span></span></p><p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: -20pt; mso-para-margin-left: 0gd; mso-list: l0 level2 lfo1"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore"><span style="FONT-SIZE: 100%">n</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 100%">매우 비효율적이나 코드가 간단하고 데이터 복사에 대한 오버헤드가 없다<span lang="EN-US">.</span></span></p><p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt 38pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore"><span style="FONT-SIZE: 100%">l</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 100%">복사 동기화</span></p><p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: -20pt; mso-para-margin-left: 0gd; mso-list: l0 level2 lfo1"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore"><span style="FONT-SIZE: 100%">n</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 100%">한번 락을 걸고 데이터를 다 빼내와서 새로운 큐에 복사를 하고 락을 푼 후 새로운 큐에 대해 반복적으로 작업을 처리<span lang="EN-US">.</span></span></p><p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: -20pt; mso-para-margin-left: 0gd; mso-list: l0 level2 lfo1"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore"><span style="FONT-SIZE: 100%">n</span><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 100%">락에 대해서는 효율적이지만 데이터 복사가 일어나고 복사하는 동안 장시간 락이 걸리는 단점</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p><span style="FONT-SIZE: 100%">&nbsp;</span></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">이 두 가지를 장점만을 결합하고 싶어서 이렇게 만들어보았다<span lang="EN-US">.</span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></span><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p></span><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds9.egloos.com/pds/200803/04/50/c0020950_47cce63a8b79d.png" width="500" height="196.526508227" onclick="Control.Modal.openDialog(this, event, 'http://pds9.egloos.com/pds/200803/04/50/c0020950_47cce63a8b79d.png');" /></div></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">기본적인 원리는 락 한번 걸 때 여러 개의 데이터를 얻어오는 대신 데이터 복사를 없애고 싶었다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">원리는 간단하다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p><span style="FONT-SIZE: 100%; FONT-FAMILY: 맑은 고딕">&nbsp;</span></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">우선 큰 큐 객체 안에 두 개의 작은 큐가 있다<span lang="EN-US">. </span>두 개는 동일한 큐로 <span lang="EN-US">IO</span>작업 결과를 담을 수 있다<span lang="EN-US">. </span>그리고 <span lang="EN-US">IO</span>쓰레드들과 로직쓰레드는 직접 큐 객체에 접근하는 것이 아니고 각각의 큐를 가리키는 두 개의 포인터에 접근을 한다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕"><span lang="EN-US">swap</span>을 요청하게 되면 데이터를 복사하지 않고 포인터만 교환한다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">포인터 교환하는데 드는 비용이 엄청나게 작기 때문에 락 걸리는 시간도 매우 작다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><br>template &lt;typename T&gt;<br>class SwapableQueueT<br>{<br>public:<br>&nbsp;SwapableQueueT() : m_lock(_T("SwapableQueueT")), m_pqueue4N(&amp;m_queue1), m_pqueue41(&amp;m_queue2)&nbsp;{&nbsp;}<br>&nbsp;inline void push(const T&amp; t)<br>&nbsp;{<br>&nbsp;&nbsp;CSafeLock sl(&amp;m_lock);<br>&nbsp;&nbsp;m_pqueue4N-&gt;push(t);<br>&nbsp;}<br>&nbsp;inline bool pop(T&amp; t)<br>&nbsp;{<br>&nbsp;&nbsp;if(m_pqueue41-&gt;empty())<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;t = m_pqueue41-&gt;front();<br>&nbsp;&nbsp;m_pqueue41-&gt;pop();<br>&nbsp;&nbsp;return true;<br>&nbsp;}<br>&nbsp;inline void swap()<br>&nbsp;{<br>&nbsp;&nbsp;CSafeLock sl(&amp;m_lock);<br>&nbsp;&nbsp;if(m_pqueue4N == &amp;m_queue1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;m_pqueue4N = &amp;m_queue2;<br>&nbsp;&nbsp;&nbsp;m_pqueue41 = &amp;m_queue1;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;m_pqueue4N = &amp;m_queue1;<br>&nbsp;&nbsp;&nbsp;m_pqueue41 = &amp;m_queue2;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>private:<br>&nbsp;std::queue&lt;T&gt; m_queue1;<br>&nbsp;std::queue&lt;T&gt; m_queue2;<br>&nbsp;std::queue&lt;T&gt;* m_pqueue4N; // n개의 쓰레드를 위한 큐<br>&nbsp;std::queue&lt;T&gt;* m_pqueue41; // 1개의 쓰레드를 위한 큐<br>&nbsp;CCriticalSection m_lock;<br>};<br><br></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">아쉬운 점은 다수의 쓰레드가 데이터를 입력할 때 매번 락이 걸리기 때문에 좀 아쉽긴 하다<span lang="EN-US">.</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">이 부분은 다른 방식으로 해결해야지<span lang="EN-US">…</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p><br /><br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕"><span lang="EN-US">IO </span>쓰레드가 여러 개인 이유는 아시다시피 자원요청에 대한 대기 시간 동안 효율적으로 <span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;</span>CPU</span>를 사용하고<span lang="EN-US">, </span>자원에 접근하는 코드가 간결해진다<span lang="EN-US">. (</span>쓰레드 내에서 블락이 걸려도 상관없기 때문에<span lang="EN-US">)</span></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><span style="FONT-SIZE: 100%; FONT-FAMILY: 맑은 고딕">&nbsp;</span></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 맑은 고딕">로직쓰레드가 하나인 이유는 로직 처리가 사이클이 작고 반복횟수가 많은 경우여서 여러 개를 사용했더니 내부적으로 동기화가 필요해지고 동기화로 인한 비효율적인 락이 생겨서 더 느려지는 현상이 발생하였다<span lang="EN-US">. </span>그래서 차라리 하나를 빨리 돌리는게 더 효율적이라고 판단<span lang="EN-US">, </span>모든 락을 제거하고 하나의 쓰레드로 변경하였다<span lang="EN-US">.<br><br>코드에 사용된 CCriticalSection, CSafeLock은 흔히 볼 수 있는 동기화 객체이다.<br>알아서 구현하거나 찾아서 쓰길 바랍니다.</span></span></span></p><br/><br/>tag : <a href="/tag/큐" rel="tag">큐</a>,&nbsp;<a href="/tag/멀티쓰레드" rel="tag">멀티쓰레드</a>,&nbsp;<a href="/tag/동기화" rel="tag">동기화</a>			 ]]> 
		</description>
		<category>개발 - 디자인</category>
		<category>큐</category>
		<category>멀티쓰레드</category>
		<category>동기화</category>

		<comments>http://roadster.egloos.com/4199854#comments</comments>
		<pubDate>Tue, 04 Mar 2008 06:19:07 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ wprintf, wcout등에 unicode빌드시 한글이 안나오는 문제 ]]> </title>
		<link>http://roadster.egloos.com/3548800</link>
		<guid>http://roadster.egloos.com/3548800</guid>
		<description>
			<![CDATA[ 
  wprintf(L"한글");<br>이라던지<br>std::wcout &lt;&lt; L"한글" &lt;&lt; std::endl;<br>같은 코드를 빌드했을 때 한글이 안나온다면 (저의 경우 VS2005 SP1)<br>다음과 같이 하시면 됩니다.<br><br>일반<br>setlocale(LC_ALL, "korean");<br>wprintf(L"한글");<br><br>STL 사용시<br>std::cout.imbue(std::locale("korean"));<br>std::wcout &lt;&lt; L"한글" &lt;&lt; std::endl;<br><br>별 내용은 아니지만 google신에게 신탁을 받기 좀 어려웠던지라 함 써놓아봅니다.			 ]]> 
		</description>
		<category>개발 - 일반</category>

		<comments>http://roadster.egloos.com/3548800#comments</comments>
		<pubDate>Thu, 28 Jun 2007 05:20:51 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Microsoft Visual Studio 2005 (VS2005) 키보드 에러 대처법 ]]> </title>
		<link>http://roadster.egloos.com/2626144</link>
		<guid>http://roadster.egloos.com/2626144</guid>
		<description>
			<![CDATA[ 
  Microsoft Visual Studio 2005 (이하 VS2005)를 사용하다가 <br />
특정 상황에서 키보드가 오동작하는 경우가 있습니다. <br />
예를들어 화살표 키라던지 insert delete home... 이런 기능키들인데요 <br />
아~ ctrl, alt, 같은 키도 안먹더군요. <br />
뭐 되는거라곤 알파벳 정도? <br />
<br />
이 상황이 되면 도구 - 옵션 - 환경 - 키보드 영역이 날아가버렸을겁니다. <br />
별 짓을 다해봐도 돌아오지는 않지요. <br />
VS2005 다시 깔아도 소용 없습니다.<br />
<br />
이유는 <br />
C:\Documents and Settings\(자기계정)\Application Data\Microsoft\VisualStudio\8.0 폴더에 있는 파일 뭔가가 잘못된 것 같더군요. <br />
해결방법은 다음과 같습니다. <br />
<br />
도구 - 설정 가져오기 및 내보내기 - 선택한 환경 설정 내보내기 를 통해서 적당히 설정을 내보냅니다. <br />
그리고 위에 폴더의 내용을 삭제하던지 8.0 폴더 자체를 지웁니다. (백업하시던지...) <br />
그리고 도구 - 설정 가져오기 및 내보내기 - 모두 다시 설정을 통해서 초기화 한 후 <br />
도구 - 설정 가져오기 및 내보내기 - 선택한 환경 설정 가져오기 - 새 설정 가져와 덮어쓰기 해서 트리에서 고르시던지 찾아보기 하셔서 가져옵니다. <br />
이 때 아무래도 키보드 설정은 제외하고 가져오는게 나을 것 같아서 저는 제외하고 가져왔습니다. <br />
실험정신이 투철하신 분은 가져와보셔도 ㅡㅡ;; <br />
단축키 따로 정의하신 분은 좀 마음이 아프실지도 모르겠지만... <br />
<br />
혹시 다음에 경험하시는 분이 지우고 VS2005 다시 까시고 하시는 삽질을 미연에 방지하기 위해서 글 적어봅니다.<br />
<br />
P.S.<br />
google에서 우리나라 사이트에서는 발견이 안되서 뻥좀 보태서 전세계 사이트 돌아다니다가 간신히 발견했습니다.<br />
(제 검색능력이 딸려서 구글신이 신탁을 안내려주셨을지도 ㅠㅠ)<br />
혹시 google에서 이 글이 검색되면 여러사람 편하겠죠?<br />
			 ]]> 
		</description>
		<category>개발 - 일반</category>

		<comments>http://roadster.egloos.com/2626144#comments</comments>
		<pubDate>Fri, 13 Oct 2006 09:10:04 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 인간은 시간여행을 할 수 있을까? ]]> </title>
		<link>http://roadster.egloos.com/680259</link>
		<guid>http://roadster.egloos.com/680259</guid>
		<description>
			<![CDATA[ 
  내가 갖고 싶은 물건이 있는데<br />
이걸 미래에 가서 사오면 얼마나 좋을까 하는 생각을 하다가<br />
(제가 좋아하는 것들은 한달만해도 가격 뚝뚝 떨어지는 공산품들입니다. ^^<br />
게다가 소장가치는 거의 없죠 -ㅅ-)<br />
시간여행에 대해서 생각해 보았다.<br />
<br />
많은 사람들에게 (특히 내 또래들?) 시간 여행이 가능하리라 생각게 해준<br />
백 투 더 퓨처 라는 영화가 있다.<br />
어려서부터 과학에 관심이 많았던 나는 과거로 갔을 때<br />
과거에 미친 영향이 현재 (다시 돌아왔을때) 영향을 미친다는 것을 보고<br />
감탄을 하며 아~ 진짜인가보다 했었다. (나만 그랬나? ㅡㅡ;;)<br />
그리고 2탄에서는 여주인공이 미래에 가서 미래의 자신과 마주치고 기절하는 것을 보고도<br />
진짜 그렇게 될 거라고 생각했었다. ㅋㅋ<br />
<br />
우선 과거로 가는 것을 생각해보면 아주 간단하다.<br />
귀납적으로 불가능 하다는 것을 증명할 수 있다.<br />
시간여행을 백 투 더 퓨처 처럼 자유롭게 할 수 있다는 전제하에 (이 전제가 아니라면 할말 없음 ㅡㅡ;;)<br />
만약 100년 후에 아님 1000년 후에 타임머신이 개발된다면 분명 100년 전이나 1000년전으로 돌아갈 수 있을 것이다.<br />
그럼 그 타임머신이 온다면 현재에 타임머신이 생기는 것이다.<br />
미래에서 온 사람도 생기는 것이다.<br />
근데 없다.<br />
그러므로 자유로운 과거로의 시간여행은 불가능하다.<br />
<br />
앗 위의 전제도 필요없을지 모른다.<br />
만약 1시간 앞으로만 돌아갈 수 있는 타임머신이 있다면<br />
1시간 앞으로 가서 다시 1시간 앞으로 갈 수 있을 것이다.<br />
1년이 대충 8760 시간이니 876000번만 앞으로 가면 100년전으로 갈 수 있다.<br />
1초라면 좀 빡세겠지만 어쨌든 조금이라도 갈 수 있다면 계속 조금씩가서 얼마든지 앞으로 갈 수 있을 것이다.<br />
(연료 문제라던지, 운전자의 피로라던지 이런거 무시 ㅡㅡ)<br />
어쨌든 미래에서 현재로 오는 사람이 없기 때문에<br />
미래에도 과거로 갈 수는 없다고 생각한다.<br />
<br />
그럼 미래로 가는 것은 어떨까?<br />
솔직히 말해서 물리학적으로 미래로 가는 것은 가능하다.<br />
빠르게 움직이는 물체의 시간은 느리게 움직이는 물체에 비해서 상대적으로 느려진다.<br />
또한 엄청난 중력(인력)이 있는 곳 (태양 근처라던지 거대한 행성 근처)에서는 시간이 느리게 가는 것이 관측되었다.<br />
이 부분은 과학적으로 (아인슈타인의 일반상대성이론 아시죵?) 증명된 부분이라 반박하실 분이 없으리라 예상된다.<br />
실제로 인공위성의 원자 시계가 지표의 원자시계보다 느리게 간다고 들었다.<br />
(이 부분은 동일한 속도로 회전하는 물체에서 중심에서 먼 부분이 더 빠른 속도로 움직이는 것에 비교하면 되죵)<br />
<br />
누군가가 '여행 자주 다니는 사람이 젊게 사는 이유가 많이 움직이면 그만큼 정지해 있는 사람보다 시간이 천천히 가기 때문이다'라고 했는데 매우 재치있는 농담인 것 같다.<br />
왜 갑자기 뜬금없는 소린지 모르겠지만 어쨌든 나의 시간을 주변의 시간보다 느리게 할 수 있다는 것은<br />
조금이라도 미래로 갈 수 있다는 것이다.<br />
빛의 속도에 근접한다면 거의 내 시간은 정지해 버리기 때문에 미래로 가게 되는 것이다.<br />
<br />
그렇다고 해서 백 투 더 퓨처 처럼 미래의 나와 만날 수 있을까?<br />
백 투 더 퓨처에서는 분명히 과거의 일이 현재에 영향을 끼쳤다.<br />
그럼 분명히 현재의 일도 미래에 영향을 끼쳐야 하는데<br />
내가 지금 시각인 2005/10/01 01:57 에 미래를 향해 떠난다면 (백 투 더 퓨처 처럼 뿅 하고 사라진다면)<br />
난 이 시간부로 실종되는 것이다.<br />
이 시간 이후로는 김도연이란 사람은 실종되서 10년 후던 20년 후던 실종된 상태로 남아있는 것이다.<br />
20년쯤 후에 29살의 나이로 짠 하고 나타나게 되는 것이다.<br />
즉 실종되었다가 20년 만에 하나도 늙지 않고 가게 되는 것이다.<br />
실종된 나를 미래에서 만날 수 있을까?<br />
<br />
그리고 1탄에서 주인공이 박사한테 언제 총맞아 죽으니까 조심하슈 이랬더니<br />
할배가 잘 기억하고 있다가 방탄조끼를 입어서 살아난다.<br />
근데 주인공은 미래로 갔다 왔으면 그 기억을 계속 할 텐데<br />
그럼 미래의 주인공이 몇월 몇일 몇시에 미래로 오게 되는걸 알게 되는 것이다.<br />
근데 미래의 주인공들은 그 사실을 모르고 있다.<br />
우선 어감이 이상하고 뭔가 논리적으로 꼬인다.<br />
어쨋든 여러 이유로 미래의 나와 만날 수는 없는 것이다.<br />
<br />
뭐 여러 이야기에 있듯이 시간이 천천히 가는 신선나라나 요정계에 갔다 오니<br />
도끼자루가 썩어있더라. 마을에 아는 사람이 하나도 없더라.<br />
꼬맹이가 할배가 되었더라...<br />
이런 것 처럼 내가 움직인 시간만큼 나는 실종되는 것이다.<br />
이것도 일종의 미래로 간 것이 아닐까?<br />
(자기 중심으로만 얘기하면 주변의 시간이 빨리 간 거지만 주변의 입장에서 보면 자신의 시간이 천천히 간 것이다.)<br />
<br />
이미 과거로의 여행이 불가능하다는 것을 증명(?)했지만<br />
그래도 조크로 백 투 더 퓨처의 헛점을 하나 짚자면<br />
주인공이 과거에서 부모님을 만나서 여러가지 일을 겪는데<br />
그로 인해서 다시 돌아왔을 때 아버지와 어머니가 확 변해 있었다.<br />
이렇게 성격 바뀐 사람들이 과연 주인공을 잉태하는 역사적인 순간을 다시 한번 맞출 수 있었을까?<br />
그리고 식성도 바뀐 사람들의 정자와 난자가 동일한 조건에서 수정할 수 있었을까?<br />
한날 한시에 뱃속에서 잉태된 이란성 쌍둥이도 모습이 완전히 다를지언데<br />
완전히 달라진 두 사람이 과연 똑같은 아들을 낳을 수 있을까?<br />
<br />
어쨌든 잡설이 참 길었다.<br />
아래 상당히 아이러니한 문구가 보인다.<br />
시간을 미래로 지정하셔도 밸리와 XML에는 글을 등록한 시간을 기준으로 보입니다.<br />
우리가 손목시계를 한시간 후로 맞추어 놓아도 우리는 시간 여행을 한 것이 아니다 ^^<br />
<br />
PS. 갑자기 생각난 건데 우리가 시간여행을 하는 아주 간단한 방법이 있다.<br />
지구의 자전 반대방향으로 돌면 과거로 (미리 가서 해가 뜨는 것이나 지는 것을 다시 볼 수 가 있다.)<br />
지구를 자전방향으로 돌면 미래로 갈 수 있다. (해가 뜨는 것을 보고 바로 해가 지는 것을 볼 수가 있다)<br />
물론 시간 분기점이 있어서 무한히 미래나 과거로 갈 순 없겠지만 말이다 ^^<br />
<br /><br />			 ]]> 
		</description>
		<category>잡설</category>

		<comments>http://roadster.egloos.com/680259#comments</comments>
		<pubDate>Fri, 30 Sep 2005 17:13:43 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 한국인의 빨리빨리 ]]> </title>
		<link>http://roadster.egloos.com/604007</link>
		<guid>http://roadster.egloos.com/604007</guid>
		<description>
			<![CDATA[ 
  얼마전에 빙글빙글 랭크 쇼라는 프로를 보았다.<br />
뭐 어떤 주제에 대해서 1~10위까지 뽑아놓고 보여주면서 패널끼리 노가리 까는 뭐 그런 류의 프로그램인데<br />
내가 본 주제는 한국인의 빨리빨리 베스트 10 이런거였다.<br />
<br />
한국인의 빨리빨리는 전세계적으로도 유명하다고 하면서<br />
일부 사람들은 냄비근성 운운하며 고쳐야 될 악습이라고 말한다.<br />
하지만 나는 그렇게 생각하지 않는다.<br />
<br />
위 쇼에서 1위는 '인터넷 클릭 후 3초내에 화면 안뜨면 마구 다시 클릭한다'였구<br />
2위는 '엘리베이터 닫힘 버튼 마구 누른다' 였다.<br />
아무래도 인터넷으로 설문조사를 하다보니 1위가 인터넷으로 된 것 같은데<br />
내 생각에 엘리베이터가 1위지 싶다.<br />
<br />
엘리베이터를 탈 때 마다 항상 맘에 안드는 문구를 보곤 한다.<br />
'닫힘버튼을 한번 안누르면 얼마의 전력이 절약됩니다.'<br />
실제로 닫힘 버튼을 누른 뒤 문이 닫힐 때 까지의 전력을 잰 것이 아닌가 싶다.<br />
그러면 당근 엄청난 전력이 소모되는 것 같으니까.<br />
그치만 실제로 보자면 타이머로 닫히는 것과 버튼을 눌러 닫히는 것의 전력소모 차이는<br />
버튼에 불들어오는 정도가 아닐까 싶다.<br />
나머지 전력소모는 동일하지 않을까?<br />
(어디 전기과 다니는 사람 없나? ㅡㅡ;;)<br />
<br />
문제는 우리가 문이 닫히기를 기다리면서 버리는 3초~5초의 시간이다.<br />
이 3초 5초의 시간이 우스워 보이지만 나처럼 17층에 사는 사람은<br />
출근시간에 내려가면서 엘레베이터가 3~4번씩 서게 되면<br />
10초 ~ 20초 씩 늦어질 수도 있는 것이다.<br />
이 정도의 시간이면 버스, 지하철을 놓치거나<br />
자가용이 신호에 걸려 최소 2~3분에서 10분 이상 늦게 할 수도 있는 시간이다.<br />
(뭐 좀 비약이 있겠지만은)<br />
<br />
얘기가 엘리베이터로 빠졌던 이유는 뭔가 빨리빨리 하는 것이<br />
저절로 시간을 절약하고 있다는 것을 설명하기 위해서다.<br />
사람들이 빨리빨리를 외치는 것은 조금이라도 시간을 절약해서<br />
그 시간에 무언가를 조금이라도 더 하려는 의지가 아닐까?<br />
나만 그런가? ^^<br />
<br />
나는 정말이지 낙천적이고 느긋한 사람이라고 생각한다.<br />
일을 할 때도 급하게 하지 않고 차근차근 하는 편이다.<br />
왜냐하면 그 편이 일을 두번하지 않게 해서 시간이 절약된다고 생각하기 때문이다.<br />
평균 1시간 걸릴 것을 빨리 하겠다고 50분에 하면 30분 교정하는 수고를 거칠 수 있기 때문에<br />
아싸리 1시간 10분을 들여 하게 된다. 그럼 10분 절약하게 되니까.<br />
(내 일이 개발자이니만큼 날림 코드는 곧 부실한 프로그램을 만들고 그 버그는 반드시 고쳐야 하게 되어있다.)<br />
<br />
그치만 아무것도 하지 않고 기다리는 시간에 만큼은 조급한 사람이 된다.<br />
나는 그렇게 무의미하게 흘러가는 시간들이 아까워서 발을 동동 구르게 되는 것이다.<br />
상대방이 약속 시간을 안지켜서 무의미하게 기다리고 있는 시간,<br />
밥먹으려고 기다리는 시간, 차나 지하철 등을 타고 이동하는 시간 등등<br />
정말 아깝지 않은가?<br />
<br />
그 시간이 누군가와 함께 있어서 의미 있는 시간이라면 어느 정도는 참을 수 있지만<br />
혼자서 보내야 하는, 특히 아무것도 없어서 멀건히 보내는 시간은 정말 아까운 것이다.<br />
그래서 나는 그러한 순간에는 언제나 빨리빨리를 외친다.<br />
운전할 때도 한시간에 갈 꺼 50분에 가면 기름은 좀 더 들겠지만<br />
내가 10분이라는 시간을 기름값 조금 내가 산 것이 되는 것이다.<br />
<br />
그리고 꼭 기름값이 아주 많이 더 드는 것도 아니지 않을까?<br />
만약 100키로를 한시간동안 시속 100키로로 달리는데 기름이 10리터가 든다면<br />
200키로를 달린다면 20리터가 들까?<br />
아닐 것이다. 왜냐하면 한시간 거리를 30분만에 주파했기 때문이다.<br />
즉 200키로로 한시간 갈 때 기름이 20리터 든다면<br />
100키로를 달리는데는 똑같이 10리터가 드는 것이다.<br />
<br />
내가 기계과를 졸업했기 때문에 연료 효율이 제일 좋은 속도란 것은<br />
최대 토크가 나오고 있는 RPM을 유지하면서 달리는 것이다.<br />
물론 고속이 되면 공기 저항과 타이어 마찰에 의한 에너지 손실도 커지지만<br />
대신 달리는 거리가 많아져서 거리당 연료 소모량은 줄어들게 된다.<br />
<br />
우리가 경제속도라고 얘기하는 것들이<br />
예전 소형차 기준으로 대략 60(4단)/80(5단) 정도에서<br />
지금은 80(4단)/100(5단) 정도에서 최대 토크가 나오기 때문이다.<br />
(이거 실험으로도 했다 ㅡㅡ;;)<br />
<br />
또한 천천히 간다고 기름이 절약되는 것이 아닌 것은 정체시를 생각하면 명확하다.<br />
가만히 있어도 최소한의 기름을 소비하는 차이기에<br />
기름의 소모는 시동이 걸려있는 시간에도 상관이 있다.<br />
그렇기에 나는 시동의 걸려있는 시간도 최소화 하고 싶고<br />
그 시간 또한 나의 부수익이 되기 때문에 1석 2조라고 생각하고픈 것이다. ㅡㅡ;;<br />
<br />
뭔가 자꾸 이상한 데로 흘러가서 이만 줄여야겠지만<br />
나는 이 세상에서 절대 살 수 없는 것이 시간이니 만큼<br />
그깟 전기나 기름 조금 더 써서 시간을 얻을 수 있다면<br />
그게 더 이득이라는 것이다. (부가적으로 그렇게 많이 더 드는 것도 아니란 것에 대한 설명이 더 길었던듯 ㅡㅡ;;)<br />
시간을 절약하는 것이 좋다면<br />
우리나라 사람들의 빨리빨리 습성도 좋은 습관으로 보여지지 않을까?<br />
또 이러한 부분들을 세계 각국에 홍보해서 이상한 소리 듣지 않도록 대처해야 되지 않을까?<br /><br />			 ]]> 
		</description>
		<category>잡설</category>

		<comments>http://roadster.egloos.com/604007#comments</comments>
		<pubDate>Tue, 13 Sep 2005 07:24:57 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ CPPUNIT - COM 관련 ASSERT ]]> </title>
		<link>http://roadster.egloos.com/582307</link>
		<guid>http://roadster.egloos.com/582307</guid>
		<description>
			<![CDATA[ 
  이런거 한번 만들어 보았다.<br />
<br />
#define CPPUNIT_ASSERT_SUCCEEDED(condition) assertSucceeded(condition, "Expression: "#condition, __FILE__, __LINE__ )<br />
<br />
inline void assertSucceeded(HRESULT hr, LPCTSTR strSourceCode, LPCTSTR strFile, int iLine)<br />
{<br />
&nbsp;&nbsp;if(SUCCEEDED(hr))<br />
&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;CComPtr&lt;IErrorInfo> piErrorInfo;<br />
&nbsp;&nbsp;if(SUCCEEDED(GetErrorInfo(0, &piErrorInfo)) && piErrorInfo)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CComBSTR description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;piErrorInfo->GetDescription(&description);<br />
&nbsp;&nbsp;&nbsp;&nbsp;CPPUNIT_NS::Asserter::fail(CPPUNIT_NS::Message("ATL assertion failed", strSourceCode, (LPCTSTR)(CString)description), CPPUNIT_NS::SourceLine(strFile, iLine));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CPPUNIT_NS::Asserter::fail(CPPUNIT_NS::Message("ATL assertion failed", strSourceCode), CPPUNIT_NS::SourceLine(strFile, iLine));<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
이렇게 해두면 CPPUNIT 다이얼로그에 COM관련 에러 메시지가 나타나게 된다.<br />
<br />
COM 프로그램에서는 AtlReportError 을 이용하여 메시지를 리포팅 하면 된다.<br />
<br />
이런식이지...<br />
<br />
HRESULT CXxx::Run()<br />
{<br />
&nbsp;&nbsp;return AtlReportError(CLSID_NULL, L"에러입니다.");<br />
}<br /><br />			 ]]> 
		</description>
		<category>개발 - 일반</category>

		<comments>http://roadster.egloos.com/582307#comments</comments>
		<pubDate>Thu, 08 Sep 2005 07:35:30 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Google Desktop 좋으네... ]]> </title>
		<link>http://roadster.egloos.com/516362</link>
		<guid>http://roadster.egloos.com/516362</guid>
		<description>
			<![CDATA[ 
  <a href="http://www.clien.net" target="_blank">클량 (clien.net)</a> 을 뒤적거리다가<br />
google desktop을 캡쳐 화면을 보았는데 여지껏 보던거랑 다른 것이었다.<br />
헉스 왜 다른가 했더니<br />
바로 sidebar 였던 것이었다.<br />
한국어판 google desktop 에는 사이드바 기능이 없는데<br />
영문판에만 있더군.<br />
한국 사이트에서 받는 영문판이 아니고<br />
<a href="http://desktop.google.co.kr/en/" target="_blank">http://desktop.google.co.kr/en/</a>를 가야 있는 영문판이다.<br />
여기서 받으면 사이드바 옵션으로 실행시킬 수 있고<br />
여러 플러그인이 기본적으로 깔리며<br />
또 다운받아서 설치할 수 있다.<br />
<img class="image_left" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds.egloos.com/pds/1/200508/24/50/c0020950_0575021.jpg" width="400" height="300" onclick="Control.Modal.openDialog(this, event, 'http://pds.egloos.com/pds/1/200508/24/50/c0020950_0575021.jpg');" align="left" /><br />
<br />
쓸만한 플러그인은<br />
디폴트로 깔리는 것중에<br />
Email : (계속 인덱싱 중이라 아직 모르겠지만 Gmail 로긴 안하고 메일 보면 좋쥐...)<br />
Web Clips : RSS 를 지원하는 블로그 같은거 긁어서 죽 나오네 짱이다.<br />
Photos : 난 안쓰지만 슬라이드 쇼 제공<br />
Quick View : 내가 자주 사용하는 사이트나 프로그램을 링크해준다.<br />
추가로 깐것<br />
TimeWarp : 시계인데 모양을 막 바꿀 수 있음<br />
System Monitor : 보다시피...<br />
Todo : 이름으로 알겠지용?<br />
<br />
뭐 주저리 주저리 이것저것 플러그인 깔리는데 다 영어로 되어있고<br />
미국 날씨, 미국 주식, 미국 뉴스 이런거라서뤼...<br />
빨리 한국어판이 나오길<br /><br />			 ]]> 
		</description>
		<category>잡설</category>

		<comments>http://roadster.egloos.com/516362#comments</comments>
		<pubDate>Tue, 23 Aug 2005 16:03:50 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 다이얼로그 마지막 입력 정보 저장하기 ]]> </title>
		<link>http://roadster.egloos.com/322601</link>
		<guid>http://roadster.egloos.com/322601</guid>
		<description>
			<![CDATA[ 
  다이얼로그나 폼등에서 에디트를 올려놓고 마지막에 적은 것을 저장하게 하고 싶을 때가 있다.<br />
근데 에디트 전부에 대해서 해버리려는 무모한 생각을 해봤다.<br />
(테스트 프로그램에 에디트 창이 절라 많은데 일일히 하기 귀찮아서...)<br />
<br />
첨엔 이런식으로 짰다.<br />
<br />
void CFormViewMenu::OnInitialUpdate() <br />
{<br />
&nbsp;&nbsp;CFormView::OnInitialUpdate();<br />
<br />
&nbsp;&nbsp;CWnd* pcWndChild = GetWindow(GW_CHILD);<br />
&nbsp;&nbsp;while(pcWndChild)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char szClassName[100] = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(::GetClassName(pcWndChild->GetSafeHwnd(), szClassName, sizeof(szClassName)) > 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0 == strcmp(szClassName, "Edit"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szBuf[1000] = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(DaulSoftFile::CDaulRegistry::GetData(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HKEY_LOCAL_MACHINE, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SoftWare\DaulSoft\TMServerStressTester\Settings", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpszChildID, szBuf, sizeof(szBuf)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcWndChild->SetWindowText(szBuf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;pcWndChild = pcWndChild->GetWindow(GW_HWNDNEXT);<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
void CFormViewMenu::OnDestroy() <br />
{<br />
&nbsp;&nbsp;CWnd* pcWndChild = GetWindow(GW_CHILD);<br />
&nbsp;&nbsp;while(pcWndChild)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char szClassName[100] = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(::GetClassName(pcWndChild->GetSafeHwnd(), szClassName, sizeof(szClassName)) > 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0 == strcmp(szClassName, "Edit"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szBuf[1000] = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pcWndChild->GetWindowText(szBuf, sizeof(szBuf)) > 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DaulSoftFile::CDaulRegistry::SetData(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HKEY_LOCAL_MACHINE, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SoftWare\DaulSoft\TMServerStressTester\Settings", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpszChildID, szBuf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;pcWndChild = pcWndChild->GetWindow(GW_HWNDNEXT);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;CFormView::OnDestroy();<br />
}<br />
<br />
DaulSoftFile::CDaulRegistry::GetData, DaulSoftFile::CDaulRegistry::SetData 함수는<br />
DaulComLib (다울소프트 공통 라이브러리)에 있는 레지스트리 관련 API 래퍼 함수이다.<br /><br />// 선언부<br />
class CFECOperation<br />
{<br />
public:<br />
&nbsp;&nbsp;void Operate(CWnd* pcWndChild);<br />
protected:<br />
&nbsp;&nbsp;virtual void Operate(CWnd* pcWndChild, LPCTSTR lpszChildID) = 0;<br />
};<br />
class CFECOLoad : public CFECOperation<br />
{<br />
protected:<br />
&nbsp;&nbsp;void Operate(CWnd* pcWndChild, LPCTSTR lpszChildID);<br />
};<br />
class CFECOSave : public CFECOperation<br />
{<br />
protected:<br />
&nbsp;&nbsp;void Operate(CWnd* pcWndChild, LPCTSTR lpszChildID);<br />
};<br />
void for_each_child(const std::string& strChildClassName, CFECOperation& op);<br />
<br />
// 정의부<br />
void CFormViewMenu::CFECOperation::Operate(CWnd* pcWndChild)<br />
{<br />
&nbsp;&nbsp;char szTemp[13] = "";<br />
&nbsp;&nbsp;sprintf(szTemp, "0x%08X", pcWndChild->GetDlgCtrlID());<br />
&nbsp;&nbsp;Operate(pcWndChild, szTemp);<br />
}<br />
<br />
void CFormViewMenu::CFECOLoad::Operate(CWnd* pcWndChild, LPCTSTR lpszChildID)<br />
{<br />
&nbsp;&nbsp;char szBuf[1000] = "";<br />
&nbsp;&nbsp;if(DaulSoftFile::CDaulRegistry::GetData(HKEY_LOCAL_MACHINE, "SoftWare\DaulSoft\TMServerStressTester\Settings", lpszChildID, szBuf, sizeof(szBuf)))<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pcWndChild->SetWindowText(szBuf);<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
void CFormViewMenu::CFECOSave::Operate(CWnd* pcWndChild, LPCTSTR lpszChildID)<br />
{<br />
&nbsp;&nbsp;char szBuf[1000] = "";<br />
&nbsp;&nbsp;if(pcWndChild->GetWindowText(szBuf, sizeof(szBuf)) > 0)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;DaulSoftFile::CDaulRegistry::SetData(HKEY_LOCAL_MACHINE, "SoftWare\DaulSoft\TMServerStressTester\Settings", lpszChildID, szBuf);<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
void CFormViewMenu::for_each_child(const std::string& strChildClassName, CFECOperation& op)<br />
{<br />
&nbsp;&nbsp;CWnd* pcWndChild = GetWindow(GW_CHILD);<br />
&nbsp;&nbsp;while(pcWndChild)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char szClassName[100] = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(::GetClassName(pcWndChild->GetSafeHwnd(), szClassName, sizeof(szClassName)) > 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(szClassName == strChildClassName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;op.Operate(pcWndChild);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;pcWndChild = pcWndChild->GetWindow(GW_HWNDNEXT);<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
void CFormViewMenu::OnInitialUpdate() <br />
{<br />
&nbsp;&nbsp;CFormView::OnInitialUpdate();<br />
<br />
&nbsp;&nbsp;for_each_child("Edit", CFECOLoad());<br />
}<br />
<br />
void CFormViewMenu::OnDestroy() <br />
{<br />
&nbsp;&nbsp;for_each_child("Edit", CFECOSave());<br />
<br />
&nbsp;&nbsp;CFormView::OnDestroy();<br />
}<br />
<br />
물론 CFECOperation 은 좀더 추상화 될 필요가 있지만 일부로 안했다.<br />
왜냐?<br />
코드는 가장 필요한 만큼만 디자인 해서 쓴다가 나의 지론...<br />
너무 멀리 내다본 코드는 결국 불필요한 코드일 뿐.<br />
<br />
FEC 는 for_each_child 의 약자고<br />
for_each 는 stl 의 그것을 차용했다 ^^<br />
			 ]]> 
		</description>
		<category>개발 - 디자인</category>

		<comments>http://roadster.egloos.com/322601#comments</comments>
		<pubDate>Fri, 08 Jul 2005 04:53:14 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 개발이 힘들어... ]]> </title>
		<link>http://roadster.egloos.com/322564</link>
		<guid>http://roadster.egloos.com/322564</guid>
		<description>
			<![CDATA[ 
  요즘 이상하게 코드가 속도가 안난다.<br />
우선적으로 일하기가 댑빵 실은 것도 있고<br />
몸의 상태(컨디션)가 최악을 달리고 있기도 하다.<br />
그래서 그런지 VC 화면에 집중이 안된다.<br />
예전의 내 VC에 대한 집중력은 다른사람들이 혀를 내두를 정도였는데 (ㅡㅡ;;)<br />
머릿속의 생각은 많은데 그게 구체화 되서 코드로 쳐지지가 않는다.<br />
빨리 이 슬럼프를 벗어나야되는데<br />
안그러면 개발자를 벗어나던지 회사를 벗어나게 될 것 같다.<br /><br />			 ]]> 
		</description>
		<category>잡설</category>

		<comments>http://roadster.egloos.com/322564#comments</comments>
		<pubDate>Fri, 08 Jul 2005 04:41:41 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 요즘 생각하는 코딩 규칙 ]]> </title>
		<link>http://roadster.egloos.com/322552</link>
		<guid>http://roadster.egloos.com/322552</guid>
		<description>
			<![CDATA[ 
  코딩 규칙에 대해서 내가 생각하는 바를 우리 회사 동료들과 한 이야기이다.<br />
정리해서 올릴까 하다가 그냥 그대로 올려보았다.<br />
<br />
From: 김도연 <br />
Sent: Thursday, July 07, 2005 4:15 PM<br />
Subject: 코딩 규칙 : 변수명 앞첨자에 대해서<br />
<br />
C++ 에서 거의 표준처럼 자리잡힌<br />
헝가리안 표기법이나 기타 여러가지 표기법에서는<br />
변수명 앞에 변수의 형을 적도록 되어있지요.<br />
<br />
int iName;<br />
string strName;<br />
char szName[];<br />
double dName;<br />
BOOL bName;<br />
CFile* pcFile;<br />
기타등등....<br />
<br />
앞첨자를 어떤걸로 쓰느냐에 따라서 조금씩 다르긴 하지만<br />
앞첨자 + 대문자로 시작하는 변수명은 거의 표준이라고 할 수 있지요.<br />
<br />
근데 제가 java를 접하면서 즐거운 경험을 했습니다.<br />
이런 식으로 쓰더군요.<br />
int count;<br />
String name;<br />
double score;<br />
boolean checked;<br />
FileOutputStream fos;<br />
<br />
C++에서 보던 것과 달라 어색할 지는 모르겠지만<br />
타이핑 하기는 정말 편합니다.<br />
함수 타이핑 할 때도<br />
<br />
boolean function(String name, int count, double score);<br />
물론 긴 함수의 경우는 대문자를 이용하지요.<br />
double firstScoreOfSomeone;<br />
보시기에는 그래도 타이핑 하기에는 한결 편합니다.<br />
주로 한단어 변수가 많기 때문에 매우 편하죠.<br />
<br />
이렇게 써도 괜찮은 이유라고 생각되는 것이<br />
java에서는 암시적 혹은 묵시적인 형변환을 지원하지 않습니다.<br />
(사실 int와 long 사이에서 되고 일반클래스 -> 추상클래스는 되긴 합니다. 근데 이건 당근 되야 되는거죠 ^^)<br />
즉 특정 형을 잘못 쓰게 되면 바로 에러가 나게 되지요.<br />
물론 eclipse가 실시간으로 코드를 체크해주어서 잘못 쓰면 바로 보이니까<br />
굳이 이름에 대고 형을 쓸 귀찮음은 필요 없는거죠.<br />
<br />
그래서 이 규칙을 저는 제 코드에도 도입시키고 싶은데<br />
사실 제 코드가 저만의 코드가 아니기 때문에 좀 걱정이 되고 있습니다.<br />
여러 사람이 같이 봐야 할 코드가 제멋대로 되어있다면 좀 그렇자나요.<br />
이제 곧 연구소 멤버들이 java programmer 가 되어야 할텐데<br />
이 쯤에서 한번 얘기해보고 싶네요.<br />
<br />
모든 분들이 오랜 습관을 고친다는게 쉽지 않으리라 예상되지만<br />
그리 어렵지도 않더군요. 편하니까요 ^^<br />
의견주세요 ^^<br />
<br />
PS.<br />
이런 것도 정말 편합니다.<br />
m_strName -> this->name<br />
편하기도 하지만 훨씬 명시적입니다.<br />
그리고 m_ 보다 this 가 훨씬 빨리, 리듬감있게 (-> 제외 ㅡㅡ;;) 쳐집니다.<br />
시험해보세요 ㅡㅡ;;<br />
<br />
PS2.<br />
aaa.Test() -> aaa.test()<br />
. 을 누르고 쉬프트를 누르고 T를 누르는 과정에서<br />
삑사리 나는 경우가 많으실 겁니다.<br />
물론 당근 IDE가 좋으면 t 를 눌러도 T로 가지만<br />
무의시적으로 T를 치게 되죠.<br />
자연스럽게 t를 치게 되면 오타도 많이 줄고<br />
여러모로 좋습니다. ^^<br />
<br />
PS3.<br />
제가 C 코딩은 많이 안해봤지만<br />
왠지 C 시절로 돌아가는 느낌도 좀 들긴 하네요.<br />
괜시리 찝찝하네요 ^^<br /><br />------------------------------------------------------------------<br />
<br />
우리 회사 연구소에서 팀장를 맡고 계시는 유욱종 차장님의 생각<br />
오랜 경력의 프로그래머 (13년 + a) 이시라 그런지 생각이 깊으시다.<br />
C/C++ 경력이 많으시다. (나머진 잘 몰라요~ 죄송)<br />
<br />
From: 	유욱종  <br />
Sent:	Thursday, July 07, 2005 4:32 PM<br />
Subject:	RE: 코딩 규칙 : 변수명 앞첨자에 대해서<br />
<br />
흠…<br />
어렴풋이 10여년전 생각이 나는군요.<br />
그때는 변수명을 다 그렇게 썻다는… ( C로 Structured Program을 작성할 때 )<br />
함수명이고 변수명이고 다 소문자만 사용했었드랬습니다.<br />
언더바 이딴거 몰랐습니다.<br />
<br />
하지만 아직 자바를 직접 써보지 않아서 그렇긴 하지만 <br />
헝가리안 표기법은 사용하는 것이 좋지 않을까 생각합니다.<br />
소스가 커지고 변수가 많아지고 하면 아무래도 자신의 타입과 소속은 정확히<br />
해 두는 것이 디버깅때나 다른 사람이 소스를 봤을 때 좀더 편하지 않을까요?<br />
<br />
이 문제는 실제 코딩에 들어가기 전에 확정을 지어야 겠군요.<br />
아마도 이런 문제는 유경험자들의 말을 들어보는 것이 확실할 것 같군요.<br />
썬의 자바 개발자들은 어떻게 사용하는 지 함 살펴보고 참조하도록 하죠.<br />
<br />
그리고 혹시 이런일이 생기면 안되지만 자바에서 C++로 소스를 전환하고자 <br />
할 때 헝가리안 표기법을 안썼다면 그때는 좀 곤난하지 않을까요?<br />
<br />
<br />
------------------------------------------------------------------<br />
<br />
다시 내 덧글<br />
<br />
From: 김도연 <br />
Sent: Thursday, July 07, 2005 4:59 PM<br />
Subject: RE: 코딩 규칙 : 변수명 앞첨자에 대해서<br />
<br />
www.sun.com 에서 받은<br />
자바 API (MFC 같은거죵)에 있는<br />
String 소스입니다.<br />
String name = "도연";<br />
할 때 그 String 입니다.<br />
 << File: String.java >> <br />
까보시면 알겠지만 제가 말씀드린대로 되어있죵?<br />
이런것도 마구 씁니다.<br />
int i, char c, float f, long l, double d<br />
(이건 다른 소스에 ^^, 사실 좋아보이진 않지요.)<br />
<br />
변수의 타입과 소속에 대해서도 얘기해보지요.<br />
우선 자바에는 글로벌 변수가 없습니다.<br />
g_뭐시기 는 존재할 수 없구요.<br />
이런 경우는 있겠지요.<br />
<br />
class CA<br />
{<br />
	int m_iNumber;<br />
	static int s_iNumber; // 전 이렇게 씁니다.<br />
}<br />
<br />
자바에선 이렇게 쓰지요. // 실제로 필드(멤버변수)이름이 같을 순 없구 비교를 위해서...)<br />
class CA<br />
{<br />
	private int number;<br />
	private static int number;<br />
	int function() {<br />
		this.number; // nonstatic<br />
		CA.number; // static<br />
	}<br />
}<br />
소속은 확실해 졌지요.<br />
<br />
문제는 형에대한 구분입니다.<br />
제 생각에는 변수 이름에 많은 정보를 주고 여러번 쓰는 것 보다 최대한 변수를 쓰지 않는 것이 좋을 것 같습니다.<br />
멤버라면 Get/Set 메쏘드를 사용하고 인수라면 함수 선언만 봐도 바로 알 수 있지요.<br />
지역 변수는 최대한 쓰지 않는 것이 코드 보기에 좋은 것 같습니다.<br />
지역 변수가 많이 필요한 코드라면 여러 함수로 분리가 되어야겠지요.<br />
함수가 한줄 두줄 단위로 짧아지게 되면 변수에 대한 필요성은 점점 줄어들고 코드의 가시성이 좋아집니다.<br />
이런 방식으로 코드의 가시성을 올리고 타이핑은 좀 편하게 했으면 좋겠다는 생각입니다.<br />
<br />
PS. 소문자 맹신론자는 아닙니다.<br />
대부분 언어의 예약어들이 소문자로 되어있기 때문에<br />
충돌나는 경우가 가끔 있습니다.<br />
delete 같은게 매번 속썩이죠. ㅋㅋ<br />
<br />
------------------------------------------------------------------<br />
<br />
개발사업부에 계시는 오병훈 과장님 덧글...<br />
개발 경력은 대략 10년?<br />
VB, 델파이, VC++, C# 까지 여러 프로그래밍 경험자.<br />
<br />
From: 	오병훈  <br />
Sent:	Friday, July 08, 2005 9:42 AM<br />
Subject:	RE: 코딩 규칙 : 변수명 앞첨자에 대해서<br />
<br />
현재 C#코딩을 하고 있는데 도연씨의 맘을 이해할 수 있습니다.<br />
표기법이라는 것이 다 나름대로 이유가 있어서 만들어 놓은 것인데<br />
Java나 C#에서는 굳이 변수 앞에 타입을 알 수 있는 첨자를 사용하지 않아도 <br />
전혀 불편한 점이 없었습니다.<br />
물론 첨자 안 넣는 것이 훨씬 편했구요.<br />
그리고 역시 대부분의 변수는 public으로 사용될 이유도 거의 없고<br />
에디터가 워낙에 지원을 잘해서 변수이름만 치면 알아서 타입을 보여주는 터라..<br />
굳이 변수를 보고 타입을 알아야 할 경우는 없다고 생각되네요.<br />
<br />
예전에 텍스트 에디터에서 코딩을 할 때는 이놈의 것이 무슨 타입인지 알려면 <br />
클래스 헤더를 보지 않고는 이해하기 힘들던 당시에는 변수에 타입첨자가 붙어있어야<br />
됐겠지만 지금 개발 상황에서는 의미가 없다고 보여집니다.<br />
대부분의 에디터들이 실시간으로 멤버정보를 보여주기 때문에…<br />
<br />
그래서 저도 C#개발시에는 네이밍 규칙을 바꿀 생각입니다.<br />
어차피 언어별로 네이밍 규칙이 다들 틀릴 수 밖에 없다는 생각이 들구요.<br />
<br />
제 생각에는 VC에 Assist 깔아서 사용한다면 변수의 첨자를 쓰지 않아도 변수타입 때문에<br />
고민하는 경우는 안 생길 거라고 보여집니다.<br />
<br />
참고로 C#의 멤버들은 앞에 _를 붙이더군요.<br />
String _name;<br />
String _code;			 ]]> 
		</description>
		<category>개발 - 일반</category>

		<comments>http://roadster.egloos.com/322552#comments</comments>
		<pubDate>Fri, 08 Jul 2005 04:37:53 GMT</pubDate>
		<dc:creator>roadster</dc:creator>
	</item>
</channel>
</rss>
