<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Heart's Develop Inside</title>
	<atom:link href="http://dev.heartsavior.net/feed" rel="self" type="application/rss+xml" />
	<link>http://dev.heartsavior.net</link>
	<description></description>
	<pubDate>Wed, 24 Sep 2008 15:58:49 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>멋지신 빵집 개발자 양병규님&#8230;</title>
		<link>http://dev.heartsavior.net/archives/225</link>
		<comments>http://dev.heartsavior.net/archives/225#comments</comments>
		<pubDate>Wed, 24 Sep 2008 15:58:49 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Think]]></category>

		<category><![CDATA[개발자 이야기]]></category>

		<category><![CDATA[마인드]]></category>

		<category><![CDATA[빵집]]></category>

		<category><![CDATA[초심]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=225</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<blockquote><p><a href="http://www.bkyang.com/right/030/right.htm">@ bkyang.com &amp; EMR</a></p></blockquote>
<p>개발자가 가져야 할 자부심과 마인드를 제대로 보여주시는 듯&#8230;</p>
<blockquote><p>내가 만든 프로그램을 수 천명이나 되는 이 병원의 의사들이 모두 마지 못해 억지로 쓰면 어떻하나..라는 걱정에 잠을 못 이루곤 했더랬습니다.</p></blockquote>
<p>마지막으로 이런 마인드를 가지고 정성들여 개발했던 게 언제였을까&#8230;</p>
<p>3년 일하고는 초심을 잃어버린 내 모습과 비교해 보면 &#8216;역시 나는 아직 한없이 모자르구나&#8217; 하는 생각이 든다.</p>
<p>양병규님 화이팅입니다. 빵집 정말 잘 쓰고 있습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/225/feed</wfw:commentRss>
		</item>
		<item>
		<title>오랜만에 접한 새로운 컴공개그(다섯 줄의 서사시)</title>
		<link>http://dev.heartsavior.net/archives/223</link>
		<comments>http://dev.heartsavior.net/archives/223#comments</comments>
		<pubDate>Tue, 23 Sep 2008 15:57:50 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Info]]></category>

		<category><![CDATA[다섯 줄의 서사시]]></category>

		<category><![CDATA[컴공개그]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=223</guid>
		<description><![CDATA[@ 다섯 줄의 서사시
오랜만에 &#8220;세상에는 10가지 종류의 사람이 존재한다.&#8221; 이후로 컴공개그 하나 보는구나&#8230;ㅋㅋ
아놔 이런걸로 웃으면 안되는데&#8230;
]]></description>
			<content:encoded><![CDATA[<blockquote><p><a href="http://dish.upnl.org/90 ">@ 다섯 줄의 서사시</a></p></blockquote>
<p>오랜만에 &#8220;세상에는 10가지 종류의 사람이 존재한다.&#8221; 이후로 컴공개그 하나 보는구나&#8230;ㅋㅋ</p>
<p>아놔 이런걸로 웃으면 안되는데&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/223/feed</wfw:commentRss>
		</item>
		<item>
		<title>간단한 문제&#8230;(연속된 숫자 그룹 맺어주기)</title>
		<link>http://dev.heartsavior.net/archives/219</link>
		<comments>http://dev.heartsavior.net/archives/219#comments</comments>
		<pubDate>Tue, 23 Sep 2008 14:25:46 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[DS/Algorithm]]></category>

		<category><![CDATA[문제]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=219</guid>
		<description><![CDATA[프로그래밍 갤러리에서 간단한 문제가 하나 올라오길래 오랜만에 C 코딩도 해볼 겸 풀어봤다.
문제 정의)
입력 : 1 2 3 10 11 12 13 19 199 200 201 202 300 305 499
출력 : 1-3, 10-13, 19, 199-202, 300, 305, 499.

연속된 숫자가 입력될 때 해당 숫자의 범위를 &#8216;-&#8217; 로 이어주는 문제이다.
숫자 혹은 범위 간에는 &#8216;,&#8217; 를 출력하고, 마지막 출력은 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gall.dcinside.com/list.php?id=programming&amp;no=90593&amp;page=3">프로그래밍 갤러리에서 간단한 문제가 하나 올라오길래</a> 오랜만에 C 코딩도 해볼 겸 풀어봤다.</p>
<p><span style="line-height: 160%;">문제 정의)<br />
입력 : 1 2 3 10 11 12 13 19 199 200 201 202 300 305 499<br />
출력 : 1-3, 10-13, 19, 199-202, 300, 305, 499.<br />
</span></p>
<p>연속된 숫자가 입력될 때 해당 숫자의 범위를 &#8216;-&#8217; 로 이어주는 문제이다.<br />
숫자 혹은 범위 간에는 &#8216;,&#8217; 를 출력하고, 마지막 출력은 &#8216;.&#8217; 이다.<br />
입력 숫자는 1&lt;=i&lt;=500 이고, 입력 갯수는 1&lt;=n&lt;=500 이다.</p>
<p>내가 푼 답)</p>
<blockquote><p><a href="http://codepad.org/ucRNVoxo">@ codepad 사이트에 입력한 코드</a></p></blockquote>
<p>새로 들어오는 값이 마지막으로 들어온 값과 연속되는 값인지만 체크하면 문제가 될 만한 것은 없다.<br />
나머지는 다 입출력의 문제&#8230;</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p219code2'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2192"><td class="code" id="p219code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> DELIMETER <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot; &quot;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">char</span> pszInput<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;1 2 3 10 11 12 13 19 199 200 201 202 300 305 499&quot;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> token <span style="color: #000080;">=</span> <span style="color: #0000dd;">strtok</span><span style="color: #008000;">&#40;</span>pszInput, DELIMETER<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">bool</span> bFirstNumber <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>		<span style="color: #666666;">// for check ',' print</span>
	<span style="color: #0000ff;">bool</span> bContinue <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>			<span style="color: #666666;">// for check continuous</span>
	<span style="color: #0000ff;">int</span> nLastNumber <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>			<span style="color: #666666;">// Should not continue the first input</span>
&nbsp;
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">NULL</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> token <span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> nCurrentNumber <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>token<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>nLastNumber <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> nCurrentNumber <span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #666666;">// continuous number</span>
			bContinue <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> bContinue <span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #666666;">// print last</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;-%d&quot;</span>, nLastNumber<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
				bContinue <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
&nbsp;
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> bFirstNumber <span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>, nCurrentNumber<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				bFirstNumber <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			<span style="color: #0000ff;">else</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;,%d&quot;</span>, nCurrentNumber<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		<span style="color: #008000;">&#125;</span>
&nbsp;
		nLastNumber <span style="color: #000080;">=</span> nCurrentNumber<span style="color: #008080;">;</span>
&nbsp;
		token <span style="color: #000080;">=</span> <span style="color: #0000dd;">strtok</span><span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, DELIMETER <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/219/feed</wfw:commentRss>
		</item>
		<item>
		<title>&#8216;제1회 대한민국 SW 개발자 컨퍼런스&#8217; 일단 사전등록 완료</title>
		<link>http://dev.heartsavior.net/archives/213</link>
		<comments>http://dev.heartsavior.net/archives/213#comments</comments>
		<pubDate>Mon, 22 Sep 2008 15:12:41 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Info]]></category>

		<category><![CDATA[대한민국 SW 개발자 컨퍼런스]]></category>

		<category><![CDATA[세미나정보]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=213</guid>
		<description><![CDATA[@ 제 1회 대한민국 SW 개발자 컨퍼런스
표를 완전 펌해봤는데 워드프레스에서 다 깨져서 안되겠다;; 그냥 링크만&#8230;
내가 처음에 봤을 때만 해도 조대협님이 ALM 발표하시는 걸로 알고 있었는데 변경된 것 같다.
조대협님 블로그를 보면 개발환경 자동화에 관해서는 내공이 정말 상당하실 것 같은데 많이 아쉽다.
(사실 가장 기대되는 파트였는데&#8230; 음냐&#8230;)
그나저나 가던지 안가던지 안철수님의 특별강연은 어떤 방법이던지 한 번 듣고 싶은데&#8230;
정말 마인드가 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><a href="http://www.devmento.co.kr/conference/conference.jsp">@ 제 1회 대한민국 SW 개발자 컨퍼런스</a></p></blockquote>
<p>표를 완전 펌해봤는데 워드프레스에서 다 깨져서 안되겠다;; 그냥 링크만&#8230;</p>
<p>내가 처음에 봤을 때만 해도 조대협님이 ALM 발표하시는 걸로 알고 있었는데 변경된 것 같다.<br />
<a href="http://bcho.tistory.com/">조대협님 블로그</a>를 보면 개발환경 자동화에 관해서는 내공이 정말 상당하실 것 같은데 많이 아쉽다.<br />
(사실 가장 기대되는 파트였는데&#8230; 음냐&#8230;)</p>
<p>그나저나 가던지 안가던지 안철수님의 특별강연은 어떤 방법이던지 한 번 듣고 싶은데&#8230;<br />
정말 마인드가 특별한 분인 것 같다.</p>
<p>그날 저녁 약속이 있긴 한데&#8230; 같이 갈 사람 모집해봐야지. 못구하면 어쩔 수 없고&#8230;ㅡㅜ</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/213/feed</wfw:commentRss>
		</item>
		<item>
		<title>JNI 를 통해 사용하는 VC++ 라이브러리를 디버깅하기</title>
		<link>http://dev.heartsavior.net/archives/205</link>
		<comments>http://dev.heartsavior.net/archives/205#comments</comments>
		<pubDate>Fri, 19 Sep 2008 07:21:18 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Lang.Java]]></category>

		<category><![CDATA[debugging]]></category>

		<category><![CDATA[Eclipse]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jdwp]]></category>

		<category><![CDATA[JNI]]></category>

		<category><![CDATA[visual c++ 6]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=205</guid>
		<description><![CDATA[JNI를 사용하는 프로젝트 수행 중에 JNI 단독으로 테스트할 때는 일어나지 않는 오류가 계속 일어나길래, JNI 가 사용하는 VC++ 라이브러리 내부를 디버깅하는 방법을 찾아 보았다.
@ Java Native Interface (JNI) - Debugging C code in a dll
설명이 잘 되어있긴 한데, 정리는 좀 덜 되어 있어서 실제로 디버깅 테스트를 해 보고 절차를 정리해 보았다.
IDE는 Visual C++ 6 를 [...]]]></description>
			<content:encoded><![CDATA[<p>JNI를 사용하는 프로젝트 수행 중에 JNI 단독으로 테스트할 때는 일어나지 않는 오류가 계속 일어나길래, JNI 가 사용하는 VC++ 라이브러리 내부를 디버깅하는 방법을 찾아 보았다.</p>
<blockquote><p><a href="http://forums.sun.com/thread.jspa?messageID=10203006">@ Java Native Interface (JNI) - Debugging C code in a dll</a></p></blockquote>
<p>설명이 잘 되어있긴 한데, 정리는 좀 덜 되어 있어서 실제로 디버깅 테스트를 해 보고 절차를 정리해 보았다.</p>
<p>IDE는 Visual C++ 6 를 기준으로 설명한다. 다만, 설정해야 할 부분이 별로 없으므로 아래의 설정은 타 IDE에도 적용이 가능할 것 같다.</p>
<p>1. Project Settings 에서 JNI 구현이 되어 있는 프로젝트를 선택함<br />
2. Settings For: 를 Debug로 맞춘 다음(혹은 Debug 옵션들이 선택된 Custom Configuration도 상관없음) Debug 탭 선택<br />
3. Executable for debug session: JRE 의 java.exe 나 javaw.exe 를 선택<br />
4. Working directory 에 JNI를 사용하는 프로젝트의 root 디렉토리를 전체 경로로 기록<br />
(Eclipse 의 경우 debug / run 시에 해당 디렉토리를 Working directory 로 사용하므로 그에 맞춰주는 것임)<br />
5. Program arguments 에<br />
-Xrunjdwp:transport=dt_socket,server=y,address=&lt;Eclipse 에서 원격 디버깅을 붙을 port&gt;,suspend=n -classpath &lt;jar파일들;class 디렉토리들(Eclipse라면 bin)&gt; &lt;Main 클래스 경로(패키지.클래스명)&gt; &lt;main() 의 arguments&gt; 기록<br />
(classpath 를 적을 때 Working directory 의 상대 경로로 적어도 된다.)</p>
<blockquote><p>* 중요 포인트 : JNI 라이브러리를 로드하는 부분( System.loadLibrary() 나 System.load() ) 에서 IDE에서 빌드하는 결과 파일을 로드하도록 해 주어야 한다.<br />
참고로, 라이브러리 경로를 절대 경로로 표현하려면 System.loadLibrary() 대신 System.load() 를 사용하여야 하고, 이 때는 경로에 확장자도 붙여 준다.</p></blockquote>
<p>디버그할 때는 VC++ 에서 Configuration 을 위에서 설정한 대상(Debug) 으로 맞추고 F5를 눌러 실행하면 JVM이 실행된 Console 이 뜬다.  VC++ 에서 break 걸리면 VC++ 디버거 사용 방법대로 디버깅 하면 된다.</p>
<p>VC++ 6 에서 실행할 때 native method 를 호출하는 위치까지는 진행되어야 breakpoint라도 걸린다. (F11로 실행해 봐야 JVM Disassembly 가 뜨기 때문에 별 도움이 안됨.)</p>
<p>위와 같은 방법으로 JNI 를 통해 호출되는 라이브러리를 디버깅할 수 있다.</p>
<p>&#8212;-</p>
<p>다음으로, 양 쪽으로 모두 디버그 하는 방법을 알아보자. (Eclipse 3.3 기준)</p>
<p>VC++ 6 은 위와 설정이 같다.</p>
<p>Eclipse 에서는 아래와 같이 설정한다. (다른 IDE를 쓴다면 해당 IDE 가 원격 디버깅하는 방법대로 하면 됨)</p>
<p>1. Open Debug Dialog 를 실행한다.<br />
2. Remote Java Application 을 선택하고 New 를 선택한다.<br />
3. Main 탭에서 Project 를 선택하고, Connection Properties 에서 Port 를 VC++ 에서 설정한 port 를 적는다.</p>
<p>해당 Debug Configuration 을 실행하면 VC++ 가 실행한 JVM 에 원격 디버거로 붙게 된다.</p>
<p>주의해야 할 점은, 프로그램 로직이 짧으면 Eclipse 가 연결하려는 시도 중에 프로그램이 끝나버린다.<br />
또한, VC++ 에서 break 가 걸린 상태에 Eclipse에서 연결을 시도하면, VC++ 에서 break 풀릴 때까지 Eclipse 는 연결이 안되는 것 같다. 즉, 연결에 대한 처리가 delay 되는 것 같다. (확실하지는 않음. 혹시 아시는 분은 리플로 알려주시면 감사하겠습니다.)</p>
<p>양 쪽으로 디버깅할 때에는, Java 프로그램이 시작할 때 native 의 초기 진입점(native method) 을 바로 실행하도록 하면 양쪽으로 디버그를 걸기가 좀 편하다.<br />
초기 진입점에 breakpoint 걸고, VC++에서 멈춰져 있는 상태가 되면 Eclipse 에서 원격 디버거로 연결하고, VC++ 에서 바로 F5를 눌러 초기 진입점을 빠져나가면 (뭐 이리 복잡하냐 -_-) 이후로는 양쪽으로 breakpoint 에서 멈추게 된다.</p>
<p>어쨌든 절차도 복잡하고&#8230; 가장 좋은 방법은 JNI 로 사용할 라이브러리를 &#8216;디버깅할 일이 없도록&#8217; 하는 것이겠다.</p>
<p>ps. 특정 IDE 에서 컴파일해야 하는 게 아니라면 Eclipse 의 CDE를 통해 Eclipse 내부에서 북치고 장구치는 것도 가능하다.</p>
<blockquote><p><a href="http://softwarecommunity.intel.com/articles/eng/1435.htm">@ Integrated Debugger for Java*/JNI Environments</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/205/feed</wfw:commentRss>
		</item>
		<item>
		<title>회사와 병특의 관계는 이런 게 아닐까&#8230;</title>
		<link>http://dev.heartsavior.net/archives/202</link>
		<comments>http://dev.heartsavior.net/archives/202#comments</comments>
		<pubDate>Mon, 15 Sep 2008 16:50:28 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Think]]></category>

		<category><![CDATA[병특]]></category>

		<category><![CDATA[산업기능요원]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=202</guid>
		<description><![CDATA[@ 산업기능요원(병특) 에 대한 자격지심 가지지 마라. 이 짓도 나름 피곤하다. ㅡ_ㅜ
윗 글을 쓸 때 사실 약간 흥분해서 병특의 입장에서 변호하는 글이 되어 버렸다.
처음에 GPG에서 해당 리플을 볼 때 들었던 생각은, &#8216;자격지심인가보다&#8217; 와 &#8216;병특한테 당한게 많은가&#8217; 이었다.
가끔 병특들이 오후 6시만 되면 칼퇴근을 하느니 오후 1시에 나오느니 하는 불만을 표출하는 글을 게시판에 쓰는 사람들이 간혹 있어서 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><a href="http://dev.heartsavior.net/archives/197">@ 산업기능요원(병특) 에 대한 자격지심 가지지 마라. 이 짓도 나름 피곤하다. ㅡ_ㅜ</a></p></blockquote>
<p>윗 글을 쓸 때 사실 약간 흥분해서 병특의 입장에서 변호하는 글이 되어 버렸다.</p>
<p>처음에 GPG에서 해당 리플을 볼 때 들었던 생각은, &#8216;자격지심인가보다&#8217; 와 &#8216;병특한테 당한게 많은가&#8217; 이었다.</p>
<p>가끔 병특들이 오후 6시만 되면 칼퇴근을 하느니 오후 1시에 나오느니 하는 불만을 표출하는 글을 게시판에 쓰는 사람들이 간혹 있어서 하는 이야기이다. 병특을 욕하는 사람들이 전체를 보지 못하듯이, 나도 전체를 보지는 못하고 있을 것 아닌가? 이런 사람도 충분히 있을 수 있는 이야기라고 생각한다.<br />
(그리고 정직원 중에서도 이런 사람들이 있을 수 있겠지.)</p>
<p>나는 회사와 병특의 관계는 이런 게 아닐까 생각한다.</p>
<p>회사가 병특을 뽑는데 가지는 이득은, &#8216;싸게 부린다&#8217; 가 아니라 &#8216;병특이 아니라면 회사 이름도 모를만한 인력을 오래도록 묶어두고 회사 발전에 힘쓰게 할 수 있다&#8217; 에 있는 것이라고 생각한다.(<a href="http://gpgstudy.com/forum/viewtopic.php?t=20961">GPG 글 링크</a>의 Neogeo 라는 분의 의견을 존중한다.)</p>
<p>병특을 하면서 얻을 수 있는 이점은, 경력적인 부분을 채우면서 대체 복무도 수행하고, 연봉제를 통해 개인 자산을 먼저 구축할 수 있는 점이라 생각한다.</p>
<p>그래서 상호간에 마인드에 대해서는 지켜줘야 될 부분이 있다.</p>
<p>병특과 회사가 윈윈하려면, 아니 적어도 좋게 끝내려면,</p>
<blockquote><p>병특도 다니는 동안에는 정직원의 마인드로 다녀야 하는거고, 회사도 병특에게 정직원의 대우를 해 줘야 한다.</p></blockquote>
<p>고 생각한다.</p>
<p>결국 양 쪽 중 한 쪽이 이를 어기니까 불신이 생겨서 서로 못 잡아먹어서 안달인 것이 아닐까?</p>
<p>ps. 병특을 뽑아놓으니 나간다느니 하는 것으로 불만이 많은 것 같은데, 일반 정직원을 뽑아도 마찬가지 현상이 발생한다. 이걸 가지고 병특한테 뭐라고 하는건 뭔가 이상한 그림이라고 생각되지 않는가?</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/202/feed</wfw:commentRss>
		</item>
		<item>
		<title>산업기능요원(병특) 에 대한 자격지심 가지지 마라. 이 짓도 나름 피곤하다. ㅡ_ㅜ</title>
		<link>http://dev.heartsavior.net/archives/197</link>
		<comments>http://dev.heartsavior.net/archives/197#comments</comments>
		<pubDate>Mon, 15 Sep 2008 16:16:12 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Think]]></category>

		<category><![CDATA[병특]]></category>

		<category><![CDATA[산업기능요원]]></category>

		<category><![CDATA[쓸데없는글인가]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=197</guid>
		<description><![CDATA[대체복무에 대한 심각한 자격지심을 가지고 있는 사람이 병특을 극하게 낮추는 꼴에 참지 못하고 글을 써 본다.
(참고로 리플을 쭉 살펴보면 알 수 있겠지만, 병특에 대한 이번 발언이 처음이 아니다.)
GPG에 리플 달아봐야 싸움판만 만들 뿐이다.
(그렇지 않아도 저 분 닉이나 이름으로 검색하면 나오는 GPG 글과 리플들을 미루어보아 상대할 가치가 없는 사람이라는 것을 알 수 있기 때문에&#8230;)
그렇기에 저 분에 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gpgstudy.com/forum/viewtopic.php?t=20961">대체복무에 대한 심각한 자격지심을 가지고 있는 사람이 병특을 극하게 낮추는 꼴</a>에 참지 못하고 글을 써 본다.<br />
(참고로 리플을 쭉 살펴보면 알 수 있겠지만, 병특에 대한 이번 발언이 처음이 아니다.)</p>
<p>GPG에 리플 달아봐야 싸움판만 만들 뿐이다.<br />
(그렇지 않아도 저 분 닉이나 이름으로 검색하면 나오는 GPG 글과 리플들을 미루어보아 상대할 가치가 없는 사람이라는 것을 알 수 있기 때문에&#8230;)<br />
그렇기에 저 분에 대한 험담은 &#8216;상대할 가치가 없다&#8217; 정도로 요약하고 끝내겠다.</p>
<p>싸움질에서 끝내는 대신 생산적인 이야기를 만들기 위해, &#8216;산업기능요원 현역 복무가 만기되어가는 S/W 개발자&#8217;로써 대체복무(정식으로는 산업기능요원, 아래부터는 병특이라 칭하겠다.) 에 대해 현재 가지고 있는(그리고 가지고 있었던) 생각에 대해 간단히 얘기해보고자 한다.<br />
내 경험도 있을 것이고 지인 경험도 있을 것이며 게시판 등에서 들은 얘기들도 있을 수 있다.<br />
내가 아무리 지인이 많고 병특에 대한 경험이 있으며 게시판 등에서 눈팅을 많이 할 지언정 모든 것에 대해 알 수는 없다. 대신, 일반적이라고 추측되어지는 이야기를 할 뿐이다. 그 점을 감안해서 생각해 주기 바란다.</p>
<p>일단, 병특이라는 게 보통은 군생활보다 쉽다는 것은 동의한다.<br />
(물론, 군생활 쉽게 하고 오는 사람들도 있다. 그리고 병특을 사람 대접도 못받고 신체가 위험한 상황에서 일하는 사람들도 있다. 이런 경우는 논외로 하고, 내 기준으로 그렇다는 이야기이다. 나도 육군 전역을 앞두고 있는 남동생이 있다.)</p>
<p>하지만, 보통의 사회 생활보다는 어렵다. 이건 확실한 근거가 있다.</p>
<p>모든 것은 몇 가지 안되는 전제조건에서 시작한다.</p>
<blockquote><p>1. 병특은 종사 중에 여러가지 이유로 페널티를 병무청으로부터 받을 수 있으며, 재입대를 받을 수도 있다.(이 때, 재입대시 종사로 인해 줄어드는 기간은 종사 기간의 1/4 정도이다. 즉, 4:1 로 산정된다.)<br />
2. 병특은 일반적인 기업-개인 간의 지원 경쟁을 완전히 무시해버리는 경쟁을 만들어낸다. 혜택도 혜택이겠지만 무엇보다 수요가 공급에 비해 엄청나게 적기 때문이다. 일반적인 4년제 대학생이 들어보지도 못했을 회사도 현역 T/O 가 있으면 외국 유학중인 대학생도 앞다투어 지원한다.</p></blockquote>
<p>먼저 1번에 대해 얘기를 하자면&#8230;</p>
<p>병특은 처음에 &#8216;성실종사서약서&#8217; 라는 것을 작성해서 병무청에 제출한다. 이는 병특 혜택자가 회사와 개인간의 관계만이 아닌 군인으로써의 의무도 함께 가지고 있으며, 군인으로써의 의무를 회사에 종사하면서 대체할 뿐임을 상기하게 하는 최초의 수단이다.<br />
그런 연유로, 병특은 하루만 무단 결근해도 재입대 처분을 받을 수 있다.<br />
뭐 이건 이해할 수 있다. 어찌보면 당연한 이야기이다. &#8216;무단&#8217; 이라는 전제가 붙었으니&#8230;</p>
<p>회사에서 부실 종사를 이유로 해고하면 &#8216;항소&#8217; 를 거쳐서 패배시에는 재입대 처분을 받는다.<br />
뭐, 여기까지도 이해한다. 성실하게 종사했다는 증거를 제출하라는데 하지 못한 사람 책임이라면 별 수 없는 일이다.</p>
<p>회사가 월급을 3개월 이상 체불하거나 문을 닫으면 병특은 3개월(기간 산정) + 3개월(요청에 의한 기간산정 외적) 의 기간을 받는다. 이 동안 회사를 구하지 못하면 재입대 처분을 받는다.<br />
근데, 병특이 6개월 이내로 남았다면 대체 어느 병특 회사에서 쉽사리 그 병특을 받겠는가?</p>
<p>이외에도 &#8216;회사보다 개인이 불리한&#8217; 페널티들이 있다.<br />
나도 아직 병특중이기 때문에 쉽사리 말하기 어려운 부분들이 있다. 그런 부분은 종사기간이 끝나고 말할 기회가 있었으면 좋겠지만&#8230; 굳이 그때 그래야 할 필요성이 있을지&#8230;<br />
(싸이를 떠올려보자&#8230; 종사기간이 끝난다고 안심할 수는 없다.)<br />
분명한 것은, 병무청에서 규정한 부실종사를 &#8216;개인 의사와 관계없이&#8217; 해야 하는 경우가 있다.<br />
IT S/W 업계에서는 나름 일반적인 일이기 때문에 대체 이딴 법이 있을 수 있는지 기가 막힌 노릇이다.</p>
<p>2번에 대해서도 이야기해 보자.<br />
산업기능요원이라는 이름으로 1년에 병역특례 혜택을 받는 사람은 매년 줄어들다가 최근 엄청나게 적어진 수를 유지하고 있다.(4급이 T/O가 생긴 것도 있고, 현역 T/O가 줄어들고 있는 것도 있다.)<br />
자본주의 시장에서 수요와 공급의 균형이 완전히 깨져버렸기 때문에 연봉과 스펙에서 회사가 칼자루를 쥐게 되었고, 이는 현재의 &#8216;인재를 싸게 굴리는&#8217; 병특의 이미지를 만들어버렸다.</p>
<p>하지만, 병특은 군인의 신분이기도 하지만 회사원이기도 하다.<br />
노사간의 갈등이 발생하면 &#8216;노동부&#8217; 에서 해결해야 한다. 4대보험 납부 다 하는 이른바 유리지갑이다.<br />
정직원의 의무에서 병특이 지키지 않아도 될 것은 하나도 없다. 그러므로, 병특이라는 이유로 정직원과 차별을 받을만한 그 어떠한 이유도 없다.<br />
(다행히도 적지 않은 회사가 &#8216;연봉&#8217;을 제외한 부분에서 정직원과 동일한 취급을 해 주고, 몇몇 회사는 연봉조차도 동일한 취급을 해 주고 있는 것으로 알고 있다. 언제나 그렇지만 일부가 문제이다.)</p>
<p>1, 2번을 가지고 회사가 병특을 가지고 노는 것도 있고, 병특 자신이 알아서 조심하는 경우도 있다.<br />
둘 다 회사가 병특에게 막강한 권한을 행사한다는 이야기이다.</p>
<p>병특도 나름대로 고충이 있고, 제한도 있다.<br />
병특을 병역면제라도 받은 마냥 비아냥거리지는 말아줬으면 좋겠다.<br />
본인도 육해공 현역들이 고생 많이 했고, 또 하고 있고, 그 사람들이 한국을 지키고 있기에 우리가 대체복무를 하고 있다는 점을 인정하고 있으니까 말이다.<br />
(아끼는 친구들, 형들, 아우들, 친동생 들이 육해공 현역을 다녀왔는데 내가 인정 안할 이유도 없지 않은가?)</p>
<p>ps. 나도 참&#8230; 쓸데없는 곳에 신경쓰이지 말아야 하는데&#8230; 이런 거에 매번 낚이는구나&#8230;OTL</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/197/feed</wfw:commentRss>
		</item>
		<item>
		<title>CVS loginfo(post-commit trigger) 작업</title>
		<link>http://dev.heartsavior.net/archives/190</link>
		<comments>http://dev.heartsavior.net/archives/190#comments</comments>
		<pubDate>Wed, 10 Sep 2008 14:45:56 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Tip.Tech]]></category>

		<category><![CDATA[cvs]]></category>

		<category><![CDATA[hook]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=190</guid>
		<description><![CDATA[(프로젝트 중에 CVS 를 연동해야 하는 작업이 있어서, 당분간은 CVS 사용 관련 포스팅이 이어질 것 같다.)
CVS 의 저장소에 변경이 일어나는 시점에(commit) 특정 명령을 수행하게 할 수 있다.
자세한 설명은 아래의 post를 참조하고&#8230;
@ Letting CVS Pull The Trigger
여러 trigger 가 있지만, 그 중 commit 이후 수행되는 trigger 는 loginfo 이다.
trigger 를 수정하는 방법 중 가장 안전한 것은 [...]]]></description>
			<content:encoded><![CDATA[<p>(프로젝트 중에 CVS 를 연동해야 하는 작업이 있어서, 당분간은 CVS 사용 관련 포스팅이 이어질 것 같다.)</p>
<p>CVS 의 저장소에 변경이 일어나는 시점에(commit) 특정 명령을 수행하게 할 수 있다.<br />
자세한 설명은 아래의 post를 참조하고&#8230;</p>
<blockquote><p><a href="http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/LettingCVSPullTheTrigger.rdoc">@ Letting CVS Pull The Trigger</a></p></blockquote>
<p>여러 trigger 가 있지만, 그 중 commit 이후 수행되는 trigger 는 loginfo 이다.</p>
<p>trigger 를 수정하는 방법 중 가장 안전한 것은 저장소의 CVSROOT 모듈을 checkout 하고 수정한 다음 commit 하는 것이다.</p>
<p>포스트를 참고로 해서 loginfo 에 한 줄을 추가해 넣었다.</p>
<blockquote><p>test/* (/cvs-log/postCommit.sh %p %{sVv} $USER)</p></blockquote>
<p>test 모듈의 모든 파일을 대상으로 commit 발생 시 /cvs-log/postCommit.sh 를 실행하겠다는 뜻이다.<br />
괄호 안의 내용들은 그대로 shell에서 실행되므로 실행될 argument 문자열을 입맛에 맞게 조절할 수 있다.</p>
<p>아래 인자들은 CVS에 의해 정보로 변환되어 들어간다.</p>
<blockquote><p>%p : 디렉토리 경로(모듈 경로가 포함됨. ex. test/DirectoryA/)<br />
%{sVv} : s 는 파일명, V 는 기존 버전 번호, v 는 신규 버전 번호<br />
$USER : commit 한 유저 아이디</p></blockquote>
<p>commit 시에 디렉토리 별로 shell 이 한 번 실행되는 것 같다. 예를 들면 commit 시에 변경 파일들이&#8230;</p>
<blockquote><p>test/DirA/A.txt 1.1 -&gt; 1.2<br />
test/DirA/B.txt 신규(1.1)<br />
test/DirB/C.txt 삭제(기존 1.3)<br />
test/DirB/D.txt 1.3 -&gt; 1.4</p></blockquote>
<p>이라면 shell 은 이렇게 실행되었다.</p>
<blockquote><p>/cvs-log/postCommit.sh test/DirA/ A.txt 1.1 1.2 B.txt NONE 1.1 cvsuser<br />
/cvs-log/postCommit.sh test/DirB/ C.txt 1.3 NONE D.txt 1.3 1.4 cvsuser</p></blockquote>
<p>예외 사항이 있다면, 디렉토리는 ADD 할 때 바로 hook 이 동작한다. 디렉토리 자체가 cvs에서는 commit 으로 추가되는 개체가 아니다.<br />
그리고 파일과 구분하기 위해서, 디렉토리는 파일 명 부분에 &#8216;-&#8217; 가 한 번 들어온다. (이후에 New, directory 가 더 들어오는데 알아서 걸러내면 된다.) 버전은 NONE NONE 으로 들어오니 이를 통해 구분해도 될 것으로 보인다.</p>
<p>CVS 는 디렉토리를 삭제할 수 없다. 저장소(물리적인 위치) 에서 직접 rm -rf 명령으로 삭제하여야 한다. 그러므로 디렉토리 삭제에 대한 감지는 되지 않는다.</p>
<p>postCommit.sh 자리에는 실행 가능한 어떠한 것이라도 올 수 있다. 여기서는 shell script 를 적었지만 그냥 막바로 프로그램을 돌릴 수도 있다. 링크된 post에서는 cvs 의 commit 이 block되기 때문에 처리가 많이 걸리는 것은 직접 걸어두지 말고 프로세스를 하나 더 두는 것을 제시하고 있다.</p>
<p>작업시 주의해야 할 것은, cvsd 설치 시에 chroot jail 설정을 한 경우에는 loginfo 가 실행하는 디렉토리 경로도 chroot가 적용된다는 것이다. (이것때문에 거의 반나절 가까이 보냈다.)<br />
loginfo 가 실행해 주는 셸 내에서도 chroot가 적용되는 것으로 확인했다. (프로그램도 아마 마찬가지가 아닐까 생각된다.)</p>
<p>위의 예를 들자면, cvsd가 /var/lib/cvsd 에 설치되고 chroot 가 /var/lib/cvsd 로 설정되어 있다면, postCommit.sh 파일은 /var/lib/cvsd/cvs-log/ 에 위치해 있어야 한다.</p>
<p>그리고, sh(shell 실행파일) 이라던지 cat, date 등이 없기 때문에 필요하다면 chroot 의 해당 디렉토리로 복사해 넣어야 한다.</p>
<p>윈도우즈에서만 작업하다가 linux 작업을 하다 보니 chroot 에 대해 전혀 모르고 있다가 된통 당할 뻔했다.</p>
<p>ps. 작업환경은 <span style="line-height: 160%;">우분투 OS 에 cvsd 패키지를 설치했고, CVS 버전은 1.12.13 (client/server) 이다.</span></p>
<p>ps2. received broken pipe signal 에러가 나서 한참 고생했을 때 chroot 문제임을 알게 해 준 포스트</p>
<blockquote><p><a href="http://ch.tudelft.nl/~arthur/cvsd/faq.html">@ cvsd: frequently asked questions</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/190/feed</wfw:commentRss>
		</item>
		<item>
		<title>납기와 품질의 외줄타기(결론없는 뻘글일 가능성 99%)</title>
		<link>http://dev.heartsavior.net/archives/186</link>
		<comments>http://dev.heartsavior.net/archives/186#comments</comments>
		<pubDate>Sat, 06 Sep 2008 19:19:31 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Think]]></category>

		<category><![CDATA[납기]]></category>

		<category><![CDATA[뻘글]]></category>

		<category><![CDATA[타협]]></category>

		<category><![CDATA[품질]]></category>

		<category><![CDATA[프로그래밍 이야기]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=186</guid>
		<description><![CDATA[저녁에 알바질하다가 우연찮게 든 생각&#8230;
병특도 이제 막바지에 이르러서&#8230; 거진 3년동안 일해온 것을 되돌아봤는데&#8230;
연차가 올라갈수록 더욱 견고하고 가독성 좋으면서 유연한 코드를 작성할 수 있는 능력에 중점을 둘 거라 생각했는데, 회사에서 요구하는 건 연차가 올라갈수록 같은 작업을 빠르게 하고, 동시에 여러 작업을 해내는 능력이었다.
퀄리티라는 건 자기만족이고&#8230; 그걸 회사에서 인정해 준다거나 하는 것은 아니었다.
(코드 리뷰가 없고 한두 사람이 [...]]]></description>
			<content:encoded><![CDATA[<p>저녁에 알바질하다가 우연찮게 든 생각&#8230;</p>
<p>병특도 이제 막바지에 이르러서&#8230; 거진 3년동안 일해온 것을 되돌아봤는데&#8230;</p>
<p>연차가 올라갈수록 더욱 견고하고 가독성 좋으면서 유연한 코드를 작성할 수 있는 능력에 중점을 둘 거라 생각했는데, 회사에서 요구하는 건 연차가 올라갈수록 같은 작업을 빠르게 하고, 동시에 여러 작업을 해내는 능력이었다.</p>
<p>퀄리티라는 건 자기만족이고&#8230; 그걸 회사에서 인정해 준다거나 하는 것은 아니었다.<br />
(코드 리뷰가 없고 한두 사람이 한 분야씩 책임지는 시스템이다보니 어찌보면 당연한 일일지도&#8230;)</p>
<p>그래서 코드가 정리가 덜 되더라도 어쩔수 없는 타협을 할 때가 종종 있었다.<br />
내가 아직 능력이 부족해서인지 몰라도 코드를 내가 원하는 이상향의 퀄리티까지 뽑으면서 납기를 맞추는 건 너무 어렵다&#8230; ㅜ.ㅜ</p>
<p>음&#8230; 작은 회사를 경험했기 때문에 이렇게 생각하는걸까? 개발 프로세스가 정립된 회사는 다를까?</p>
<p>이제 사회로 나오면 그 중간 과정이 어떻든(대학원을 가던지, 졸업 후 바로 취직을 하던지) 새로 할 취직은 큰 규모의 회사로 갈 생각인데, 거기에서는 내가 &#8216;만족할 만한 퀄리티&#8217;의 소스 코드를 작성할 시간이 허용될지, 아니면 또 납기와 품질의 외줄타기를 해야 할지&#8230;</p>
<p>납기를 최우선의 가치로 하자니, 코드 퀄리티에 문제가 생겨서 나중에 일이 터졌을 때 야근하고, 품질을 최우선의 가치로 하자니, 차후 확장성 고려하다 보면 오버디자인이 될 때가 많고, 오버예외처리도 많아서 그것때문에 야근하니&#8230;</p>
<p>결국 한국 말 중에서 가장 어렵다는 그 &#8216;적당한&#8217; 선에서 타협하는 게 답일라나?</p>
<p>타협이 필요한 답들은 언제나 어렵다&#8230; 타협점 자체가 다른 &#8216;문제&#8217; 니까&#8230;</p>
<p>프로젝트 할 때마다 도인(혹은 구루)이 나타나서 &#8220;타협점은 여기다~&#8221; 라고 알려주신다면 감사할 듯&#8230;<br />
(그래서 배울 수 있는 회사가 나에게는 절실한 듯 하다.)</p>
<p>ps. 역시나 쓰다보니 정리가 안되는구나&#8230;ㅋㅋ</p>
<p>ps2. <a href="http://gall.dcinside.com/list.php?id=programming&amp;no=87946&amp;page=1">같은 주제로 프갤에 올린 글</a>(자반칼치 님과의 의견교환 재밌었음 <img src='http://dev.heartsavior.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 주말 새벽에 올려서 호응도는 없었지만&#8230; 평일 오후에 올렸으면 여러 개발자들과 의견교환 할 수 있지 않을까 싶긴 한데, 당장 글로 정리하지 않으면 금방 까먹었을 듯&#8230;)</p>
<p>ps3. 궁극적인 목표는 야근하지 않고 일하는 거&#8230; 평생의 이상향임.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/186/feed</wfw:commentRss>
		</item>
		<item>
		<title>순수 자바를 이용하여 JVM을 죽게 하는 프로그램을 어떻게 짤까?</title>
		<link>http://dev.heartsavior.net/archives/182</link>
		<comments>http://dev.heartsavior.net/archives/182#comments</comments>
		<pubDate>Mon, 25 Aug 2008 16:36:47 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Lang.Java]]></category>

		<category><![CDATA[crash]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[jvm]]></category>

		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=182</guid>
		<description><![CDATA[순수 자바를 이용하여 JVM을 죽게 하는 프로그램을 어떻게 짜죠?
&#8216;사랑하지 않으면 떠나라&#8217; 의 한 챕터에서 제시하는, 자바 고급 프로그래머에 대한 면접 내용이다.
처음에 이 문제를 접했을 때 잠깐 착각을 해서 &#8216;순수 자바를 이용하여&#8217; 라는 부분을 염두에 두지 못했다.
이 전제가 없으면 가장 편하게 생각할 수 있는 방법은 JNI 이다. JNI에서 C/C++ 라이브러리를 호출하고, 라이브러리 내부에서 런타임 에러로 crash [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>순수 자바를 이용하여 JVM을 죽게 하는 프로그램을 어떻게 짜죠?</p></blockquote>
<p>&#8216;사랑하지 않으면 떠나라&#8217; 의 한 챕터에서 제시하는, 자바 고급 프로그래머에 대한 면접 내용이다.</p>
<p>처음에 이 문제를 접했을 때 잠깐 착각을 해서 &#8216;순수 자바를 이용하여&#8217; 라는 부분을 염두에 두지 못했다.</p>
<p>이 전제가 없으면 가장 편하게 생각할 수 있는 방법은 JNI 이다. JNI에서 C/C++ 라이브러리를 호출하고, 라이브러리 내부에서 런타임 에러로 crash 상태를 만들면(잘못된 메모리 참조 같은 쉬운 방법을 이용하자) JVM 도 crash 가 발생하게 된다. 견고한 JVM 을 피해서 돌아가는 답안이라고 할 수 있다. 그만큼 JNI 라이브러리를 작성할 때는 심혈을 기울여야 한다는 뜻이기도 하다.</p>
<p>하지만, &#8216;순수 자바를 이용하여&#8217; 라는 전제가 붙는 것을 확인하고는 답을 낼 수 없었다. 자바 코드 내에서 발생하는 오류는 모두 Exception 이나 Error 로 잡힌다고 생각했던 것도 있고, JVM 내부는 공부해 본 적이 없기 때문이기도 했다.</p>
<p>그러다 오늘, 프로그래밍 갤러리에서 <a href="http://gall.dcinside.com/list.php?id=programming&amp;no=86147">DriverManager Vulnerability</a> 라는 글이 올라왔고, 약간의 논쟁 후에 immutable 속성인 String 클래스의 private field 를 수정하는 아이디어가 나타났다.<br />
reflection을 몰라서 가능할 것이라고는 전혀 생각하지 못했다.<br />
근데&#8230; reflection을 통해서 String 클래스의 private field 를 변경하는 글이 올라왔다. (<a href="http://gall.dcinside.com/list.php?id=programming&amp;no=86155">첫번째 글</a> / <a href="http://gall.dcinside.com/list.php?id=programming&amp;no=86158">두번째 글</a>)<br />
이것 자체로도 나에게는 상당히 신기한 일이었다.<br />
C/C++ 언어를 주로 다뤘던지라, 캡슐화는 견고함을 보장한다라고 생각을 하고 있었는데, reflection 으로 private field의 access 권한을 획득해버렸다.</p>
<p>근데, 첫번째 글의 결과를 보니&#8230; JVM이 죽었다!?</p>
<p>글에 적힌 crash 로그를 살펴보니 jre 1.5 버전이다.<br />
같은 코드를 eclipse 에서 구현하여 해당 프로젝트의 JDK와 JRE를 1.5로 맞추었다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p182code4'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1824"><td class="code" id="p182code4"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">String</span> abc <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> def <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;abc&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">Field</span> declaredField <span style="color: #339933;">=</span> <span style="color: #003399;">String</span>.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getDeclaredField</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;value&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
declaredField.<span style="color: #006633;">setAccessible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> abcArray <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> declaredField.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>abc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
abcArray<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'d'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>def<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>해당 코드를 호출했다. 역시, JVM이 crash되었다.</p>
<blockquote><p>#<br />
# An unexpected error has been detected by HotSpot Virtual Machine:<br />
#<br />
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0&#215;00aea4fc, pid=1764, tid=1672<br />
#<br />
# Java VM: Java HotSpot(TM) Client VM (1.5.0_16-b02 mixed mode, sharing)<br />
# Problematic frame:<br />
# j  net.heartsavior.dev.JVMDeath.crashJVMUsingStringObject()V+24<br />
#<br />
# An error report file with more information is saved as hs_err_pid1764.log<br />
#<br />
# If you would like to submit a bug report, please visit:<br />
#   http://java.sun.com/webapps/bugreport/crash.jsp<br />
#</p></blockquote>
<p>뭐&#8230; 그래서 결론은 JVM 이 죽는 코드를 &#8216;구현했다&#8217; 가 아닌 &#8216;발견했다&#8217; 이고, 그나마 위의 코드는 1.6에서는 통하지 않는다&#8230;;;<br />
<strong>위의 코드를 1.6에서 돌리면 정상적으로(라고 해야될라나) &#8216;def&#8217; 가 출력된다.</strong><br />
( 이게 1.5만의 버그인지, 1.5 이하 공통 버그였다가 1.6에서 수정된 것인지는 잘 모르겠다. 귀찮다;; )</p>
<p>ps. 잘 생각해 보면 1.6도 JVM 이 죽지 않는다 뿐이지, String 클래스가 immutable 에서 해방될 수 있다&#8230;<br />
즉, &#8221; &#8216;뻘짓을 하지 않고 정식 루트로 접근할 경우&#8217; String 클래스는 immutable 이다 &#8221; 라고 할 수 있겠다. -_-;;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/182/feed</wfw:commentRss>
		</item>
		<item>
		<title>XP tweak 배포판 고발 건에 대한 생각</title>
		<link>http://dev.heartsavior.net/archives/180</link>
		<comments>http://dev.heartsavior.net/archives/180#comments</comments>
		<pubDate>Sun, 24 Aug 2008 16:35:58 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Think]]></category>

		<category><![CDATA[MS]]></category>

		<category><![CDATA[XP tweak]]></category>

		<category><![CDATA[소송]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=180</guid>
		<description><![CDATA[아는 사람은 알겠지만, JMXP 라는 Windows XP tweak 배포판이 MS에 의해 고발되었다.
무려 합의금으로 6억원이 제시되었다는데&#8230; 6억원이면 XP 1부 를 아주 넉넉하게 40만원씩 잡아도 1500부 에 상당하는 액수이다.
게다가 개인이 6억원을 합의로 처리할 리가 없는 일&#8230; 당연히 합의해 줄 의향이 없다는 표현으로 제시한 액수일 것이다.
tweak 자체가 합법적이지 않기 때문에 제작자가 죄값을 치러야 하는 것은 어쩔 수 없는 [...]]]></description>
			<content:encoded><![CDATA[<p>아는 사람은 알겠지만, JMXP 라는 Windows XP tweak 배포판이 MS에 의해 고발되었다.<br />
무려 합의금으로 6억원이 제시되었다는데&#8230; 6억원이면 XP 1부 를 아주 넉넉하게 40만원씩 잡아도 1500부 에 상당하는 액수이다.<br />
게다가 개인이 6억원을 합의로 처리할 리가 없는 일&#8230; 당연히 합의해 줄 의향이 없다는 표현으로 제시한 액수일 것이다.</p>
<p>tweak 자체가 합법적이지 않기 때문에 제작자가 죄값을 치러야 하는 것은 어쩔 수 없는 일이라 쳐도&#8230;<br />
분명 현실적인 합의금을 제시하여 경각심도 주고 일도 너무 크게 벌이지 않을 수도 있는데, 합의 자체를 못하게 만들어서 굳이 배포자 인생에 빨간 줄을 그어버리겠다 - 적어도 한국에서 빨간 줄이 그어진다라는 것은 엄청난 낙인이라고 생각한다 - 는 MS의 정책은 조금 아쉽다. 아니, 무섭다.</p>
<p>MS가 배포판에 대해 사전 경고를 했는지 안했는지가 나로써는 정말 궁금하다.<br />
사전 경고 조치라는 노력 정도는 MS에서 했었길 바란다.<br />
해결책으로 꼭 여러 사람 빨간 줄 긋는 방법만 있는 건 아닐 것이다.<br />
다른 방법이 있다면, 먼저 시도를 해서 통하지 않으면 그 때 조치를 취해도 되지 않을까?<br />
힘 있는 기업이 힘 없는 개인 찍어누르는 데 온 힘을 기울일 필요는 없는 것 아닌가&#8230;</p>
<p>다시 한 번 정리하자면, JMXP 제작자가 죄를 저지른 것도 사실이고 죄 값을 치러야 하는 것도 사실이지만, 개인을 상대로 한 소송에서 극단적인 처벌을 요구한다는 면은 솔직히 좀 아쉬울 따름이다.<br />
뭐라 할 처지는 안되고, 그저 아쉽다고&#8230;</p>
<p>ps. 솔직히 XP 를 tweak 해서 드라이버를 포함시키는 방법이 정말 유용한 방법이긴 하다.<br />
SATA 드라이버나 RAID 드라이버가 XP 순정에 없으면&#8230; 정말 좌절의 상황이 오기 때문이다.<br />
XP 가 처음 등장했을 때에도 플로피 드라이브를 장착하는 PC들이 별로 없었거나 감소 추세였던 것으로 아는데, 지금이라도 다른 개선을 보여 줄 수는 없는 것인가?<br />
&#8216;Vista 는 그럴 필요 없으니 Vista 를 사라&#8217; 는 답이라고 할 수는 없을 것 같다.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/180/feed</wfw:commentRss>
		</item>
		<item>
		<title>Thread Pool 을 별다른 설정 없이 간단하게 사용하는 방법</title>
		<link>http://dev.heartsavior.net/archives/177</link>
		<comments>http://dev.heartsavior.net/archives/177#comments</comments>
		<pubDate>Mon, 11 Aug 2008 09:14:58 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Lang.Java]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[ThreadPool]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=177</guid>
		<description><![CDATA[* Thread Pool 을 별다른 설정 없이 간단하게 사용하는 방법
ExecutorService service = Executors.newFixedThreadPool(CONCURRENT_THREAD_COUNT);
&#8230;
service.execute(new Runnable() { public void run() { &#8230; } });
&#8230;
service.shutdown();
(짧기 때문에 code-highlight 를 적용하지 않았음)
java.util.concurrent.Executor와 그의 친구들을 사용하면 두세 줄로 해결
이런 유용한 메소드를 지원해 준다는 건 상당히 마음에 든다. J2SE 만세~!!
ps. 좀 더 복잡하게 사용하는 방법은 아래 링크 참조(매번 이런 식이지&#8230;)
@ ThreadpoolExecutor
]]></description>
			<content:encoded><![CDATA[<p>* Thread Pool 을 별다른 설정 없이 간단하게 사용하는 방법</p>
<blockquote><p>ExecutorService service = Executors.newFixedThreadPool(CONCURRENT_THREAD_COUNT);</p>
<p>&#8230;</p>
<p>service.execute(new Runnable() { public void run() { &#8230; } });</p>
<p>&#8230;</p>
<p>service.shutdown();</p></blockquote>
<p>(짧기 때문에 code-highlight 를 적용하지 않았음)</p>
<p>java.util.concurrent.Executor와 그의 친구들을 사용하면 두세 줄로 해결</p>
<p>이런 유용한 메소드를 지원해 준다는 건 상당히 마음에 든다. J2SE 만세~!!</p>
<p>ps. 좀 더 복잡하게 사용하는 방법은 아래 링크 참조(매번 이런 식이지&#8230;)</p>
<blockquote><p><a href="http://programmingexamples.wikidot.com/threadpoolexecutor">@ ThreadpoolExecutor</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/177/feed</wfw:commentRss>
		</item>
		<item>
		<title>ASP로 AJAX &#038; Cross Domain 해결하기</title>
		<link>http://dev.heartsavior.net/archives/170</link>
		<comments>http://dev.heartsavior.net/archives/170#comments</comments>
		<pubDate>Mon, 04 Aug 2008 13:34:21 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Tip.Tech]]></category>

		<category><![CDATA[AJAX]]></category>

		<category><![CDATA[ASP]]></category>

		<category><![CDATA[Cross-Domain]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=170</guid>
		<description><![CDATA[우선 AJAX 개념이 필요하다면 아래 포스트들을 참조&#8230;
@ Head Rush Ajax / 동기 &#38; 비동기 + AJAX 기본 흐름
@ ASP + AJAX Step 1 / Step 2 / Step 3
ASP 사이트에서 IIS 외의 웹 서버에서 AJAX 요청을 수행하려고 했지만, Cross Domain 정책에 막혀 실패했다.
구글링을 열심히 해 본 결과, 몇 가지 방법을 찾을 수 있었다. (방법들이 깔끔하게 [...]]]></description>
			<content:encoded><![CDATA[<p>우선 AJAX 개념이 필요하다면 아래 포스트들을 참조&#8230;</p>
<blockquote><p><a href="http://blog.naver.com/tijhhhw/100050978912">@ Head Rush Ajax / 동기 &amp; 비동기 + AJAX 기본 흐름</a><br />
@ ASP + AJAX <a href="http://blog.naver.com/swogjs/50023008607">Step 1</a> / <a href="http://blog.naver.com/swogjs/50023213761">Step 2</a> / <a href="http://blog.naver.com/swogjs/50025261363">Step 3</a></p></blockquote>
<p>ASP 사이트에서 IIS 외의 웹 서버에서 AJAX 요청을 수행하려고 했지만, Cross Domain 정책에 막혀 실패했다.</p>
<p>구글링을 열심히 해 본 결과, 몇 가지 방법을 찾을 수 있었다. (방법들이 깔끔하게 요약된 포스트가 있어서 링크한다.)</p>
<blockquote><p><a href="http://snook.ca/archives/javascript/cross_domain_aj/">@ Cross Domain Ajax: a Quick Summary</a></p></blockquote>
<p>그 중에 Web Proxy 를 사용하기로 결정!<br />
가장 쉬워보였고, 무엇보다 야후 개발자 네트워크에 설명되어 있어서&#8230;;;<br />
야후 OpenAPI 를 이런 식으로 사용하길 권장하는 것이니 괜찮은 방법일 것으로 보인다.</p>
<blockquote><p><a href="http://developer.yahoo.com/javascript/howto-proxy.html">@ Use a Web Proxy for Cross-Domain XMLHttpRequest Calls - Yahoo! Developer Network</a></p></blockquote>
<p>위의 포스트에는 PHP 로 proxy 를 만들어서 쓰고 있는데, ASP 사이트이기 때문에 ASP 로 proxy 를 만들어 보려 했지만 결국 실력이 딸려 <a href="http://gall.dcinside.com/list.php?id=programming&amp;no=83898&amp;page=3">프로그래밍 갤러리에 약간의 도움을 받고</a>(<a href="http://gall.dcinside.com/list.php?id=programming&amp;no=83892&amp;page=3">도움 요청글</a>) 코드를 정리해서 완성했다.<br />
(JSP로는 껌일 것 같은데 ASP는 전혀 모르겠다&#8230; &#8216;어플 프로그래머니까&#8230;&#8217; 라는 핑계를&#8230;-_-;; )</p>
<p>먼저 내가 갖고 있었던, Cross-Domain의 문제를 가지고 있던 코드를 내부 페이지를 호출하도록 변경&#8230;</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p170code7'); return false;">View Code</a> ASP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1707"><td class="code" id="p170code7"><pre class="asp" style="font-family:monospace;"><span style="color: #006600; font-weight: bold">&lt;</span>html<span style="color: #006600; font-weight: bold">&gt;</span>
	<span style="color: #006600; font-weight: bold">&lt;</span>head<span style="color: #006600; font-weight: bold">&gt;</span>
		<span style="color: #006600; font-weight: bold">&lt;</span>title<span style="color: #006600; font-weight: bold">&gt;</span>AJAX TEST - FROM SimpleHttpServer<span style="color: #006600; font-weight: bold">&lt;/</span>title<span style="color: #006600; font-weight: bold">&gt;</span>
&nbsp;
		<span style="color: #006600; font-weight: bold">&lt;</span>script<span style="color: #006600; font-weight: bold">&gt;</span>
			<span style="color: #0000ff; font-weight: bold;">function</span> newXMLHttpRequest<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
				<span style="color: #0000ff; font-weight: bold;">var</span> xmlreq <span style="color: #006600; font-weight: bold">=</span> <span style="color: #0000ff; font-weight: bold;">false</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #ff6600;">// IE가 아닌 브라우저</span>
				<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span>window.<span style="color: #9900cc;">XMLHttpRequest</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					xmlreq <span style="color: #006600; font-weight: bold">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> XMLHttpRequest<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #006600; font-weight:bold">&#125;</span> 
				<span style="color: #ff6600;">// IE</span>
				<span style="color: #990099; font-weight: bold;">else</span> <span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span>window.<span style="color: #9900cc;">ActiveXObject</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					try <span style="color: #006600; font-weight:bold">&#123;</span>
						<span style="color: #ff6600;">// 최근 IE</span>
						xmlreq <span style="color: #006600; font-weight: bold">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> ActiveXObject<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;Msxml2.XMLHTTP&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
					<span style="color: #006600; font-weight:bold">&#125;</span> catch<span style="color: #006600; font-weight:bold">&#40;</span>e1<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
						try <span style="color: #006600; font-weight:bold">&#123;</span>
							<span style="color: #ff6600;">// 예전 IE</span>
							xmlreq <span style="color: #006600; font-weight: bold">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> ActiveXObject<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;Microsoft.XMLHTTP&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
						<span style="color: #006600; font-weight:bold">&#125;</span> catch<span style="color: #006600; font-weight:bold">&#40;</span>e2<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
							<span style="color: #ff6600;">// ALL FAILED !!</span>
						<span style="color: #006600; font-weight:bold">&#125;</span>
					<span style="color: #006600; font-weight:bold">&#125;</span>
				<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
				return xmlreq<span style="color: #006600; font-weight: bold">;</span>
			<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
			<span style="color: #0000ff; font-weight: bold;">function</span> getNewID<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
				<span style="color: #0000ff; font-weight: bold;">var</span> req <span style="color: #006600; font-weight: bold">=</span> newXMLHttpRequest<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #ff6600;">// CALLBACK 메소드로 getReadyStateHandler를 등록</span>
				<span style="color: #0000ff; font-weight: bold;">var</span> handlerFunction <span style="color: #006600; font-weight: bold">=</span> getReadyStateHandler<span style="color: #006600; font-weight:bold">&#40;</span>req, showNewID<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
				req.<span style="color: #9900cc;">onreadystatechange</span> <span style="color: #006600; font-weight: bold">=</span> handlerFunction<span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #ff6600;">// 첫번째 파라미터 - 방식(GET or POST)</span>
				<span style="color: #ff6600;">// 두번째 파라미터 - 주소</span>
				<span style="color: #ff6600;">// 세 번째 파라미터 - 비동기 여부(true가 비동기, false는 동기)</span>
				req.<span style="color: #330066;">open</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;GET&quot;</span>,<span style="color: #cc0000;">&quot;veoh.asp&quot;</span>,<span style="color: #0000ff; font-weight: bold;">true</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #ff6600;">// POST 이면 헤더도 바꿈</span>
				<span style="color: #008000;">/*
				req.setRequestHeader(&quot;Content-type&quot;, 
					&quot;application/x-www-form-urlencoded&quot;);
				*/</span>
&nbsp;
				<span style="color: #ff6600;">// 쿼리 스트링이 있을 경우 파라미터로 작성</span>
				req.<span style="color: #330066;">send</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #0000ff; font-weight: bold;">null</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
			<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
			<span style="color: #0000ff; font-weight: bold;">function</span> getReadyStateHandler<span style="color: #006600; font-weight:bold">&#40;</span>req, responseJSONHandler<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
				return <span style="color: #0000ff; font-weight: bold;">function</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					<span style="color: #ff6600;">// AJAX에서 데이터를 완전히 얻어온 상태</span>
					<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span>req.<span style="color: #9900cc;">readyState</span> <span style="color: #006600; font-weight: bold">==</span> <span style="color: #800000;">4</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
						<span style="color: #ff6600;">// 웹 서버에서 코드 200(성공) 을 리턴하였음</span>
						<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span>req.<span style="color: #330066;">status</span> <span style="color: #006600; font-weight: bold">==</span> <span style="color: #800000;">200</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
							<span style="color: #ff6600;">// TEXT(JSON) DATA 가 req.responseText에 들어 있음</span>
&nbsp;
							<span style="color: #ff6600;">// responseJSONHandler 파라미터로 넘어온 함수를 호출</span>
							responseJSONHandler<span style="color: #006600; font-weight:bold">&#40;</span>req.<span style="color: #9900cc;">responseText</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
						<span style="color: #006600; font-weight:bold">&#125;</span> <span style="color: #990099; font-weight: bold;">else</span> <span style="color: #006600; font-weight:bold">&#123;</span>
							alert<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;HTTP error: &quot;</span> + req.<span style="color: #330066;">status</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
						<span style="color: #006600; font-weight:bold">&#125;</span>
					<span style="color: #006600; font-weight:bold">&#125;</span>
				<span style="color: #006600; font-weight:bold">&#125;</span>
			<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
			<span style="color: #ff6600;">// 실제 처리가 이루어지는 함수</span>
			<span style="color: #0000ff; font-weight: bold;">function</span> showNewID<span style="color: #006600; font-weight:bold">&#40;</span>idJSON<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
				<span style="color: #ff6600;">// JSON 문자열이 비었으면 에러</span>
				<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span> idJSON <span style="color: #006600; font-weight: bold">==</span> <span style="color: #0000ff; font-weight: bold;">null</span> <span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					alert<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;idJSON is null!!&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
					return<span style="color: #006600; font-weight: bold">;</span>
				<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
				alert<span style="color: #006600; font-weight:bold">&#40;</span>idJSON<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #ff6600;">// 일반 문자열에서 JSON으로 변환</span>
				<span style="color: #0000ff; font-weight: bold;">var</span> jsonObject <span style="color: #006600; font-weight: bold">=</span> eval<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #008000;">'(' + idJSON + ')');</span>
&nbsp;
				<span style="color: #ff6600;">// error 프로퍼티를 얻음</span>
				<span style="color: #0000ff; font-weight: bold;">var</span> <span style="color: #990099; font-weight: bold;">error</span> <span style="color: #006600; font-weight: bold">=</span> jsonObject.<span style="color: #990099; font-weight: bold;">error</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span> <span style="color: #990099; font-weight: bold;">error</span> <span style="color: #006600; font-weight: bold">==</span> <span style="color: #0000ff; font-weight: bold;">null</span> <span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					alert<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;JSON Parse Failed!!&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
					return<span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #006600; font-weight:bold">&#125;</span> 
				<span style="color: #ff6600;">// 성공할 경우 에러 코드 0, 실패할 경우  &gt; 0을 넣어놓도록 되어 있음</span>
				<span style="color: #990099; font-weight: bold;">else</span> <span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span> <span style="color: #990099; font-weight: bold;">error</span> <span style="color: #006600; font-weight: bold">&gt;</span> <span style="color: #800000;">0</span> <span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					alert<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;ERROR Returned!! Error Code : &quot;</span> + <span style="color: #990099; font-weight: bold;">error</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
					return<span style="color: #006600; font-weight: bold">;</span>
				<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
				<span style="color: #ff6600;">// ID 프로퍼티를 얻음</span>
				<span style="color: #0000ff; font-weight: bold;">var</span> id <span style="color: #006600; font-weight: bold">=</span> jsonObject.<span style="color: #9900cc;">ID</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
				<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span> id <span style="color: #006600; font-weight: bold">==</span> <span style="color: #0000ff; font-weight: bold;">null</span> <span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					alert<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;JSON Parse Failed!!&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
					return<span style="color: #006600; font-weight: bold">;</span>
				<span style="color: #006600; font-weight:bold">&#125;</span> <span style="color: #990099; font-weight: bold;">else</span> <span style="color: #006600; font-weight:bold">&#123;</span>
					<span style="color: #ff6600;">// 얻어온 ID값을 출력</span>
					alert<span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;ID Received!! ID : &quot;</span> + id<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
				<span style="color: #006600; font-weight:bold">&#125;</span>
			<span style="color: #006600; font-weight:bold">&#125;</span>
		<span style="color: #0000ff; font-weight: bold;">&lt;/script&gt;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold">&lt;/</span>head<span style="color: #006600; font-weight: bold">&gt;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold">&lt;</span>body<span style="color: #006600; font-weight: bold">&gt;</span>
	<span style="color: #006600; font-weight: bold">&lt;</span>button onclick<span style="color: #006600; font-weight: bold">=</span><span style="color: #cc0000;">&quot;getNewID()&quot;</span><span style="color: #006600; font-weight: bold">&gt;</span>새 아이디 얻기<span style="color: #006600; font-weight: bold">&lt;/</span>button<span style="color: #006600; font-weight: bold">&gt;</span>
	<span style="color: #006600; font-weight: bold">&lt;/</span>body<span style="color: #006600; font-weight: bold">&gt;</span>
<span style="color: #006600; font-weight: bold">&lt;/</span>html<span style="color: #006600; font-weight: bold">&gt;</span></pre></td></tr></table></div>

<p>AJAX로 내부 사이트의 proxy 페이지를 호출하며, proxy 페이지로 veoh.asp 를 사용한다.<br />
veoh.asp 에서 외부 사이트의 내용을 넘겨주기만 하면 된다.<br />
Cross-Domain 을 위한 ASP Proxy 페이지(veoh.asp) 는 아래와 같다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p170code8'); return false;">View Code</a> ASP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1708"><td class="code" id="p170code8"><pre class="asp" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">&lt;%</span> <span style="color: #006600; font-weight: bold">@</span>LANGUAGE<span style="color: #006600; font-weight: bold">=</span><span style="color: #cc0000;">&quot;JSCRIPT&quot;</span> CODEPAGE<span style="color: #006600; font-weight: bold">=</span><span style="color: #cc0000;">&quot;65001&quot;</span> <span style="color: #0000ff; font-weight: bold;">%&gt;</span>
<span style="color: #0000ff; font-weight: bold;">&lt;%</span>
	<span style="color: #ff6600;">// Custom Functions</span>
	<span style="color: #0000ff; font-weight: bold;">function</span> $_GET<span style="color: #006600; font-weight:bold">&#40;</span>values<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
		return <span style="color: #990099; font-weight: bold;">Request</span>.<span style="color: #330066;">QueryString</span><span style="color: #006600; font-weight:bold">&#40;</span>values<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">!=</span><span style="color: #cc0000;">&quot;undefined&quot;</span><span style="color: #006600; font-weight: bold">?</span><span style="color: #990099; font-weight: bold;">String</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #990099; font-weight: bold;">Request</span>.<span style="color: #330066;">QueryString</span><span style="color: #006600; font-weight:bold">&#40;</span>values<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">:</span><span style="color: #0000ff; font-weight: bold;">null</span><span style="color: #006600; font-weight: bold">;</span>
	<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
	<span style="color: #0000ff; font-weight: bold;">function</span> echo<span style="color: #006600; font-weight:bold">&#40;</span>values<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
		<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold">&#40;</span>values<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
	<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
	<span style="color: #ff6600;">// Define Timeout Limit</span>
	<span style="color: #990099; font-weight: bold;">Server</span>.<span style="color: #9900cc;">ScriptTimeout</span> <span style="color: #006600; font-weight: bold">=</span> <span style="color: #800000;">10</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
	Object.<span style="color: #9900cc;">prototype</span>.<span style="color: #9900cc;">toParam</span> <span style="color: #006600; font-weight: bold">=</span> <span style="color: #0000ff; font-weight: bold;">function</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight:bold">&#123;</span>
		<span style="color: #0000ff; font-weight: bold;">var</span> <span style="color: #330066;">querystring</span> <span style="color: #006600; font-weight: bold">=</span> <span style="color: #006600; font-weight:bold">&#91;</span><span style="color: #006600; font-weight:bold">&#93;</span><span style="color: #006600; font-weight: bold">;</span>
		<span style="color: #990099; font-weight: bold;">for</span> <span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #0000ff; font-weight: bold;">var</span> inc <span style="color: #990099; font-weight: bold;">in</span> this<span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
			<span style="color: #990099; font-weight: bold;">if</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight: bold">!</span>this.<span style="color: #9900cc;">hasOwnProperty</span><span style="color: #006600; font-weight:bold">&#40;</span>inc<span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight:bold">&#41;</span> continue<span style="color: #006600; font-weight: bold">;</span>
			<span style="color: #990099; font-weight: bold;">if</span> <span style="color: #006600; font-weight:bold">&#40;</span>this<span style="color: #006600; font-weight:bold">&#91;</span>inc<span style="color: #006600; font-weight:bold">&#93;</span><span style="color: #006600; font-weight: bold">!=</span><span style="color: #0000ff; font-weight: bold;">null</span><span style="color: #006600; font-weight:bold">&#41;</span> <span style="color: #006600; font-weight:bold">&#123;</span>
				<span style="color: #330066;">querystring</span>.<span style="color: #9900cc;">push</span><span style="color: #006600; font-weight:bold">&#40;</span>inc + <span style="color: #cc0000;">&quot;=&quot;</span> + <span style="color: #990099; font-weight: bold;">Server</span>.<span style="color: #9900cc;">URLEncode</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #990099; font-weight: bold;">String</span><span style="color: #006600; font-weight:bold">&#40;</span>this<span style="color: #006600; font-weight:bold">&#91;</span>inc<span style="color: #006600; font-weight:bold">&#93;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
			<span style="color: #006600; font-weight:bold">&#125;</span> <span style="color: #990099; font-weight: bold;">else</span> <span style="color: #006600; font-weight:bold">&#123;</span>
				<span style="color: #330066;">querystring</span>.<span style="color: #9900cc;">push</span><span style="color: #006600; font-weight:bold">&#40;</span>inc + <span style="color: #cc0000;">&quot;=&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
			<span style="color: #006600; font-weight:bold">&#125;</span>
		<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
		return <span style="color: #330066;">querystring</span>.<span style="color: #9900cc;">join</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;&amp;&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
	<span style="color: #006600; font-weight:bold">&#125;</span>
&nbsp;
	<span style="color: #0000ff; font-weight: bold;">var</span> xmlHTTP <span style="color: #006600; font-weight: bold">=</span> <span style="color: #990099; font-weight: bold;">Server</span>.<span style="color: #330066;">CreateObject</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;MSXML2.ServerXMLHTTP&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
	<span style="color: #ff6600;">// 원래 AJAX 요청을 수행하려던 페이지를 호출한다</span>
	xmlHTTP.<span style="color: #330066;">open</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;GET&quot;</span>, <span style="color: #cc0000;">&quot;http://www.example.com/idrequest&quot;</span>, <span style="color: #0000ff; font-weight: bold;">false</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span> <span style="color: #ff6600;">//, false, false);</span>
&nbsp;
	xmlHTTP.<span style="color: #9900cc;">setRequestHeader</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;Content-type&quot;</span>, <span style="color: #cc0000;">&quot;text/xml&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
	xmlHTTP.<span style="color: #9900cc;">setRequestHeader</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #cc0000;">&quot;Cache-control&quot;</span>,<span style="color: #cc0000;">&quot;no-cache&quot;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
	xmlHTTP.<span style="color: #330066;">send</span><span style="color: #006600; font-weight:bold">&#40;</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
	<span style="color: #990099; font-weight: bold;">Response</span>.<span style="color: #330066;">Write</span><span style="color: #006600; font-weight:bold">&#40;</span>xmlHTTP.<span style="color: #9900cc;">responseText</span><span style="color: #006600; font-weight:bold">&#41;</span><span style="color: #006600; font-weight: bold">;</span>
&nbsp;
	xmlHTTP <span style="color: #006600; font-weight: bold">=</span> <span style="color: #0000ff; font-weight: bold;">null</span><span style="color: #006600; font-weight: bold">;</span>
<span style="color: #0000ff; font-weight: bold;">%&gt;</span></pre></td></tr></table></div>

<p>이렇게 하면 잘 된다. 흐흐&#8230; 문제는, 디버깅이 엄청 어려울 것으로 예상된다는거&#8230; 서버를 꺼놓고 테스트해보니까 404가 아닌 500 이 리턴됐고, 더 중요한 것은 exception catch 가 안된다 -_-;;</p>
<p>ps. 프로토타입(prototype.js) 으로 Cross Domain 을 해결하는 포스트가 있긴 한데 테스트는 못해봤음.</p>
<blockquote><p><a href="http://blog.naver.com/techbug/150023863541">@ [PrototypeJS] Cross Domain상의 Ajax 호출</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/170/feed</wfw:commentRss>
		</item>
		<item>
		<title>VC++ 부동소수점 계산의 정확도를 높이는 방법</title>
		<link>http://dev.heartsavior.net/archives/164</link>
		<comments>http://dev.heartsavior.net/archives/164#comments</comments>
		<pubDate>Mon, 04 Aug 2008 01:48:50 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Tip.Tech]]></category>

		<category><![CDATA[/Op]]></category>

		<category><![CDATA[VC]]></category>

		<category><![CDATA[부동소수점]]></category>

		<category><![CDATA[오차]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=164</guid>
		<description><![CDATA[프로그래밍 갤러리에서 놀고 있었는데(&#8230;) 흥미로운 떡밥 하나가 올라왔다.
나도 모르게 덥썩 물어버렸다(&#8230;)
문제의 코드는 이것

?View Code CPP#include &#60;stdio.h&#62;
&#160;
int main&#40;void&#41;
&#123;
float radius;
float area;
&#160;
printf&#40;&#34;원의 반지름 입력 : &#34;&#41;;
scanf&#40;&#34;%f&#34;, &#38;radius&#41;;
&#160;
area = radius*radius*3.1415;
&#160;
printf&#40;&#34;원의 넓이 : %f \n&#34;, area&#41;;
&#160;
return 0;
&#125;

글쓴이 말로는, VC++ 6 과 VS.net 2005 가 계산 결과가 다르게 나온다는 것이었다.
동강꺼랑 코드는 똑같애 12.0 입력했을 경우
내가 나온 값(VS.net 2005)은 452.376007
동강 나온 값(VC++6)은 [...]]]></description>
			<content:encoded><![CDATA[<p>프로그래밍 갤러리에서 놀고 있었는데(&#8230;) <a href="http://gall.dcinside.com/list.php?id=programming&amp;no=83107">흥미로운 떡밥 하나</a>가 올라왔다.<br />
나도 모르게 덥썩 물어버렸다(&#8230;)</p>
<p>문제의 코드는 이것</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p164code10'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p16410"><td class="code" id="p164code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">float</span> radius<span style="color: #008080;">;</span>
<span style="color: #0000ff;">float</span> area<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;원의 반지름 입력 : &quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%f&quot;</span>, <span style="color: #000040;">&amp;</span>radius<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
area <span style="color: #000080;">=</span> radius<span style="color: #000040;">*</span>radius<span style="color: #000040;">*</span><span style="color:#800080;">3.1415</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;원의 넓이 : %f <span style="color: #666666; font-weight: bold;">\n</span>&quot;</span>, area<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>글쓴이 말로는, VC++ 6 과 VS.net 2005 가 계산 결과가 다르게 나온다는 것이었다.</p>
<blockquote><p>동강꺼랑 코드는 똑같애 12.0 입력했을 경우</p>
<p>내가 나온 값<strong>(VS.net 2005)</strong>은 452.376007<br />
동강 나온 값<strong>(VC++6)</strong>은 452.376000</p></blockquote>
<p>비슷한 문제를 GpgStudy 에서 찾을 수 있었다.<br />
해결 방법 외에도 정확한 설명이 나와 있어서 기반 지식까지 쌓을 수 있었다.(물론 MSDN에 있는 내용&#8230; 이라지만 영어보다는 한글 설명이&#8230;^^;; 그리고 좀 덜 딱딱한 문체이기도 하고&#8230;)</p>
<blockquote><p><a href="http://www.gpgstudy.com/forum/viewtopic.php?p=5517">@ assert의 버그?</a></p></blockquote>
<p>답만 정리하자면, VC++ 6는 컴파일 옵티마이징 옵션중에 /Op (Improve Float Consistency)를 켜면 되고, VS 2008 은 기본이 /fp:precise (/Op를 대체) 로 되어 있어서 신경쓰지 않아도 된다.</p>
<p>이렇게 하면 위의 코드 실행 결과 VC++ 6 도 452.376007 이 나오게 된다.</p>
<p>자세한 것은 MSDN 자료를 참조하자.<br />
vc++ 6 : <a href="http://msdn.microsoft.com/en-us/library/aa984742(VS.71).aspx">http://msdn.microsoft.com/en-us/library/aa984742(VS.71).aspx</a><br />
VS.net 2005~ : <a href="http://msdn.microsoft.com/ko-kr/library/e7s85ffb(VS.80).aspx">http://msdn.microsoft.com/ko-kr/library/e7s85ffb(VS.80).aspx</a></p>
<p>ps. 코드 하일라이트가 c/c++ include 태그 부분은 깔끔하지가 못한듯&#8230; 내가 잘못 쓴 건가&#8230;-_-;;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/164/feed</wfw:commentRss>
		</item>
		<item>
		<title>Vista 호환 어플리케이션 개발 - Virtualization</title>
		<link>http://dev.heartsavior.net/archives/153</link>
		<comments>http://dev.heartsavior.net/archives/153#comments</comments>
		<pubDate>Fri, 25 Jul 2008 05:40:34 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Info]]></category>

		<category><![CDATA[virtualization]]></category>

		<category><![CDATA[vista]]></category>

		<category><![CDATA[가상화]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=153</guid>
		<description><![CDATA[@ 윈도우 비스타 UAC(사용자 계정 콘트롤) 이야기
솔루션을 비스타에서 테스트하고 있는데, 역시나 강화된 보안 때문에 몇몇 부분이 비정상적으로 작동한다.
Vista + IE7 프로텍션 모드는 워낙 뭐 얘기가 많아서 그러려니 했는데(프로텍션 모드 끈 상태로 테스트했다&#8230;-_- 프로텍션 모드 지원은 나중에&#8230;), 일반 어플들 또한 몇몇 기능이 제대로 돌아가지 않았다.
이상하게 파일 I/O 관련해서만 문제가 생겨서, 자료 검색 좀 해 봤더니 위와 [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><a href="http://blog.naver.com/process3/20031561263">@ 윈도우 비스타 UAC(사용자 계정 콘트롤) 이야기</a></p></blockquote>
<p>솔루션을 비스타에서 테스트하고 있는데, 역시나 강화된 보안 때문에 몇몇 부분이 비정상적으로 작동한다.</p>
<p>Vista + IE7 프로텍션 모드는 워낙 뭐 얘기가 많아서 그러려니 했는데(프로텍션 모드 끈 상태로 테스트했다&#8230;-_- 프로텍션 모드 지원은 나중에&#8230;), 일반 어플들 또한 몇몇 기능이 제대로 돌아가지 않았다.</p>
<p>이상하게 파일 I/O 관련해서만 문제가 생겨서, 자료 검색 좀 해 봤더니 위와 같은 정보를 얻을 수 있었다.<br />
특히 Vista의 &#8216;가상화&#8217; 기술에 대한 쉬운 설명이 있어서 궁금한 점을 해결하는 데 아주 도움이 많이 되었다.</p>
<p>가상화(Virtualization) 기술은, 기존 프로그램과 Vista 의 호환을 위한 기술로, 시스템 폴더나 HKLM 레지스트리에 기록 및 읽기를 수행하는 요청을 내부적으로 다른 위치로 리다이렉트시켜서 기존 프로그램도 정상적으로 돌아가면서 Vista OS 의 보안도 수행하는 기술이다.</p>
<blockquote><p>변경되는 위치는,</p>
<p>파일 : %user&#8217;s profile%\AppData\local\virtualstore\ 아래에 폴더 구조 그대로&#8230;<br />
(예: Program Files\&#8230;)</p>
<p>레지스트리 : HKCU\software\classes\virtualstore\<br />
(이건 테스트를 안해봐서 구조 그대로 내려가는지는 모르겠음)</p></blockquote>
<p>테스트중인 어플이 문제가 생겼던 부분도 여기에 있었는데, 이 어플은 임시 디렉토리를 사용할 때 어플의 위치\Temp 디렉토리를 사용했다. 인스톨해서 쓰는 프로그램이니 그 위치가 Program Files 의 하위 디렉토리(즉, 시스템 디렉토리) 가 되었던 것이다. 가상화 덕분에 실제 파일 I/O 는 리다이렉트된 위치에서 정상적으로 수행은 됐는데, 해당 디렉토리를 자동으로 띄워 주는 부분이 수행이 제대로 안 되었던 것으로 결론을 내렸다.<br />
(가상화 디렉토리 내에 파일이 저장된 것은 확인했다.)</p>
<p>가상화라는 기술로 기존 어플을 지원해주고 있긴 하지만, 어디까지나 레거시 어플을 위한 부분이고, 새로 프로그래밍 할 때는 시스템 폴더나 HKLM 레지스트리는 안쓸 수 있으면 안쓰는 부분으로 프로그래밍해야 될 것 같다.</p>
<p>ps.<br />
그나저나 프로텍션 모드&#8230; Vista + IE7 이 이정도인데 IE8이 출시된다면&#8230;<br />
그냥 앞으로 ActiveX를 개발할 일이 없었으면 좋겠다&#8230;-_-;;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/153/feed</wfw:commentRss>
		</item>
		<item>
		<title>2012년까지 고급 IT 인력 2만명 양성&#8230; 또 뭘 하려고 이러실까&#8230;</title>
		<link>http://dev.heartsavior.net/archives/152</link>
		<comments>http://dev.heartsavior.net/archives/152#comments</comments>
		<pubDate>Sun, 06 Jul 2008 16:51:21 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Think]]></category>

		<category><![CDATA[IT인력양성]]></category>

		<category><![CDATA[개발자이야기]]></category>

		<category><![CDATA[삽질]]></category>

		<category><![CDATA[정부]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=152</guid>
		<description><![CDATA[(경어체는 잠시 생략합니다. 뭐, 원래 잘 안쓰긴 하지만, 그냥 누군가에게 1:1로 말하듯이 쓰고 싶네요.)
@ 2012년까지 고급 IT 인력 2만명 양성
부탁이니까, 제발 좀 신경쓰지마&#8230;
정부에서 IT 인력 늘려서 이 모양 이 꼴이 됐다가, 거품 빠져서 그나마 요즘 대우가 괜찮아지고 있는데&#8230;
왜 매번 생각하는 게 기업 위주야?
기업에서 사람 없다고 죽는 소리 좀 내니까 &#8216;오케이 알았어 이참에 실업률도 줄일 겸 [...]]]></description>
			<content:encoded><![CDATA[<p>(경어체는 잠시 생략합니다. 뭐, 원래 잘 안쓰긴 하지만, 그냥 누군가에게 1:1로 말하듯이 쓰고 싶네요.)</p>
<blockquote><p><a href="http://news.naver.com/main/read.nhn?mode=LSD&amp;mid=sec&amp;sid1=105&amp;oid=008&amp;aid=0002005710">@ 2012년까지 고급 IT 인력 2만명 양성</a></p></blockquote>
<p>부탁이니까, 제발 좀 신경쓰지마&#8230;<br />
정부에서 IT 인력 늘려서 이 모양 이 꼴이 됐다가, 거품 빠져서 그나마 요즘 대우가 괜찮아지고 있는데&#8230;</p>
<p>왜 매번 생각하는 게 기업 위주야?<br />
기업에서 사람 없다고 죽는 소리 좀 내니까 &#8216;오케이 알았어 이참에 실업률도 줄일 겸 한 번 만들어내지 뭐&#8217; 이거 아냐?</p>
<p>그리고, 만만한게 IT 개발이야?</p>
<p>IMF때 실업률 뭐로 해결했어? IT 인력 찍어냈잖아.<br />
그 이후로 어떻게 됐었어?<br />
벤처 거품 다 빠졌고 사람이 충분해진 IT 개발자들은 열악한 환경때문에 결국 빨아먹히고 이 길을 떠났잖아?<br />
&#8216;IT맨&#8217; 이라는 분이 이것때문에 S모 공중파 메인 시간 뉴스를 탔는데, 더 말할 필요가 있어?</p>
<p>제발 부탁이야. 신경쓰지 말아주라.<br />
이번에 또 찍어내면, 난 전공 공부보다 영어 공부를 먼저 하게 될꺼야.<br />
인력의 수출이 당신들이 원하는 거면, 잘 하고 있는거고&#8230; 설마 그건 아니겠지?</p>
<p>ps. 이전에 썼던 관련 글</p>
<blockquote><p><a href="http://dev.heartsavior.net/archives/116">@ 왜 S/W 개발자가 미취업자의 대안 직업인가?</a></p>
<p><a href="http://dev.heartsavior.net/archives/53">@ SW 분석설계사 10만 양성… 아키텍트도 양산하려는 막나가는 한국 IT</a></p></blockquote>
<p>ps2. ZDNet-Korea 에 있던 관련 컬럼이 기억나서 링크 걸어본다.</p>
<blockquote><p><a href="http://www.zdnet.co.kr/itbiz/column/anchor/mwpark/0,39030394,39140773,00.htm">@ [박민우의 e-Simple] IT 업계를 떠나는 소프트웨어 개발자들</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/152/feed</wfw:commentRss>
		</item>
		<item>
		<title>Java / Windows에서 Runtime.exec() 배치 리턴값이 정확히 넘어오지 않음</title>
		<link>http://dev.heartsavior.net/archives/150</link>
		<comments>http://dev.heartsavior.net/archives/150#comments</comments>
		<pubDate>Sat, 28 Jun 2008 16:58:09 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Lang.Java]]></category>

		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=150</guid>
		<description><![CDATA[Java가 아무래도 OS depedent 한 부분은 좀 깔끔하지가 못한 게 아닌가 생각이 드는 상황.
Runtime.exec() -> Process.waitFor() 나 Process.exitValue();
배치 파일에서 넘겨주는 값과 상관없이 0이 나온다.
대놓고 배치 파일에 
exit /b 1
을 해도 0 이 나온다. 당연히 cmd 창에서 배치를 실행하고 echo %ERRORLEVEL% 을 하면 1이 나온다.
음&#8230; 배치에서 리턴 값 받아서 쉽게 가려고 했는데 안될라나보다.
아래는 배치를 실행하는 클래스.
에러 [...]]]></description>
			<content:encoded><![CDATA[<p>Java가 아무래도 OS depedent 한 부분은 좀 깔끔하지가 못한 게 아닌가 생각이 드는 상황.</p>
<p>Runtime.exec() -> Process.waitFor() 나 Process.exitValue();<br />
배치 파일에서 넘겨주는 값과 상관없이 0이 나온다.</p>
<p>대놓고 배치 파일에 </p>
<blockquote><p>exit /b 1</p></blockquote>
<p>을 해도 0 이 나온다. 당연히 cmd 창에서 배치를 실행하고 echo %ERRORLEVEL% 을 하면 1이 나온다.</p>
<p>음&#8230; 배치에서 리턴 값 받아서 쉽게 가려고 했는데 안될라나보다.</p>
<p>아래는 배치를 실행하는 클래스.<br />
에러 코드 받아오는 것 빼고는 정상적으로 동작하는 것으로 보아서는 코드 문제 같지는 않다.</p>
<p>ps. 제가 뭔가 잘못 알고 있는 부분이 있거나, Java에서 리턴값을 받을 수 있는 방법이 있으면 알려주시면 정말 감사하겠습니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p150code12'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p15012"><td class="code" id="p150code12"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">net.heartsavior.dev.util</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.BufferedReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.File</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.InputStreamReader</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ExecutorStreamRead <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Thread</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">BufferedReader</span> br <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> ExecutorStreamRead<span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> is<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		br <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>is<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// TODO Auto-generated method stub</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">String</span> line<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>line <span style="color: #339933;">=</span> br.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// TODO 로그</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			br.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// TODO 예외 처리</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author Heart
 *
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> WindowsFileExecutor <span style="color: #000000; font-weight: bold;">implements</span> LocalFileExecutor <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> filePath, <span style="color: #003399;">String</span> argString<span style="color: #009900;">&#41;</span> 
		<span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">==</span> filePath <span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">Process</span> p <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">String</span> curDir <span style="color: #339933;">=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;user.dir&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">File</span> workDir <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> filePath.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span>		<span style="color: #666666; font-style: italic;">// 상대 경로</span>
			workDir <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span>curDir <span style="color: #339933;">+</span> getDirectoryPath<span style="color: #009900;">&#40;</span>filePath<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span>											<span style="color: #666666; font-style: italic;">// 절대 경로</span>
			workDir <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span>getDirectoryPath<span style="color: #009900;">&#40;</span>filePath<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">!=</span> argString <span style="color: #009900;">&#41;</span>
			p <span style="color: #339933;">=</span> <span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span>
				getCorrectWindowsFilePath<span style="color: #009900;">&#40;</span>filePath<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; &quot;</span> <span style="color: #339933;">+</span> argString, <span style="color: #000066; font-weight: bold;">null</span>, workDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span>
			p <span style="color: #339933;">=</span> <span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span>getCorrectWindowsFilePath<span style="color: #009900;">&#40;</span>filePath<span style="color: #009900;">&#41;</span>, <span style="color: #000066; font-weight: bold;">null</span>, workDir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// TODO 로그</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Console Print ------------------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		ExecutorStreamRead readStdout <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ExecutorStreamRead<span style="color: #009900;">&#40;</span>p.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		readStdout.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		ExecutorStreamRead readStdErr <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ExecutorStreamRead<span style="color: #009900;">&#40;</span>p.<span style="color: #006633;">getErrorStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		readStdErr.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// TODO 로그</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;End of Console Print -----------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> errorCode <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			errorCode <span style="color: #339933;">=</span> p.<span style="color: #006633;">waitFor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> ie<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IOException</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> errorCode <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
			errorCode <span style="color: #339933;">=</span> p.<span style="color: #006633;">exitValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> errorCode<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> getCorrectWindowsFilePath<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> filePath<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">==</span> filePath.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> filePath<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">StringBuffer</span> sb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>filePath<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sb.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> sb.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> getDirectoryPath<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> filePath<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">char</span> delim <span style="color: #339933;">=</span> <span style="color: #0000ff;">'<span style="color: #000099; font-weight: bold;">\\</span>'</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> lastDelim <span style="color: #339933;">=</span> filePath.<span style="color: #006633;">lastIndexOf</span><span style="color: #009900;">&#40;</span>delim<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">==</span> lastDelim <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			delim <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
&nbsp;
			lastDelim <span style="color: #339933;">=</span> filePath.<span style="color: #006633;">lastIndexOf</span><span style="color: #009900;">&#40;</span>delim<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">==</span> lastDelim<span style="color: #009900;">&#41;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> filePath.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, lastDelim<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://dev.heartsavior.net/archives/150/feed</wfw:commentRss>
		</item>
		<item>
		<title>문자열로 된 숫자를 입력받아 더하거나 빼는 프로그램</title>
		<link>http://dev.heartsavior.net/archives/148</link>
		<comments>http://dev.heartsavior.net/archives/148#comments</comments>
		<pubDate>Wed, 25 Jun 2008 01:51:35 +0000</pubDate>
		<dc:creator>Heart</dc:creator>
		
		<category><![CDATA[Dev.Programming]]></category>

		<category><![CDATA[입사시험]]></category>

		<category><![CDATA[한컴]]></category>

		<guid isPermaLink="false">http://dev.heartsavior.net/?p=148</guid>
		<description><![CDATA[한컴 입사시험 문제라고 한다
(최근 입사문제인가 싶어서 안올리고 있었는데, 구글에서 검색해볼 껄 그랬다 -_-;; 2005년 쯤에 KLDP에 있네.)
문제 : 문자열로 된 숫자를 입력받아 더하거나 빼는 프로그램을 만드시오
처리조건
- 문자열로 된 값을 입력받아, 모두 더한 값을 문자열로 출력한다.
- 마이너스 값이 될 수 있으며 기호는 &#8216;-&#8217; 문자를 사용한다.
- 최대 입력은 &#8216;1억&#8217;이며 그 이상은 에러처리를 한다.
입력 예)
이백원 + 오천원 - [...]]]></description>
			<content:encoded><![CDATA[<p>한컴 입사시험 문제라고 한다<br />
(최근 입사문제인가 싶어서 안올리고 있었는데, 구글에서 검색해볼 껄 그랬다 -_-;; 2005년 쯤에 KLDP에 있네.)</p>
<blockquote><p>문제 : 문자열로 된 숫자를 입력받아 더하거나 빼는 프로그램을 만드시오</p>
<p>처리조건<br />
- 문자열로 된 값을 입력받아, 모두 더한 값을 문자열로 출력한다.<br />
- 마이너스 값이 될 수 있으며 기호는 &#8216;-&#8217; 문자를 사용한다.<br />
- 최대 입력은 &#8216;1억&#8217;이며 그 이상은 에러처리를 한다.</p>
<p>입력 예)<br />
이백원 + 오천원 - 만원</p>
<p>출력 예)<br />
-사천팔백원</p></blockquote>
<p>출처가 된 커뮤니티에서는 쉽다는 의견들이 많았는데&#8230;<br />
결과에 대해 &#8216;일십만&#8230;&#8217; 이렇게 표현하지 않고 &#8216;만천일원&#8230;&#8217; 이렇게 일반적으로 말하는 형식으로 만드려면 출력할 때 손을 좀 많이 대야 한다.<br />
(int 내에서 사칙연산을 한다는 전제 하에)사칙연산은 당연히 문제가 안되고, 어차피 입력 값을 파싱하는 부분과 사칙연산의 결과를 다시 한글로 출력하는 부분이 핵심이라 할 수 있다. 역시 한컴에서 출제할 만한 문제인 듯.</p>
<p>아래는 내가 푼 코드&#8230;<br />
버그를 하나 알고 있지만, 출제의도와는 관계없는 것 같아 놔둔다. 버그를 해결하려면 BigInteger가 필요&#8230;<br />
입력값이 int 범위를 넘어가면 오버플로우가 일어나서 undefined behavior를 보일 수 있다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p148code14'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p14814"><td class="code" id="p148code14"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#define REP1_SIZE		10</span>
<span style="color: #339900;">#define REP2_SIZE		4</span>
<span style="color: #339900;">#define REP3_SIZE		3</span>
&nbsp;
<span style="color: #0000ff;">char</span> g_numberHangul<span style="color: #008000;">&#91;</span>REP1_SIZE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">&quot;영&quot;</span>, <span style="color: #FF0000;">&quot;일&quot;</span>, <span style="color: #FF0000;">&quot;이&quot;</span>, <span style="color: #FF0000;">&quot;삼&quot;</span>, <span style="color: #FF0000;">&quot;사&quot;</span>, <span style="color: #FF0000;">&quot;오&quot;</span>, <span style="color: #FF0000;">&quot;육&quot;</span>, <span style="color: #FF0000;">&quot;칠&quot;</span>, <span style="color: #FF0000;">&quot;팔&quot;</span>, <span style="color: #FF0000;">&quot;구&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> g_numberRep2Hangul<span style="color: #008000;">&#91;</span>REP2_SIZE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">&quot;영&quot;</span>, <span style="color: #FF0000;">&quot;십&quot;</span>, <span style="color: #FF0000;">&quot;백&quot;</span>, <span style="color: #FF0000;">&quot;천&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> g_numberRep3Hangul<span style="color: #008000;">&#91;</span>REP3_SIZE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">&quot;영&quot;</span>, <span style="color: #FF0000;">&quot;만&quot;</span>, <span style="color: #FF0000;">&quot;억&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#define MAX_INPUT_NUMBER	100000000		// 억</span>
&nbsp;
<span style="color: #339900;">#define MODE_INIT		0</span>
<span style="color: #339900;">#define MODE_PLUS		1</span>
<span style="color: #339900;">#define MODE_MINUS		2</span>
&nbsp;
<span style="color: #339900;">#define CHAR_PLUS		'+'</span>
<span style="color: #339900;">#define CHAR_MINUS		'-'</span>
<span style="color: #339900;">#define CHAR_SPACE		' '</span>
&nbsp;
<span style="color: #339900;">#define STRING_WON		&quot;원&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> getIndexOnHangulArray<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> arrHangulSrc<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> arrLength, <span style="color: #0000ff;">char</span> hangul<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> pow_int<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a, <span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> printNumToHangul<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> number<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> printNumToHangulRep2Recur<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> number, <span style="color: #0000ff;">int</span> rep2Idx<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> printNumToHangulRep3Recur<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> number, <span style="color: #0000ff;">int</span> rep3Idx<span style="color: #008000;">&#41;<