<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/style/rss/style.xsl" type="text/xsl" media="screen"?>
<rss version="2.0">
	<channel>
		<title>미친병아리의 프로그래밍 이야기</title>
		<link>http://madchick.tistory.com/</link>
		<description>프로그래밍에 관한 여러가지 이야기..</description>
		<language>ko</language>
		<pubDate>Sun, 11 May 2008 14:26:07 +0900</pubDate>
		<generator>Tistory 1.1</generator>
		<image>
		<title>미친병아리의 프로그래밍 이야기</title>
		<url><![CDATA[http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMDEwMDAwMDAwMDAwLmpwZw==]]></url>
		<link>http://madchick.tistory.com/</link>
		<description>프로그래밍에 관한 여러가지 이야기..</description>
		</image>
		<item>
			<title>ODBC 설정 에러.. (오라클 클라이언트가 문제야..)</title>
			<link>http://madchick.tistory.com/18</link>
			<description>오라클 클라이언트는 설치과정이 좀 독특한 프로그램이다.. 자바로 만들어진 설치 프로그램은 윈도우, 리눅스, 유닉스, 맥 등의 OS에서 모두 사용하기 위해 설계가 되었는가 본데, 각 운영체제에서 당연히 여겨지는 점들이 지켜지지 않아 황당한 경우가 많다..&lt;br /&gt;&lt;br /&gt;예를들면, 윈도우 환경에서 설치경로에 공백문자와 한글을 지원한다.. 하지만, 오라클 클라이언트는 이런 경로에 설치를 하면 제대로 동작을 안한다.. 더구나 일정 경로 이상 깊이가 길어지면 (즉, 경로명 길이가 길어지면) 동작을 안하는 경우도 있다.. 온갖 삽질을 통해 경험으로 이런 내용들을 알고 있어 오라클 클라이언트를 설치할때면 무조건 디폴트 경로에 설치를 한다.. 또 무슨 일이 생길지 모르므로.. 오라클의 새 버젼이 나올때 마다 오라클 클라이언트도 새로 나오는데, 왜 아직까지 이런 문제점들을 수정되지 않는가 모르겠다.. 이런 부분을 보면 한중일 2바이트 문자에 대한 지원을 Microsoft 만큼 제대로 하는 곳도 없다.. 오픈소스 진영도 Microsoft를 따라가려면 아직도 멀었다..&lt;br /&gt;&lt;br /&gt;하지만, 이것도 내가 잘 하면 되는 것이지만 다른 사람이 이상하게 설치를 해둔 상황에 내가 이상한 점을 발견하고 문제를 해결해야 하는 상황을 접하게 되면 피곤하게 된다.. 이번에도 그런 경우였는데, 다른 서버에서는 잘 동작하는 &lt;A href=&quot;http://madchick.tistory.com/12&quot;&gt;IIS 서버 컴포넌트&lt;/A&gt;가 새 서버에 세팅을 했더니 DB 접속이 안되는 것이다.. 젠장..&lt;br /&gt;&lt;br /&gt;정말 신기한 현상은 제어판의 ODBC 세팅하는 화면에서 접속 테스트를 해보면 접속이 제대로 된다는 것이다.. ODBC 세팅창에서는 제대로 되는데, 프로그램에서 안되니 우리 프로그램 문제라 생각하고 연락을 한 것이다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;BLOCKQUOTE&gt;Microsoft OLE DB Provider for ODBC Drivers 오류 &#039;80004005&#039; &lt;br /&gt;5 (Oracle in OraHome92) 시스템 오류가 발생하여 지정한 드라이버를 로드하지 못했습니다. &lt;br /&gt;/OracleTest.asp, 줄 15&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;br /&gt;컴포넌트가 DB 접속이 계속 실패를 하는데 원인 찾기가 쉽지 않아, ASP로 간단한 샘플코드를 만들어 확인을 해봤다.. ASP에서도 똑같은 오류가 발생했다.. 위와 같은 오류가 발생하였는데, 원인을 찾는 것이 쉽지 않았다.. 구글을 비롯해 네이버 지식인 등 검색을 좀 해봤는데 완전 똑같은 현상은 아니지만 비슷한 현상들 겪는 사람들이 좀 있었다.. 내용을 종합해보니 C 드라이브 루트가 아닌 D 드라이브에 오라클 클라이언트를 설치하면 제대로 동작을 안하는 경우가 있다는데 힌트를 얻었다.. 확인해보니 문제의 서버에도 오라클 클라이언트가 D 드라이브에 설치되어 있었다.. 젠장, 이렇게 황당한 경우가.. 왜 D 드라이브에 설치를 하면 정상동작을 안하는 것이야? 이렇게 만들라고 해도 이렇게 만들기 힘들겠다.. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;BLOCKQUOTE&gt;&lt;A href=&quot;http://database.ssarang.net/?inc=read&amp;amp;aid=1641&amp;amp;criteria=mssql&amp;amp;subcrit=qna&amp;amp;id=&amp;amp;limit=20&amp;amp;keyword=&amp;amp;page=5&quot;&gt;http://database.ssarang.net/?inc=read&amp;amp;aid=1641&amp;amp;criteria=mssql&amp;amp;subcrit=qna&amp;amp;id=&amp;amp;limit=20&amp;amp;keyword=&amp;amp;page=5&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://locke.tistory.com/40&quot;&gt;http://locke.tistory.com/40&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://sqler.pe.kr/web_board/view_list.asp?id=6551&amp;amp;read=1718&amp;amp;pagec=&amp;amp;gotopage=24&amp;amp;block=2&amp;amp;part=myboard3&quot;&gt;http://sqler.pe.kr/web_board/view_list.asp?id=6551&amp;amp;read=1718&amp;amp;pagec=&amp;amp;gotopage=24&amp;amp;block=2&amp;amp;part=myboard3&lt;/A&gt;&lt;/BLOCKQUOTE&gt;&lt;br /&gt;원인을 찾기가 힘들었지 해결방법은 간단했다.. 오라클 클라이언트를 언인스톨 하고, C 드라이브에 설치를 하니 해결이 되었다.. 무슨 프로그램이 C 드라이브에 설치를 했을때와 D 드라이브에 설치를 했을때 동작이 틀려질 수가 있을까? 어떻게 만들면 이렇게 동작할 수가 있을까? 정말 신기하다..&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<category>mdac</category>
			<category>MSSQL</category>
			<category>odbc</category>
			<category>oracle</category>
			<category>오라클</category>
			<category>오라클클라이언트</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/18</guid>
			<comments>http://madchick.tistory.com/18#entry18comment</comments>
			<pubDate>Sun, 11 May 2008 13:59:18 +0900</pubDate>
		</item>
		<item>
			<title>First Line of Defense for Web Applications..</title>
			<link>http://madchick.tistory.com/17</link>
			<description>ASP.NET 환경에서 안전한 웹 어플리케이션을 만드는데 알아두면 좋은 내용들을 다루고 있다.. 본질적인 내용은 어느 개발환경에서든 모두 고려해볼만한 내용을 담고 있지만, 예와 설명이 ASP.NET을 기준으로 설명을 하고 있어 모든 웹개발자들이 공유하고 즐기기엔 약간 아쉬운 점이 있기는 하다.. 뭐, MS 기술자들이 모이는 블로그 사이트에 올려진 글이니 당연하기 하겠지만..&lt;br /&gt;&lt;br /&gt;3번째 이야기에서 보면 입력값 점검을 위해 정규표현식을 사용하는 예가 나오는데, 아주 좋은 방법이라 생각한다.. 올바로된 값이 입력되었는지를 점검하는데 정규표현식 만큼 간결하면서도 강력한 방법이 없는데, 자바 스크립트 뿐만 아니라 많은 프로그래밍 환경에서 지원하는 방법인데 주변의 프로그래머들은 의외로 사용을 안하는 것 같다.. 왜 그럴까 좀 궁금해진다..&lt;br /&gt;
&lt;BLOCKQUOTE&gt;First Line of Defense for Web Applications - Part 1 &lt;br /&gt;(&lt;A href=&quot;http://blogs.msdn.com/hackers/archive/2007/10/12/first-line-of-defense-for-web-applications-part-1.aspx&quot;&gt;http://blogs.msdn.com/hackers/archive/2007/10/12/first-line-of-defense-for-web-applications-part-1.aspx&lt;/A&gt;)&lt;br /&gt;First Line of Defense for Web Applications - Part 2 &lt;br /&gt;(&lt;A href=&quot;http://blogs.msdn.com/hackers/archive/2007/10/22/first-line-of-defense-for-web-applications-part-2.aspx&quot;&gt;http://blogs.msdn.com/hackers/archive/2007/10/22/first-line-of-defense-for-web-applications-part-2.aspx&lt;/A&gt;)&lt;br /&gt;First Line of Defense for Web Applications - Part 3 &lt;br /&gt;(&lt;A href=&quot;http://blogs.msdn.com/hackers/archive/2007/10/30/first-line-of-defense-for-web-applications-part-3.aspx&quot;&gt;http://blogs.msdn.com/hackers/archive/2007/10/30/first-line-of-defense-for-web-applications-part-3.aspx&lt;/A&gt;)&lt;br /&gt;First Line of Defense for Web Applications - Part 4 &lt;br /&gt;(&lt;A href=&quot;http://blogs.msdn.com/hackers/archive/2007/11/12/first-line-of-defense-for-web-applications-part-4.aspx&quot;&gt;http://blogs.msdn.com/hackers/archive/2007/11/12/first-line-of-defense-for-web-applications-part-4.aspx&lt;/A&gt;)&lt;br /&gt;First Line of Defense for Web Applications - Part 5 &lt;A href=&quot;http://blogs.msdn.com/hackers/archive/2007/12/16/first-line-of-defense-for-web-applications-part-5.aspx&quot;&gt;&lt;br /&gt;(http://blogs.msdn.com/hackers/archive/2007/12/16/first-line-of-defense-for-web-applications-part-5.aspx&lt;/A&gt;)&lt;br /&gt;First Line of Defense for Web Applications - Conclusion &lt;br /&gt;(&lt;A href=&quot;http://blogs.msdn.com/hackers/archive/2008/01/06/first-line-of-defense-for-web-applications-conclusion.aspx&quot;&gt;http://blogs.msdn.com/hackers/archive/2008/01/06/first-line-of-defense-for-web-applications-conclusion.aspx&lt;/A&gt;)&lt;/BLOCKQUOTE&gt;4번째 이야기에서 주로 다루는 &lt;FONT face=Arial&gt;Cross Site Scripting에 대해서는 그동안 관심을 가져보지 못했었는데, 앞으로는 이 부분에 대해서도 관심을 가져야 하겠다.. &lt;br /&gt;&lt;br /&gt;5번째 이야기에서는 SQL 인젝션에 대해 지면을 할애하고 있다..&lt;br /&gt;&lt;br /&gt;4번째, 5번째 이야기는 사실 프로그래밍 개발환경에 상관 없이 모두에게 동일하게 적용되는 내용이니 참고해보면 좋겠다.. 물론, 이 두가지 주제에 대해서는 이 글들 말고도 다른 좋은 글들이 훨씬 더 많이 있을테니 그러한 글들을 참조해도 좋다.. 아무튼 이 두 주제는 요즘 보안에서는 기본에 해당하는 내용이므로 꼭 내용을 숙지하고 프로그래밍시 반영을 해야한다..&lt;br /&gt;&lt;br /&gt;정 시간이 없다면 맨 마지막 글인 결론 내용이라도 꼭 읽어볼 필요가 있겠다..&lt;/FONT&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/17</guid>
			<comments>http://madchick.tistory.com/17#entry17comment</comments>
			<pubDate>Mon,  5 May 2008 16:45:14 +0900</pubDate>
		</item>
		<item>
			<title>C/C++에서 integer변수 swap 방법 비교..</title>
			<link>http://madchick.tistory.com/16</link>
			<description>&lt;P&gt;다음 DNA에서 C/C++에서 integer변수 swap 방법 비교 (&lt;A href=&quot;http://dna.daum.net/technote/ccpp/CPPSwap&quot;&gt;http://dna.daum.net/technote/ccpp/CPPSwap&lt;/A&gt;) 라는 글을 보고 옛날 생각도 나고, 요즘 CPU 환경에서는 그냥 임시변수를 선언하여 구현하는 것이 더 빠르다는 결론이 재밌어 보여 윈도우에서도 함 해봤다.. VC++ 6.0과 VS 2008을 사용하여 2개를 비교를 해봤다..&lt;br /&gt;&lt;br /&gt;원문에서 소개된 소스코드를 아래와 같이 조금 수정해봤다.. 윈도우즈 환경에서 실행시간 위해 약간의 코드를 추가했다.. 원본 코드는 그대로 유지했음.. 새 컴파일러가 좀 더 좋아진 점이 있는가 해서 VC++ 6.0과 VS 2008을 가지고 두번 비교를 해봄..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;std::swap을 사용하는 방법&lt;br /&gt;&lt;/STRONG&gt;std::swap : c++에서 일반적으로 가장 널리쓰이는 안전한 방법 &lt;br /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#ff0000&gt;&quot;stdafx.h&quot;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;algorithm&amp;gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;main&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD start = ::GetTickCount() ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;a = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;b = 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;i=0;i&amp;lt;50000000;i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; std::swap(a,b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&lt;FONT color=#ff0000&gt;&quot;%d %d\n\n&quot;&lt;/FONT&gt;,a, b);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD end = ::GetTickCount() ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&lt;FONT color=#ff0000&gt;&quot;execution time : %1.3f m/s\n&quot;&lt;/FONT&gt;, (&lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;)(end - start) / (&lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;)100) ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;temp ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::cin &amp;gt;&amp;gt; temp ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&amp;nbsp;0 ;&lt;br /&gt;}&lt;/BLOCKQUOTE&gt;
&lt;P&gt;VC++ 6.0 : execution time : 0.630 m/s&lt;br /&gt;VS 2008 : execution time : 0.630 m/s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;xor를 이용한 방법&lt;/STRONG&gt;&lt;br /&gt;c에서 예전에 많이 사용되던 방법 임시변수를 사용하지 않아서 좋다는 장점이 있음. 오래된 CPU에서는 이 방법이 빨랐으나 최근 CPU에서는 bit operation이 느려서 그다지 좋지 않다고 알려져있음. &lt;br /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#ff0000&gt;&quot;stdafx.h&quot;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;algorithm&amp;gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#define&lt;/FONT&gt;&amp;nbsp;SWAP(a,b) { &lt;FONT color=#0000ff&gt;if&lt;/FONT&gt;&amp;nbsp;(a!=b) { a^=b; b^=a; a^=b; }}&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;main&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD start = ::GetTickCount() ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;a = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;b = 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;i=0;i&amp;lt;50000000;i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SWAP(a,b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&lt;FONT color=#ff0000&gt;&quot;%d %d\n\n&quot;&lt;/FONT&gt;,a, b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD end = ::GetTickCount() ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&lt;FONT color=#ff0000&gt;&quot;execution time : %1.3f m/s\n&quot;&lt;/FONT&gt;, (&lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;)(end - start) / (&lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;)100) ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;temp ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::cin &amp;gt;&amp;gt; temp ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&amp;nbsp;0 ;&lt;br /&gt;}&lt;/BLOCKQUOTE&gt;
&lt;P&gt;VC++ 6.0 : execution time : 0.940 m/s&lt;br /&gt;VS 2008 : execution time : 0.940 m/s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;임시변수를 이용한 방법&lt;/STRONG&gt;&lt;br /&gt;가장 기본적인 방법. 임시변수를 사용한다는 단점이 있음.&lt;br /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#ff0000&gt;&quot;stdafx.h&quot;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;algorithm&amp;gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt;&amp;nbsp;&amp;lt;windows.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;#define&lt;/FONT&gt;&amp;nbsp;SWAP(a,b) { &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;t=a; a=b; b=t; }&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;main&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD start = ::GetTickCount() ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;a = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;b = 2;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;for&lt;/FONT&gt;(&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;i=0;i&amp;lt;50000000;i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SWAP(a,b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&lt;FONT color=#ff0000&gt;&quot;%d %d\n\n&quot;&lt;/FONT&gt;,a, b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; DWORD end = ::GetTickCount() ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&lt;FONT color=#ff0000&gt;&quot;execution time : %1.3f m/s\n&quot;&lt;/FONT&gt;, (&lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;)(end - start) / (&lt;FONT color=#0000ff&gt;double&lt;/FONT&gt;)100) ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt;&amp;nbsp;temp ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; std::cin &amp;gt;&amp;gt; temp ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&amp;nbsp;0 ;&lt;br /&gt;}&lt;/BLOCKQUOTE&gt;
&lt;P&gt;VC++ 6.0 : execution time : 0.470 m/s&lt;br /&gt;VS 2008 : execution time : 0.630 m/s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;결론&lt;br /&gt;&lt;/STRONG&gt;실험환경 : Intel Core2 Duo T5600 1.83GHz, 2.5GB RAM&lt;br /&gt;&lt;br /&gt;VC++ 6.0 : execution time : 0.630 m/s&lt;br /&gt;VS 2008 : execution time : 0.630 m/s&lt;br /&gt;&lt;br /&gt;VC++ 6.0 : execution time : 0.940 m/s&lt;br /&gt;VS 2008 : execution time : 0.940 m/s&lt;br /&gt;&lt;br /&gt;VC++ 6.0 : execution time : 0.470 m/s&lt;br /&gt;VS 2008 : execution time : 0.470 m/s&lt;br /&gt;&lt;br /&gt;VC++ 6.0과 VS 2008의 차이점은 없음 (옵션 변경 없이 디폴트로 실행시켰을때..)&lt;br /&gt;임시변수를 사용하는 방법이 가장 빠름.. 이상한 점은 VS 2008에서는 세번째 실험방법의 결과가 실행시마다 왔다갔다 한다는 점.. 0.470과 0.630이 실행시마다 왔다갔다 함..&lt;br /&gt;&lt;br /&gt;새로운 환경에서는 예전의 지식은 힘을 발휘하지 못하게 되는 경우가 있다.. 임시변수를 두면 좋지 않다는 생각을 가지고 살다, 이런 결론을 얻고 보면 좀 황당하다.. std::swap 보다도 임시변수를 사용하는 것이 빠르다니.. 많이 읽고 정보를 수집하고, 직접 실습을 해보고 하여 항상 최신 지식으로 무장할 필요가 있다..&lt;/P&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/16</guid>
			<comments>http://madchick.tistory.com/16#entry16comment</comments>
			<pubDate>Mon,  5 May 2008 15:15:51 +0900</pubDate>
		</item>
		<item>
			<title>MS SQL 2005 수동삭제방법..</title>
			<link>http://madchick.tistory.com/15</link>
			<description>MS SQL 2005를 수동으로 삭제하는 방법.. 설치시 오류가 났거나, 언인스톨 과정에서 오류가 난 경우, Visual Studio 설치시 지 맘대로 설치를 해버리는 쓸데없는 MS SQL 2005의 인스턴스들을 제거하고 싶은 경우에 사용..&lt;br /&gt;&lt;br /&gt;Microsoft의 페이지들은 사이트 개편이 URL이 언제 어떻게 바뀌어버릴지 모르니 몇가지 핵심 내용을 메모해둘 필요가 있음..&amp;nbsp; 원문은 &lt;A href=&quot;http://support.microsoft.com/kb/909967/ko&quot;&gt;http://support.microsoft.com/kb/909967/ko&lt;/A&gt;&amp;nbsp;참조..&lt;br /&gt;&lt;br /&gt;아래 명령어를 실행하여 삭제하고 싶은 인스턴스를 선택하면 삭제됨..&lt;br /&gt;&lt;br /&gt;
&lt;BLOCKQUOTE&gt;&lt;STRONG&gt;&quot;C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\ARPWrapper.exe&quot; /Remove&lt;/STRONG&gt;&lt;/BLOCKQUOTE&gt;설치된 인스턴스가 여러개인 경우, 언인스톨을 하고 나면 설치지원 프로그램들이 같이 삭제가 되기 때문에 설치 CD를 사용해 설치지원 프로그램만 설치한 후 취소를 하여 종료하고 다시 위의 명령어를 실행하여 삭제하고 싶은 인스턴스 갯수만큼 반복해야 함.. 불편하지만, 다른 방법 없음..&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<category>MSSQL</category>
			<category>mssql 2005</category>
			<category>수동삭제</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/15</guid>
			<comments>http://madchick.tistory.com/15#entry15comment</comments>
			<pubDate>Wed, 23 Apr 2008 02:00:41 +0900</pubDate>
		</item>
		<item>
			<title>실버라이트 실습기..</title>
			<link>http://madchick.tistory.com/14</link>
			<description>ActiveX를 대신할 방법으로 Flex와 Silverlight를 저울질 중인데.. &lt;A href=&quot;http://madchick.egloos.com/1690651&quot;&gt;Flex는 약간 맛을 좀 봤으니&lt;/A&gt;, 오늘은 실버라이트 구경을 좀 해보기로 했다.. 그런데 볼만한 책이 하나도 없다.. 나온 책도 베타버젼을 가지고 쓴 책이 몇권 있을 뿐.. 앞으로 책들이 좀 나오긴 할 모양인가 본데, 그럴바엔 아예 실버라이트2 베타1을 보는게 나을거 같아 마침 눈에 들어오는 샘플이 있어 요걸로 실습을 해봤다..&lt;br /&gt;&lt;br /&gt;사전준비..&lt;br /&gt;
&lt;UL&gt;
&lt;LI&gt;Visual Studio 2008 설치 
&lt;LI&gt;&lt;A href=&quot;Microsoft%20Silverlight%20Tools%20Beta%201%20for%20Visual%20Studio%202008&quot; target=_blank&gt;Microsoft Silverlight Tools Beta 1 for Visual Studio 2008&lt;/A&gt; 설치 (이것만 설치하면 Windows - Silverlight 2 Beta 1 Runtime과&amp;nbsp; Silverlight 2 Beta 1 Tools도 같이 설치가 된다..) 
&lt;LI&gt;Expression Blend 2.5 Preview 설치 
&lt;LI&gt;Deep Zoom Composer 설치 (반드시 설치할 필요는 없다.. Deep Zoom 효과를 사용하려면 필요한 툴인데, 내가 고른 샘플이 이 효과를 설명하는 샘플이기 때문에 설치를 했다..)&lt;/LI&gt;&lt;/UL&gt;실습예제는 Coding4Fun 사이트에서 봐뒀던 예제..&lt;br /&gt;&lt;A href=&quot;http://blogs.msdn.com/coding4fun/archive/2008/04/09/8363805.aspx&quot;&gt;Deepzoom application in 15 minutes&lt;/A&gt;&amp;nbsp;(Coding4Fun 이라는 사이트는 Microsoft 기술에 대한 재미난 예제들을이 많이 소개되는 사이트다..) 자세한 설명은 원문인 &lt;A href=&quot;http://blogs.msdn.com/dawate/archive/2008/03/21/intro-to-silverlight-2-video-tutorial-deepzoom-for-dummies.aspx&quot;&gt;Intro to Silverlight 2 Video Tutorial: DeepZoom for Dummies!&lt;/A&gt;&amp;nbsp;에서 친절한 설명을 볼 수 있다.. &lt;br /&gt;&lt;br /&gt;설명도 친절하게 잘 되어 있고, 따라해보면 나도 쉽게 결과를 확인해볼 수 있다.. 오~ 이거 신기하구만.. IE에서도 확인해보고, FF에서도 확인을 해봤다.. 양쪽에서 모두 잘 보인다.. 내친김에 얼마전에 설치한 &lt;A href=&quot;http://madchick.egloos.com/1735522&quot;&gt;우분투&lt;/A&gt;에서도 확인을 해봤다.. 그런데, 헉~&lt;br /&gt;&lt;br /&gt;아직도 지원하는 플랫폼이 Flash 혹은 FLEX 보다 부족하다.. 리눅스에서 안된다니.. 이런 된장.. 실망이다..&lt;br /&gt;&lt;A href=&quot;http://www.microsoft.com/silverlight/resources/installationFiles.aspx&quot;&gt;Silverlight Installation Files&lt;/A&gt; 페이지에 가보면 윈도우즈와 MacOS 밖에 지원을 못함을 확인할 수 있다.. Silverlight 2 Beta 1은 좀 나을까 싶어 확인해봤는데 똑같다.. 리눅스에서는 안된다..&lt;br /&gt;&lt;br /&gt;사실 리눅스에서 되고 안되고는 큰 문제가 아닐 수도 있지만, 분명 실버라이트의 초기 발표에서는 리눅스를 포함한 모든 플랫폼에서 지원되는 클라이언트를 배포하겠다고 했었다.. (내가 기억을 잘 못 하는 것일까?) 하지만, 지금은 언제부터인지 몰라도 리눅스는 빠져있다..&lt;br /&gt;&lt;br /&gt;어도비가 아무리 날고 긴다 하더라도 몇년내로 Flex는 Silverlight에게 밀릴 것이 거의 확실하다고 생각한다.. Adobe가 볼랜드를 인수한다던지, 구글에 인수 당한다던지 하는 이변이 없는한 ActionScript로 .NET을 당해낼 재간은 없다.. 하지만, 그동안은 여전히 Flex가 강세다.. 딴거 다 재쳐두고 플랫폼과 브라우저에서 실버라이트가 밀린다.. MacOS 정도만 더 지원하는 상황이라면 그냥 ActiveX로 버티는게 올바른 선택 아닐까?&lt;br /&gt;&lt;br /&gt;굳이 실버라이트 혹은 Flex로 만들 필요가 있을까? FF 하나 더 지원하기 위해서? Flex로 만들었다가 다시 실버라이트로 바꾸느니 실버라이트가 좀 더 쓸만해질때까지 기다리는 동안 ActiveX로 버텨보는게 최선이라는 생각이 든다..&lt;br /&gt;&lt;br /&gt;물론, SI 하면서 고객사에서 실버라이트로 꼭 만들어줘 하는 상황이 발생하는 경우 그때가서 보려면 부담스러우니 틈틈히 봐두는 것도 나쁘진 않겠다.. 그것도 실버라이트 보다는 .NET 3.5와 XAML에 중점을 두는 것이 여러모로 이득일 것이라는 생각이 든다.. 어차피 같이 사용하게될 공통분모만 보는 것이지.. 실버라이트, 실버라이트 하지만 정말 요긴하게 사용될 만한 곳은 아직은 딱히 없는 것 같다..&lt;br /&gt;&lt;br /&gt;2008.04.26&lt;br /&gt;DeepZoom을 멋지게 활용한 예 : &lt;A href=&quot;http://gilverlight.net/2826&quot;&gt;&lt;FONT color=#000000&gt;Deep Zoom Viewer Lite 1.3 Update&lt;/FONT&gt;&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;2008.05.03&lt;br /&gt;SilverLight에서 소켓을 사용하는 샘플 : &lt;A href=&quot;http://gilverlight.net/2834&quot;&gt;&lt;FONT color=#000000&gt;Silverlight 2 Socket 예제&lt;/FONT&gt;&lt;/A&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>관심이야기</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/14</guid>
			<comments>http://madchick.tistory.com/14#entry14comment</comments>
			<pubDate>Sat, 19 Apr 2008 13:51:39 +0900</pubDate>
		</item>
		<item>
			<title>SQL Server JDBC 드라이버 버그..</title>
			<link>http://madchick.tistory.com/13</link>
			<description>&lt;P&gt;기능 개선상 스토어드 프로시저가 몇개 추가되었는데, 갑자기 스토어드 프로시저 호출이 안되는거다.. 예전 스토어드 프로시저는 잘 호출되고 실행도 되는데 새로 추가된 스토어드 프로시저는 호출이 안된다.. 도대체 뭐가 문제인가.. 몇일을 끙끙 거리고 해매도 답도 안나오고..&lt;br /&gt;&lt;br /&gt;스토어드 프로시저 내부에 select 가 2개 이상 있는 것도 아니고.. 이렇게 수정해보고, 저렇게 수정을 해봐도 해결이 안되더군..&lt;br /&gt;&lt;br /&gt;2008/03/18 19:16:18 at ets.biz.admin.siteadmin.TestMngMgt.TestMngTO.testMngMarking2&lt;br /&gt;(TestMngTO.java:500) [Debug] call proc_answer ex ( ?, &#039;&#039; ) start&lt;br /&gt;2008/03/18 19:16:18 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run&lt;br /&gt;(ThreadPool.java:683) [Error] com.microsoft.sqlserver.jdbc.SQLServerException: 서버 커서는 둘 이상의 SELECT 문이 있는 원격 저장 프로시저나 저장 프로시저에서 사용할 수 없습니다. 기본 결과 집합이나 클라이언트 커서를 사용하십시오.&lt;br /&gt;&amp;nbsp; &amp;nbsp; at ets.biz.admin.siteadmin.TestMngMgt.TestMngTO.testMngMarking2(TestMngTO.java:522)&lt;br /&gt;&amp;nbsp; &amp;nbsp; at ets.biz.admin.siteadmin.TestMngMgt.TestMngBLC.testMngMarking2(TestMngBLC.java:154)&lt;br /&gt;&amp;nbsp; &amp;nbsp; at ets.biz.admin.siteadmin.TestMngMgt.TestMngBLC.doTheWork(TestMngBLC.java:51)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;에러메시지를 가지고 구글 검색을 해봤는데도 검색도 안되고.. 결국, 안되는 영어로 메시지를 영어로 바꾸어 검색을 해서 영문에 해당하는 에러메시지를 찾아냈다.. 그 메시지로 Microsoft의 MSDN 사이트에서 검색을 하니 알려진 버그라는 사실을 찾았다.. 문제는 SQL Server JDBC 드라이버의 버그였으며, 최신버젼으로 업데이트 하니 해결되었다..&lt;br /&gt;&amp;nbsp;&lt;br /&gt;2006년에 수정된 버그인데, 몇날 몇일을 이것 때문에 시간을 허비한 것인지.. preparedStatement를 MS SQL 2000에서 수행할때 나는 버그였다.. 2005에서는 발생하지 않았다..&lt;/P&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<category>Java</category>
			<category>JDBC</category>
			<category>MSSQL</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/13</guid>
			<comments>http://madchick.tistory.com/13#entry13comment</comments>
			<pubDate>Sun,  6 Apr 2008 22:11:07 +0900</pubDate>
		</item>
		<item>
			<title>IIS 서버 콤포넌트 만들기..</title>
			<link>http://madchick.tistory.com/12</link>
			<description>몇년전에 몇번 만들어보고는 만들일이 없었는데, 최근에 ASP에서 호출하여 쓸 수 있도록 하는 콤포넌트를 만들게 되었다.. 오랜만에 새로 만들어 보려니 예전 소스를 봐도 기억도 안나고 삽질의 연속.. 아~ 이래서 기록을 남겨둬야 한다니깡.. 워드 프로세서 문서가 저장된 BLOB 필드를 읽어 웹브라우저에서 보여줄 수 있는 png 이미지 파일로 저장하는 기능을 하는 녀석이었는데, 다른 기능은 어렵지 않게 구현이 가능했는데 COM에 관련된 내용 때문에 삽질이 많았다.. 몇년전에 보고 책꽂이에 먼지만 쌓이던 책을 오랜만에 꺼내 찾기도 하고, 인터넷 검색도 하면서 찾은 내용들을 정리해보자.. VC++ 6.0 기준이라 좀 그렇긴 하다만..&lt;br /&gt;&lt;br /&gt;아래 내용의 개발환경은 VC++ 6.0 with SP6 and &lt;A href=&quot;http://madchick.tistory.com/11&quot;&gt;Platform SDK&lt;/A&gt; 2001 Feb, Windows XP Professional with SP2, IIS 5.0에서 이루어졌다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;콤포넌트 만들기&lt;/FONT&gt;&lt;br /&gt;&lt;/STRONG&gt;IIS용 컴포넌트는 ATL COM 컴포넌트로 만든다.. 먼저 프로젝트를 생성해야 하는데, 다음과 같은 순서로 따라하면 된다.. 프로젝트 생성후 문제가 없는지 빌드해서 점검해본다..&lt;br /&gt;
&lt;OL&gt;
&lt;LI&gt;File 메뉴 &amp;gt; new &amp;gt; Projects 탭에서 ATL COM AppWizard 선택.. 
&lt;LI&gt;Location에서 저장할 경로를 지정하고, Project name에 원하는 이름 입력 후 OK 클릭.. 
&lt;LI&gt;다음 화면에서 IIS의 ASP 프로그래밍에 사용할 것이므로 DLL로 선택.. 
&lt;LI&gt;3번 화면에서 MFC를 사용하고 싶다면 Support MFC를 체크한다.. UI에 관련된 클래스들은 아무런 소용이 없지만, CString 등 자료구조 및 유틸리티성 클래스들을 활용하고 싶다면 클릭해야 한다.. 나중에 프로젝트 만들고 나서 MFC를 사용할 수 있도록 만드는 방법도 있을텐데, 찾아보덜 않아 모르겠다.. 난 그냥 무조건 클릭한다.. MFC 관련 클래스들 사용하고 싶어서.. 
&lt;LI&gt;빌드는 주로 Debug와 Release MinDependency, 이렇게 2개를 주로 사용한다.. 물론, 상황에 따라서는 다른 옵션도 사용하게 되고, 유니코드를 고려한 코딩을 하게 되면 유니코드로 빌드할 수 있다.. 특히, 서버 컴포넌트의 경우 서버에서 실행되는 코드로 조금의 성능향상도 중요할 수 있기 때문에 유니코드로 빌드하면 좋다.. WinNT 계열 (NT를 포함하여 이후 버젼.. 2000, XP, 2003 서버, Vista 등)에서는 유니코드가 기본이며, 하위호환을 위해 다른 인코딩 방식을 지원하는 것이므로 아무리 작은 오버헤드라도 줄이는 것이 중요한 서버에서는 유니코드로 작성하는 것이 좋다.. MinSize와 MinDependency의 차이는 잘 모르겠다..&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;이렇게 만들어진 코드는 초기화 등의 경우 외에는 실제 코드가 들어가는 것은 적고, 실제 기능 및 동작을 위해서는 소스코드를 추가해야 한다.. 이 클래스가 실제 동작을 담당하는 코드이다..&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Insert 메뉴에서 New ATL Object를 선택한다.. 
&lt;LI&gt;Category에서 Objects를 선택하고, Objects에서는 ActiveX Server Component를 선택한다.. 
&lt;LI&gt;클래스 이름을 입력한다.. Prog ID에 나타난 값이 ASP에서 Server.CreateObject로 생성시 넘기는 값이된다.. Prog ID 값을 잘 기억해 두도록 한다.. 물론, 잊어버려도 &quot;프로젝트명.클래스명 &quot;으로 조합하면 된다.. 최악의 경우에는 GUID를 가지고 레지스트리 편집기에서 검색을 해보면 Prog ID 문자열 값을 알아낼 수도 있다.. 
&lt;P align=center&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNC50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNC50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;260&quot; width=&quot;424&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;
&lt;LI&gt;Attributes, ASP 탭 부분은 디폴트로 옵션을 체크한 후 마친다..&lt;/LI&gt;&lt;/OL&gt;
&lt;P align=center&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNC50aXN0b3J5LmNvbTovYXR0YWNoLzAvMi5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNC50aXN0b3J5LmNvbTovYXR0YWNoLzAvMi5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;260&quot; width=&quot;424&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMi5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMi5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;260&quot; width=&quot;424&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;이렇게 추가된 클래스에 필요한 메쏘드, 프로퍼티를 추가하게 된다.. 일반적인 함수 및 멤버함수 등을 추가하면 된다.. 필요하다면 이런 클래스를 필요한 만큼 컴포넌트에 계속해 추가해 넣을 수 있다.. 이런 경우 DLL은 하나지만, Server.CreateObject를 분리하여 호출할 수 있게된다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;메쏘드와 프로퍼티 추가&lt;br /&gt;&lt;/FONT&gt;&lt;/STRONG&gt;ASP 페이지에서 호출할 수 있도록 메쏘드와 프로퍼티를 추가한다.. 메쏘드는 함수호출을 위해, 프로퍼티는 약속된 값에 접근하는데 편의성을 제공하기 위해 사용된다.. 특정 단위기능을 수행하기 위해서는 메쏘드 호출을, 상태값이나 특정 기능 수행후 결과값을 접근하기 위해서 프로퍼티를 사용한다.. 클래스에서의 멤버함수와 멤버변수와 비슷하다 생각할 수 있다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;메쏘드 추가/수정/삭제하는 방법&lt;/STRONG&gt;&lt;br /&gt;클래스 뷰 트리에서 ATL 객체를 추가해 넣을때 입력했던 클래스 이름이 C로 시작하는 것이 있을 것이고, I로 시작하는 것이 보인다.. C로 시작하는 클래스 트리를 펼쳐보면 그 안에 다시 I로 시작하는 인터페이스가 보이는데, 트리상에서 최상단에 I로 시작하는 인터페이스도 같이 보이니 그리로 접근한다.. 물론, C로 시작하는 클래스 밑에서 똑같은 작업을 해도 동일한 작업을 수행할 수 있다..&lt;br /&gt;
&lt;OL&gt;
&lt;LI&gt;마우스 우측버튼을 클릭하여 Add Method를 클릭.. 
&lt;LI&gt;새로 나타난 다이얼로그 창에 메쏘드 이름과 파라미터 리스트를 입력.. 
&lt;LI&gt;파라미터 입력시 데이터형과 규칙에 맞게 입력을 해준다..&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;이 다이얼로그에서 리턴값을 선택할 수 없는 황당함을 느끼게 되는데, 이는 나중에 처리할 것이니 여기서는 일단 넘어간다.. 나도 처음에 이 다이얼로그를 보고 어찌나 황당하던지.. &lt;br /&gt;&lt;br /&gt;데이터형은 COM에서 사용할 수 있는 자료형들이 많이 있지만 long, double, BSTR, VARIANT 정도만 알고 있으면 된다.. long과 double은 C++에서와 동일하니 같은 의미로 사용하면 되고, 문자열의 경우는 BSTR을, 한 자료형의 배열이나 여러 자료형이 섞인 구조체의 경우는 VARIANT를 사용한다..&lt;br /&gt;&lt;br /&gt;아울러 COM 인터페이스를 기술하는 방법의 특이한 점이 메쏘드 패러미터 앞에 [in], [out], [out,retval] 이라는 내용을 명시한다는 점.. 메쏘드 추가시 이 부분까지 같이 명시를 해서 표기를 해주면 더 좋다.. 물론, 여기서는 생략하고 나중에 직접 하나하나 고쳐도 된다.. 생략하면 모두 [in]으로 간주한다..&lt;br /&gt;&lt;br /&gt;일단 만들때는 위저드를 통해 뭔가 UI가 제공되지만, 수정과 삭제를 할때는 그러한 UI가 제공되지 않는다.. VC++ 6.0의 한계중 하나인데 일관된 UI를 제공해주지 않는다.. 만들때 뭔가 UI가 나왔으니 수정이나 삭제시에도 기대를 하게 되는 것이 사람 심리인데, 이러한 당연한 기대를 완전 무시하는 것이다.. 수정과 삭제는 편집기 열고 내가 알아서 잘 해야 한다.. 만들때 내가 직접 만들지 않았으므로 어디 어디 코드들이 추가되었는지 알 길이 없는데, 이럴때에는 메쏘드 이름을 가지고 Find In Files를 잘 해서 필요한 곳 빠지지 않고 잘 수정 혹은 삭제가 되도록 신경써야 한다.. 첨 해볼때만 좀 황당하지, 한번만 해보면 별거 아니라는 생각이 든다.. VC++ 6.0에 뭔가 많이 바라지도 않아왔었고, 손으로 열심히 다듬던 코드들인데 새삼스러울 것도 없다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;프로퍼티 추가/수정/삭제하는 방법&lt;/STRONG&gt;&lt;br /&gt;프로퍼티는 메쏘드와 방식이 완전 동일하다.. 메쏘드를 추가, 수정 및 삭제를 할줄 안다면 프로퍼티도 동일한 방법으로 하면 된다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;&lt;br /&gt;리턴값 넘기기&lt;/FONT&gt;&lt;br /&gt;&lt;/STRONG&gt;리턴값을 넘기고 싶은 경우는 패러미터 리스트에서 가장 마지막 패러미터에 [out, retval]를 붙여주면 된다..&lt;br /&gt;예를들면 맨 마지막 파라미터를 [out,retval] int* iResult 라고 했으면 int 값을 리턴으로 넘기는 것이며, [out,retval] BSTR* sFileName 이렇게 하면 문자열을 리턴값으로 넘긴다는 의미가 된다..&lt;br /&gt;&lt;br /&gt;따라서, SetImagePath([in] BSTR sPath, [out,retval] int* iResult) 이렇게 메쏘드를 선언했다면 파라미터는 문자열을 넘기는 것 하나이며 정수값을 리턴하는 메쏘드가 되는 것이다..&lt;br /&gt;호출할때는 대략 result = objTestCom.SetImagePath (&quot;경로명&quot;) 이런 모습으로 사용하게 된다.. 리턴값을 파라미터 리스트에 정의한다는게 좀 어색하기는 하다.. 아무튼, COM 컴포넌트에서는 이렇게 만들어야 한다.. 이상하지만, 따르는 수 밖에 없다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;리턴값으로 Variant 넘기기&lt;/FONT&gt;&lt;br /&gt;&lt;/STRONG&gt;C에는 배열과 구조체라는 것이 있으며 다른 언어에도 이와 상응하는 자료구조가 있을 것이다.. 문제는 언어마다 다른 자료구조를 COM 이라는 환경에서 어떻게 동일한 인터페이스로 처리할 것인가.. 고민의 결과는 바로 VARIANT 이다.. 따라서 기본 자료구조로 해결 안되는 모든 자료구조는 바로 이 Variant로 해결을 해야 한다.. 대부분 배열을 위해 많이 사용된다.. 이를 좀 더 응용하면 여러 상황에서 활용될 수 있을 것이다.. 기본적으로 Variant는 다른 자료형들을 하나로 묶어서 관리할 수 있다..&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;STDMETHODIMP CTestVariant::ReturnVariant(int iValue, VARIANT *pVal)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; AFX_MANAGE_STATE(AfxGetStaticModuleState())&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; VARIANT v;&lt;br /&gt;&amp;nbsp; &amp;nbsp; v.vt = VT_VARIANT | VT_ARRAY;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; int iRowCount &amp;nbsp;&amp;nbsp; = 3 ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; int iColumnCount = 2 ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; SAFEARRAY* pSA;&lt;br /&gt;&amp;nbsp; &amp;nbsp; SAFEARRAYBOUND bnd[2]={{iRowCount,1}, {iColumnCount,1}};&lt;br /&gt;&amp;nbsp; &amp;nbsp; pSA = SafeArrayCreate(VT_VARIANT, 2, bnd); &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; VARIANT* pVar;&lt;br /&gt;&amp;nbsp; &amp;nbsp; SafeArrayAccessData(pSA, (void**)&amp;amp;pVar);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for(int i=0 ; i&amp;lt;iRowCount ; i++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(int j=0 ; j&amp;lt;iColumnCount ; j++)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char szPrint[1024] ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sprintf(szPrint, &quot;%d, %d&quot;, i+1, j+1) ;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#ff9900&gt;int iIndex = i + j * iRowCount ;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; USES_CONVERSION ;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pVar[iIndex].vt = VT_BSTR;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pVar[iIndex].bstrVal = SysAllocString(T2OLE((TCHAR*)szPrint));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; SafeArrayUnaccessData(pSA);&lt;br /&gt;&amp;nbsp; &amp;nbsp; v.parray = pSA;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; *pVal = v;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return S_OK ;&lt;br /&gt;}&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;br /&gt;Variant를 리턴값으로 넘기는 방법에 대해서는 &lt;A href=&quot;http://kindlion.tistory.com/entry/ATL에서-asp로-배열-데이터-보내는법-1&quot; target=_blank&gt;kindlion님의 글&lt;/A&gt;을 보고 참조를 하였다.. 다만, 글에 약간 잘못된 부분이 있어 이 부분은 약간 수정을 했다.. Variant에서는 C++에서와 VB에서 서로 반대로 들어가는 것이 아니고, n*n 배열을 만드는데 있어 C++에서는 연속적인 메모리 공간이고 이를 논리적으로 분리하여 n*n 배열을 만드는 것이니 메모리에 접근할때 논리적으로 구성된 배열처럼 접근하도록 계산을 좀 해야 하는데 이 계산이 kindlion님 말처럼 항상 반대는 아니라는 것.. kindlion님의 글에서는 마침 반대로 되었을 뿐, 이 상황은 배열을 몇 바이 몇으로 만드느냐에 따라 달라질 수 있다.. 해서 n*n 크기의 일반적인 상황에서도 데이터를 제대로 넣을 수 있도록 수정을 해야했다..&lt;br /&gt;&lt;br /&gt;iRowCount, iColumnCount 값을 바꿔가며 배열의 생성초기화를 바꿔도 VB에서는 제대로된 값을 가져올 수 있도록 수정된 부분은 위의 샘플코드에서 색상표시가 된 부분이다.. &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT size=3&gt;&lt;STRONG&gt;테스트하기&lt;br /&gt;&lt;/STRONG&gt;&lt;FONT size=2&gt;자, 그럼 이렇게 작성된 코드를 ASP에서 어떻게 활용할 수 있는가 함 보자..&lt;br /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&amp;lt;%&lt;br /&gt;&amp;nbsp; &amp;nbsp; set objTestCom = Server.CreateObject(&quot;Test.TestVariant&quot;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Dim data&lt;br /&gt;&amp;nbsp; &amp;nbsp; data = objTestCom.ReturnVariant (1)&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for i=1 to UBound(data,1) step 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for j=1 to UBound(data,2) step 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; response.write data(i,j) &amp;amp; &quot;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Next&lt;br /&gt;&amp;nbsp; &amp;nbsp; Next&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; set objTestCom = nothing&lt;br /&gt;%&amp;gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;br /&gt;2차원 배열을 받아 화면에 출력해주는 ASP용 코드이다.. 직접 호출을 해주면 C++ 코드에서 넣었던 인덱스 값들이 제대로 출력되는 것을 확인할 수 있을 것이다..&lt;br /&gt;&lt;br /&gt;테스트하는 방법은 위의 코드를 ASP 파일로 저장한 후에, IIS가 설치된 사이트 혹은 가상디렉토리에 넣은 후 해당 URL을 호출하면 실행된 결과를 확인할 수 있다.. 테스트하는 PC가 컴포넌트를 빌드하는 PC와 다르다면 개발하는 PC에서 DLL 파일을 테스트용 PC에 옮긴후, 도스창을 열어서 DLL 파일이 복사된 경로로 이동한 후에 다음과 같은 명령을 실행시켜줘야 한다.. &quot;regsvr32 DLL파일명&quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;STRONG&gt;디버깅하기&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;Visual Studio는 강력한 디버깅 환경을 제공하는 것으로 유명한데, IIS 서버 콤포넌트 개발시에는 어떻게 이 강력한 디버거를 활용할 수 있을까? 일반적인 상황처럼 사용할 수는 없다.. 조금은 번거로운 방식으로 디버깅을 해야한다..&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;빌드를 한다.. 
&lt;LI&gt;웹브라우저를 실행시켜 테스트용 페이지를 호출한다.. 
&lt;LI&gt;작업관리자를 실행시킨다.. 프로세스탭으로 가서 dllhost.exe 프로세스를 찾아 PID를 확인한다.. 여러개가 있는 경우에는 프로세스를 실행시킨 사용자가 인터넷 서비스 계정인 것을 찾는다.. 
&lt;LI&gt;VC++에서 디버깅을 한다.. Build &amp;gt; Start Debug &amp;gt; Attacth to Process 를 클릭.. 새로 뜬 다이얼로그 창에서 Show System Processes를 클릭..&amp;nbsp; 3번 과정에서 확인한 PID를 갖는 프로세스를 선택한 후 OK 버튼을 클릭하면 디버깅이 시작된다.. 
&lt;LI&gt;디버깅 하고자 하는 코드가 담긴 소스코드 파일을 열어 브레이크 포인트를 걸고 디버깅을 한다..&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;프로젝트의 워크스페이스 파일이 닫혀 버리니 원하는 소스코드 파일 찾기도 귀찮아지고, 디버깅을 종료했다 다시 시작할때마다 이 과정을 반복해야 하니 여간 귀찮은게 아니긴 하다.. 하지만, 그래도 웹서버와 연동이 되어 돌아가는 DLL 파일을 이렇게라도 디버깅 할 수 있다는게 어딘가.. 이런 방법이 없었다면 별 수 없다.. 천상 로그파일에 로그 찍어가며 디버깅 하는 수 밖에..&lt;br /&gt;&lt;br /&gt;디버깅 하는 방법 자체는 VC++ 6.0의 디버거를 사용하는 것과 동일하니 이 내용은 생략한다..&lt;br /&gt;&lt;br /&gt;여러번 반복해보면 알겠지만, 다른 프로그램이 추가로 실행되지 않는다면 3번 과정을 생략할 수 있다.. 바로 4번으로 넘어가도 우리가 원하는 프로세스가 뭔지 알 수 있다..&lt;/P&gt;
&lt;P&gt;위와 같은 과정을 계속해서 반복해야 하는데 이를 좀 더 편하게 하는 팁이 몇개 있다.. 내가 주로 사용하는 팁인데, 우선 개발환경과 테스트 환경을 한데 붙여 한 PC에서 수행하는게 편하다.. 이를 위해서는 XP의 경우 반드시 Professional 이상을 사용해야 한다.. 그 이하에서는 IIS가 설치되지 않기 때문에..&lt;br /&gt;&lt;br /&gt;두번째로는 VC++을 하나는 소스코드 수정 및 콤포넌트 빌드용, 다른 하나는 디버깅용 이렇게 2개를 동시에 띄워놓고 사용하는 것이 편하다.. 일반적인 디버깅 환경과 달리 Attach Process를 통한 디버깅은 소스코드 워크스페이스가 닫혀 버리기 때문이다.. 매번 열고 닫고 하기가 귀찮으니 하나는 코드수정 및 빌드용으로, 다른 하나는 디버깅 전용으로 2개를 동시에 실행시켜두고 사용하는 것이 편하다..&lt;br /&gt;&lt;br /&gt;마지막으로, 정말 귀찮은 작업중에 하나가 웹서버를 계속 내렸다 올렸다 하는 것이다.. IIS는 서버 컴포넌트를 한번 올리면 메모리에 올려두기 때문에 코드를 수정한 경우 수정된 코드가 반영되지 않는다.. IIS가 파일을 물고 있기 때문에 VC++이 새로운 DLL을 덮어쓰지 못하기 때문이다.. 따라서 IIS를 재기동 시키는 일이 자주 반복되는데 이거 여간 귀찮은게 아니라서 마우스 더블클릭 혹은 커맨드라인에서 쉽게 실행시킬 수 있도록 bat 파일을 하나 만들었다..&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;net stop W3SVC&lt;br /&gt;net stop IISADMIN&lt;br /&gt;net start IISADMIN&lt;br /&gt;net start W3SVC&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;br /&gt;위의 내용을 담은 텍스트 파일을 하나 만들고, 파일명을 ReStartIIS.bat 으로 바꾸면 된다.. 명령어는 XP에 IIS 5.0을 사용했을때 기준이며, Windows 2003의 경우에는 명령어가 약간 다를 수도 있다.. 이 bat 파일을 VC++의 Tools 메뉴에 등록시켜두면 단축키로 쉽게 웹서버를 내렸다 올렸다 할 수 있다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>심화이야기</category>
			<category>ActiveX</category>
			<category>atl</category>
			<category>com</category>
			<category>IIS</category>
			<category>VARIANT</category>
			<category>vc++</category>
			<category>디버깅</category>
			<category>컴포넌트</category>
			<category>프로그래밍</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/12</guid>
			<comments>http://madchick.tistory.com/12#entry12comment</comments>
			<pubDate>Thu,  7 Feb 2008 20:05:00 +0900</pubDate>
		</item>
		<item>
			<title>Microsoft Platform SDK..</title>
			<link>http://madchick.tistory.com/11</link>
			<description>&lt;P&gt;Platform SDK는 OS나 서버제품, IE, DirectX, 기타 H/W 관련된 기능추가 및 개선 등의 내용을 담고 있는 샘플소스코드 및 라이브러리를 제공하는 패키지다.. 사실 다른 개발툴에서는 도움이 안된다.. 거의 VC++ 전용이라고 봐도 된다..&lt;br /&gt;&lt;br /&gt;그래서 그런지 요즘엔 나오지 않는다.. .NET 개발환경으로 옮겨가길 바라는 Microsoft의 전략 때문일까? 아무튼, VC++ 개발자들에 대한 지원이 많이 줄고 있다는 느낌이 들고, 이것도 그런 측면으로 이해될 수 있다.. 하지만, 이런 VC++ 개발자들을 이제 잊혀진 존재로 취급하는 것은 아주 좋지 않은 정책이다.. VC++ 개발자에 대한 지원을 Microsoft가 끊어버렸다는 질책 및 아쉬움이 괜히 나오는게 아니다.. 그래도, 이번 VS.NET 2008에서는 VC++에 대한 지원을 대폭 늘렸다고 하는 이야기가 들리니 좋은 현상이다..&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNC50aXN0b3J5LmNvbTovYXR0YWNoLzAvMC5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs4.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNC50aXN0b3J5LmNvbTovYXR0YWNoLzAvMC5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;364&quot; width=&quot;550&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Platform SDK는 개발툴 버젼에 따라서 연동이 되는 버젼이 따로 있다.. 최신의 버젼에서는 이전 개발툴과 제대로 호환이 되지 않는다.. 따라서 하드디스크 용량이 좀 낭비되는 듯한 느낌이 들더라도, 각 개발툴 버젼에 맞춰서 각각 별도로 설치를 해두는 것이 좋다.. 그렇지 않은 경우 괜한 삽질 및 시간낭비가 될 가능성이 높다..&lt;br /&gt;&lt;br /&gt;VC++ 6.0을 사용하기 위해서는 MS Platform SDK 2001 Feb이 6.0을 지원하는 마지막 버젼이다.. 참고로 MSDN은 October 2001 (위의 그림)이 VC++ 6.0을 지원하는 마지막 버젼이다.. MSDN도 VC++ 6.0용은 별도로 설치를 해놓아야 한다.. 물론, MSDN은 IDE에서 연동이 안된다는 부분 말고는 별도로 설치를 하지 않아도 되긴 한다.. Platform SDK는 빌드가 제대로 안된다던지 하는 현상이 일어나는 것에 비하면 큰 문제는 아니지만, IDE와 연동이 안되는 것은 아무데서나 F1을 누르면 관련 도움말을 볼 수 있는 기능을 포기해야 하는 것이니 용량이 된다면 각각 별도로 설치하는 것이 좋겠다..&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNS50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs5.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNS50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;364&quot; width=&quot;550&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;VC++ 2005를 위해서는 MS Platform SDK 2005 April이 마지막 버젼이다.. 사실 그 이후로 나온 Vista 같은 OS를 위해서 관련 플랫폼 SDK가 나와야 하는데 정식으로 나오지 않는거 보면 안타까운 일이다.. MSDN 라이브러리는 가장 최신의 버젼이 계속해서 나오고 있는데, 왜 플랫폼 SDK는 최신으로 업데이트가 안되고 있는 건지.. Microsoft의 특별한 공식입장 발표 같은 것도 없는거 보면 웬지 이제 VC++ 개발은 구닥다리가 되어 버린 것만 같은 느낌도 든다.. 뭐, Microsoft에서 어쩌던 상관은 없긴 하지만..&lt;br /&gt;&lt;br /&gt;아무리 그래도 그렇지, 이렇게 2개나 설치해야만 하는걸까? 최신판 하나만 설치해놓고 살면 어떤 일이 발생할까? 대표적으로 VC++ 6.0에서 COM 관련 (ActiveX 컨트롤, IIS 서버 콤포넌트 등) 소스를 빌드할때 디버그 모드로 제대로 빌드가 되지 않고 컴파일 에러가 난다.. 왜 이런 에러가 나는지는 모르겠지만, 아무튼 해결책은 VC++ 6.0에 맞는 플랫폼 SDK를 설치하는 것이 가장 바람직한 해결책이다..&lt;br /&gt;&lt;br /&gt;아마 곧 새 플랫폼 SDK가 나오지 않을까 기대를 해보며.. 앞으로는 각각 SDK별로 나뉘어 (DirectX는 별도 SDK로 제공) 제공되면서 플랫폼 SDK 라는 이름이 없어질 지도 모르겠지만, 예전처럼 플랫폼 SDK라는 이름으로 모두 제공되는 것이 편하다는 생각이 든다.. 각각의 SDK들이 너무 종류도 많고 용량이 너무 커져서 플랫폼 SDK라는 이름으로 모두 묶이지 않을지 모르겠다..&lt;/P&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>기본이야기</category>
			<category>PlatformSDK</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/11</guid>
			<comments>http://madchick.tistory.com/11#entry11comment</comments>
			<pubDate>Sun, 16 Dec 2007 13:40:31 +0900</pubDate>
		</item>
		<item>
			<title>Java, PreparedStatement 쿼리문 확인하기..</title>
			<link>http://madchick.tistory.com/10</link>
			<description>&lt;P&gt;자바 코딩을 할 일이 생겼는데, 쿼리문을 날리는데 Prepared Statement를 사용하면 좋다는 생각이 나서 사용해보기로 했다.. 평소엔 신경도 쓰지 않던 내용을 일도 많고 바쁜데 하필 적용시켜보겠다고 생각을 했는지는 모르겠다.. 하긴, 물론 이렇게 한다고 해서 시간이 더 걸리거나 어려운 방법은 아니다..&lt;br /&gt;&lt;br /&gt;Prepared Statement는 DB 서버가 쿼리문을 캐쉬해두어 성능을 높일 수 있게 해주는 알고리즘을 개선 시키기 위해 등장한 것으로, 패러미터가 계속해서 바뀌는 쿼리문도 캐쉬를 해둘 수 있도록 하기 위해 고안된 것이다.. 즉, 변화되는 부분을 ? 로 처리해두고 실제 실행될때는 실행될때마다 다른 값이 매칭되어 실행되도록 하는 방식이다.. 솔직히 정말로 빠른지 어떤지는 직접 느껴보지는 못했다..&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMC5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMC5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;374&quot; width=&quot;550&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;일반적인 쿼리문 날리는 것과 별반 다를바 없지만, 쿼리문 작성할때 변경되어야 하는 부분을 ?로 표시하여 작성을 하고, 그 부분의 값을 setParam 함수 호출을 통해 값을 할당한다는 부분이 조금 다른 부분이다.. setParam 이라는 함수 내부에서는 &lt;FONT color=#0000ff&gt;psmt.setString(1, 변수값); &lt;/FONT&gt;과 같이 몇번째 ?를 어떤 값으로 바꿔야 하는지를 명시하는 코드가 들어가 있다..&lt;br /&gt;&lt;br /&gt;사실, 그냥 막 쿼리 날리는 것과 이렇게 수정하는 것과의 차이는 거의 없고 어려운 일이 아니기 때문에 여기까지는 좋았다.. 그런데 사용중 쿼리문이 에러가 나는 현상이 발생.. 로그를 찍어서 어떤 쿼리문이 날아가고 있는지 보고 싶은데, 이런 젠장.. PraparedStatement의 쿼리 내용을 찍을 수 있는 방법이 없는거다..&lt;br /&gt;&lt;br /&gt;자바에서 기본적으로 제공해주는 방법이 있을 것으로 알았다.. ToString으로 하면 될 줄 알았는데, 너무 순진한 생각이었다.. 결국, 자바에서 기본적으로 제공되는 방법으로 Prepared Statement의 실제 실행된 쿼리문 모습을 알아낼 수는 없다는 것을 알게되었다..&lt;br /&gt;&lt;br /&gt;검색을 통해 찾은 사이트에서 방법을 알아낼 수 있었다.. (참조 : &lt;A href=&quot;http://phplab.co.kr/cms/board/bod_view.php?code=jsp&amp;amp;no=368&amp;amp;pageID=1&amp;amp;item=&amp;amp;find=&amp;amp;flg&quot; target=_blank&gt;PreparedStatement - ? 치환해서 로그찍는 소스&lt;/A&gt;, 소스 수정에 필요한 파일 다운로드 : &lt;A href=&quot;http://madchick.tistory.com/attachment/fk0.java&quot;&gt;LoggableStatement.java&lt;/A&gt;) 이런 기능은 자바가 기본으로 제공해주는 Prepared Statement 클래스에 들어가 있으면 좋겠구만 말이지..&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5qcGc=&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs6.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzNi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5qcGc=&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;353&quot; width=&quot;550&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;br /&gt;이렇게 수정하고 나면, Prepared Statement로 작성된 쿼리문도 최종 수행된 쿼리문이 어떤 모습으로 날아갔는지 확인해 볼 수 있게된다..&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>기본이야기</category>
			<category>Java</category>
			<category>PreparedStatement</category>
			<category>자바</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/10</guid>
			<comments>http://madchick.tistory.com/10#entry10comment</comments>
			<pubDate>Sun, 16 Dec 2007 03:21:18 +0900</pubDate>
		</item>
		<item>
			<title>Dr Watson을 기본 디버거로 사용하기..</title>
			<link>http://madchick.tistory.com/9</link>
			<description>&lt;P&gt;데스크탑 어플리케이션 개발시 잡기 힘든 버그 중 하나가 가끔씩 일어나는 크래쉬.. 언제 죽는다, 재현을 해보기 힘든 비정상 종료상황이 발생하는 경우는 죽는 상황을 어떻게 하면 재현할 수 있다는 정보를 수집하기가 상당히 어려운 부분이 있다..&lt;br /&gt;&lt;br /&gt;다행히 윈2000 이상의 윈도우 시스템에서는 Dr Watson 이라는 꽤 괜찮은 기본 디버거가 윈도우 시스템에 기본 탑재가 되어 있다.. &lt;A href=&quot;http://madchick.egloos.com/237931&quot; target=_blank&gt;메트 피에트릭이 소개한 SEH 처리용 클래스를 활용&lt;/A&gt;하는 방법 보다는 훨씬 더 많은 디버깅 관련 자료를 제공해주는 덤프를 작성해 줄 수 있기 때문에 Dr Watson을 활용하는 방법이 좋다고 생각한다.. (&lt;A href=&quot;http://madchick.egloos.com/287201&quot; target=_blank&gt;SEH 처리용 클래스에 관련된 보다 더 많은 정보 참고&lt;/A&gt;)&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMDYwMDAwMDAwMDAyLmpwZw==&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMDYwMDAwMDAwMDAyLmpwZw==&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;450&quot; width=&quot;396&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;실행시킨 모습은 위와 같은데, 로그파일과 크래쉬 덤프를 위와 같이 세팅한 대로 남겨준다.. 이렇게 남은 정보는 위에서 이야기한 기사에 소개된 SEH 처리용 클래스가 남기는 정보보다 훨씬 더 유용한 정보들을 많이 남겨준다.. 하지만, 위 그림과 같이 저장되는 경로만 내가 원하는 곳으로 저장해둔다고 동작하는 것은 아니다.. 잊지말고 반드시 해줘야 하는 작업, 하지만 막상 하려면 명령어가 생각나지 않는 작업을 해줘야 한다.. &lt;br /&gt;&lt;br /&gt;명령행에서 &quot;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;drwtsn32 -i&lt;/FONT&gt;&lt;/STRONG&gt;&quot; 라고 쳐줘야 Dr Watson이 기본 디버거로 설정이 되면서 정보를 남겨주게 된다..&lt;br /&gt;&lt;br /&gt;그럼 이 정보를 제대로 활용하는 방법은? 인터넷에서 검색을 통해 더 좋은 자료를 찾을 수도 있겠지만, 지금까지 내가 알기로는 &lt;A href=&quot;http://madchick.egloos.com/719786&quot; target=_blank&gt;Debugging Applications&lt;/A&gt;라는 책이 가장 좋은 활용법을 알려준다..&lt;br /&gt;&lt;br /&gt;언제 죽는지 모르는 버그에 시달리고 있다면, 개발자 자신의 PC의 세팅을 이렇게 남겨두면 어떨까?&lt;br /&gt;&lt;br /&gt;더 나아가 우리가 배포하는 사용자 PC의 환경도 이렇게 바꿔두면 어떨까? 사실 사용자의 PC 환경을 우리가 만든 어플리케이션이 맘대로 조작한다는건 상당히 기분 나쁜 일일 수도 있다.. 더구나 내가 만든 프로그램의 사용자 역시 프로그래머다.. 그런데 그 사람이 사용하는 기본 디버거가 따로 있는데, 이게 Dr Watson으로 어느날 갑자기 바뀌었다.. 이건 좀 아니긴 하다.. 하지만, 많은 경우에 기본 디버거를 바꿔버리고, 우리가 원하는 위치에 크래쉬 덤프를 남기고 그것을 우리가 수집할 수 있다면 여러 사용자 환경에서 발생하는 오류에 대한 대처에 더욱 능동적일 수 있지 않을까?&lt;br /&gt;&lt;br /&gt;최소한 사용자 동의를 얻어 진행할 수 있는 클로즈 베타, 혹은 베타 서비스 기간에는 이를 적용하여 크래쉬에 대한 정보를 적극적으로 수집하는 것도 좋은 방법일 것이다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;추가내용 : &lt;A href=&quot;http://jhrogue.blogspot.com/&quot;&gt;jrogue&lt;/A&gt;님이 알려주신 주옥같은 정보.. &lt;br /&gt;&lt;br /&gt;1. Dr Watson은 윈도우 설치시 사용할 수 있는 기본 디버거.. 별도로 세팅하지 않아도 크래쉬 정보를 수집할 수 있다.. 난, 개발툴을 설치했기 때문에 Dr Watson이 기본 디버거가 아니었던 것이다.. &lt;br /&gt;&lt;br /&gt;2. &lt;A href=&quot;http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/drwatson_overview.mspx?mfr=true&quot;&gt;Dr Watson에 관련된 좋은 정보&lt;/A&gt; &lt;br /&gt;&lt;br /&gt;3. &lt;A href=&quot;http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/drwatson_logfile.mspx?mfr=true&quot;&gt;Dr Watson의 로그파일을 점검하는 방법에 관한 정보&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;음.. 이쯤되면, 무식한 덕에 제목을 완전 잘 못 달았음을 알 수 있다.. Dr Watson은 원래 윈도우즈의 기본 디버거였던 것이다.. 이름은 아마도 셜록홈즈 소설에 나오는 바로 그 왓슨 박사에서 따온 듯 하다..&lt;/P&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<category>Dr Watson</category>
			<category>디버깅</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/9</guid>
			<comments>http://madchick.tistory.com/9#entry9comment</comments>
			<pubDate>Mon, 12 Nov 2007 23:52:06 +0900</pubDate>
		</item>
		<item>
			<title>.NET으로 포팅된 Quake2 소스..</title>
			<link>http://madchick.tistory.com/8</link>
			<description>무척 오래된 내용인데, 블로그에 백업 차원에서.. 음, 이런 글을 &lt;A href=&quot;http://madchick.springnote.com/pages&quot;&gt;스프링노트&lt;/A&gt;(위키)에 올려둬야 하는건가?&lt;br /&gt;&lt;br /&gt;퀘이크 2는 &lt;A href=&quot;http://madchick.egloos.com/66514&quot;&gt;소스코드가 공개&lt;/A&gt;된 Id Software의 유명한 FPS 게임이다.. 소스코드가 공개된 덕에 여러가지 실험(?)에 자주 사용되곤 하는데, &lt;A href=&quot;http://madchick.egloos.com/1395746&quot;&gt;자바 그래픽 엔진을 테스트 하기 위해 사용&lt;/A&gt;되기도 하고, Visual C++ .NET의 기능 홍보(?)에 사용되기도 한다.. 이 샘플소스코드는 &lt;A href=&quot;http://madchick.egloos.com/58477&quot;&gt;Microsoft MVP&lt;/A&gt;로 활동하던 시절, &lt;A href=&quot;http://madchick.egloos.com/413465&quot;&gt;MSDN 세미나&lt;/A&gt;에서 사용했던 샘플이기도 한데, 2004년도에 VS 2003에 포함된 VC++을 홍보하기 위해 많이 사용되었던 샘플이기도 하다.. VC++을 가지고 아주 흥미로운 시도를 한 좋은 샘플이다..&lt;br /&gt;(현재는 그 다음 버젼인 &lt;A href=&quot;http://madchick.egloos.com/1109691&quot;&gt;퀘이크3까지 소스코드가 공개&lt;/A&gt;되어 있다..)&lt;br /&gt;
&lt;BLOCKQUOTE&gt;.NET으로 포팅된 Quake 2 살펴보기&lt;br /&gt;
&lt;UL&gt;
&lt;LI&gt;Vertigo 소프트웨어사 공개내용 (&lt;A href=&quot;http://www.vertigosoftware.com/Quake2.htm&quot;&gt;http://www.vertigosoftware.com/Quake2.htm&lt;/A&gt;) 
&lt;LI&gt;코드프로젝트에 공개된 내용 (&lt;A href=&quot;http://www.codeproject.com/managedcpp/Quake2.asp&quot;&gt;http://www.codeproject.com/managedcpp/Quake2.asp&lt;/A&gt;) 
&lt;LI&gt;Microsoft MSDN 사이트에 소개된 내용.. MS에서도 좋은 샘플임을 알아챈 모양이다.. (&lt;A href=&quot;http://msdn2.microsoft.com/en-us/visualc/Aa336449.aspx&quot;&gt;http://msdn2.microsoft.com/en-us/visualc/Aa336449.aspx&lt;/A&gt;)&lt;/LI&gt;&lt;/UL&gt;&lt;/BLOCKQUOTE&gt;이 샘플이 흥미로운 이유는 공개된 퀘이크2 소스 (C 코드로 되어있다)를 수정하지 않고 .NET 환경에서 바로 사용할 수 있으며, 여기에 몇가지 기능을 더 추가하여 새로 추가되는 기능은 .NET 코드로 작성을 해, 두 코드가 잘 섞여 돌아가는 모습을 보여줬기 때문이다.. 유명한 게임에 내가 원하는 기능을 추가하는 흥미로운 방법으로 보여줘서 샘플로서 효과가 아주 크다고 할 수 있다..&lt;br /&gt;&lt;br /&gt;원 게임에는 없는 기능인 레이더 기능(위에 소개된 URL들 중에서 코드프로젝트 사이트에 가보면 화면 캡쳐 이미지가 있다..)이 추가되어 있는데, 이 기능이 .NET 코드로 작성된 코드다.. 즉, C 언어로 작성된 원 게임소스는 컴파일러 및 개발툴에 의해 자동으로 .NET 어셈블리로 빌드되어 추가된 기능과 함께 .NET 환경에서 실행이 되는 것이다..&lt;br /&gt;&lt;br /&gt;간단한 빌드 설정만 바꾸면 쉽게 .NET 어셈블리로 빌드가 되는 놀라운(?) VC++의 기능이라 할 수 있겠다.. 예전에 작성된 많은 C 코드들을 쉽게 재활용할 수 있는 기회가 열리기 때문이다.. 하지만, C++ 코드들은 이렇게 되지 못하는 경우가 많아 반쪽짜리 기능 이기도 하다.. .NET을 고려하는 C/C++ 개발자들 중에는 C++ 개발자들이 더 많고, 그들이 C 코드와 C++ 코드 중 어떤 것을 더 많이 가지고 있을지는 뻔하기 때문이다..&lt;br /&gt;&lt;br /&gt;이러다 보니 .NET 환경에서의 VC++은 정말 무슨 존재인가 하는 생각이 들기도 한다.. 허브셔터나 스탠리 리프먼 등 많은 C++의 대가들이 대거 Microsoft에 입사하여 C++을 .NET 환경에서 사용하기 편리하게 만드는 작업에 몰두하고 있다.. 이들이 블로그에 올리는 내용이나, 활동하는 뉴스그룹, 메일링 리스트에 관련 내용들이 자주 언급되며 비중도 많이 차지하고 있다.. 하지만, &lt;A title=&quot;Read &#039;[C++/CLI] Mixed-Type 사용시의 메모리 해제 문제&#039;&quot; href=&quot;http://kaistizen.net/EE/index.php/weblog/comments/cplusplus_cli_mixed_type_memory_management/&quot;&gt;[C++/CLI] Mixed-Type 사용시의 메모리 해제 문제&lt;/A&gt;와 같은 글들을 읽어보며 드는 생각은 뭐하러 이렇게 복잡하게 만들어야 하는가 하는 생각 뿐이다..&lt;br /&gt;&lt;br /&gt;
&lt;BLOCKQUOTE&gt;.NET 환경에서 VC++은 찬밥이 아닌 이유..&lt;br /&gt;
&lt;OL&gt;
&lt;LI&gt;Native 코드를 작성할 수 있는 유일한 개발도구이다.. VB .NET 너무 많이 바뀌었다.. C#, 새로운 언어이니 .NET 전용이다.. 
&lt;LI&gt;COM 프로그램을 쉽게 개발할 수 있도록 되었다 
&lt;LI&gt;표준 C++ 지원 및 이제는 STL도 지원한다.. 
&lt;LI&gt;웹서비스 개발에도 최적의 성능을 제공해준다.. 
&lt;LI&gt;Native 코드와 .NET 코드를 섞을 수도 있다..&lt;/LI&gt;&lt;/OL&gt;&lt;/BLOCKQUOTE&gt;위와 같은 이유들을 만들어(?) 내긴 하지만, 사실 1번과 5번 이외에는 차라리 C++을 쓰고 말지 하는 생각이 든다.. 굳이 .NET 어셈블리로 만들어 얻는 이득이 없기 때문이다..&lt;br /&gt;&lt;br /&gt;이야기가 상당히 다른 방향으로 흘러갔는데, 아무튼 C 코드는 VC++ .NET 덕분에 .NET 환경에서 거의 소스코드의 수정없이 100% 사용이 가능하다는 것을 잘 보여주는 샘플이다..&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>관심이야기</category>
			<category>.NET</category>
			<category>C++</category>
			<category>Quake</category>
			<category>퀘이크</category>
			<category>하위호환성</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/8</guid>
			<comments>http://madchick.tistory.com/8#entry8comment</comments>
			<pubDate>Thu,  4 Oct 2007 01:32:18 +0900</pubDate>
		</item>
		<item>
			<title>S/W 테스팅과 품질관리..</title>
			<link>http://madchick.tistory.com/7</link>
			<description>&lt;P&gt;사내 게시판에 올렸던 내용.. 안타깝지만, 현재까지도 우리 회사에 QA팀은 운영되고 있지 못하다..&lt;br /&gt;&lt;br /&gt;_____________________________________________&lt;br /&gt;From: 오광섭 &lt;br /&gt;Sent: Saturday, March 22, 2003 12:01 PM&lt;br /&gt;Posted To: 공부모임 (SW공학)&lt;br /&gt;Conversation: [참고] S/W 테스팅과 품질관리 관련 (작성중)&lt;br /&gt;Subject: [참고] S/W 테스팅과 품질관리 관련 (작성중)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2가지 측면에서 접근해야 한다..&lt;br /&gt;&lt;br /&gt;1. 개발팀&lt;br /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;어떻게 하면 버그를 만들지 않을 수 있는가에 대한 연구&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;br /&gt;2. QA 팀&lt;br /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;어떻게 하면 버그를 쉽게 찾아낼 수 있는가에 대한 연구&lt;br /&gt;아무나 할 수 있는 일이 아니다.. 능력이 되는 인력이 필요하다.. 없으면 양성해야 한다.. 개발자만 양성이 필요한게 아니다.. 
&lt;LI&gt;How To Break Software (A Practical Guide to Testing)의 저자는 플로리다 공학대학의 S/W 공학부 교수인데 저자가 서문에서 밝히듯 S/W 테스팅에 관한 이론들은 이미 많은 책들이 나와 있으며, 이 책은 Good Tester가 되기 위한 실전지침들이며 학교에서 학부 및 대학원생들의 수업에 사용하고 있는 내용이라고 한다.. 
&lt;LI&gt;국내 대학의 S/W 엔지니어링 커리큘럼에 이런 과정이 있을 것이라는 생각이 들지 않아 정말 슬프지만 (국내 대학들은 망할 취업률에 연연하며, 학원에서도 이미 넘쳐나도록 배출하고 있는 초급 개발자 양성에만 열을 올리고 있으니 정말 한심스럽지 않을 수 없다.. VC++, VB, 윈도 프로그래밍 가리키고 있을 시간에 자료구조를 더 가리키는게 도움이 된다는 사실을 왜 대학은 모르고 있을까..) 
&lt;LI&gt;교육기관에서 인력공급이 안된다고, S/W 개발사가 필요인력 확보에 손놓고 있을 수만은 없을 것이다.. 자체 양성을 해야 한다..&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;QA 테스팅 팀의 Golden Rule&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;1. Do unto others until they hate you&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;QA 팀의 가이드라인&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;* Catch Phrase *&lt;br /&gt;Know your product, think on your feet, and let your exprience guide you. Brain on, eye open.. Test !&lt;br /&gt;&lt;br /&gt;1. Thou shalt pummel thy app with multitudes of input&lt;br /&gt;2. Thou shalt covet thy neighbor&#039;s apps&lt;br /&gt;3. Thou shalt seek thee out the wise oracle&lt;br /&gt;4. Thou shalt not worship nonreproducible failures&lt;br /&gt;5. Thou shalt honor thy model and automation&lt;br /&gt;6. Thou shalt hold thy developers sins against them&lt;br /&gt;7. Thou shalt revel in app murder (celebrate the BSOD)&lt;br /&gt;8. Thou shalt keep holy the sabbath (release)&lt;br /&gt;9. Thou shalt covet thy developer&#039;s source code&lt;br /&gt;&lt;br /&gt;Figure this out for extra credit: Why are there only nine?&lt;/P&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>기본이야기</category>
			<category>QA</category>
			<category>테스팅</category>
			<category>품질관리</category>
			<category>프로젝트</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/7</guid>
			<comments>http://madchick.tistory.com/7#entry7comment</comments>
			<pubDate>Tue, 25 Sep 2007 00:49:40 +0900</pubDate>
		</item>
		<item>
			<title>프로세스 메모리 읽어내기..</title>
			<link>http://madchick.tistory.com/6</link>
			<description>국내 인터넷 뱅킹에 &lt;A href=&quot;http://www.jiniya.net/tt/590&quot;&gt;메모리 해킹&lt;/A&gt;이 적용되면 큰일이라는 이야기들이 나오던데.. 정말 그런 일들이 대규모로 일어난다면 속수무책인 금융사건이 발생할지도 모른다.. 하지만, 내가 걱정하고 있는다고 해서 상황이 바뀌는 것도 아니고, 이런 문제점을 해결하기 위한 난세의 영웅이 될 수 있는 것도 아니니 뒤로 미뤄두기로 하고.. 관심을 다른데로 돌려보자.. &lt;br /&gt;&lt;br /&gt;어떻게 이런 것이 가능할까? &lt;A href=&quot;http://www.jiniya.net/tt/579&quot;&gt;게임에서는 이미 많이 사용되던 기법&lt;/A&gt;이라고 하는데, 컴퓨터 상에서 실행되는 프로그램은 컴퓨터의 구조상 필연적으로 메모리에 올라가게 되어 있으며 이 메모리를 읽어내는 기술을 아는 사람에게는 그 어떤 데이터도 보호할 수 없는 상황인 것이 문제다.. 이를 위한 해결책은 논하는 것은 내 능력 밖의 일인 것 같고.. &lt;br /&gt;&lt;br /&gt;메모리를 읽어내는 좋은 샘플이 하나 있다.. &lt;A href=&quot;http://www.codeproject.com/csharp/minememoryreader.asp&quot;&gt;Minesweeper, Behind the scenes&lt;/A&gt;, &lt;A href=&quot;http://www.codeproject.com/csharp/minereader_enhanced.asp&quot;&gt;Enhancement for the cool Minesweeper Memory Reader&lt;/A&gt; 라는 글에서 소개된 윈도우즈의 지뢰찾기 프로그램의 메모리를 읽어 지뢰가 있는 위치를 알려주는 프로그램이다.. 이 처럼 내 컴퓨터의 메모리에 올라가 있는 데이터는 전문지식만 갖추면 쉽게 꺼내 볼 수 있다.. &lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMDEwMDAwMDAwMDAxLmpwZw==&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzI3MzY5QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMDEwMDAwMDAwMDAxLmpwZw==&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;412&quot; width=&quot;550&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;문제는 어느 메모리에 어떤 값들이 있는지를 알 수 없다는 것인데.. 리버스 엔지니어링을 통하면 시간이 걸리는 것이 문제지, 마음만 먹으면 알아낼 수 있다.. (예 : &lt;A href=&quot;http://madchick.egloos.com/1341745&quot;&gt;Olly Debugger 사용해보기&lt;/A&gt;에 리버스 엔지니어링에 관한 몇개의 글이 링크되어 있다..) &lt;br /&gt;&lt;br /&gt;결국 아직까지는 메모리 속의 데이터까지 암호화를 하거나 보호하지는 않기 때문에 S/W들의 크랙버젼이 나오고, Microsoft가 온라인인증 기능을 넣어 윈도우를 출시한지 하루만에 이를 무력화 시키는 불법 윈도우 설치본이 나오기도 하는 것이다.. &lt;br /&gt;&lt;br /&gt;리버스 엔지니어링.. 나중에 은퇴해서 좀 한가해지면 심심풀이로 공부해볼라고 마음먹고 있는 분야다.. 메모리 속을 들여다 보고 내 맘대로 제어할 수 있다면 정말 흥미로울 것 같다..&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>심화이야기</category>
			<category>디버깅</category>
			<category>리버스엔지니어링</category>
			<category>메모리해킹</category>
			<category>지뢰찾기</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/6</guid>
			<comments>http://madchick.tistory.com/6#entry6comment</comments>
			<pubDate>Mon, 24 Sep 2007 21:22:07 +0900</pubDate>
		</item>
		<item>
			<title>RIA 3파전 주인공들..</title>
			<link>http://madchick.tistory.com/3</link>
			<description>&lt;P&gt;&lt;STRONG&gt;포스트 플래쉬 시대&lt;/STRONG&gt;&lt;br /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;포스트플래시 시대, 웹개발 플랫폼 &#039;新삼국지&#039;&amp;nbsp; (&lt;A href=&quot;http://itviewpoint.com/tt/index.php?pl=3037&quot;&gt;http://itviewpoint.com/tt/index.php?pl=3037&lt;/A&gt;)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;br /&gt;&lt;STRONG&gt;UI 개발에 대한 관심&lt;/STRONG&gt;&lt;br /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;UI개발을 무시하지 마세요. (&lt;A href=&quot;http://www.blo9.com/wp/?p=373&quot;&gt;http://www.blo9.com/wp/?p=373&lt;/A&gt;) 
&lt;LI&gt;오만한 Flex 관련 글 관련 논쟁 관전평 (&lt;A href=&quot;http://jania902.egloos.com/3463030&quot;&gt;http://jania902.egloos.com/3463030&lt;/A&gt;) 
&lt;LI&gt;[디자인 정글기고] &lt;A href=&quot;http://uxkorea.net/blog_post_68.aspx&quot;&gt;1. Age of UX(User Experience) - UX의 시대&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;UX : 사용자가 제품, 또는 서비스를 제공하는 회사에 대해서 경험하는 전체적인 효과, 효율, 만족을 의미합니다. UI를 포함하는 전체적인 경험을 의미하고, UI를 주요한 요소로 포함합니다.&lt;/BLOCKQUOTE&gt;&lt;STRONG&gt;
&lt;P&gt;&lt;br /&gt;&lt;/STRONG&gt;&lt;STRONG&gt;실버라이트&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;SilverLight Get Started (&lt;A href=&quot;http://silverlight.net/GetStarted/&quot;&gt;http://silverlight.net/GetStarted/&lt;/A&gt;) 
&lt;LI&gt;실버라이트 기술 세미나 스케치 (&lt;A href=&quot;http://www.acornpub.co.kr/blog/148&quot;&gt;http://www.acornpub.co.kr/blog/148&lt;/A&gt;) 
&lt;LI&gt;실버라이트에 대한 프리젠테이션을 해야 한다면? (&lt;A href=&quot;http://reagan.egloos.com/443449&quot;&gt;http://reagan.egloos.com/443449&lt;/A&gt;) 
&lt;LI&gt;Silverlight in the lime light (&lt;A href=&quot;http://blogs.msdn.com/coding4fun/archive/2007/05/23/2828849.aspx&quot;&gt;http://blogs.msdn.com/coding4fun/archive/2007/05/23/2828849.aspx&lt;/A&gt;) 
&lt;LI&gt;실버라이트 2D 물리엔진 (&lt;A href=&quot;http://reagan.egloos.com/355850&quot;&gt;http://reagan.egloos.com/355850&lt;/A&gt;) 
&lt;LI&gt;재미있는 실버라이트 데모 2가지 (&lt;A href=&quot;http://reagan.egloos.com/350520&quot;&gt;http://reagan.egloos.com/350520&lt;/A&gt;)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;br /&gt;플래쉬&lt;/STRONG&gt;&lt;br /&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Adobe AIR (Adobe Integrated Runtime - codename Apollo) 
&lt;LI&gt;Build with HTML/AJAX, Build with Flex 
&lt;LI&gt;웹앱스콘 네이버 오픈API 코드 샘플 (&lt;A href=&quot;http://www.blo9.com/wp/?p=389&quot;&gt;http://www.blo9.com/wp/?p=389&lt;/A&gt;)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;br /&gt;자바 FX&lt;br /&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;자바FX 모바일, &#039;스마트폰 OS&#039; 맹주 노린다&amp;nbsp; (&lt;A href=&quot;http://itviewpoint.com/tt/index.php?pl=3054&quot;&gt;http://itviewpoint.com/tt/index.php?pl=3054&lt;/A&gt;) 
&lt;LI&gt;JavaFX, Sun의 RIA 시장용 무기? (&lt;A href=&quot;http://desktop.tistory.com/entry/JavaFX-Sun&quot;&gt;http://desktop.tistory.com/entry/JavaFX-Sun&lt;/A&gt;) 
&lt;LI&gt;JavaFX (&lt;A href=&quot;http://functional.or.kr/javafx/tutorial/intro&quot;&gt;http://functional.or.kr/javafx/tutorial/intro&lt;/A&gt;) 
&lt;LI&gt;eclipse JavaFX plug-in (&lt;A href=&quot;http://functional.or.kr/javafx/tool/eclipse-plugin&quot;&gt;http://functional.or.kr/javafx/tool/eclipse-plugin&lt;/A&gt;) 
&lt;LI&gt;JavaFX 튜토리얼: Hello World (&lt;A href=&quot;http://functional.or.kr/javafx/tutorial/hello-world&quot;&gt;http://functional.or.kr/javafx/tutorial/hello-world&lt;/A&gt;)
&lt;LI&gt;JavaFX 효과 (&lt;A href=&quot;http://sdnkorea.com/blog/457&quot;&gt;http://sdnkorea.com/blog/457&lt;/A&gt;)&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>동향이야기</category>
			<category>flex</category>
			<category>JavaFX</category>
			<category>ria</category>
			<category>Silverlight</category>
			<category>실버라이트</category>
			<category>자바FX</category>
			<category>프로그래밍</category>
			<category>플렉스</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/3</guid>
			<comments>http://madchick.tistory.com/3#entry3comment</comments>
			<pubDate>Mon, 24 Sep 2007 20:12:52 +0900</pubDate>
		</item>
		<item>
			<title>Microsoft SQL Server에서 보안계정 연결시키기..</title>
			<link>http://madchick.tistory.com/5</link>
			<description>&lt;P&gt;96년도에 졸업하고 사회생활을 하면서 가장 처음으로 접한 DB서버가 MS SQL 6.5였다.. 그래서 그런지, 오라클 보다는 MS SQL에 더 정이 가는가보다.. 첫인연도 그렇지만, 사용하기에 MS SQL 서버가 훨씬 편리하다는 특징이 더 이런 상황을 만들었을 것이라 생각한다..&lt;br /&gt;&lt;br /&gt;MS SQL 서버의 편리함은 인스톨과정에서 부터 조금만 사용해보면 바로 나타난다.. 설치, DB 생성, 백업, 백업으로부터의 복구 등등의 과정을 프로젝트 진행간 자주 해보면 MS SQL 서버를 사용해보면 편리하다.. mySQL 같이 간편하면서, 성능은 오라클 못지 않는다고나 할까.. 뭐, 이렇게 말하면 오라클 유저들에게 한 소리 듣는다.. 어떻게 오라클과 MS SQL을 성능 비교를 할 수 있느냐, 비교할 것을 해야지.. 하지만, 난 MS SQL과 오라클의 성능차이는 거의 없다고 생각한다..&lt;br /&gt;&lt;br /&gt;아무튼, MS SQL 서버를 사용하면서 가장 편리한 점은 DB 복사를 손쉽게 할 수 있다는 것이다.. 예를들면 개발중인 DB서버에서 이 DB를 다른 서버에 그대로 복사본을 만들고 싶으면 DB 파일만 새 서버에 복사를 해서 새 MS SQL 서버에서 파일로 DB에 연결만 하면 끝이다.. 오라클에서는 이 과정이 꽤 복잡하다..&lt;br /&gt;&lt;br /&gt;하지만, 이때 좀 귀찮은 경우가 생길때가 있다.. 위와 같은 방법으로 A서버에 CBT라는 DB를 B서버에 똑같이 만들어서 A서버에서는 계속 개발을하고 B서버에서 단위테스트를 진행을 했다.. 그러다 DB가 변경된 부분들이 생겨서 B서버에 DB를 다시 옮겨야 한다.. 이때도 B서버의 CBT DB를 없애고 위와 같은 방법으로 새로 붙이면 되는데 문제는 계정이 좀 꼬이는 경우가 생긴다..&lt;br /&gt;&lt;br /&gt;A서버에서와 같은 이름과 패스워드 계정으로 CBT DB에 접근하고 싶은데 이미 계정이 있으니 만들 수 없다는 둥, 이런 문제가 발생하는 것이다.. 정말 큰 문제는 이런 경우 MS SQL 엔터프라이즈 메니저 (2000이하) 혹은 SQL Server Management Studio (2005이상)가 제공하는 UI 상에서는 이 문제를 해결할 수 있는 방법이 없다.. 모든 작업을 커맨드 라인이 아닌 UI에서 하는 MS SQL 서버의 특징에 위배되는 상황이다.. 하지만, 뭐 방법없다.. UI에서 제공 안해주니 별 수 없지.. 쿼리를 날려 해결해야 한다.. 이때 사용하는 스토어드 프로시저가 sp_change_users_login 이다..&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
&lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;
&lt;BLOCKQUOTE&gt;사용법 : EXEC sp_change_users_login &#039;Update_One&#039;, &#039;cbt&#039;, &#039;cbt&#039;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;이 스토어드 프로시저를 사용하지 않으면 해결할 수 있는 방법이 없는데, 도움말에서 이거 찾기도 쉽지 않다.. 쩝..&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있습니다.
			&lt;!-- Creative Commons License--&gt;
			&lt;!-- &lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
			&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
			&lt;/Work&gt;
			&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/ShareAlike&quot;/&gt;&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/div&gt;&lt;/fieldset&gt;</description>
			<category>응용이야기</category>
			<category>db</category>
			<category>MSSQL</category>
			<author>미친병아리</author>
			<guid>http://madchick.tistory.com/5</guid>
			<comments>http://madchick.tistory.com/5#entry5comment</comments>
			<pubDate>Sat, 30 Jun 2007 22:47:51 +0900</pubDate>
		</item>
		<item>
			<title>Window Vista에서 레거시 프로그램 적응시키기..</title>
			<link>http://madchick.tistory.com/2</link>
			<description>새로운 OS가 나오게 되면 가장 관심을 가지는 것은 과연 내가 만든 프로그램이 새 OS에서 정상적으로 동작할 것인가 하는 점이다.. 윈95가 등장할때 그랬으며, 윈98, 윈ME, 윈2000, 윈XP 등등.. 이번 윈도우 비스타도 예외는 아니었지만, 그러면서도 안심이 되는 부분은 MS가 새 OS를 내 놓을때 가장 신경을 많이 쓰는 부분이 다름아닌 하위호환성 보장이라는 것.. 새 OS들이 나올때마다 걱정은 했지만, 별 일 없이 넘어갈 수 있었던 것이 바로 이 부분 때문이었으며, 이번에도 큰 어려움 없을 것이라는 안일한 자세.. 사실 윈3.1에서 윈95로 넘어갈때 말고는 큰 일이 없었던것이 사실이다.. (&lt;A href=&quot;http://madchick.egloos.com/1259551&quot;&gt;Microsoft가 그렇게 중요시 하는 하위호환성&lt;/A&gt;에 대해 자세히 느껴보고 싶으면 &lt;A href=&quot;http://madchick.egloos.com/962300&quot;&gt;조엘 온 소프트웨어&lt;/A&gt;를 읽어보시길..)&lt;br /&gt;&lt;br /&gt;하지만, 윈도우 비스타는 달랐다.. 많이 달랐다.. 윈XP에서 잘 돌아가는 프로그램을 윈도우 비스타에서 돌아가게 만드는데 무려 2달 정도가 걸렸다.. 물론, 다른 일들이 많아 팀원 전체가 붙어 대응을 하지 못해 오래 걸리긴 했지만, 애초에 예상했던 것 보다는 훨씬 오래걸린 대응 준비기간이었다..&lt;br /&gt;&lt;br /&gt;
&lt;BLOCKQUOTE&gt;우리 프로그램의 문제점&lt;br /&gt;- ActiveX 컨트롤&lt;br /&gt;- 레지스트리&lt;br /&gt;- 파일저장&lt;br /&gt;- 프로세스 생성&lt;br /&gt;- 윈도우 메시지 전달&lt;/BLOCKQUOTE&gt;ActiveX 컨트롤은 사실 아무런 문제없이 윈도우 비스타로 옮길 수 있다.. 윈도우 비스타라고 해서 ActiveX 컨트롤이 없으질게 아니고 (&lt;A href=&quot;http://madchick.egloos.com/1557386&quot;&gt;Silverlight&lt;/A&gt;도 윈도우 환경에서는 ActiveX로 구현되며, 플래쉬, 애크로뱃리더도 ActiveX로 구현되어 있기 때문에 대체기술이 나오기 전에는 없어질 리가 없기 때문에.. 대체기술은 웹표준이 그래픽과 멀티미디어쪽으로 확정되기 전에는 오랜기간 없을 것으로 보인다..) 기본적으로 우리 프로그램도 아무런 문제가 없었지만, 레지스트리와 파일억세스를 하는 부분이 많았다..&lt;br /&gt;&lt;br /&gt;레지스트리 접근은 HKEY_CURRENT_USER 하위는 읽고 쓸 수 있기 때문에 위치만 옮기면 아무런 문제가 되지 않는다.. 물론, 현실에서는 이 위치를 공유하는 프로그램들이 많을 수 있고, 어떤 프로그램에서는 위치를 변경하는게 만만한 작업이 아닐 수 있기 때문에 현실은 그리 녹녹치 않을 수도 있다.. 가장 좋은 방법은 레지스트리 사용은 아예 하지 않도록 수정하는 방법이 정답이다.. 하지만, 우리 프로그램은 새 버젼이 개발중이었으므로 최소한의 노력을 들이기로 했다..&lt;br /&gt;&lt;br /&gt;파일저장 부분도 사실 큰 어려운 부분은 아니지만, 레지스트리의 경우와 비슷하다.. 권한이 없는 폴더에는 접근하지 않도록 수정해줘야 한다.. 특히, 권한을 가진 프로그램이 만들어둔 파일을 다른 프로세스에서 접근해야 하는 경우 문제가 생길 수 있다.. 가장 문제가 되는 것이 ActiveX 컨트롤이 접근해야 하는 경우인데, 이 경우는 ActiveX 컨트롤이 해당 파일에 접근할 수 있는 방법이 없으므로 권한이 낮은 프로세스에서도 접근 가능한 위치로 옮겨야 한다..&lt;br /&gt;&lt;br /&gt;프로세스 생성은 비교적 간단하다.. ShellExecute에 추가된 파라미터를 넣어 높은 권한으로 실행시킬 수 있는 방법이 있기 때문이다.. 하지만, 원래 권한이 낮은 곳에서 (다른 프로세스나 ActiveX 컨트롤이) 높은권한의 프로세스를 실행시키는 일이라 권한상승 경고창이 뜬다..&lt;br /&gt;&lt;br /&gt;윈도우즈 메시지 전달은 사실 별로 신경을 쓰지 못했던 부분인데, 낮은 프로세스에서 높은 프로세스로 메시지를 보내는 것은 사정없이 무시된다.. 특히, ActiveX 컨트롤이 실행파일을 실행시킨 후에 메시지를 통해 데이터를 전달하는 구조의 경우 문제가 된다..&lt;br /&gt;&lt;br /&gt;하지만, 위의 문제들을 해결하기 위해 그동안 여러가지 검토를 하고 테스트 코드를 짜며 든 생각은 과연 무엇이 더 좋아졌는가 이다.. 좋아진 부분이 딱 하나 있기는 하다.. 권한이 상승된 프로세스가 허락없이 실행될때 경고창이 뜬다는 것이다.. 이점은 나 몰래 어떤 프로그램을 실행시키기가 더 어려워 졌다는 점에서 보안이 강화되었다고 할 수 있는데, 이외의 것들은 소위 하위호환성 때문에 조금만 코드를 고치면 XP에서 동작했던 것 처럼 동작하도록 수정할 수 있다.. 어찌 보면 내가 예상한대로였는데, 작년말쯤 팀원들과 이야기 하던 내용이 기억난다.. &quot;그렇다면 좋아질게 하나도 없는데, 그렇게 고칠거면 뭐하러 고치나?&quot; &lt;br /&gt;&lt;br /&gt;열심히 함 고쳐보라는건가? 뭐하러 이런 소모적인 해야 수정을 하는지 모르겠다.. 되먹지 않은 악성 프로그램을 배포하는 사람들이 코드 좀 수정해서 비스타에서도 동작하도록 만들게 하기 위해, 전 세계 수많은 프로그래머들이 비스타에서 돌아가는 프로그램을 위해 코드를 수정하게 만들어야 했는가? 하위호환성 때문에 피해가는 방법이 다 존재한다면, XP에서 문제없이 돌아가는 프로그램은 비스타에서도 그냥 돌아가도록 하는게 더 좋았을 것이다.. 그렇다 하더라도 권한상승창 때문에 원래의 목적은 달성할 수 있었을 것이다.. 참, 아쉬운 부분이다..&lt;br /&gt;&lt;br /&gt;권한 상승창이 뜨는 부분은 비스타 사용자들로부터 많은 이야기가 나올 것인데, 윈도우 비스타에서 깔끔하게 돌아가는 프로그램을 만들기 위해서 (권한상승 허가하는 창이 뜨지 않고 동작하도록)는 앞으로는 개발초기 설계시부터 잘 고려를 해야하겠다..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;fieldset style=&quot;margin:20px 0px 20px 0px;padding:5px;&quot;&gt;&lt;legend&gt;&lt;span&gt;&lt;strong&gt;크리에이티브 커먼즈 라이선스&lt;/strong&gt;&lt;/span&gt;&lt;/legend&gt;&lt;!--Creative Commons License--&gt;&lt;div style=&quot;float: left; width: 88px; margin-top: 3px;&quot;&gt;&lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;&lt;img alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0&quot; src=&quot;http://i.creativecommons.org/l/by-nc-sa/2.0/kr/88x31.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 92px; margin-top: 3px; text-align: justify;&quot;&gt;이 저작물은 &lt;a rel=&quot;license&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; target=_blank&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이선스&lt;/a&gt;에 따라 이용하실 수 있