<?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>flexible gameserver</title>
	<link>http://javawork.egloos.com</link>
	<description>배우고 때로 익히니 이 또한 즐겁지 아니한가</description>
	<language>ko</language>
	<pubDate>Wed, 18 Nov 2009 17:27:37 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>flexible gameserver</title>
		<url>http://pds17.egloos.com/logo/200910/28/14/d0043314.jpg</url>
		<link>http://javawork.egloos.com</link>
		<width>80</width>
		<height>80</height>
		<description>배우고 때로 익히니 이 또한 즐겁지 아니한가</description>
	</image>
  	<item>
		<title><![CDATA[ Active Object Pattern on ACE ]]> </title>
		<link>http://javawork.egloos.com/2475871</link>
		<guid>http://javawork.egloos.com/2475871</guid>
		<description>
			<![CDATA[ 
  게임서버를 작성하다보면 로직스레드 혹은 패킷처리 스레드에서 처리할수 없는 작업들이 있습니다. DB작업이 좋은 예인데, 블럭이 걸리기 때문에 별도의 스레드에서 처리를 해주어야 합니다. 정리하자면 로직 스레드에서 DB스레드에 이 작업을 처리해 달라고 요청을 해야하는 상황인데, 이럴때 Active Object 패턴을 적용할 수 있습니다.<br />
<br />
<blockquote>int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
&nbsp;&nbsp; &nbsp;DBWorkerThread workerThread;<br />
&nbsp;&nbsp; &nbsp;workerThread.activate();<br />
&nbsp;&nbsp; &nbsp;while(true)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SelectAccountJob job;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<span style="font-weight: bold;">workerThread.put(&amp;job);</span><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) Put job \n")));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ACE_OS::sleep (1);<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
class DBWorkerThread : public ACE_Task_Base<br />
{<br />
public:<br />
&nbsp;&nbsp; &nbsp;int svc()<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;const int MAX_TIMEOUT = 5;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while(true)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ACE_Time_Value tv ((long)MAX_TIMEOUT);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ACE_Method_Request *request = queue_.dequeue(&amp;tv);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (0 == request)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;continue;<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<span style="font-weight: bold;">request-&gt;call();</span><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return 0;<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;&nbsp; int put (ACE_Method_Request *req)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return queue_.enqueue(req);<br />
&nbsp;&nbsp; &nbsp;}<br />
private:<br />
&nbsp;&nbsp; &nbsp;ACE_Activation_Queue queue_;<br />
};<br />
<br />
class SelectAccountJob : public ACE_Method_Request<br />
{<br />
public:<br />
&nbsp;&nbsp; &nbsp;virtual int call (void)<br />
&nbsp;&nbsp; &nbsp;{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ACE_DEBUG((LM_INFO, ACE_TEXT ("(%t) Start SelectAccountJob\n")));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ACE_OS::sleep (1);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) End SelectAccountJob\n")));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return 0;<br />
&nbsp;&nbsp; &nbsp;}<br />
};<br />
<br />
</blockquote>실행하면 아래와 같이 차례대로 실행이 되는 것을 볼수 있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200911/19/14/d0043314_4b041e608685f.png" width="500" height="247.169811321" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200911/19/14/d0043314_4b041e608685f.png');" /></div>왼쪽에 숫자가 ThreadID입니다. Put Job과 실제 실행이 각자 다른 스레드에서 실행되고 있습니다. ACE_Method_Request를 상속받아서 call 메서드만 구현해주면 DBWorkerThread에서 알아서 실행해줍니다. <br />
<br />
하지만 실제로는 결과값도 받아와야 하는 경우가 많죠. 이럴때 ACE_Future를 사용할 수 있습니다.&nbsp; <br />
<br />
<blockquote>int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
&nbsp;&nbsp;&nbsp; DBWorkerThread workerThread;<br />
&nbsp;&nbsp;&nbsp; workerThread.activate();<br />
&nbsp;&nbsp;&nbsp; while(true)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SelectAccountJob job;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">ACE_Future&lt;std::string&gt; future = job.future();</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; workerThread.put(&amp;job);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) Put job \n")));<br />
<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::string result;</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; future.get(result);</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) GetResult(%s)\n"), result.c_str()));</span><br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
class SelectAccountJob : public ACE_Method_Request<br />
{<br />
public:<br />
&nbsp;&nbsp;&nbsp; virtual int call (void)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_DEBUG((LM_INFO, ACE_TEXT ("(%t) Start SelectAccountJob\n")));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_OS::sleep (1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">result_.set("Success");</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) End SelectAccountJob\n")));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; ACE_Future&lt;std::string&gt; &amp;future (void)</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; {</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return result_;</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; }</span><br style="font-weight: bold;"><br style="font-weight: bold;"><span style="font-weight: bold;">private:</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; ACE_Future&lt;std::string&gt; result_;</span><br />
};<br />
</blockquote><br />
Job을 넣기전에 ACE_Future를 발급받습니다. ACE_Future는 결과값을 받을수 있는 proxy라고 할수 있습니다. future.get()하면 결과값을 받을 수 있는데, WorkerThread에서 결과값을 넣기 전이라면 받을수 있을때까지 블럭이 걸립니다. 내부적으로는 event wait를 합니다. WorkerThread에서 작업이 끝나면 signal을 주고 get을 했던 스레드는 블럭이 풀리면서 값을 받아오게 되는 구조입니다. 그전에 작업이 완료되어 있으면 블럭없이 바로 받아올수 있습니다.<br />
<br />
WorkerThread에서 작업이 끝나면 callback을 불러주는 식으로 구현도 가능합니다.<br />
<br />
<blockquote>int ACE_TMAIN (int, ACE_TCHAR *[])<br />
{<br />
&nbsp;&nbsp;&nbsp; ...<br />
<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; CompletionCallBack cb;</span><br />
&nbsp;&nbsp;&nbsp; while(true)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SelectAccountJob* job = new SelectAccountJob();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_Future&lt;std::string&gt; future = job-&gt;future();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">job-&gt;attach(&amp;cb);</span><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; workerThread.put(job);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) Put job \n")));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_OS::sleep (1);<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; getchar();<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
<span style="font-weight: bold;">class CompletionCallBack: public ACE_Future_Observer&lt;std::string&gt;</span><br style="font-weight: bold;"><span style="font-weight: bold;">{</span><br style="font-weight: bold;"><span style="font-weight: bold;">public:</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; virtual void update (const ACE_Future&lt;std::string&gt; &amp; future)</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; {</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::string result;</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; future.get(result);</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_INFO, ACE_TEXT("(%t) GetResult(%s)\n"), result.c_str()));</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; }</span><br style="font-weight: bold;"><span style="font-weight: bold;">};</span><br />
<br />
class SelectAccountJob : public ACE_Method_Request<br />
{<br />
&nbsp;&nbsp;&nbsp; ...<br />
<span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; void attach (CompletionCallBack *cb)</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; {</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result_.attach (cb);</span><br style="font-weight: bold;"><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; }<br />
</span>private:<br />
&nbsp;&nbsp;&nbsp; ACE_Future&lt;std::string&gt; result_;<br />
};<br />
</blockquote><br />
WorkerThread에서 작업이 끝나면 CompletionCallBack::update를 호출해 줍니다. 보통 작업 결과를 확인하고 응답패킷을 보내주는 코드를 넣으면 되겠죠.<br />
<br />
<br />
<br/><br/>tag : <a href="/tag/ace" rel="tag">ace</a>,&nbsp;<a href="/tag/framework" rel="tag">framework</a>,&nbsp;<a href="/tag/active" rel="tag">active</a>,&nbsp;<a href="/tag/object" rel="tag">object</a>,&nbsp;<a href="/tag/pattern" rel="tag">pattern</a>,&nbsp;<a href="/tag/ACE_Future" rel="tag">ACE_Future</a>,&nbsp;<a href="/tag/ACE_Method_Request" rel="tag">ACE_Method_Request</a>			 ]]> 
		</description>
		<category>Programming</category>
		<category>ace</category>
		<category>framework</category>
		<category>active</category>
		<category>object</category>
		<category>pattern</category>
		<category>ACE_Future</category>
		<category>ACE_Method_Request</category>

		<comments>http://javawork.egloos.com/2475871#comments</comments>
		<pubDate>Wed, 18 Nov 2009 17:03:53 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 플랫폼 독립적인 코드 작성 ]]> </title>
		<link>http://javawork.egloos.com/2470615</link>
		<guid>http://javawork.egloos.com/2470615</guid>
		<description>
			<![CDATA[ 
  윈도우용으로 작성한 코드를 리눅스용으로 포팅할 일이 생겼는데, 다행히 ACE 기반으로 작성된 코드라 쉽게 포팅 할 수 있었습니다. 포팅중에 정리해둔 것을 옮겨봅니다. <br />
<br />
<font style="text-decoration: underline; font-weight: bold;" size="4">대소문자의 명확한 구분 </font><br />
파일을 지칭할때 윈도우와 달리 리눅스는 대소문자를 명확하게 구분합니다. 윈도우에서 그냥 넘어갔던 코드가 문제가 생길수 있습니다. 대부분 include에서 문제가 발생합니다.<br />
<ul><li>"Stdafx.h" -&gt; "stdafx.h"</li><li>ace/os_ns_string.h -&gt; ace/OS_NS_string.h<br />
</li></ul><font style="font-weight: bold; text-decoration: underline;" size="4">ACE 타입의 사용<br />
</font>gcc에는 tchar.h 가 없기때문에 TCHAR를 모두 ACE_TCHAR로 변경했습니다.<br />
<ul><li>TCHAR -&gt;ACE_TCHAR</li><li>_T("text") - &gt; ACE_TEXT("text")</li></ul>또하나 유의할점은 TCHAR는 _UNICODE define 유무에 따라 char/wchar이 결정되지만 ACE_TCHAR는 ACE_USES_WCHAR define에 따라 결정됩니다.<br />
<br />
<font style="text-decoration: underline;" size="4"><span style="font-weight: bold;">_s 함수들</span></font><br />
vc에서는 strcpy_s와 같이 _s가 붙은 함수의 사용을 권장하고 컴파일시에 경고메세지도 나옵니다. 하지만 gcc에는 없는 함수이기 때문에 그냥 strcpy함수 를 사용해야 합니다. 뒤에도 나오지만 ACE_OS::strcpy 함수를 쓰는게 가장 좋습니다. 설정에 따라 char/wchar로 switch되기 때문입니다. 그래도 C4996 warning은 피할수 없습니다. _CRT_SECURE_NO_DEPRECATE으로 끄는 수밖에 없습니다.<br />
<br />
<font style="font-weight: bold; text-decoration: underline;" size="4">ACE 함수의 사용</font><br />
ace/OS_NS_string.h, ace/OS_NS_stdlib.h, ace/OS_NS_stdio.h 에는 문자열과 io를 다루는 함수들이 있습니다. 그 함수들을 사용하면 ACE가 플랫폼과 char/wchar에 맞는 함수들을 호출해줍니다.<br />
<br />
<ul><li>sprintf -&gt; ACE_OS::sprintf</li><li>strcpy -&gt; ACE_OS::strcpy<br />
</li><li>atoi -&gt; ACE_OS::atoi</li><li>atof -&gt; ACE_OS::atof</li><li>strcmp - &gt;ACE_OS::strcmp</li><li>strtoul - &gt; ACE_OS::strtoul</li><li>strlen - &gt;ACE_OS::strlen</li><li>strcat -&gt; ACE_OS::strcat</li><li>vsnprintf - &gt;ACE_OS::vsnprintf</li><li>fopen - &gt;ACE_OS::fopen</li><li>fread - &gt; ACE_OS::fread<br />
</li></ul><br />
<font style="text-decoration: underline;" size="4"><span style="font-weight: bold;">멤버함수 템플릿 특수화의 미묘한 차이</span></font><br />
vc에서는 되는데, gcc에서는 inline으로 해결해야 하는 문제가 있더군요. 특정 상황에서 템플릿 멤버함수가 특수화가 되지 않는 현상이었습니다. 아마 부분 특수화 관련 이었던것 같은데, vc의 문제인지 gcc의 문제인지는 알수 없지만 반드시 체크해야 합니다. <br />
<br />
<font style="text-decoration: underline;" size="4"><span style="font-weight: bold;">GetTickCount() 함수</span></font><br />
GetTickCount()는 리눅스에서는 gettimeofday()로 바꾸어주어야 합니다. 그냥 치환만 하면 되는건 아니고 받아오는 단위가 다르기 때문에 변환도 필요합니다. 아래와 같이 만들어서 사용했습니다.<br />
<blockquote>unsigned int&nbsp; GetTick()<br />
{<br />
#ifdef WIN32<br />
&nbsp;&nbsp;&nbsp; return GetTickCount();<br />
#else <br />
&nbsp;&nbsp;&nbsp; timeval tick;<br />
&nbsp;&nbsp;&nbsp; gettimeofday (&amp;tick, 0);<br />
&nbsp;&nbsp;&nbsp; return (tick.tv_sec*1000 + tick.tv_usec/1000);<br />
#endif<br />
}</blockquote><br />
<font size="4"><span style="font-weight: bold; text-decoration: underline;">InterlockedCompareExchange 함수</span></font><br />
ACE에는 이 함수에 대응하는 함수가 없습니다. 이 외의 interlocked 계열 함수들은 모두 있습니다만 유독 이함수만 없습니다. 그냥 lock걸고 비교하는 방식으로 변경해야합니다.<br />
<br />
<br />
<br/><br/>tag : <a href="/tag/ace" rel="tag">ace</a>,&nbsp;<a href="/tag/linux" rel="tag">linux</a>,&nbsp;<a href="/tag/플랫폼" rel="tag">플랫폼</a>,&nbsp;<a href="/tag/독립" rel="tag">독립</a>,&nbsp;<a href="/tag/windows" rel="tag">windows</a>,&nbsp;<a href="/tag/framework" rel="tag">framework</a>			 ]]> 
		</description>
		<category>Programming</category>
		<category>ace</category>
		<category>linux</category>
		<category>플랫폼</category>
		<category>독립</category>
		<category>windows</category>
		<category>framework</category>

		<comments>http://javawork.egloos.com/2470615#comments</comments>
		<pubDate>Wed, 11 Nov 2009 12:52:58 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 독일남부여행 - Garmisch ]]> </title>
		<link>http://javawork.egloos.com/2463103</link>
		<guid>http://javawork.egloos.com/2463103</guid>
		<description>
			<![CDATA[ 
  이번 남부여행의 종착점 Garmisch-Partenkirchen(보통 "가르미슈"라고 하더군요) 입니다. 여기는 독일에서 가장 높은 산인 Zugspitze가 있습니다. 등산열차가 있어서 누구나 쉽게 올라갈 수 있습니다. 올라가서 보니 구름이 밑에 있더군요(+_+). 사진으로 주욱 보시겠습니다. <br />
<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc376a134.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc376a134.jpg');" /></div> <div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc491ee07.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc491ee07.jpg');" /></div><br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbc56711cb.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbc56711cb.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc5fbadc6.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc5fbadc6.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbc69db17a.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbc69db17a.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200911/02/14/d0043314_4aedbc9140348.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200911/02/14/d0043314_4aedbc9140348.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc9c2d893.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200911/02/14/d0043314_4aedbc9c2d893.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200911/02/14/d0043314_4aedbcaf1ca08.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200911/02/14/d0043314_4aedbcaf1ca08.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbcbbd838e.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbcbbd838e.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbcc7907f1.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbcc7907f1.jpg');" /></div><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbcd137313.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200911/02/14/d0043314_4aedbcd137313.jpg');" /></div><br />
<br/><br/>tag : <a href="/tag/Garmisch" rel="tag">Garmisch</a>,&nbsp;<a href="/tag/Germany" rel="tag">Germany</a>,&nbsp;<a href="/tag/Zugspitze" rel="tag">Zugspitze</a>,&nbsp;<a href="/tag/독일" rel="tag">독일</a>,&nbsp;<a href="/tag/등산열차" rel="tag">등산열차</a>			 ]]> 
		</description>
		<category>기타</category>
		<category>Garmisch</category>
		<category>Germany</category>
		<category>Zugspitze</category>
		<category>독일</category>
		<category>등산열차</category>

		<comments>http://javawork.egloos.com/2463103#comments</comments>
		<pubDate>Sun, 01 Nov 2009 17:00:51 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 독일남부여행 - Füssen ]]> </title>
		<link>http://javawork.egloos.com/2461456</link>
		<guid>http://javawork.egloos.com/2461456</guid>
		<description>
			<![CDATA[ 
  다음 여행지는 퓌센(Füssen)입니다. 이전 여행지인 Lindau(Bodensee)에서 기차로 3시간 정도 걸립니다. 노인슈반스타인(Neuschwanstein)성과 호엔슈방가우 성으로 유명합니다. 노인슈반스타인성은 디즈니랜드 백조의 성 모델로도 알려져있습니다. <br />
<br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea191021d97.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea191021d97.jpg');" /></div>밤에 도착해서 찍었더니 괴기스럽게 나왔습니다. 밤에도 조명을 켜두더군요.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea194bbc146.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea194bbc146.jpg');" /></div>먼저 호엔슈방가우 성 입구. 여기는 그닥 볼게 많지 않아 패스.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea197b68c5d.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea197b68c5d.jpg');" /></div>Alpsee라는 호수입니다. 호엔슈방가우성 가는 길에 있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea19b901820.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea19b901820.jpg');" /></div>단풍과 함께 절경을 보여줍니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/30/14/d0043314_4aea19d1b6529.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/30/14/d0043314_4aea19d1b6529.jpg');" /></div>물 정말 맑네요. <br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea19eb6c0b1.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea19eb6c0b1.jpg');" /></div>푸르스름한 빛을 띄는 호수<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea1aee2472a.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea1aee2472a.jpg');" /></div>아이랑 걸어가기에는 조금 먼 거리라서 노인슈반스타인 성까지는 마차를 타고 갔습니다. 요금은 두당 6유로. <br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/30/14/d0043314_4aea1a06ba0da.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/30/14/d0043314_4aea1a06ba0da.jpg');" /></div>노인슈반스타인 성에 왔습니다. 아쉽게도 성안은 촬영금지입니다. :(<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/30/14/d0043314_4aea1a23aec5c.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/30/14/d0043314_4aea1a23aec5c.jpg');" /></div>성에서 찍은 마을<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea1a7c25d6e.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/30/14/d0043314_4aea1a7c25d6e.jpg');" /></div>호엔슈방가우 성<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea1a98ed2bb.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/30/14/d0043314_4aea1a98ed2bb.jpg');" /></div>사진이 가장 잘 나온다는 마리엔 다리에서 찍은 노인슈반스타인 성<br />
<br />
</div>노인슈반스타인 성은 외관, 내부 장식, 주변 자연경관 어느 하나 빠질게 없을 정도로 훌륭합니다. 독일 여행을 가신다면 강력추천하고 싶네요.<br />
<br/><br/>tag : <a href="/tag/Füssen" rel="tag">Füssen</a>,&nbsp;<a href="/tag/Neuschwanstein" rel="tag">Neuschwanstein</a>,&nbsp;<a href="/tag/퓌센" rel="tag">퓌센</a>,&nbsp;<a href="/tag/germany" rel="tag">germany</a>,&nbsp;<a href="/tag/독일" rel="tag">독일</a>			 ]]> 
		</description>
		<category>기타</category>
		<category>Füssen</category>
		<category>Neuschwanstein</category>
		<category>퓌센</category>
		<category>germany</category>
		<category>독일</category>

		<comments>http://javawork.egloos.com/2461456#comments</comments>
		<pubDate>Fri, 30 Oct 2009 08:42:09 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 독일남부여행  - Bodensee ]]> </title>
		<link>http://javawork.egloos.com/2460634</link>
		<guid>http://javawork.egloos.com/2460634</guid>
		<description>
			<![CDATA[ 
  Bodensee는 독일 남부 Lindau와 오스트리아, 스위스에 걸쳐있는 독일에서 가장 큰 호수입니다. 프랑크푸르트에서 기차로 5~6시간 정도 걸리지만 기차 창문으로 보이는 풍경이 멋져서 감수할만 합니다. :)<br />
<br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/29/14/d0043314_4ae8bd20a34e4.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/29/14/d0043314_4ae8bd20a34e4.jpg');" /></div>초원이 펼쳐진 평원<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8bd458590b.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8bd458590b.jpg');" /></div>풀뜯는 소<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bd9f7753e.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bd9f7753e.jpg');" /></div>드디어 Bodensee에 도착했습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/29/14/d0043314_4ae8bdde6fc87.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/29/14/d0043314_4ae8bdde6fc87.jpg');" /></div>유람선도 있고, 개인 보트도 많이 정박되어있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8be16270b7.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8be16270b7.jpg');" /></div>물이 참 깨끗합니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8be374fdfa.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8be374fdfa.jpg');" /></div>거의 끝이 보이지 않습니다. 하지만 바다가 아니라 호수.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8beab3e515.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8beab3e515.jpg');" /></div>유람선을 타고 <span style="text-decoration: line-through;">바다</span> 호수로 나왔습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bedd0bce4.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bedd0bce4.jpg');" /></div><span style="text-decoration: line-through;">새우깡</span> 빵조각을 향한 갈매기의 비행<br />
근데 호수인데 왠 갈매기 =_=;<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8bf425a72f.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/29/14/d0043314_4ae8bf425a72f.jpg');" /></div>반대편으로 가니 날씨가 좀 밝아지네요.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bf1a3603e.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bf1a3603e.jpg');" /></div>하늘, 산, 물 빛의 조화<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bf78288ef.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/29/14/d0043314_4ae8bf78288ef.jpg');" /></div>노을지는 Bodensee<br />
</div><br/><br/>tag : <a href="/tag/lindau" rel="tag">lindau</a>,&nbsp;<a href="/tag/bodensee" rel="tag">bodensee</a>,&nbsp;<a href="/tag/germany" rel="tag">germany</a>,&nbsp;<a href="/tag/독일" rel="tag">독일</a>			 ]]> 
		</description>
		<category>기타</category>
		<category>lindau</category>
		<category>bodensee</category>
		<category>germany</category>
		<category>독일</category>

		<comments>http://javawork.egloos.com/2460634#comments</comments>
		<pubDate>Thu, 29 Oct 2009 08:05:13 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 크라이텍 한국지사 프로그래머 구인 ]]> </title>
		<link>http://javawork.egloos.com/2453393</link>
		<guid>http://javawork.egloos.com/2453393</guid>
		<description>
			<![CDATA[ 
  <div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/20/14/d0043314_4adccbc811e6b.gif" width="190" height="114" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/20/14/d0043314_4adccbc811e6b.gif');" /></div><br />
<a href="http://www.gamejob.co.kr/List_GI/GIB_Read.asp?GI_No=49427">http://www.gamejob.co.kr/List_GI/GIB_Read.asp?GI_No=49427</a><br />
<a href="http://www.gpgstudy.com/forum/viewtopic.php?topic=24568">http://www.gpgstudy.com/forum/viewtopic.php?topic=24568</a><br />
자세한 내용은 링크를 참고하시고, 간단히 요약하면 네트워크 프로그래머와 3D/Tool 프로그래머를 구인중입니다. 분위기상 무언가 새로운 것을 시작하려는 듯 하니 많이 지원해주시면 좋겠네요.<br />
<br />
몇달전에 저도 한번 방문했었는데, 사무실은 역삼역 근처에 있고 새빌딩을 넉넉하게 쓰고 계시더군요. 분위기도 자유롭고 따뜻하게 대해주셔서 참 감사했었습니다. <br />
<br />
채용정보 보니 이력서는 영문으로 제출해야 하는군요. 제가 일전에 올린 포스트도 참고가 될것 같습니다.<br />
<a target="_blank" href="http://javawork.egloos.com/2199134">http://javawork.egloos.com/2199134</a><br />
<br />
채용과 큰 관련은 없지만 아래 링크에 가보시면 크라이텍에 얼마나 다양한 국가의 사람들이 일하고 있는지 보실수 있습니다. 물론 저도 포함. :)<br />
<a target="_blank" href="http://www.crytek.com/culture/team/">http://www.crytek.com/culture/team/</a><br />
			 ]]> 
		</description>
		<category>기타</category>

		<comments>http://javawork.egloos.com/2453393#comments</comments>
		<pubDate>Mon, 19 Oct 2009 20:40:12 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 오픈소스 마인드 맵 프로그램 XMind ]]> </title>
		<link>http://javawork.egloos.com/2448820</link>
		<guid>http://javawork.egloos.com/2448820</guid>
		<description>
			<![CDATA[ 
  <a target="_blank" href="http://www.xmind.net/">http://www.xmind.net/</a><br />
XMind는 오픈소스로 제공되는 마인드맵 프로그램입니다. jre를 설치하는 걸 보면 자바로 만든 것 같습니다.  무료/유료 버전이 있습니다만 무료로 제공되는 버젼도 훌륭합니다.<br />
<br />
XMind로 간단하게 마인드맵을 하나 그려보겠습니다.<br />
<br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4e8104e3c5.png" width="500" height="350.5859375" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4e8104e3c5.png');" /></div>초기화면 입니다. 제목부분을 더블클릭해서 입력할 수 있습니다.<br />
</div><br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4e84ef053c.png" width="500" height="350.5859375" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4e84ef053c.png');" /></div>서브토픽을 하나 만들었습니다. 메인토픽이 선택된 상태에서 탭키를 누르면 서브토픽이 생성됩니다.<br />
</div> <br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/14/14/d0043314_4ad4e8b5809bc.png" width="500" height="350.5859375" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/14/14/d0043314_4ad4e8b5809bc.png');" /></div>서브토픽을 하나 더 생성했습니다. 이전 서브토픽 포커스에서 엔터키를 입력하면 됩니다.<br />
</div><br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/14/14/d0043314_4ad4e950f15aa.png" width="500" height="350.5859375" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/14/14/d0043314_4ad4e950f15aa.png');" /></div><br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4e96ca3a14.png" width="500" height="350.5859375" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4e96ca3a14.png');" /></div><br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4ea732a143.png" width="500" height="349.12109375" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4ea732a143.png');" /></div>진행 상황도 표시할 수 있습니다.<br />
</div><br />
<div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4eb1f489ac.png" width="500" height="350.09765625" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200910/14/14/d0043314_4ad4eb1f489ac.png');" /></div>이런식으로 응용이 가능합니다.<br />
</div><br />
제 경우는 어떤 일을 먼저 해야 하는지 판단이 잘 안될때, 갑자기 떠오른 아이디어를 정리하고 싶을때, 할일을 정리할때 마인드맵을 사용합니다. 전체적인 그림이 한눈에 들어오고 현재 진행상황도 쉽게 파악이 가능합니다. <br />
<br/><br/>tag : <a href="/tag/xmind" rel="tag">xmind</a>,&nbsp;<a href="/tag/mindmap" rel="tag">mindmap</a>,&nbsp;<a href="/tag/마인드맵" rel="tag">마인드맵</a>			 ]]> 
		</description>
		<category>기타</category>
		<category>xmind</category>
		<category>mindmap</category>
		<category>마인드맵</category>

		<comments>http://javawork.egloos.com/2448820#comments</comments>
		<pubDate>Tue, 13 Oct 2009 21:10:58 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ ACE_Message_Block의 chained block 기능 ]]> </title>
		<link>http://javawork.egloos.com/2439678</link>
		<guid>http://javawork.egloos.com/2439678</guid>
		<description>
			<![CDATA[ 
  ACE_Message_Block은 고정 크기 및 가변 크기 버퍼를 효과적으로 관리하기 위한 클래스 입니다.&nbsp; 데이터 복사, read ptr, write ptr 관리, 레퍼런스 카운팅 등 여러가지 편리한 기능들을 제공합니다. 그중의 하나인 chained block 기능을 소개합니다.<br />
<br />
코드로 먼저 보여드리죠.<br />
<br />
<blockquote>ACE_Message_Block* head = new ACE_Message_Block(size);<br />
ACE_Message_Block* next = new ACE_Message_Block(size);<br />
head-&gt;cont(next);</blockquote>head와 next block은 연결된 상태입니다. 마치 링크드 리스트 처럼 말이죠. <br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200910/02/14/d0043314_4ac5b9fb075cd.png" width="500" height="170" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200910/02/14/d0043314_4ac5b9fb075cd.png');" /></div><br />
next block 뒤로도 계속 연결할 수 있습니다. <br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/02/14/d0043314_4ac5ba076ecfe.png" width="500" height="120" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/02/14/d0043314_4ac5ba076ecfe.png');" /></div><br />
<br />
이렇게 연결된 block을 구하는 코드는 아래와 같습니다.<br />
<blockquote>ACE_Message_Block* node = head-&gt;cont();<br />
</blockquote><br />
이런 chained block 기능으로 composite 패턴을 구현합니다.<br />
<blockquote>composite 패턴 : 개별객체와 복합객체를 같은 방식으로 다룰수 있는 인터페이스를 제공<br />
</blockquote><br />
서버에서 받은 패킷이 그것을 처리하는 로직으로 도달하기까지 거치는 여러 클래스, 함수들이 ACE_Message_Block을 손쉽게 다룰수 있게 됩니다. head block만 넘기면 되기 때문이죠. 중간에 어떤 데이터를 추가하려고 해도 버퍼를 복사할 필요없이 뒤에 연결하기만 하면 됩니다. cont() 함수로 iterating도 간단하게 할 수 있고&nbsp; 연결된 block들의 총길이와 개개의 block들의 길이 등을 계산하는 함수들도 별도로 제공됩니다. head block만 release하면 연결된 block들도 함께 release 됩니다. 따라서 패킷을 모두 처리한후에 head block만 release하면 되죠. <br />
<br />
Chained block의 끝에 새로운 block을 추가하려면 tail block을 알아야 하는데, head block에서 한번에 tail block을 알아내는 인터페이스는 제공하지 않습니다. 아래와 같이 구현하면 됩니다.<br />
<blockquote>ACE_Message_Block *FindTail(ACE_Message_Block *block)<br />
{<br />
&nbsp;&nbsp;&nbsp; ACE_Message_Block *tail = block;<br />
&nbsp;&nbsp;&nbsp; while (NULL != tail-&gt;cont())<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tail = tail-&gt;cont();<br />
&nbsp;&nbsp;&nbsp; return tail;<br />
}</blockquote><br />
처리중에 연결된 block중 하나에 다른 스레드에서 접근하면 문제가 생길수 있기 때문에 thread-safe는 별도로 보장을 해주어야 합니다.<br />
<br/><br/>tag : <a href="/tag/ace" rel="tag">ace</a>,&nbsp;<a href="/tag/framework" rel="tag">framework</a>,&nbsp;<a href="/tag/ACE_Message_block" rel="tag">ACE_Message_block</a>,&nbsp;<a href="/tag/Composite패턴" rel="tag">Composite패턴</a>			 ]]> 
		</description>
		<category>Programming</category>
		<category>ace</category>
		<category>framework</category>
		<category>ACE_Message_block</category>
		<category>Composite패턴</category>

		<comments>http://javawork.egloos.com/2439678#comments</comments>
		<pubDate>Thu, 01 Oct 2009 22:38:27 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ lock-free 회의론 ]]> </title>
		<link>http://javawork.egloos.com/2439670</link>
		<guid>http://javawork.egloos.com/2439670</guid>
		<description>
			<![CDATA[ 
  저도 이전에 lock-free에 대해 관심이 많이 생겨서 이것 저것 많이 알아보고 구현도 해본적이 있습니다만 현재는 회의적인 입장입니다. 이유는 2가지 입니다.<br />
<ol><li>사용하는데 제약이 너무 많음</li><li>들인 노력에 비해 향상되는 성능이 크지 않음</li></ol><font size="4"><span style="text-decoration: underline;">제약이 너무 많음</span></font><br />
lock-free 알고리즘의 하나인 <a target="_blank" href="http://serverprogramminggem.springnote.com/pages/865946">SpinBuffer</a>의 경우 두가지 제약이 있습니다. 하나는 소비자 스레드와 생산자 스레드가 각각 하나씩이어야 한다는 것이고 다른 하나는 두 스레드가 블럭되지 않고 SpinBuffer의 생산, 소비 함수를 주기적으로 호출을 해야 한다는 점입니다. 이 두 조건을 모두 만족하는 상황에서만 SpinBuffer를 사용해야 합니다. 그외에 대부분의 lock-free 알고리즘은 이러한 자기만의 제약사항이 있습니다. 거기에 공통적인 문제점인 <a href="http://blog.naver.com/PostView.nhn?blogId=jjoommnn&amp;logNo=130040068875&amp;widgetTypeCall=true">ABA 문제</a>도 있죠. 이런 문제점을 잘 이해하고 사용하지 않으면 큰 낭패를 볼 수 있습니다.<br />
<br />
<font size="4"><span style="text-decoration: underline;">노력대 성능비</span><br />
</font>이렇게 제약사항을 모두 충족시키며 적용을 했음에도 불구하고 lock-free 알고리즘을 적용하여 향상되는 성능은 미미한 편이었습니다. 그보다는 busy wait나 context switching을 줄임으로서 얻는 성능의 향상이 더 컸습니다. <br />
<br />
<a target="_blank" href="http://serverprogramminggem.springnote.com/pages/3912089">Proactor 패턴</a><br />
<a target="_blank" href="http://javawork.egloos.com/1818696">Half-Sync/Half-Async 패턴</a><br />
<a target="_blank" href="http://javawork.egloos.com/2397148">바람직한 Producer-Consumer 모델</a><br />
<br />
lock-free 알고리즘을 이해하고 구현하는데 시간을 들이는 것보다는 기존의 concurrent 패턴을 잘 이해하고, 그안에서 성능을 향상시키는게 가격대 성능비(?)로 낫다고 판단했습니다. 그래서 요즘은 concurrent 패턴들을 조금 더이상적으로 구현하는데 신경을 쓰고 있습니다. 성급하게 응용을 하기 보다는 원저자의 의도에 가깝게 FM대로 구현을 하는 것이지요.<br />
<br />
			 ]]> 
		</description>
		<category>기타</category>

		<comments>http://javawork.egloos.com/2439670#comments</comments>
		<pubDate>Thu, 01 Oct 2009 20:54:06 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 동네 산책길 ]]> </title>
		<link>http://javawork.egloos.com/2431160</link>
		<guid>http://javawork.egloos.com/2431160</guid>
		<description>
			<![CDATA[ 
  <div style="text-align: center;"><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69b1cce2be.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69b1cce2be.jpg');" /></div>집에서 바로 나서면 있는 골목길입니다. 오르막이라 처음부터 체력이 좀 소진 됩니다. =_=;<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69b6e131c0.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69b6e131c0.jpg');" /></div>동네 놀이터 입니다. 그네, 미끄럼틀, 씨름장(?) 정도만 있는 작은 곳 입니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69bb139026.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69bb139026.jpg');" /></div>그 중 하나인 그네 입니다. 넘어졌을때 다치지 말라고 작은 나무조각들이 깔려있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69c6379410.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69c6379410.jpg');" /></div>동네 지붕이 예쁜집.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab69c2012a92.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab69c2012a92.jpg');" /></div>이제부터 본격 산책길 입니다. 오른쪽에 큰 밭이 있는데, 보리도, 밀도 아닌 뭔지 모를 작물이 잘 자라고 있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69d0d64538.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69d0d64538.jpg');" /></div>빨간 사과가 한창인 사과나무. 아무도 관리 안하는 것 같은데 열매를 주렁주렁 달고 있네요.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69d1f60c68.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69d1f60c68.jpg');" /></div>사과가 썩어나는 현장. 아무도 안주워 가더군요. <br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab69da5a3c13.jpg" width="450" height="800" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab69da5a3c13.jpg');" /></div>전나무처럼 생겼는데, 잎새가 축축 늘어집니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69dea8869c.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69dea8869c.jpg');" /></div>잠시 돌아본 동네 전경<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab69e2959bbd.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab69e2959bbd.jpg');" /></div>9월의 독일 하늘.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69e588ef30.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69e588ef30.jpg');" /></div>어딘가로 들어가는 입구를 발견<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69ec3efa25.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69ec3efa25.jpg');" /></div><br />
들어가보니..<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69e8cae9e8.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69e8cae9e8.jpg');" /></div>공원이군요<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69ef95d44a.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69ef95d44a.jpg');" /></div>지대가 높아서 프랑크푸르트 시내가 보입니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69f1f5baa3.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69f1f5baa3.jpg');" /></div>토요일 정오인데도 한산하네요.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69f32bfcc9.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69f32bfcc9.jpg');" /></div>공원내 포도밭도 있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69f821219f.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69f821219f.jpg');" /></div>연날리는 할아버지<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69fa15ce68.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69fa15ce68.jpg');" /></div>계단<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69fb9f27e5.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab69fb9f27e5.jpg');" /></div>광합성 중인 시민들<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69fcbf13e9.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab69fcbf13e9.jpg');" /></div>포도밭 옆으로 어디론가 가는 길이 있습니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab6a0217186f.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab6a0217186f.jpg');" /></div>사과농장입니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab6a03904664.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds17.egloos.com/pds/200909/21/14/d0043314_4ab6a03904664.jpg');" /></div>들어가보니 사과축제 같은 것을 하고 있네요. 그래서 개방되어 있었던 모양입니다.<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab6a06e8fe1e.jpg" width="500" height="375" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200909/21/14/d0043314_4ab6a06e8fe1e.jpg');" /></div>사과 덩굴(?)<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab6a085eff12.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab6a085eff12.jpg');" /></div>분위기 있는 나무 사이길<br />
<div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab6a0ca0316d.jpg" width="500" height="281.25" onclick="Control.Modal.openDialog(this, event, 'http://pds16.egloos.com/pds/200909/21/14/d0043314_4ab6a0ca0316d.jpg');" /></div>동네 지붕 예쁜집 #2<br />
</div>			 ]]> 
		</description>
		<category>기타</category>

		<comments>http://javawork.egloos.com/2431160#comments</comments>
		<pubDate>Sun, 20 Sep 2009 21:40:55 GMT</pubDate>
		<dc:creator>자바워크</dc:creator>
	</item>
</channel>
</rss>
