<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Oki's IT Story...</title>
	<link>http://dokim.egloos.com</link>
	<description>Professional</description>
	<language>ko</language>
	<pubDate>Fri, 12 Dec 2008 01:52:07 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>Oki's IT Story...</title>
		<url>http://pds8.egloos.com/logo/200806/25/82/f0022282.jpg</url>
		<link>http://dokim.egloos.com</link>
		<width>80</width>
		<height>53</height>
		<description>Professional</description>
	</image>
  	<item>
		<title><![CDATA[ 용어 ]]> </title>
		<link>http://dokim.egloos.com/1223734</link>
		<guid>http://dokim.egloos.com/1223734</guid>
		<description>
			<![CDATA[ 
  앙와위(<strong>supine</strong>) 심장수축기(<strong>systolic</strong>)&nbsp;이완기(<b>diastolic</b>)			 ]]> 
		</description>
		<category>* Cardiology PACS</category>

		<comments>http://dokim.egloos.com/1223734#comments</comments>
		<pubDate>Fri, 12 Dec 2008 01:52:07 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Cardiac Cath ]]> </title>
		<link>http://dokim.egloos.com/1205005</link>
		<guid>http://dokim.egloos.com/1205005</guid>
		<description>
			<![CDATA[ 
  <table cellpadding="0" width="550" border="0"><tbody><tr><td colspan="2"><span style="FONT-SIZE: 170%; FONT-FAMILY: arial"><b>심장혈관 조영술</b></span><br></td></tr><tr><td width="275"><span style="FONT-SIZE: 130%; FONT-FAMILY: arial">( Cardiac Cath. )</span></td><td valign="bottom" align="right" width="275"><span style="FONT-SIZE: 100%; COLOR: #0000ff"><b></b></span></td></tr></tbody></table><div style="TEXT-ALIGN: left"></div><div style="TEXT-ALIGN: left"></div><div style="TEXT-ALIGN: left"></div><hr width="550" size="2"><table cellpadding="3" width="550" border="1"><tbody><tr><td bgcolor="#c0d9d9" colspan="2"><span style="FONT-SIZE: 100%">◈ 검사방법, 촬영결과</span></td></tr><tr><td align="middle" width="170"><img src="http://www.krta.or.kr/member/pds/kumsa/cha/radedu/intro/main/6angio/ltcoro.gif"><br><br><img src="http://www.krta.or.kr/member/pds/kumsa/cha/radedu/intro/main/6angio/rtcoro.gif"></td><td><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움"><ul><li type="none">왼쪽심장혈관-관상동맥(위쪽사진)촬영사진과,<br>오른쪽심장혈관-관상동맥(아래쪽사진)촬영사진입니다.</li></ul><ul><li type="none">입원검사를 기본으로하며, 검사만을 위해서는<br>2~3일 정도의 입원기간이 소요됩니다.</li></ul><ul><li type="none">입원후 병실에서의 지시사항을 따르신 후 검사를 하시면 됩니다.</li></ul><ul><li type="none">진단가능질환<br>심근경색증,심혈관비대,심장혈관이상...</li></ul></span></td></tr></tbody></table>			 ]]> 
		</description>
		<category>* Cardiology PACS</category>

		<comments>http://dokim.egloos.com/1205005#comments</comments>
		<pubDate>Mon, 01 Dec 2008 07:12:41 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 심초음파검사 (echocardiography) ]]> </title>
		<link>http://dokim.egloos.com/1179982</link>
		<guid>http://dokim.egloos.com/1179982</guid>
		<description>
			<![CDATA[ 
  <p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3d3d3d"><a href="http://100.naver.com/100.nhn?docid=147439"><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">초음파</span></span></a></span><span style="FONT-SIZE: 10pt; COLOR: #3d3d3d">를 이용하여 심장의 형태와 움직임<span lang="EN-US">, </span>심장내 혈액의 흐름 등을 관찰하는 검사이다<span lang="EN-US">. </span>음파보다도 높은 음역의 초음파를 발생시켜 심장에 반사되어 돌아오는 음파를 이용하여 얻은 영상으로 검사한다<span lang="EN-US">. <a href="http://100.naver.com/100.nhn?docid=102990"><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">심근경색증</span></span></a></span>과 <span lang="EN-US"><a href="http://100.naver.com/100.nhn?docid=757102"><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">허혈성</span></span><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US"> </span></span><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">심질환</span></span></a>, </span>선천성 심질환<span lang="EN-US">, </span>류머티즘성 판막질환<span lang="EN-US">, <a href="http://100.naver.com/100.nhn?docid=103009"><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">심내막염</span></span></a> </span>등 심장과 관련된 구조적<span lang="EN-US">, </span>기능적 이상을 확인할 수 있다<span lang="EN-US">. <br><br></span>대개 가슴에 특별한 젤리를 바르고 진동 크리스탈이 부착된 탐촉자를 가슴 위의 적당한 부위에 갖다대고 검사한다<span lang="EN-US">. </span>그러나 초음파 발생 장치를 식도에 밀어넣고 심장을 관찰하는 방법과 도부타민이라는 일종의 <span lang="EN-US"><a href="http://100.naver.com/100.nhn?docid=5450"><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">강심제</span></span></a></span>를 정맥으로 투여하는 동안 검사하는 방법 등도 널리 활용된다<span lang="EN-US">. </span>약물을 투여하는 흉부의 불쾌감 또는 두통<span lang="EN-US">&nbsp;</span>및 구토<span lang="EN-US">,&nbsp;</span>서맥 및 <span lang="EN-US"><a href="http://100.naver.com/100.nhn?docid=78662"><span lang="EN-US" style="COLOR: #096ab5"><span lang="EN-US">부정맥</span></span></a> </span>등의 부작용이 있을 수 있으나 통증이나 위험은 거의 없다<span lang="EN-US">. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></span></p>			 ]]> 
		</description>
		<category>* Cardiology PACS</category>

		<comments>http://dokim.egloos.com/1179982#comments</comments>
		<pubDate>Wed, 26 Nov 2008 00:40:26 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ WinInet API  ]]> </title>
		<link>http://dokim.egloos.com/1142450</link>
		<guid>http://dokim.egloos.com/1142450</guid>
		<description>
			<![CDATA[ 
  <span style="COLOR: #ff0000">WinInet API<span style="COLOR: #ff0000"></span></span> <p><br>WinInet(The Microsoft Win32 Internet functions) 클래스는 Win32반의 WinInet API들을 캡슐화하고 있는 클래스의 모임을 말하며 클라이언트 쪽에서 인터넷의 표준 프로토콜인 HTTP, Gopher, FTP 등을 지원하기 위한 클래스이다. MFC에서 제공하는 WinInet 관련 클래스들은 네트워크상에서 발생하는 여러 가지 복잡한 처리 작업을 내부적으로 수행하고 상당히 안정적인 코드를 제공한다. 이러한 프로토콜을 사용한 전송을 쉽게 할 수 있도록 운영체제 확장의 일부로 wininet.dll을 제공한다. MFC 응용 프로그램에서 wininet.dll은 CInternetSession 개체에 의해 표현된다. CInternetSession은 작업자가 인터넷에 정확히 어떻게 연결하려고 했는지 wininet.dll에게 알리도록 한다.</p><p>&nbsp;</p><p><span style="COLOR: #006699"><span style="COLOR: #d41a01">CInternetSession</span>(LPCTSTR pstrAgent = NULL, DWORD dwCont</span><span style="COLOR: #006699">ext = 1, DWORD dwAccessType = RNET_OPEN_TYPE_PRE</span><span style="COLOR: #006699">CONFIG, LPCTSTR pstrProxyName = NULL, LPCTSTR pstrProxy</span><span style="COLOR: #006699">Bypass = NULL, DWORD dwFlags = 0);</span></p><p><span style="COLOR: #006699"></span>&nbsp;</p><p>첫 번째 인자는 클라이언트 쪽 소프트웨어 이름을 가리키는 포인터이다. 디폴트값 NULL은 생성자가 AfxGetAppName() 호출을 통해 응용프로그램의 이름을 찾게 할 것이다. dwAccessType 인자는 WinInet에게 인터넷을 어떻게 연결할 계획인지 알려준다. 디폴트 값인 INTER_OPEN_TYPE_PRECONFIG는 레지스트리에서 인터넷 연결에 관하여 이전에 입력된 정보를 찾는다. 인트라넷을 사용하고 있거나 컴퓨터가 인터넷에 직접 연결되어 있다면 INTERNET_OPEN_TYPE_DIRECT를 지정할 수 있다. 방화벽을 통한 연결은 GATEWAY_INTERNET_ACCESS, 프록시를 통해 인터넷에 요청을 전달하려고 하려면 INTERNET_OPEN_TYPE_PROXY를 지정한다. 이것을 지정하지 않으면 pstrProxyName과 pstrProxyBypass 인자를 NULL로 지정할 수 있다. 그리고 dwFlags 인자를 사용하여 다른 방법으로 연결에 영항을 줄 수 있다. 비동기 동작을 지원하는 INTERNET_FLAG_ASYNC 플래그와 세션을 통해 기존 연결을 재사용하려는 INTER_FLAG_EXITING_CONNECT 플래그가 OR 연산자를 사용하여 결합된다.</p><p>&nbsp;</p><p>dwContext라는 인자가 있는데 인터넷에 있는 다른 컴퓨터와 대화하는 것은 오랜 시간이 걸릴 수 있다. 일부 프로토콜 등은 많은 오버헤드를 발생시키고, 인터넷 응용 프로그램의 사용자들은 종종 느린 링크를 통해서 연결된다. 따라서 윈도우 인터넷 API는 언제, 어떤 것이 진행되었는지 응용프로그램이 알 수 있게 하는 콜백을 제공한다. dwContext 인자는 단순히 응용 프로그램이 실행하고 있는 각 동작들을 구분할 수 있게 해준다. MFC는 콜백 함수처럼 복잡한 것들에 대해 염려하지 않아도 되게 해준다. CInternetSession으로부터 클래스를 유도하고 OnStatusCallback() 함수를 오버라이드할 수 있다. </p><p><br>또 CInternetSession 듀도 개체에 EnableStatusCallback() 함수를 호출하여 상태 콜백을 받고 싶어한다는 것을 시스템에게 알릴 필요가 있다. 이 인자가 TRUE(디폴트)이면 함수가 콜백을 활성화시킬 것이고, FALSE이면 인자가 콜백을 비활성화시킬 것이다. CInternetSession을 열고 FTP 프로토콜을 이용하여 파일을 전송할 경우 GetFtpConnection() 멤버를 호출함으로써 FtpConnection 개체를 생성할 수 있다. GetFtpConnection()은 이 새 CFtpConnection을 가리키는 포인터를 반환한다.</p><p><br><span style="COLOR: #006699">CFtpConnection* <span style="COLOR: #d41a01">GetFtpConnection</span>( LPCTSTR pstrServer, LPC</span><span style="COLOR: #006699">TSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, I</span><span style="COLOR: #006699">NTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, B</span><span style="COLOR: #006699">OOL bPassive = FALSE ); </span></p><p><span style="COLOR: #006699"></span>&nbsp;</p><p>첫 번째 인자는 연결하고자 하는 서버의 이름이고 두 번째 인자와 세 번째 인자는 연결에 사용될 사용자 이름과 암호를 나타낸다. 디폴트 값인 NULL을 전달하면 익명(anonynous)으로 접속요청을 하게 된다. nPort 인자는 포트 번호를 나타내는데 디폴트 값인 INTERNET_INVALID_PORT_NUMBER을 사용하면 이 프로토콜의 디폴트 TCP/IP 포트 번호(HTTP:80, FTP:21, Gopher:70, HTTPS:443)를 사용한다. 이를 이용한 FTP 서버 접속은 리스트 3과 같다.</p><p>&nbsp;</p><p>리스트 3 : <span style="COLOR: #ff0000">FTP 서버 접속</span><br>------------------------------------------------------------</p><p><span style="COLOR: #006699"><span style="COLOR: #d41a01">CInternetSession</span> m_Session;</span></p><p><span style="COLOR: #006699"><span style="COLOR: #d41a01">CFtpConnection</span> *m_pConnection = NULL;<br>try<br>{<br>//Anonymous 로 로그인<br>m_pConnection = <span style="COLOR: #d41a01">m_Session.</span><span style="COLOR: #d41a01">GetFtpConnection</span>(</span><a class="con_link" href="ftp://ftp.pserang.co./" target="_blank"><span style="COLOR: #006699"><a href="ftp://ftp.pserang.co.kr/">ftp.pserang.co.</span></a><span style="COLOR: #006699">kr</a></span><span style="COLOR: #006699">);<br>// 사용자명과 패스워드 로그인<br>/* m_pConnnection = m_Session.GetFtpConnection(</span><a class="con_link" href="ftp://ftp.pseran/" target="_blank" ?,?user_name?,?password ?><span style="COLOR: #006699"><a href="ftp://ftp.pserang.co.kr%22,%22user_name%22,%22password/">ftp.pseran</span></a><span style="COLOR: #006699">g.co.kr","User_Name","Password</a></span><span style="COLOR: #006699">); */<br>//연결시 작업<br>m_pConnection-&gt;Close();<br>}<br><span style="COLOR: #d41a01">catch</span> (<span style="COLOR: #d41a01">CInternetException</span> *m_pEx)<br>{<br>m_pEx-&gt;<span style="COLOR: #d41a01">ReportError</span>(<span style="COLOR: #006699">MB_ICONEXCLAMATION);</span><br>m_pConnection = NULL;<br>m_pEx-&gt;Delete();<br>}<br>delete m_pConnection;</span><br>------------------------------------------------------------<br>CInternetException은 운영체제로부터 문제를 기술하는 에러 텍스트를 얻어내는 에외처리 클래스이다. 연결이 이루어 졌을 때 GetCurrentDirectory()를 호출하여 FTP 컴퓨터의 현재 디렉토리를 얻을 수 있고 SetCurrentDirectory()로 상대편 디렉토리를 설정할 수 있다. 그리고 GetFile()로 파일을 다운로드 할 수 있고 PutFile()로 파일을 업로드 할 수 있다. 사용자에게 권한이 주어지면 CreateDirectory()/RemoveDirectory() 및 Remove()/Rename()를 호출하여 디렉토리를 생성/추가할 수 있고 파일을 제거/이름변경을 할 수 있다. 예를 들어 <span style="COLOR: #ff0000">파일을 다운로드 </span>할 때의 코드는 다음과 같다.<br>&nbsp;</p><p><span style="COLOR: #006699">m_pConnection-&gt;<span style="COLOR: #d41a01">GetFile</span>("RemoteFile", "localFile", FALSE,&nbsp;</span><span style="COLOR: #006699">FILE_ATTRIBUTE_NORMAL,&nbsp;FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_</span><span style="COLOR: #006699">RELOAD |&nbsp;INTERNET_FLAG_NO_CACHE_WRITE);</span></p><p><span style="COLOR: #006699"></span>&nbsp;</p><p>네 번째 인자(DWORD dwAttributes)는 파일 복사 후 로컬 컴퓨터에 생성되는 파일의 속성을 나타낸다. 읽기 전용은 FILE_ATTRIBUTE_READONLY로 지정할 수 있다. 다섯 번째 인자(DWORD dwFlags)는 원시 이진 파일들을 처리할 수 없는 연결을 통해 올바로 데이터를 전달하기 위해 FTP 프로토콜에 사용되는 의미를 바꾼다. CFtpFileFind란 클래스가 있는데 FTP 서버를 검색하는 기능을 수행한다. 이 클래스는 CFileFind 클래스에서 파생되었다. CFtpFileFind 클래스는 두 개의 인자가 있는데 첫 번째 인자는 검색할 서버를 위한 CFtpConnectiondmf 가리키는 포인터이고 두 번째 인자는 dwContext 값을 나타낸다.</p><p>&nbsp;</p><p><span style="COLOR: #006699"><span style="COLOR: #d41a01">CFtpFileFind</span> *m_pFileFind = NULL;<br>m_pFileFind = new CFtpFileFind(m_pConnection);<br>BOOL bContinue = TRUE;<br>CString m_file_name;<br>m_pFileFind-&gt;<span style="COLOR: #d41a01">FindFile</span>("RemoteDir");<br>while(bContinue)<br>{<br>bContinue = m_pFileFind-&gt;FindNextFile();<br>m_file_name = m_pFileFind-&gt;GetFileName();<br>if(m_pFileFind-&gt;<span style="COLOR: #d41a01">IsDirectory())</span><br>{<br>//디렉토리일 경우 루틴<br>}<br>// 파일인 경우<br>else<br>{<br>//파일일 경우 루틴<br>}<br>}</span></p><p>FTP 서버로 연결이 되면 CFtpFileFind 클래스를 이용하여 지정된 경로의 파일을 계속 찾는 구문이다. HTTP 서버 즉, 일반적으로 말하는 웹 서버에 접속하기 위해서 MFC 계층에서 CFtpConnection과 비슷한 위치를 차지하는 CHttpConnection를 사용해 연결할 수 있다. CInternetSession의 GetHtpConnection() 멤버를 사용하여 CHttpConnection을 열 수 있다.</p><p>&nbsp;</p><p><span style="COLOR: #006699"><span style="COLOR: #d41a01">CHttpConnection</span>* GetHttpConnection( LPCTSTR pstrServer, INT</span><span style="COLOR: #006699">ERNET_PORT nPort = NTERNET_INVALID_PORT_NUMBER, LPC</span><span style="COLOR: #006699">TSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL );</span></p><p><span style="COLOR: #006699"></span>&nbsp;</p><p><span style="COLOR: #006699">각 인자는 GetFtpConnection()과 거의 동일하다. 웹서버에 접속하</span><span style="COLOR: #006699">는 코드는 다음과 같다.</span></p><p><span style="COLOR: #006699"></span>&nbsp;</p><p><span style="COLOR: #006699"><span style="COLOR: #d41a01">CInternetSession</span> m_Session;<br><span style="COLOR: #d41a01">CHttpConnection</span> *m_pHttpConnection = NULL;<br><span style="COLOR: #d41a01">CHttpFile</span> *m_pFile = NULL;<br>try<br>{<br>m_pHttpConnection = <span style="COLOR: #d41a01">m_Session.GetHttpConnection</span>(</span><a class="con_link" href="http://www.pser/" target="_blank"><span style="COLOR: #006699"><a href="http://www.pserang.co.kr/">www.pser</span></a><span style="COLOR: #006699">ang.co.kr</a></span><span style="COLOR: #006699">);<br>m_pFile = m_pHttpconnection-&gt;<span style="COLOR: #d41a01">OpenRequest</span>(CHttpConnection::</span><span style="COLOR: #006699">HTTP_VERB_GET,"/");<br>m_pFile -&gt; <span style="COLOR: #d41a01">AddRequestHeaders</span>("Accept:text/*\r\nAccept-La</span><span style="COLOR: #006699">nguage:kr\r\n");<br>m_pFile -&gt;<span style="COLOR: #d41a01">SendRequest</span><span style="COLOR: #d41a01">();</span><br>//...<br>}<br>catch(<span style="COLOR: #d41a01">CInternetException</span> *m_pEx)<br>{<br><span style="COLOR: #d41a01">m_pEx-&gt;ReprotError();</span><br><span style="COLOR: #d41a01">m_pEx-&gt;Delete();</span><br>}<br>delete m_pFile;<br>delete m_pHttpConnection;</span></p><p>&nbsp;</p><p>CHttpFile이라는 것이 있는데 CInternetFile로부터 유도되었고 CInternetFile은 CStdioFile로부터 유도되었다. CHttpFile의 특징은 자신만의 파일 데이터 버퍼링을 수행한다. SetReadBufferSize()를 호출하여 버퍼 크기를 설정할 수 있고, 버퍼를 설정하지 않고서 ReadString()을 사용하면 자동으로 버퍼가 설정된다. 위 코드 중 서버에게 요청하는 OpenRequest()의 첫 번째 인자는 CHttpConnection 내부의 enum에서 정의된 기호이다. 이 인자는 요청에서 사용하고자 하는 메소드를 지정한다. HTTP_VERB_GET이라는 메소드는 서버에 있는 개체의 전체 내용을 요청하는데 쓰인다. 그 외 특정 개체와 연결된 개체를 전달하고자 할 때는 HTTP_VERB_POST 인자가 쓰이고 마지막 인자인 POST 대신 HEAD, PUT, LINK, DELETE, UNLINK 등이 사용된다.&nbsp; 요청은 CHttpFile::SendRequest() 호출과 함께 전달된다. 요청을 전달하기 전에 헤더를 추가하고 싶으면 CHttpFile::AddHeaders()를 호출할 수 있다. 서버가 요청에 대한 개체를 갖고 있지만 클라이언트의 Accept: 헤더에서 지정된 형식 요청을 충족시킬 수 없으면 일반 "404 Not Found"(HTTP_STATUS_NOT_FUOND: 404)" 에러와 </p><p>"HTTP_STATUS_NONE_ACCEPTABLE: 406" 에러를 반환할 것이다. 요청이 전달되고 반응이 성공적으로 수신되었으면 SendRequest()가 TRUE를 반환한다. 그렇지 않으면 예외가 발생할 것이다. 이것은 내부 서버 에러가 있다는 것을 의미한다. CHttpFile::QueryInfoStatusCode()를 호출함으로써 CHttpFile 개체로 들어온 정보로부터 반환 코드를 커낼 수 있다. </p><p>&nbsp;</p><p><span style="COLOR: #d41a01">m_pFile-&gt;SendRequest();<br>DWORD m_dwStatusCode;<br>m_pFile-&gt;QueryInfoStatusCode(m_dwStatusCode);</span></p><p>&nbsp;</p><p>m_dwStatusCode는 요청 결과에 반영하는 정수를 갖고 있다. 예를 들어 200은 HTTP_STATUS_OK를 나타내며 요청이 게이트웨이로 갔지만 게이트웨이와 서버와의 통신이 타임아웃일 경우는 504(HTTP_STATUS_GATEWAY_TIMEOUT)를 나타낸다<br>리스트 4는 프록시를 통하여 HTTP 파일을 다운로드 하는 코드이다.</p><!--       <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"		    xmlns:dc="http://purl.org/dc/elements/1.1/"		    xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">       <rdf:Description	        rdf:about="http://minnimok.egloos.com/4504108"	        dc:identifier="http://minnimok.egloos.com/4504108"	        dc:title="WinInet API"	        trackback:ping="http://minnimok.egloos.com/tb/4504108"/>       </rdf:RDF>       -->			 ]]> 
		</description>
		<category>* Detail_Programming</category>

		<comments>http://dokim.egloos.com/1142450#comments</comments>
		<pubDate>Thu, 20 Nov 2008 02:03:36 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ windows 실행 명령어 ]]> </title>
		<link>http://dokim.egloos.com/787131</link>
		<guid>http://dokim.egloos.com/787131</guid>
		<description>
			<![CDATA[ 
  [일반 명령어] <p>calc (계산기)<br>charmap 문자표<br>cleanmgr 디스크정리<br>clipbrd (클립보드에 복사된 내용 표시)<br>cmd(도스명령프롬프트 실행) 단, 윈98은 command <br>control (<span id="google-navclient-hilite" style="COLOR: black; BACKGROUND-COLOR: yellow"><span style="BACKGROUND-COLOR: #ffffff">제어판</span></span>)<br>dfrg.msc 디스크 조각모음<br>dxdiag (다이렉트X 진단도구 및 그래픽과 사운드의 세부정보를 보여줌)<br>eudcedit 사용자 정의 문자 편집기<br>explorer 탐색기<br>magnify 돋보기<br>mobsync 동기화<br>msconfig(시작프로그램 제어등 많은기능 제공) <br>msinfo32 시스템정보<br>mstsc 원격 데스크톱 연결<br>netstat -na(현재 열린포트와 TCP/IP 프로토콜정보를 보여줌) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 열린포트로 트라이목마형 바이러스 침투 유무확인가능 <br>notepad 메모장<br>ntbackup 백업 및 복원 마법사<br>osk 화상키보드<br>pbrush 또는 mspaint (그림판)<br>ping 사이트주소(핑테스트 해당 사이트의 인터넷연결 유무 확인) <br>regedit(레지스트리 편집기)<br>sfc(시스템 파일 검사기) <br>&nbsp;&nbsp; - 시스템 파일을 검사한후 깨지거난 손실된 파일을 원본 압축파일에서 찾아서 복원시켜줌 <br>&nbsp;&nbsp;&nbsp;&nbsp; 단, 윈2000에서는 cmd실행 후 sfc사용 - 마지막 설정된 값을 다음 윈도우부팅시 곧바로 실행됨[수정] <br>sndrec32 녹음기<br>sndvol32 (시스템 사운드 등록정보,볼륨조절)<br>sysedit(autoexec.bat, config.sys, win.ini, system.ini 시스템구성편집기) <br>systray(사운드 볼륨설정 노란색 스피커 아이콘을 트라이목록에 띄움)<br>telnet open 사이트주소(텔넷접속명령어)<br>tourstart (윈도우 기능안내 html 문서표시)<br>wab 주소록<br>winipcfg(인터넷에 접속된 자신의 아이피 주소를 보여줌) 단, 윈2000은 ipconfig로 변경됨<br>winmine (지뢰찾기)<br>winver (윈도우 버전확인)<br>wmplayer (윈도우 미디어 플레이어)<br>wordpad 워드패드<br>wscui.cpl 보안센터<br>wupdmgr 윈도우업데이트</p><p>&nbsp;</p><p>[MSC 명령어]</p><p>certmgr.msc : 인증서 관리<br>ciadv.msc : 인덱싱 서비스<br>compmgmt.msc : 컴퓨터 관리<br>devmgmt.msc : 장치관리자<br>dfrg.msc : 디스크 조각 모음<br>diskmgmt.msc : 디스크 관리<br>eventvwr.msc : 이벤트 뷰어 (이벤트 로그)<br>fsmgmt.msc : 공유 폴더 (공유 폴더 관리)<br>gpedit.msc : 그룹 정책<br>lusrmgr.msc : 로컬 사용자 및 그룹<br>ntmsmgr.msc : Removable Storage<br>ntmsoprq.msc : 이동식 저장소 운영자 요청<br>perfmon.msc : 성능<br>rsop.msc : 정책의 결과 집합<br>secpol.msc : 로컬 보안 설정<br>services.msc : 서비스<br>wmimgmt.msc : WMI 서비스 구성<br>comexp.msc : comexp 구성 요소 서비스<br>control userpasswords2 : 사용자 계정&nbsp; </p><br/><br/>tag : <a href="/tag/실행명령어" rel="tag">실행명령어</a>			 ]]> 
		</description>
		<category>* Infomation</category>
		<category>실행명령어</category>

		<comments>http://dokim.egloos.com/787131#comments</comments>
		<pubDate>Thu, 04 Sep 2008 00:44:44 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Visual Studio 2005 Class Designer ]]> </title>
		<link>http://dokim.egloos.com/551231</link>
		<guid>http://dokim.egloos.com/551231</guid>
		<description>
			<![CDATA[ 
  <table id="hpcontenttable" style="WIDTH: 100%" cellpadding="0" border="0"><tbody><tr><td><div id="nsbanner"><div id="TitleRow"><h1 class="dtH1"><br />
Visual Studio 2005 Class Designer</h1></div></div><!--NONSCROLLING BANNER END--><p>Matthew A. Stoecker<br />
Microsoft Corporation</p><p>2004년 5월</p><p>적용 대상:</p><p>&nbsp;&nbsp;&nbsp;Visual Studio 2005</p><p><b class="le">요약</b>: Visual Studio Class Designer를 사용하면 클래스 구조와 관계를 시각화하고 시각 디자인 환경에서 새 클래스를 만들고 클래스를 쉽게 refactor할 수 있습니다. 이 백서에서는 이러한 작업에 대해 설명합니다(7페이지/인쇄 페이지 기준).</p><blockquote class="dtBlock"><b class="le">참고</b> 이 문서는 해당 제품 릴리스의 제조 이전에 개발되었으므로 여기에 포함된 정보가 출시 제품의 내용과 완전히 일치함을 보증하지는 못합니다. 여기서 제공되는 정보는 이 문서가 작성된 당시의 제품 정보를 기준으로 하며 계획 목적으로만 사용해야 합니다. 정보는 언제든지 사전 예고 없이 변경될 수 있습니다. Microsoft가 이 설명서 본안에 관련된 특허권, 상표권, 저작권 또는 기타 지적 재산권 등을 보유할 수도 있습니다. 서면 사용권 계약에 따라 Microsoft로부터 귀하에게 명시적으로 제공된 권리 이외에, 이 설명서의 제공은 귀하에게 이러한 특허권, 상표권, 저작권, 또는 기타 지적 재산권 등에 대한 어떠한 사용권도 허여하지 않습니다.</blockquote><h4 class="dtH1">목차</h4><p><a href="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/clssdsgnr.aspx#clssdsgnr_topic1" target="_self">소개</a><br />
<a href="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/clssdsgnr.aspx#clssdsgnr_topic2" target="_self">시각 클래스 디자이너를 사용해야 하는 이유</a><br />
<a href="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/clssdsgnr.aspx#clssdsgnr_topic3" target="_self">Visual Studio Class Designer</a><br />
<a href="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/clssdsgnr.aspx#clssdsgnr_topic4" target="_self">Visual Studio와의 통합</a><br />
<a href="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/clssdsgnr.aspx#clssdsgnr_topic5" target="_self">결론</a></p><h2 class="dtH1"><a name="clssdsgnr_topic1"></a>소개</h2><p>Visual Studio Class Designer는 CLR(공용 언어 런타임)을 위한 완전한 기능을 갖춘 시각 디자인 환경입니다. Visual Studio Class Designer를 사용하면 클래스 및 기타 유형의 구조를 시각화하고 이 시각 표현을 통해 소스 코드를 편집할 수 있습니다. 클래스 다이어그램의 변경 내용은 즉시 코드에 반영되며 코드의 변경 내용은 즉시 디자이너의 모양에 영향을 줍니다. 디자이너와 코드 간의 이러한 동기 관계를 통해 복잡한 CLR 유형을 시각적으로 쉽게 만들고 구성할 수 있습니다.</p><p>Class Designer에는 코드를 refactor하고 식별자 이름을 쉽게 바꾸고 메서드를 다시 정의할 수 있는 특수 기능이 들어 있습니다. 클래스와 구조도 자동으로 생성할 수 있으며 스텁을 자동으로 생성하여 인터페이스를 구현할 수 있습니다.</p><p>마지막으로, Class Designer는 코드 베이스 영역을 동료에게 쉽게 전달할 수 있는 통신 도구로 사용할 수도 있습니다. 클래스 다이어그램을 인쇄하거나 이미지로 저장하여 HTML 페이지나 PowerPoint 프레젠테이션으로 표시할 수 있습니다.</p><a href="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/images/ClssDsgnr-fig01big.gif" target="_Top" alt text="Click the image to view a larger version."><img src="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/images/clssDsgnr-fig01.gif"></a> <p class="label"><b>그림 1. Class Designer</b></p><h2 class="dtH1"><a name="clssdsgnr_topic2"></a>시각 클래스 디자이너를 사용해야 하는 이유</h2><p>소프트웨어를 디자인하는 작업은 매우 어렵고 복잡합니다. 초기 디자인 단계에서 코드 검토, 최종 제품 문서화에 이르기까지 개발 주기 동안 모든 시점에서 문제가 발생합니다. 시각 클래스 디자이너는 전체 개발 주기에서 유용하며 다음과 같은 시나리오를 예로 들 수 있습니다. <ul type="disc"><li>기존 코드 이해: 기존 코드 베이스는 복잡하고 혼란스러울 수 있습니다. 시각 클래스 디자이너를 사용하면 기존 클래스 계층 구조를 그래픽으로 탐색하고 각 클래스 간의 관계를 파악할 수 있습니다. <li>클래스 디자인: 시각 클래스 디자이너를 사용하여 소프트웨어를 그래픽으로 훌륭하게 디자인하고 구현할 수 있습니다. <li>코드 검토 및 refactoring: 시각 클래스 디자이너는 코드 검토 및 refactoring을 위한 강력한 도구입니다. 기존 코드 다이어그램에 검토용 주석을 추가할 수 있으며 디자이너로 코드를 refactor하여 시간을 절약할 수 있습니다. <li>문서화를 위한 클래스 다이어그램: 클래스 다이어그램을 사용하여 상속 트리를 그래픽으로 표시함으로써 기존 클래스 계층 구조를 문서화할 수 있습니다. 또한 클래스 다이어그램은 전자 메일이나 시각적 프레젠테이션을 통해 동료와 아이디어를 교환하는 경우에도 유용합니다. </li></ul><h2 class="dtH1"><a name="clssdsgnr_topic3"></a>Visual Studio Class Designer</h2><p>Visual Studio Class Designer는 .NET Framework용 통합 디자인 기능을 갖춘 시각적 코드 디자인 도구입니다. Class Designer의 시각적 기능은 CLR과 밀접하게 관련되어 있습니다. 클래스, 구조, 인터페이스 등의 CLR 모양은 각각의 특성을 나타내는 모양으로 시각적으로 구별되도록 표현됩니다. 더욱이 다이어그램의 용어는 특정 언어와 관련이 있습니다. 예를 들어 Visual Basic에서는 <code class="ce">Public</code>, <code class="ce">Private</code> 및 <code class="ce">Friend</code> 액세스 수준으로 작업할 수 있습니다. 반면 C#에서는 <code class="ce">public</code>,<code class="ce"> private</code> 및 <code class="ce">internal</code>로 표시됩니다. Class Designer와 CLR의 견고한 통합을 통해 Class Designer는 .NET Framework를 사용하여 클래스를 만들 수 있는 이상적인 도구가 되었습니다.</p><p>Visual Studio Class Designer는 위에서 언급한 모든 주요 시나리오를 위한 기능을 제공하므로 전체 개발 주기에 걸쳐 적절히 사용할 수 있습니다. 예를 들면 다음과 같습니다. <ul type="disc"><li>기존의 코드 이해: Visual Studio Class Designer를 사용하여 클래스 간의 관계를 쉽고 빠르게 확인할 수 있습니다. 시각적으로 확인하고 기존 유형에 친숙해질 수 있게 함으로써 기존 코드의 상속 계층 구조를 확인할 수 있을 뿐 아니라 참조된 유형 및 .NET 어셈블리도 확인할 수 있습니다. <li>클래스 디자인: Visual Studio Class Designer를 사용하여 클래스 및 클래스 계층 구조를 빠르게 디자인할 수 있습니다. 자주 사용하는 끌어서 놓기 기능을 사용하여 코드 편집기와의 동기화를 유지하면서 클래스 다이어그램을 만들 수 있습니다. 클래스 다이어그램을 변경하면 코드에 바로 반영되며 반대의 경우도 마찬가지입니다. 클래스 다이어그램은 항상 코드의 현재 상황을 표시합니다. <li>코드 검토 및 refactoring: Visual Studio Class Designer는 코드 검토 및 refactoring을 위한 강력한 도구입니다. 이후의 작업을 위해 기존 코드 다이어그램에 주석을 추가할 수 있으며 기본으로 제공되는 refactoring 기능을 사용하여 기호 이름 바꾸기, 속성 필드 캡슐화 등의 일반 작업을 빠르고 편리하게 수행할 수 있습니다. <li>문서화를 위한 클래스 다이어그램: 기존 클래스 다이어그램을 인쇄하거나 이미지로 저장하여 HTML 페이지나 Microsoft PowerPoint 프레젠테이션으로 표시하는 등 다양한 방법으로 표시할 수 있습니다. </li></ul><h3 class="dtH1">Class Designer를 사용하여 클래스 만들기</h3><p>프로젝트에서 Class Designer를 사용하여 클래스를 쉽게 만들고 구성할 수 있습니다. 클래스 다이어그램은 실제로 코드의 현재 상황을 표시합니다. 다이어그램의 변경 내용은 코드와 자동으로 동기화되며 반대의 경우도 마찬가지입니다. 도구 상자에서 Class Design 표면으로 클래스를 끌어서 놓는 방법으로 간단한 클래스를 만들 수 있습니다. 프로젝트에 클래스를 만든 후에는 코드 편집기를 열고 코드를 직접 새 클래스에 추가할 수 있습니다. 변경한 내용은 클래스 다이어그램에 반영됩니다.</p><p>클래스를 만든 후 Class Details 창을 사용하여 구성원을 추가할 수 있습니다. 예를 들어 메서드를 추가하려면 Class Details 창에서 <b>&lt;add method&gt;</b>를 클릭하고 메서드 이름을 입력합니다. 그런 다음 반환 유형, 액세스 수준을 지정하고 메서드에 대한 주석을 추가할 수 있습니다. 메서드를 만든 후에는 매개 변수 이름을 지정하고 유형, 한정자 및 주석을 지정하여 메서드를 먼저 추가하는 것과 비슷한 방법으로 메서드 이름에 매개 변수를 추가할 수 있습니다. 메서드가 추가되는 것과 같은 방식으로 속성, 필드 및 이벤트가 추가됩니다. 트리 컨트롤을 사용하여 메서드를 편집하는 작업은 코드 편집기에서 입력하는 것과 매우 유사합니다. 동일한 키 입력으로 셀을 탐색할 수 있으며 IntelliSense 도움말을 사용할 수 있습니다.</p><h3 class="dtH1">인터페이스 구현</h3><p>Class Designer를 사용하여 클래스에서 인터페이스를 쉽게 구현할 수 있습니다. 사실, 인터페이스가 Class Designer 표면에 표시된 경우 클래스에서 인터페이스로 상속 선을 그려서, 클래스를 상속할 때 사용하는 절차를 똑같이 사용하여 구현할 수 있습니다. 그러나 인터페이스가 Class Designer에 표시되지 않은 경우에도 쉽게 구현할 수 있습니다. 클래스 보기<b></b>에서 구현할 클래스로 인터페이스를 끌어서 놓으면 됩니다. 인터페이스에 정의된 메서드에 대해 메서드 스텁이 자동으로 생성됩니다. 일단 구현된 후에는 코드 편집기에서 특정 구현 코드를 추가할 수 있습니다.</p><h3 class="dtH1">상속 계층 구조 시각화</h3><p>Class Designer를 사용하여 프로젝트에서 상속 계층 구조를 시각화할 수 있습니다. 상속된 클래스의 기본 클래스를 표시하려면 클래스의 헤더 영역을 마우스 오른쪽 단추로 클릭하고 <b>Show Base Class</b>를 클릭합니다. 그러면 다이어그램에 기본 클래스가 나타납니다.</p><p>기존 클래스에서 상속되는 클래스를 표시하려면 클래스의 헤더 영역을 마우스 오른쪽 단추로 클릭하고 <b>Show Derived Types</b>를 선택합니다. 파생된 클래스가 상속 선으로 클래스에 연결되어 다이어그램에 나타납니다.</p><h2 class="dtH1"><a name="clssdsgnr_topic4"></a>Visual Studio와의 통합</h2><p>Class Designer는 Visual Studio 2005 Team System과 완벽하게 통합됩니다. 일반 Visual Studio 도구를 사용할 때와 같은 공간에서 같은 방법으로 친숙하게 Class Designer로 작업할 수 있습니다. Class Designer에서 작업할 경우 친숙한 끌어서 놓기 작업을 통해 액세스할 수 있는 Class Designer 도구가 도구 상자에 포함되어 있으면 Class Details 및 Properties 창에서 유형 구성원에 액세스할 수 있습니다. Solution Explorer, Class View 등의 표준 Visual Studio 도구 창에서도 끌어서 놓기 기능을 사용할 수 있습니다. Class Designer에서 변경한 내용은 모두 해당 코드 파일과 즉시 동기화됩니다. 그런 다음 Visual Studio 코드 편집기를 사용하여 정상적으로 이 코드 파일을 열어서 편집할 수 있습니다.</p><h3 class="dtH1">클래스 다이어그램</h3><p>클래스 다이어그램은 변경을 통해 계속 업데이트되는 현재 코드 보기입니다. 클래스 다이어그램에는 기존 프로젝트의 클래스가 표시됩니다. 클래스 다이어그램을 사용하여 프로젝트에서 클래스 간의 관계를 시각화하고 개별 클래스에 구성원을 추가 및 편집할 수 있습니다. 클래스 다이어그램 파일은 프로젝트의 일부로서 계속 남아 있으므로 코드를 그래픽으로 볼 때 항상 사용할 수 있습니다.</p><p><b>Project</b> 메뉴에서 <b>New Item</b>을 선택하고 클래스 다이어그램을 선택하여 기존 프로젝트에 새 클래스 다이어그램을 추가할 수 있습니다. 클래스 다이어그램은 프로젝트의 일부라기보다는 클래스를 만들고 편집하는 과정을 돕는 도구입니다. 클래스를 만든 후에는 Class View<b></b>에서 클래스 디자인 표면으로 끌어서 놓는 방법으로 Class Designer에 기존 클래스를 추가할 수 있습니다. 또한 도구 상자에서 Class Designer로 끌어서 놓는 방법으로 새 클래스 및 기타 유형을 추가할 수 있습니다.</p><p>Class Designer에 추가한 후 클래스 및 기타 유형은 선택하고 처리할 수 있는 도형으로 표시됩니다. Class Designer에서 임의의 도형을 선택하면 상세 정보가 Class Details<b></b> 창에 표시됩니다. 클래스 다이어그램 자체에는 시각적 정보만 저장되며 코드 내용에 대한 정보는 포함되지 않습니다. 클래스 다이어그램 파일을 삭제해도 코드는 손실되지 않습니다.</p><p class="fig"><img alt="" src="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/images/clssdsgnr-fig02.gif" border="0"></p><p class="label"><b>그림 2. 클래스 다이어그램</b></p><h3 class="dtH1">도구 상자</h3><p>클래스 다이어그램이 표시되면 도구 상자에서 새 구성원을 클래스 다이어그램에 추가할 수 있습니다. 도구 상자에는 클래스 다이어그램에 추가할 수 있는 클래스, 구조, 대리자, enum 및 기타 유형이 포함되어 있습니다. 도구 상자에서 유형이 추가되면 해당 코드 및 코드 파일이 프로젝트에 추가됩니다. </p><p class="fig"><img alt="" src="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/images/clssdsgnr-fig03.gif" border="0"></p><p class="label"><b>그림 3. 도구 상자</b></p><h3 class="dtH1">Class Details 창</h3><p>Class Details<b> </b>창에는 Class Designer에 표시되는 유형이 가진 메서드, 속성, 필드 및 이벤트가 표시됩니다. Class Details 창을 사용하여 Class Designer에 있는 클래스 구성원이나 구조를 신속하게 편집할 수 있습니다. 예를 들어 메서드의 반환 유형을 변경하거나 매개 변수를 추가하거나 액세스 수준을 변경할 수 있습니다. Class Details 창에서 변경한 내용은 모두 코드에 즉시 반영됩니다.</p><p class="fig"><img alt="" src="http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/images/clssdsgnr-fig04.gif" border="0"></p><p class="label"><b>그림 4. Class Details 창</b></p><h2 class="dtH1"><a name="clssdsgnr_topic5"></a>결론</h2><p>Class Designer는 Visual Studio 2005를 위한 새 도구로서, 프로젝트에서 클래스 및 인터페이스를 신속하게 만들고 구성할 수 있게 합니다. 이 백서에서는 기존 코드 이해, 클래스 디자인, 코드 검토 및 refactoring, 문서화를 위한 다이어그램 사용 등 Class Designer를 사용할 수 있는 가장 기본적인 시나리오에 대해 설명했습니다. Class Designer의 기능에 대해 더 자세히 배워서 이 새 도구를 활용하면 소프트웨어를 개발할 때 유용할 것입니다.</p><!--closes the topic content div--><!--FOOTER_END--><!-- End Content --></td></tr></tbody></table><br />
<br />
<p><br />
출처 : http://www.microsoft.com/korea/msdn/library/ko-kr/dev/vstudio/clssdsgnr.aspx			 ]]> 
		</description>
		<category>* Skill</category>

		<comments>http://dokim.egloos.com/551231#comments</comments>
		<pubDate>Fri, 04 Jul 2008 03:46:40 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Mpeg-2 Codec (위키백과) ]]> </title>
		<link>http://dokim.egloos.com/393222</link>
		<guid>http://dokim.egloos.com/393222</guid>
		<description>
			<![CDATA[ 
  <p><b>MPEG-2</b>(엠펙 투)는 <a title="MPEG" href="http://ko.wikipedia.org/wiki/MPEG">MPEG</a>(Moving Picture Expert Group)이 정한 오디오와 비디오 인코딩(부호화)에 관한 일련의 표준을 말하며, ISO 표준 13818(13818-1은 시스템, 13818-2는 비디오 부호화, 13818-3은 오디오...)로 공표되었다. MPEG-2는 일반적으로 디지털 위성방송, 디지털 유선방송 등의 디지털 방송을 위한 오디오와 비디오 정보 전송을 위해 쓰이고 있다. 또, MPEG-2의 표준을 약간 변형한 인코딩 포맷은 상업 <a title="DVD" href="http://ko.wikipedia.org/wiki/DVD">DVD</a>의 표준으로 돌비 디지털, DTS와 함께 사용되고 있다.</p><p>MPEG-2는 <a title="MPEG-1" href="http://ko.wikipedia.org/wiki/MPEG-1">MPEG-1</a>과 비슷하지만, <a title="텔레비전" href="http://ko.wikipedia.org/wiki/%ED%85%94%EB%A0%88%EB%B9%84%EC%A0%84">텔레비전</a> 방송에서 사용하는 <a class="mw-redirect" title="비월주사" href="http://ko.wikipedia.org/wiki/%EB%B9%84%EC%9B%94%EC%A3%BC%EC%82%AC">비월주사</a> 방식의 영상을 지원한다. MPEG-2 비디오는 저속 비트율(1 Mbit/s) 환경에는 부적합하지만, 초당 3 메가비트 이상을 요구하는 MPEG-1보다는 향상된 압축률을 보이고 있다. MPEG-2의 MPEG-1과 구별되는 특징으로는 데이터 유실이 많은 전송 환경에도 적합한 트랜스포트 스트림이 정의되어 있다는 점을 들 수 있으며, 이는 현재 디지털 방송에 사용되고 있다. MPEG-2는 원래 MPEG-3로 개발하려던 <a class="mw-redirect" title="HDTV" href="http://ko.wikipedia.org/wiki/HDTV">HDTV</a>(고선명 텔레비젼) 전송의 표준 또한 포함한다. 또한 MPEG-1과도 호환성도 보장되어 표준을 따르는 MPEG-2 디코더는 MPEG-1 스트림도 재생할 수 있다.</p><p>MPEG-2 13818-3 오디오 표준은 MPEG-1 오디오 표준에서 발전되어 채널의 확장을 하는 MC (다중 채널)과 낮은 표본화 주파수를 제공하는 LSF (낮은 샘플링 주파수:Low Sampling Frequency)(24 kHz, 22.05 kHz, 16 kHz)로 구성되어 있다. 또한 두가지 모두 MPEG-1 오디오를 복호화할 수 있는 하위 호환성의 특성을 가지고 있다. 알고리즘 측면에서는 추가된 내용이 없기 때문에 이론적으로 MPEG-1과 동일한 압축율을 가진다고 봐도 무방하다.</p><p>하지만 MPEG-2에서는 압축율을 높이는 대신, 하위 호환성을 지원하지 않는 AAC (고급 오디오 코딩)를 13818-3이 표준화 된 후 13818-7로 표준화하고 있다. AAC에는 기존 MPEG 오디오에서 사용되지 않던, LTP, TNS, 예측 도구가 추가되었으며 레이어로 구분하던 MPEG-1,2와는 달리 도구의 집합인 프로파일로 구분하여 정의하고 있다. (덜 복잡함, 조절할 수 있는 샘플 속도)</p><table class="toc" id="toc" summary="목차"><tbody><tr><td><div id="toctitle"><h2>목차</h2><span class="toctoggle">[<a class="internal" id="togglelink" href="javascript:toggleToc()">숨기기</a>]</span></div><ul><li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#MPEG-2_.ED.91.9C.EC.A4.80"><span class="tocnumber">1</span> <span class="toctext">MPEG-2 표준</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#.EA.B0.84.EB.9E.B5.ED.95.9C_MPEG-2_.EB.B9.84.EB.94.94.EC.98.A4_.EC.9D.B8.EC.BD.94.EB.94.A9_.EC.A0.88.EC.B0.A8"><span class="tocnumber">2</span> <span class="toctext">간략한 MPEG-2 비디오 인코딩 절차</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#MPEG-2_.EC.98.A4.EB.94.94.EC.98.A4_.EB.B6.80.ED.98.B8.ED.99.94"><span class="tocnumber">3</span> <span class="toctext">MPEG-2 오디오 부호화</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#DVD.EC.9D.98_MPEG-2"><span class="tocnumber">4</span> <span class="toctext">DVD의 MPEG-2</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#DVB.EC.97.90.EC.84.9C.EC.9D.98_MPEG-2"><span class="tocnumber">5</span> <span class="toctext">DVB에서의 MPEG-2</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#MPEG-2_.ED.91.9C.EC.A4.80_.EB.AC.B8.EC.84.9C"><span class="tocnumber">6</span> <span class="toctext">MPEG-2 표준 문서</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#.EA.B0.99.EC.9D.B4_.EB.B3.B4.EA.B8.B0"><span class="tocnumber">7</span> <span class="toctext">같이 보기</span></a> <li class="toclevel-1"><a href="http://ko.wikipedia.org/wiki/MPEG-2#.EB.B0.94.EA.B9.A5_.EA.B3.A0.EB.A6.AC"><span class="tocnumber">8</span> <span class="toctext">바깥 고리</span></a> </li></ul></td></tr></tbody></table>//<![CDATA[ if (window.showTocToggle) { var tocShowText = "보이기"; var tocHideText = "숨기기"; showTocToggle(); } //]]><p><a id="MPEG-2_.ED.91.9C.EC.A4.80" name="MPEG-2_.ED.91.9C.EC.A4.80"></a></p><h3><span class="editsection">[<a title="부분 편집: MPEG-2 표준" href="http://ko.wikipedia.org/w/index.php?title=MPEG-2&amp;action=edit&amp;section=1">편집</a>]</span> <span class="mw-headline">MPEG-2 표준</span></h3><p>DVD / DVB 에서 사용되는 변경된 표준을 제외한 MPEG-2 비디오와 MPEG-2 오디오에 대한 일반 정보.</p><p><b>MPEG-2</b> 시스템 스트림은 보통 다음과 같은 두 가지 요소로 구성된다.</p><ul><li>영상 데이터 + 타임 스탬프(시각 정보) <li>소리 데이터 + 타임 스탬프 </li></ul><p><a name=".EA.B0.84.EB.9E.B5.ED.95.9C_MPEG-2_.EB.B9.84.EB.94.94.EC.98.A4_.EC.9D.B8.EC.BD.94.EB.94.A9_.EC.A0.88.EC.B0.A8"></a></p><h3><span class="editsection">[<a title="부분 편집: 간략한 MPEG-2 비디오 인코딩 절차" href="http://ko.wikipedia.org/w/index.php?title=MPEG-2&amp;action=edit&amp;section=2">편집</a>]</span> <span class="mw-headline">간략한 MPEG-2 비디오 인코딩 절차</span></h3><p>MPEG-2는 <i>오디오 신호를 비롯한 동영상의 일반적인 인코딩(부호화)</i>을 위한 규약이다. 부호화된 비디오 스트림은 인트라(<b>I</b>ntra), 전방 예측(<b>P</b>redictive), 양방향 예측(<b>B</b>idirectional)의 세가지 프레임들이 GOP(Group of Pictures) 구조라는 특별한 구조를 이루어 만들어 진다. 일반적으로 부호화할 원본은 소리가 포함된 일정한 해상도의 영상이 초당 25(<a class="new" title="CCIR (아직 생성되지 않음)" href="http://ko.wikipedia.org/w/index.php?title=CCIR&amp;action=edit&amp;redlink=1">CCIR</a>규정) 프레임 또는 초당 29.97(<a class="mw-redirect" title="FCC" href="http://ko.wikipedia.org/wiki/FCC">FCC</a>규정) 프레임의 속도로 바뀌는 동영상이다.</p><p>MPEG-2는 <a class="mw-redirect" title="비월주사" href="http://ko.wikipedia.org/wiki/%EB%B9%84%EC%9B%94%EC%A3%BC%EC%82%AC">비월주사</a>(interlaced scan)와 <a class="mw-redirect" title="순차주사" href="http://ko.wikipedia.org/wiki/%EC%88%9C%EC%B0%A8%EC%A3%BC%EC%82%AC">순차주사</a>(progressive scan) 두 가지 방식의 비디오 스트림을 모두 지원한다. 순차주사 방식에선 부호화의 기본 유닛이 프레임(한 장의 영상)이 되고, 비월주사 방식에선 필드(한 장의 영상의 홀수줄, 혹은 짝수줄만으로 이루어짐)이다. 아래 설명에서 "픽처" 혹은 "정지 영상"이라고 말한 것은 각각의 기본 유닛(즉 필드나 프레임)을 가리킨다.</p><p>MPEG-2 스트림은 단일 영상을 부호화한 데이터 프레임의 연속이다. 각 정지영상을 부호화하는 방법엔 인트라(I), 전방 예측(P), 양방향 예측(B) 세 가지가 있다.</p><p>각 비디오 이미지는 루미넌스(명도) 성분 Y 와 두 개의 크로미넌스(색차) U, V 채널로 우선 나뉘어진다. 각각에 대해 공간적으로 "매크로 블럭(macroblock)"이라 불리는 16x16 크기의 격자로 나뉘며, 이 매크로 블럭이 부호화의 기본적인 조각이 된다. 매크로 블럭은 8x8 크기의 "블럭" 4개가 합쳐진 것이다. 원본 이미지의 크로미넌스 포맷에 따라 한 매크로 블럭이 8x8 크기의 크로미넌스 블럭을 갖을지, 아니면 16x16을 갖을지가 결정된다. 예를 들어, 일반적으로 쓰이는 <a class="new" title="4:2:0 (아직 생성되지 않음)" href="http://ko.wikipedia.org/w/index.php?title=4:2:0&amp;action=edit&amp;redlink=1">4:2:0</a> 포맷에서는, 한 색상이 매크로 블럭 하나(16x16)당 한 개의 크로미넌스 블록(8x8)만을 갖게 되어, 하나의 매크로 블럭은 4개의 루미넌스 블럭, 1개의 U블럭, 1개의 V블럭으로 총 6개의 블럭을 갖게 된다.</p><p>I 픽처의 경우 이미지 데이터는 다음 문단에서 설명하는 인코딩 절차를 바로 거치게 되며, P (혹은 B) 픽처의 경우엔 우선 "움직임 보상"(motion compensation)이라 불리는 과정을 거쳐 이전 영상(B의 경우엔 이전과 이후의 영상)과의 관련성을 검색하여 이용한 후 다음 인코딩을 진행하게 된다. 움직임 보상에선 P (혹은 B) 픽처로 만들어질 영상의 각 매크로 블럭이 이전(B의 경우엔 이후도 포함) 영상의 어느 부분과 가장 관련성이 높은가를 알아내어 그 부분과의 공간상의 변위인 "움직임 벡터"(motion vector)와 두 영상간의 차이가 다음과 같이 부호화 되어 전송되게 된다.</p><p>각 블럭은 8x8 <a title="이산 코사인 변환" href="http://ko.wikipedia.org/wiki/%EC%9D%B4%EC%82%B0_%EC%BD%94%EC%82%AC%EC%9D%B8_%EB%B3%80%ED%99%98">이산 코사인 변환</a>(descrete cosine transformaton)의 과정을 거치게 된다. 변환으로 얻어진 각 계수들은 미리 정해진 값들로 나누어 양자화 되고, 지그재그로 재배열 된 후 영에 대한 <a class="new" title="RLC (아직 생성되지 않음)" href="http://ko.wikipedia.org/w/index.php?title=RLC&amp;action=edit&amp;redlink=1">RLC</a>을 하게 된다. 마지막으로 <a class="mw-redirect" title="허프만 코딩" href="http://ko.wikipedia.org/wiki/%ED%97%88%ED%94%84%EB%A7%8C_%EC%BD%94%EB%94%A9">허프만 코딩</a>으로 부호화를 마친다.</p><p>I 픽쳐 인코딩은 공간적인 반복성에 대한 것이고, P 와 B 픽처는 시간적인 반복성에 대한 것이다. 다시 말해, 동영상을 이루는 이어지는 두개의 정지영상은 서로 상당히 비슷하며, 그래서 P 픽처는 보통 I 픽처의 10%, B 픽처는 2%의 크기로 부호화된다.</p><p>이 세 가지 프레임으로 이루어지는 일련의 프레임들은 GOP(Group of Pictures)라 불리는 구조를 이룬다. 다양한 구조의 GOP가 가능하지만 많이 쓰이는 것은 I_BB_P_BB_P_BB_P_BB_P_BB_ 의 순서로 15개의 프레임이 하나의 GOP를 구성하는 것이다. 이와 유사하게 12개의 프레임으로 만들어진 GOP구조도 자주 쓰인다. GOP 구조의 I, P, B 프레임의 구성 비율은 비디오 스트림의 성격, 출력 스트림이 갖어야 하는 대역폭(bandwidth)등에 따라 정해진다. 인코딩에 걸리는 시간도 비율을 결정하는 한 요소이다. 이를테면 실시간으로 전송해야 하는 생방송의 경우에 인코딩에 동원되는 자원은 한정되어 있으며, B 픽처가 많이 들어간 스트림은 I 픽처만으로 이루어진 스트림에 비해 인코딩에 3배 정도의 시간이 들 수 있다.</p><p>MPEG-2 인코더의 출력 비트율은 일정해야 하거나, 정해진 최대 비트율을 갖고 변할 수 있다. 가변 비트율의 예로 10.4 Mbps를 최대 비트율로 갖는 DVD 영화를 들 수 있다. 일정한 비트율을 얻기 위해서 양자화의 수준을 변경시킬 수 있다. 그러나 양자화가 심하게 될 경우엔 전송된 스트림이 디코딩 된 화면에 격자모양이 나타날 수 있다. 이 현상은 비트율이 내려갈수록 더욱 심각해진다.</p><p><a id="MPEG-2_.EC.98.A4.EB.94.94.EC.98.A4_.EB.B6.80.ED.98.B8.ED.99.94" name="MPEG-2_.EC.98.A4.EB.94.94.EC.98.A4_.EB.B6.80.ED.98.B8.ED.99.94"></a></p><h3><span class="editsection">[<a title="부분 편집: MPEG-2 오디오 부호화" href="http://ko.wikipedia.org/w/index.php?title=MPEG-2&amp;action=edit&amp;section=3">편집</a>]</span> <span class="mw-headline">MPEG-2 오디오 부호화</span></h3><p>MPEG-2 는 또한 새로운 오디오 인코딩 방식을 도입한다. 이는</p><ul><li>반으로 줄어든 샘플링 율을 사용하는 저속 비트율 인코딩 (MPEG-1 Layer 1/2/3 LSF) <li>다채널 인코딩. 최고 5.1 채널 </li></ul><p><a id="DVD.EC.9D.98_MPEG-2" name="DVD.EC.9D.98_MPEG-2"></a></p><h3><span class="editsection">[<a title="부분 편집: DVD의 MPEG-2" href="http://ko.wikipedia.org/w/index.php?title=MPEG-2&amp;action=edit&amp;section=4">편집</a>]</span> <span class="mw-headline">DVD의 MPEG-2</span></h3><p>DVD 표준에는 다음과 같은 제한 사항이 더해진다.</p><ul><li>해상도의 제한 <ul><li>720 x 480 픽셀, 초당 59.94 필드 (FCC) <li>720 x 480 픽셀, 초당 29.97 프레임 (FCC) <li>720 x 576 픽셀, 초당 50 필드 (CCIR) <li>720 x 576 픽셀, 초당 25 프레임 (CCIR) </li></ul><li>초당 최고 9,8 메가비트 <li>YUV 4:2:0 <li>부가적인 자막 가능 <li>오디오 <ul><li>48 kHz MPEG-2 Layer 2 가능 <li>48 kHz 최고 초당 448 킬로비트의 디지털 돌비 가능 <li>754 또는 초당 1510 킬로비트 의 DTS 가능 <li>최소한 하나의 MPEG 오디오 또는 DD 오디오 트랙 포함 </li></ul><li>GOP 구조의 제한 </li></ul><p><a id="DVB.EC.97.90.EC.84.9C.EC.9D.98_MPEG-2" name="DVB.EC.97.90.EC.84.9C.EC.9D.98_MPEG-2"></a></p><h3><span class="editsection">[<a title="부분 편집: DVB에서의 MPEG-2" href="http://ko.wikipedia.org/w/index.php?title=MPEG-2&amp;action=edit&amp;section=5">편집</a>]</span> <span class="mw-headline">DVB에서의 MPEG-2</span></h3><p><a class="mw-redirect" title="DVB" href="http://ko.wikipedia.org/wiki/DVB">DVB-MPEG</a>에 더해진 제한 사항.</p><ul><li>다음의 SDTV 급 해상도만 허용됨. <ul><li>720 × 480 화소, 24/1.001, 24, 30/1.001 또는 30 프레임/초 <li>640 × 480 화소, 24/1.001, 24, 30/1.001 또는 30 프레임/초 <li>544 × 480 화소, 24/1.001, 24, 30/1.001 또는 30 프레임/초 <li>480 × 480 화소, 24/1.001, 24, 30/1.001 또는 30 프레임/초 <li>352 × 480 화소, 24/1.001, 24, 30/1.001 또는 30 프레임/초 <li>352 × 240 화소, 24/1.001, 24, 30/1.001 또는 30 프레임/초 <li>720 × 576 화소, 25 프레임/초 <li>544 × 576 화소, 25 프레임/초 <li>480 × 576 화소, 25 프레임/초 <li>352 × 576 화소, 25 프레임/초 <li>352 × 288 화소, 25 프레임/초 </li></ul></li></ul><p><a id="MPEG-2_.ED.91.9C.EC.A4.80_.EB.AC.B8.EC.84.9C" name="MPEG-2_.ED.91.9C.EC.A4.80_.EB.AC.B8.EC.84.9C"></a></p><h3><span class="editsection">[<a title="부분 편집: MPEG-2 표준 문서" href="http://ko.wikipedia.org/w/index.php?title=MPEG-2&amp;action=edit&amp;section=6">편집</a>]</span> <span class="mw-headline">MPEG-2 표준 문서</span></h3><dl><dt>ISO/IEC 13818-1&nbsp; <dd>시스템 - 비디오와 오디오 데이터의 동기화와 다중 송신을 정의. <dt>ISO/IEC 13818-2&nbsp; <dd>비디오 - 비월주사, 순차주사 비디오 신호의 압축 코덱을 정의. <dt>ISO/IEC 13818-3&nbsp; <dd>오디오 - 오디오 신호의 개념적인 압축 코덱, MPEG-1 (<a title="MP3" href="http://ko.wikipedia.org/wiki/MP3">MP3</a>)에 여러 채널을 쓸 수 있게 한 확장을 정의. <dt>ISO/IEC 13818-4&nbsp; <dd>테스트 절차를 정의. 호환성 테스트를 위한 절차를 서술하였음. <dt>ISO/IEC 13818-5&nbsp; <dd>소프트웨어 시뮬레이션 시스템을 정의. <dt>ISO/IEC 13818-6&nbsp; <dd>DSM-CC (Digital Storage Media Command and Control의 약자)의 확장을 정의. <dt>ISO/IEC 13818-7&nbsp; <dd><a class="mw-redirect" title="AAC" href="http://ko.wikipedia.org/wiki/AAC">AAC</a> (<a class="mw-redirect" title="고급 오디오 코딩" href="http://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B8%89_%EC%98%A4%EB%94%94%EC%98%A4_%EC%BD%94%EB%94%A9">고급 오디오 코딩</a>) <dt>ISO/IEC 13818-9&nbsp; <dd>실시간 인터페이스를 위한 확장. <dt>ISO/IEC 13818-10&nbsp; <dd>DSM-CC의 순응 확장 <dt>ISO/IEC 13818-11&nbsp; <dd>MPEG2 시스템 위의 IPMP </dd></dl><br/><br/>tag : <a href="/tag/mpeg2" rel="tag">mpeg2</a>			 ]]> 
		</description>
		<category>mpeg2</category>

		<comments>http://dokim.egloos.com/393222#comments</comments>
		<pubDate>Mon, 26 May 2008 06:39:55 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ MPEG -2 Codec (네이버 백과사전) ]]> </title>
		<link>http://dokim.egloos.com/393214</link>
		<guid>http://dokim.egloos.com/393214</guid>
		<description>
			<![CDATA[ 
  <a href="http://terms.naver.com/search.naver?mode=all&amp;query=%B5%F0%C1%F6%C5%D0%C5%DA%B7%B9%BA%F1%C0%FC"><span style="COLOR: #458a08">디지털 텔레비전</span></a> 방송, 통신, 저장 매체용 컬러 <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=4369"><span style="COLOR: #458a08">동화상</span></a> 및 오디오의 <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=7411"><span style="COLOR: #458a08">부호화</span></a>·압축 방식의 <a href="http://terms.naver.com/search.naver?mode=all&amp;query=%B1%B9%C1%A6%C7%A5%C1%D8"><span style="COLOR: #458a08">국제 표준</span></a>. <a href="http://terms.naver.com/search.naver?mode=all&amp;query=%B1%B9%C1%A6%C7%A5%C1%D8%C8%AD%B1%E2%B1%B8"><span style="COLOR: #458a08">국제표준화기구</span></a>(ISO)와 <a href="http://terms.naver.com/item.nhn?dirId=1&amp;docId=690"><span style="COLOR: #458a08">국제전기표준회의</span></a>(IEC)의 합동 조직인 JTC 1 산하의 작업 조직 <a href="http://terms.naver.com/search.naver?mode=all&amp;query=%BF%A5%C6%E4%B1%D7"><span style="COLOR: #458a08">엠페그</span></a>(MPEG)에서 표준화 작업을 진행했다. MPEG 1이 <a href="http://terms.naver.com/search.naver?mode=all&amp;query=%C0%FC%BC%DB%BC%D3%B5%B5"><span style="COLOR: #458a08">전송 속도</span></a> 1.5Mbps 정도로 <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=13056"><span style="COLOR: #458a08">읽기 전용 콤팩트디스크 기억 장치</span></a>(CD&shy;ROM) 등 저장 매체를 적용 대상으로 하는 규격인 데 반해서, MPEG 2는 <a href="http://100.naver.com/100.nhn?docid=155294"><span style="COLOR: #096ab5">텔레비전 방송</span></a>, 통신, 오디오·비디오 기기 등 광범위한 적용 분야를 대상으로 하는 고품질의 규격이다. 영상의 전송 속도는 당초에는 4~10Mbps로 했으나 <a href="http://terms.naver.com/search.naver?mode=all&amp;query=%B0%ED%BC%B1%B8%ED%C5%DA%B7%B9%BA%F1%C0%FC"><span style="COLOR: #458a08">고선명 텔레비전</span></a>(HDTV)의 화질을 감안하여 4~100Mbps로 높여 MPEG 1보다 훨씬 고화질의 규격이 되었다. 1995년에 ISO/IEC 13818&shy;1(시스템), ISO/IEC 13818&shy;2(비디오), ISO/IEC 13818-3(오디오), ISO/IEC 13818&shy;6(<a href="http://terms.naver.com/search.naver?mode=all&amp;query=%B5%F0%C1%F6%C5%D0"><span style="COLOR: #458a08">디지털</span></a> 저장 매체 <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=14972"><span style="COLOR: #458a08">제어 명령</span></a>) 등의 4개 국제 표준이 확정되었다. MPEG 2는 차세대 디지털 텔레비전인 미국의 <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=945"><span style="COLOR: #458a08">고도화 텔레비전</span></a>(ATV), 유럽의 <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=4590"><span style="COLOR: #458a08">디지털 비디오 방송</span></a>(DVB) 등의 HDTV, <a href="http://terms.naver.com/item.nhn?dirId=1&amp;docId=194"><span style="COLOR: #458a08">광대역 종합 정보 통신망</span></a>(B-ISDN)을 이용한 영상의 전송, <a href="http://terms.naver.com/item.nhn?dirId=2&amp;docId=4589"><span style="COLOR: #458a08">디지털 비디오 디스크</span></a>(DVD) 등의 디지털 저장 매체의 개발과 소프트웨어 제작의 <a href="http://terms.naver.com/item.nhn?dirId=1&amp;docId=3945"><span style="COLOR: #458a08">디지털화</span></a>를 촉진하는 원동력이 되고 있다.<br/><br/>tag : <a href="/tag/mpeg2" rel="tag">mpeg2</a>			 ]]> 
		</description>
		<category>mpeg2</category>

		<comments>http://dokim.egloos.com/393214#comments</comments>
		<pubDate>Mon, 26 May 2008 06:37:04 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ "인터넷 떠도는 주민번호 지우세요" ]]> </title>
		<link>http://dokim.egloos.com/291589</link>
		<guid>http://dokim.egloos.com/291589</guid>
		<description>
			<![CDATA[ 
  <table height="60" cellspacing="0" cellpadding="0" width="575" border="0"><tbody><tr><td class="sub_tit_last" style="PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 0px; PADDING-TOP: 15px" valign="center">"인터넷 떠도는 주민번호 지우세요"</td></tr><tr><td style="PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 0px; PADDING-TOP: 15px"><b>행안부 캠페인… 2만여 사이트 이용확인ㆍ정리</b></td></tr><tr><td>&nbsp;</td></tr></tbody></table><table cellspacing="0" cellpadding="0" width="160" align="right" border="0"><tbody><tr><td><!--///기사 이미지 시작 ///--><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; PADDING-TOP: 0px"><img src="http://www.dt.co.kr/contents/images/200804/2008043002010151745002.jpg" border="0"></div><!--///기사 이미지 끝///--></td></tr></tbody></table><!--@본문시작@--><span class="txt_last22"><br><br><br>인터넷에 떠다니거나 잠자고 있는 자신의 주민등록번호를 손쉽게 정리할 수 있게 됐다.<br><br>행정안전부는 사이버상의 주민등록번호 오ㆍ남용을 방지하고 안전한 사용을 유도하기 위해 오는 5월 1일부터 6월 30일까지 두 달간 `2008 주민번호 클린 캠페인'(clean.mopas.go.kr)을 실시한다고 29일 밝혔다.<br><br>이번 캠페인은 최근 옥션, 하나로텔레콤 등 대기업에서 개인정보 유출 사태가 발생하면서 개인정보에 대한 우려가 높아짐에 따라 자신의 주민번호 이용내역을 확인할 수 있도록 지원하기 위한 것이다. 행안부는 2001년 실명확인서비스 이후 인터넷 사이트에서 실명확인 및 성인인증 등의 목적으로 자신의 주민번호가 언제, 어디서 사용됐는지 내역을 무료로 확인할 수 있도록 해준다. 이용내역을 확인하려면 본인인증 절차를 거쳐야 한다.<br><br>이번 캠페인을 통해 약 2만여 사이트에서 주민번호 이용내역을 확인할 수 있다. 이는 실명확인을 거치는 국내 전체 인터넷사이트의 90%에 해당하는 것이다.<br><br>공인인증서나 신용카드 인증 등 본인인증수단을 확보하기 어려운 20세 이하 청소년과 60세 이상 고령자들도 세대주의 생년월일, 성명, 증 발급일자를 이용해 본인인증을 할 수 있다. 그러나 대포폰 등으로 인한 안정성 문제 때문에 휴대폰 인증은 제외된다.<br><br>캠페인 사이트에서는 자신의 주민번호가 이용된 사이트에 직접 접속할 수 있도록 링크를 지원하고, 인터넷기업협회 회원사에 대해 전화로도 탈퇴 신청을 할 수 있도록 하고 있다.<br><br>행정안전부 백운현 지방행정국장은 "최근 인터넷사이트에서 대규모 개인정보가 유출된데 대해 유감스럽게 생각하며 주민등록번호의 대체수단 개발이 시급하다고 생각한다"며 "주민번호의 올바른 사용을 유도하고 개인정보의 오ㆍ남용을 방지하기 위해 클린캠페인을 정기적으로 실시할 계획"이라고 밝혔다. <br><br><br>출처 : 디지털 타임즈 배옥진기자 withok@&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.dt.co.kr/contents.htm?article_no=2008043002010151745002">http://www.dt.co.kr/contents.htm?article_no=2008043002010151745002</a><br></span><br/><br/>tag : <a href="/tag/주민번호" rel="tag">주민번호</a>			 ]]> 
		</description>
		<category>* IT News</category>
		<category>주민번호</category>

		<comments>http://dokim.egloos.com/291589#comments</comments>
		<pubDate>Wed, 30 Apr 2008 10:52:59 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [64비트 윈도우 프로그래밍] ③ 64비트 프로그램으로 가는 길 ]]> </title>
		<link>http://dokim.egloos.com/287172</link>
		<guid>http://dokim.egloos.com/287172</guid>
		<description>
			<![CDATA[ 
  <p><a class="con_link" target="_blank" name="top"><strong><span style="FONT-SIZE: 100%">[64비트 윈도우 프로그래밍] ③ 64비트 프로그램으로 가는 길</span></strong></a></p><p><span style="FONT-SIZE: 100%"></span>&nbsp;</p><p><span style="FONT-SIZE: 100%"><span style="COLOR: #d41a01">연재순서<br></span><a class="con_link" href="http://blog.naver.com/mybrainz/140011506596" target="_blank"><span style="FONT-SIZE: 100%">1회. 32비트 윈도우 프로그램을 엄호하라</span></a><br><span style="FONT-SIZE: 100%"><a class="con_link" href="http://blog.naver.com/mybrainz/140012274266" target="_blank">2회. 윈도우의 변신은 무죄? 64비트 윈도우 파악하기</a><br><span style="COLOR: #d41a01"><a class="con_link" href="http://blog.naver.com/mybrainz/140013255685" target="_blank">3회. 64비트 윈도우 프로그램으로 가는 길 </a></span></span></span></p><p><span style="FONT-SIZE: 100%"></span>&nbsp;</p><p><span style="FONT-SIZE: 100%">19세기말 노르웨이의 화가 에드바르트 뭉크가 남긴 ‘절규’는 노을이 비낀 하늘과 멀리 펼쳐진 북유럽의 해안선을 배경으로 불안한 얼굴을 한 남자를 그린 작품이다. 그동안 32비트 컴퓨팅에 안주해 있던 우리들은 이제 그림 속의 남자와 같이 혼란스러운 64비트 컴퓨팅 시대를 눈앞에 두고 있다. <br><br>이번 회에서는 혼돈 속에 작은 빛이 되기 바라는 마음으로 64비트 응용 프로그램을 개발하기 위한 환경 구축 방법과 새로운 소스를 개발하거나 기존의 32비트 소스를 포팅할 때 유념해야 할 사항들, 그리고 컴파일러의 적극적인 활용법에 대해 설명하겠다. <br><br><!-- 설명 테이블 --><newselement></span></p><div style="BORDER-RIGHT: #666 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #666 1px solid; PADDING-LEFT: 5px; FONT-SIZE: 0.9em; BACKGROUND: #f6f6f6; FLOAT: right; PADDING-BOTTOM: 5px; MARGIN-LEFT: 10px; BORDER-LEFT: #666 1px solid; WIDTH: 180px; PADDING-TOP: 5px; BORDER-BOTTOM: #666 1px solid; POSITION: relative; TEXT-ALIGN: left"><span style="FONT-SIZE: 100%"><b>연재 가이드</b><br><br><b>운영체제</b> : 64비트 윈도우 XP/64비트 윈도우 2003 <br><b>개발언어</b> : 에디터, 플랫폼 SDK 최신판, 비주얼 스튜디오 닷넷 2003, 비주얼 스튜디오 닷넷 2005 <br><b>기초지식</b> : C/C++ 프로그래밍/윈도우 구조 이해 <br><b>응용분야</b> : 64비트 윈도우에서 동작하는 모든 프로그램</span></div><p></newselement><span style="FONT-SIZE: 100%">지난 2회에 걸쳐 64비트 윈도우에서 32비트 응용 프로그램을 WOW64 호환모드 위에서 동작하도록 개발하는 방법과 64비트 윈도우의 달라진 점을 개발자의 관점에서 설명했다. <br><br>하지만 이번 연재를 접한 독자들은 아직까지도 막상 64비트 응용 프로그램을 어떻게 개발해야 할지 막막할 수 있을 것이다. 64비트 응용 프로그램은 64비트 윈도우에서 개발해야 하는 걸까? 컴파일은 어디서 해야 하고 테스트는 어떻게 해야 하는 걸까? 64비트 개발 환경은 있는 것인가? 등등의 수많은 물음이 생길 것인데, 이번 회에는 그 물음에 작으나마 도움이 되는 내용을 언급하려고 한다. <br><br>먼저 32비트와 64비트 환경이 공존하는 지금 응용 프로그램 개발 모델은 어떻게 설정해야 할까? MS에서 권장하고 있는 개발 모델은 &lt;그림 1&gt;과 같이 32비트 윈도우에서 32비트와 64비트 코드를 하나로 개발하고 컴파일하며 32비트 응용 프로그램은 32비트 윈도우에서 테스트하고 64비트 응용 프로그램은 64비트 윈도우에서 테스트하는 것이다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_01.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;그림 1&gt; 윈도우 응용 프로그램 개발 모델</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">심지어 완벽한 64비트 개발환경 지원을 목표로 하는 비주얼 스튜디오 닷넷 2005(아직까지는 베타이므로 변경될 수도 있다)도 64비트 윈도우에서는 WOW64에서 동작하기 때문에 32비트/64비트 소스의 작성 및 컴파일은 32비트 환경에서 하는 것이 풍부한 32비트 개발 지원 도구를 사용할 수 있다는 점에서 훨씬 유리하다. 결론적으로 32비트 윈도우에서 크로스 컴파일된 64비트 실행 파일을 64비트 윈도우에서 실행하고 테스트하면서 남아 있는 버그를 잡는 것이 훨씬 효율적인 개발 모델인 것이다. <br><br><b>무엇을 준비해야 하는가?</b> <br>이제 드디어 64비트 응용 프로그램을 만들어야 할 시간이다. 현재 64비트 응용 프로그램을 개발하기 위한 환경은 아직 완벽하지 않은 상태라고 할 수 있다. 키를 쥐고 있는 MS에서 제공하는 방법은 몇 가지 개발 가이드 정도를 제공하고 있다. 무엇보다 64비트 응용 프로그램을 개발하기 위해 가장 어려운 점 중 하나는 아직까지 공식 64비트 컴파일러와 통합개발환경이 제공되고 있지 않다는데 있다. <br><br>MS는 올해 상반기에 출시 예정인 비주얼 스튜디오 닷넷 2005를 통해 x64 및 IA64 플랫폼에서 수행 가능한 응용 프로그램을 통합개발환경에서 원활하게 개발할 수 있도록 계획하고 있다. 그렇다면 비주얼 스튜디오 닷넷 2005가 정식 출시될 때까지 우리는 64비트와 32비트가 맞물린 이 혼란의 시대에 가만히 앉아 있어야 할 것인가? MS가 제공하는 플랫폼 SDK에 그 해답이 있다. <br><br><b>이가 없으면 잇몸으로 - 플랫폼 SDK와 비주얼 스튜디오 닷넷 2003</b> <br>현재 플랫폼 SDK는 64비트 응용 프로그램을 개발하기 위해 필요한 가장 기본적인 툴킷이다. 플랫폼 SDK에는 64비트 응용 프로그램을 개발하기 위한 C/C++ 컴파일러와 라이브러리 및 헤더 그리고 기본적인 디버깅 도구를 포함하고 있다. 그래서 64비트 응용 프로그램을 개발하기 위해서는 플랫폼 SDK 최신판과 비주얼 스튜디오 닷넷 2003이 필요하다. 플랫폼 SDK를 설치하기 위해서는 어떻게 해야 할까? 관련된 </span><a class="con_link" href="http://www.microsoft.com/msdownload/platformsdk/sdkupdate" target="_blank"><u><span style="FONT-SIZE: 100%">MS 웹사이트</span></u></a><span style="FONT-SIZE: 100%">를 통해 설치할 수 있다(방법은 그다지 어렵지 않으므로 각자 설치해 보자). <br><br>플랫폼 SDK의 설치를 마친 후에는 플랫폼 SDK에서 제공하는 64비트 빌드 환경을 이해해야 한다. 플랫폼 SDK는 미리 준비된 5개의 빌드 환경을 제공하는데 이 중에서 64비트 빌드 환경(윈도우 서버 2003 64비트 및 윈도우 XP 64비트)을 찾아 볼 수 있고 각 빌드 환경을 실행하면 지정한 빌드 환경이 설정된 커맨드 윈도우가 실행된다. 이 빌드 환경은 「시작메뉴-&gt;프로그램-&gt;플랫폼 SDK 설치 그룹-&gt;Open Build Environment Window」에서 찾아볼 수 있다. <br><br>이 빌드 환경들은 내부적으로는 플랫폼 SDK가 설치된 디렉토리에 존재하는 SetEnv.bat 파일을 특정 파라미터로 실행해 구성된 환경이다. 시작 프로그램에 미리 등록된 빌드 환경을 실행하지 않고 개발자가 직접 SetEnv.bat을 특정 파라미터로 실행해 빌드 환경을 변경할 수도 있는데 그 방법은 ‘SetEnv.bat /?’ 로 실행해 보면 어렵지 않게 알 수 있다. 이 빌드 환경을 구성하는 주요 요소는 다음과 같다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">◆ %LIB% : 라이브러리가 위치한 디렉토리 <br>◆ %INCLUDE% : 헤더 파일이 위치한 디렉토리 <br>◆ %PATH% : 컴파일러, 링커, 메이커, 여러 가지 SDK 도구들이 위치한 디렉토리 <br></span></div><p><br><span style="FONT-SIZE: 100%">개발자가 특정 빌드 환경을 지정해 실행하면 그 빌드 환경애 맞도록 %LIB%, %INCLUDE%, %PATH%가 설정되어 실행된다. 이 빌드 환경을 정확하게 이해하기 위해 다음과 같은 순서로 테스트를 해보자. <br><br>[1] C나 C++로 된 간단한 응용 프로그램 하나를 작성한다. <br>[2] 플랫폼 SDK의 빌드 환경 중 Set Windows XP 64-bit Build Environment (Debug)을 실행해 보자. <br>[3] 커맨드 윈도우가 나타나면 작성한 응용 프로그램을 다음과 같이 컴파일하자. 참고로 /Wp64는 아주 유용하며 필수적인 옵션으로 작성된 소스에서 64비트 프로그램으로서 적합하지 않은 부분을 자동으로 검출해 경고해 준다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">cl /c /EHsc /Wp64 64test.cpp <br></span></div><p><br><span style="FONT-SIZE: 100%">[4] 생성된 오브젝트의 링킹을 수행해서 빌드를 마무리하자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">link /out:64test.exe /machine:IA64 64test.obj <br></span></div><p><br><span style="FONT-SIZE: 100%">[5] 생성된 실행 파일이 32비트 윈도우에서 실행되지 않고 64비트 윈도우로 복사해서 수행되는지 확인해 보자. <br><br>지금까지 한 작업을 간단히 정리해 보면 64비트 응용 프로그램을 개발하기 위해서는 MS에서 제공하는 기존의 컴파일러로는 불가능하기 때문에 플랫폼 SDK를 설치해야 하고 설치한 후에는 64비트 빌드 환경을 설정하고 간단히 커맨드 윈도우에서 소스를 컴파일 및 링킹하는 방법을 설명해 보았다. <br><br>커맨드 윈도우에서 컴파일 및 링킹 작업에 익숙한 개발자라면 여기까지만 설명을 해도 더 이상 플랫폼 SDK를 이용한 방법을 설명할 필요가 없겠지만 대부분의 개발자들은 통합개발환경인 IDE에 익숙하기 때문에 비주얼 스튜디오 2003과 플랫폼 SDK를 이용한 64비트 개발환경 구축이 필요하다. 이 방법도 다음과 같은 순서대로 따라하면 그다지 어렵지 않게 습득할 수 있다. <br><br>[1] C나 C++로 된 간단한 응용 프로그램 하나를 작성한다. <br>[2] 플랫폼 SDK의 빌드 환경 중 Set Windows XP 64-bit Build Environment (Debug)을 실행해 보자. <br>[3] 비주얼 스튜디오 닷넷을 다음과 같이 실행한다. 참고로 devenv는 일반적으로 C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE에 존재한다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">devenv /useenv <br></span></div><p><br><span style="FONT-SIZE: 100%">[4] 비주얼 스튜디오 닷넷 2003 통합 환경에서 작성한 응용 프로그램 프로젝트를 연다. <br>[5] 통합환경 메뉴의 「빌드-&gt;구성관리자」에서 &lt;화면 1&gt;과 같이 64BitDebug라는 새로운 솔루션 구성을 추가한다. 이때 기본 구성은 Debug 설정을 복사하도록 한다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_02.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;화면 1&gt; 새로운 솔루션 구성 추가</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">[6] 통합환경 메뉴의 「프로젝트-&gt;프로젝트 속성페이지」에서 몇 가지 정보를 조정한다. 먼저 디버깅 정보 형식을 &lt;화면 2&gt;와 같이 ‘프로그램 데이터베이스(/Zi)’로 변경한다. ‘편집하며 계속하기를 위한 프로그램 데이터베이스(/ZI)’ 형식은 플랫폼 SDK에서 제공하는 64비트 컴파일러에서는 지원하지 않기 때문이다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_03.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;화면 2&gt; 디버깅 정보 형식 변경</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">[7] 계속해서 &lt;화면 3&gt;과 같이 프로젝트 속성 페이지의 ‘코드 생성’에 있는 ‘버퍼 보안 검사’를 ‘아니오’로 변경한다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_04.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;화면 3&gt; 버퍼 보안 검사 변경</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">[8] 계속해서 &lt;화면 4&gt;와 같이 프로젝트 속성 페이지의 「링커-명령줄」에 ‘/MACHINE:IA64’ 추가 옵션을 입력한다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_05.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;화면 4&gt; 링커에 추가옵션 설정</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">[9] 앞 단계에서 ‘/MACHINE:IA64’로 설정했기 때문에 &lt;화면 5&gt;와 같이 「링커-고급」에서 ‘대상 컴퓨터’를 ‘설정 안함’으로 변경한다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_06.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;화면 5&gt; 링커의 대상 컴퓨터 설정을 변경</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">[10] 통합환경에서 프로젝트를 빌드하고 생성된 실행 파일이 32비트 윈도우에서 실행되지 않고 64비트 윈도우로 복사해서 수행되는지 확인해 보자. <br><br>이제까지 플랫폼 SDK와 비주얼 스튜디오 2003을 이용한 64비트 응용 프로그램 개발 환경 구축을 살펴봤다. 참고로 플랫폼 SDK로는 IA64 계열에 비해 아쉽게도 x64 계열은 완벽히 지원하지 않고 있는 상황이어서 x64 계열 응용 프로그램을 작성하기는 어렵다. 또한 managed C++를 사용한 프로그램을 작성할 수 없고 native C++로 작성된 프로그램만 지원한다. x64 계열과 IA64 계열을 모두 지원하고 managed C++를 지원하는 개발환경은 아직 없는 것일까? 완벽한 지원을 기대한다면 올 상반기 출시 예정인 비주얼 스튜디오 닷넷 2005를 기다려봐야 할 것 같다. <br><br><b>64비트 개발을 위해 준비된 개발도구 - 비주얼 스튜디오 닷넷 2005</b> <br>닷넷 프레임워크 2.0과 완벽한 64비트 개발 환경 지원을 탑재한 비주얼 스튜디오 닷넷 2005(코드명 : Widbey)는 &lt;화면 6&gt;과 같이 통합개발환경에 존재하는 구성관리자의 플랫폼 항목에서 x64와 IA64를 선택할 수 있어서 앞서 설명한 바와 같이 플랫폼 SDK의 64비트 헤더와 라이브러리 및 컴파일러를 사용하지 않아도 된다. 또한 native C./C++ 및 managed C++도 64비트 컴파일을 할 수 있는 64비트 응용 프로그램 개발을 하기 위한 완전한 개발 환경이다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_07.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;화면 6&gt; 비주얼 스튜디오 닷넷 2005의 구성 관리자</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">현재까지는 베타테스트가 진행 중이므로 </span><a class="con_link" href="http://msdn.microsoft.com/vs2005" target="_blank"><u><span style="FONT-SIZE: 100%">웹사이트</span></u></a><span style="FONT-SIZE: 100%">에서 각자 다운받아 설치후 사용해 보기 바란다. <br><br><b>32비트에서 64비트로 이사가기</b> <br>64비트 컴퓨팅 세상이 온다고는 하지만 아직까지는 32비트 컴퓨팅을 위한 소스가 많이 존재하는 것이 현실이고 64비트 윈도우를 위한 소스를 새로 개발하기 보다는 기존 소스를 64비트 윈도우에서도 동작할 수 있도록 포팅하는 것이 대부분의 경우 현실적일 것이다. <br><br>개발자 측면에서 볼 때 기존 16비트 윈도우 응용 프로그램 소스를 32비트 응용 프로그램 소스로 포팅하는 것보다는 32비트 소스를 64비트 소스로 포팅하는 것이 훨씬 손쉬운 작업이다, 그러나 쉽다고 해서 무작정 할 수 있는 것은 아니고 포팅 가이드라인을 정하고 계획을 세우고 개발을 한 후 실제 64비트 윈도우에서 테스트해 보는 일련의 공정을 거쳐야만 한다. <br><br><b>64비트 포팅 가이드라인</b> <br>포팅 계획 세우기 <br>포팅 계획을 세우기에 앞서 먼저 포팅 작업을 위한 작업량을 측정해야 한다. 작업량을 측정할 수 있는 요소로는 첫 번째로 현재 32비트 응용 프로그램 소스의 문제를 먼저 인식해야 한다. 그래서 64비트 컴파일러로 일단 컴파일을 해 보고 나타나는 오류와 경고들을 알아야 한다. <br><br>두 번째로는 공유해서 사용하는 모듈들의 리스트와 모듈간의 사용 관계를 파악해야 한다. 그래서 사용하고 있는 모듈 중 다른 팀 또는 다름 개발회사에서 개발한 모듈이 있다면 그 모듈이 64비트로 포팅할 계획을 수립하고 있는지 점검해야 한다. <br><br>세 번째로는 하위 호환을 위한 코드나 어셈블리 코드를 점검해야 한다. 예를 들어 64비트 윈도우에서는 16비트 응용 프로그램을 구동할 수 없기 때문에 16비트 윈도우 응용 프로그램 코드는 더 이상 64비트 윈도우에서 동작하지 않기 때문이다. 반면에 x86 어셈블리 코드는 WOW64에서 동작하고 x64의 경우 성능에도 별다른 차이가 없지만 아이테니엄을 사용하는 IA64의 경우 성능의 저하가 있을 수 있기 때문에 성능 향상을 위해서는 x86 어셈블리 코드를 IA64 어셈블리 코드로 변경하는 것을 고려해봐야 한다. <br><br>작업량 측정이 끝났다면 전체 응용 프로그램을 포팅할 계획을 세워야 한다. 이때 일부분만을 포팅하기는 어렵다. 만약 부득이한 경우 거의 소스를 변경하지 않고 32비트 소스를 64비트 응용 프로그램으로 컴파일할 수 있는 방법이 있는데 ‘/LARGEADDRESSAWARE:NO’ 옵션을 사용하는 것이다. 이 옵션은 생성된 코드 내의 모든 포인터와 데이터가 32비트 프로세스와 같이 2G안에서 동작하도록 하는 옵션이다. 그러나 이 옵션은 매우 단기적인 처방이며 같이 사용하는 모든 모듈이 이 방식으로 컴파일되어야 하므로 향후 더 많은 문제점을 발생시킬 수 있다. <br><br>또한 개발에 사용되는 기술들을 검토해봐야 하는데 DAO(Data Access Object)나 Jet 데이터베이스 엔진의 경우 64비트 윈도우에서 지원하지 않기 때문에 소스 내에서 이런 기술을 사용했다면 유사한 다른 기술을 사용할 것을 검토해봐야 한다. 그리고 하나의 소스에서 생성되는 32비트와 64비트 응용 프로그램을 별개의 제품군으로 취급하고 출시하는 것을 권장한다. 왜냐하면 소스는 공유하지만 테스트 및 제품 마스터링, 마케팅 및 고객지원 이슈가 다르기 때문이다. <br><br>개발하기 <br>아직까지 비주얼 스튜디오 닷넷 2005와 같은 완전한 64비트 개발환경이 구축되어 있지는 않지만 신속히 64비트 응용 프로그램을 출시하려는 개발자라면 64비트 응용 프로그램 개발을 늦출 수는 없다. 그러므로 앞서 설명한 플랫폼 SDK를 이용해 먼저 64비트 응용 프로그램을 작성하는 것이 좋다. <br><br>그리고 여러 번 강조하지만 하나의 소스코드로 32비트와 64비트 응용 프로그램이 컴파일될 수 있도록 해야 한다. 이것이 바로 이렇게 하위호환성을 유지하고 하나의 코드로 32비트와 64비트를 개발하게 하기 위해 LLP64 데이터 모델을 채택한 이유이기 때문이다. MS의 윈도우와 SQL 서버도 하나의 소스코드에서 32비트와 64비트 제품군을 빌드했다고 한다. 그리고 뒤에 자세히 언급하겠지만 컴파일러에 새롭게 추가된 최적화 특징들을 사용할 것을 권장한다. 다음은 상세한 포팅 순서이다. <br><br>[1] 64비트 프로젝트를 구성한다. VC++ 6.0으로 작성된 프로젝트라면 VS 2003/VS 2005를 이용해서 포팅하려는 타입(APP/LIB/DLL)에 맞는 64비트 빈 프로젝트를 만들고 VC++ 6.0의 프로젝트를 참조해서 파일들을 64비트 프로젝트에 추가한다. <br>[2] 64비트 프로젝트에 맞게 프로젝트 설정들을 변경한다. 일반적으로 신경써서 맞춰줘야 하는 부분은 다음과 같다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">- 헤더 포함 디렉토리/라이브러리 디렉토리/라이브러리 파일 <br>- Precompiled Header/기타 컴파일 옵션/기타 링킹 옵션 조정 <br></span></div><p><br><span style="FONT-SIZE: 100%">[3] /Wp64 옵션을 켜고 컴파일을 해보면(/Wp64 옵션은 일반적으로 기본으로 켜져 있다) 경고/오류가 나타나는데 일반적으로 다음과 같은 내용들이 나온다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">- 최신 C++ 표준을 적용해 발생하는 템플릿 사용 또는 기본 인자에 관련된 오류/경고 <br>- 타입 캐스팅되면서 발생하는 데이터 손실 경고 <br>- MFC를 오버라이딩해서 사용할 때 함수 파라미터/리턴 타입의 변경된 부분에 대한 오류 <br>- INVALID_HANDLE_VALUE 대신 0xFFFFFFFF를 사용한 경우 <br>- 사용하는 외부 라이브러리도 모두 64비트이어야 하는데 32비트 라이브러리를 사용할 경우 <br></span></div><p><br><span style="FONT-SIZE: 100%">[4] 발생한 오류와 경고를 MSDN을 참조해 해결한다. <br>[5] 여러 개의 모듈로 제품이 구성되어 있을 경우 기본 라이브러리-&gt;DLL-&gt;실행파일 순으로 전체 프로젝트를 포팅해야 한다. <br><br>테스트하기 <br>먼저 테스트할 프로그램이 순수하게 64비트로 구성된 프로그램인지 아니면 WOW64를 사용하는 부분도 있는지를 검토해야 한다. 이러한 것은 테스트 계획 수립단계에서 결정되어야 하며 이에 따라서 테스트 도구가 64비트용만 있으면 되는지 아니면 32비트와 64비트용이 모두 필요한지가 결정이 되고 테스트 환경 구축 및 일정 산정에도 도움이 되기 때문이다. <br><br>일반적으로 32비트와 64비트 프로그램 모두 같은 소스를 기반으로 하기 때문에 테스트 단계에서의 버그 수정은 64비트 환경에서 테스트하고 버그를 수정한 후 32비트 환경에서 부작용이 없는지 재컴파일 한 후 테스트하고 다시 64비트 환경에서 재컴파일한 후 테스트해야 한다. COM이나 RPC를 사용할 경우에는 32비트와 64비트 모두 정상적으로 통신하는지 테스트돼야 하고 필요할 경우 네트워크 너머에 존재하는 16비트 컴퍼넌트들과 네트워크 통신에 이상이 없는지도 테스트돼야 한다. <br><br>때에 따라서는 32비트 윈도우를 위해 개발된 제품도 64비트 윈도우에서 테스트돼야 하는데 제품을 사용하는 고객들이 32비트 응용 프로그램을 64비트 윈도우에서 WOW64를 통해 사용할 수도 있기 때문이다. 그밖에 64비트 윈도우에서는 32비트 윈도우에 비해 메모리 사용방법이 크게 변경되었기 때문에 많은 메모리를 탑재한 시스템에서도 테스트를 해봐야 한다. <br><br><b>포인터를 다룰 때 신경써야 할 것들</b> <br>64비트 윈도우가 채택한 LLP64 데이터 모델은 기존의 데이터 타입은 호환성을 위해 32비트를 유지하고 포인터를 64비트로 변경한 데이터 모델이다. 그래서 64비트 응용 프로그램을 개발하기 위해서는 다른 어떤 데이터보다 포인터를 다룰 때 주의해야 한다. 이번 절에서는 포인터를 다룰 때 신경써야 할 사항 몇 가지를 살펴보자. <br><br>◆ 포인터를 int, long, , UINT, ULONG, DWORD.으로 타입 캐스팅하지 말아야 한다 <br><br>비트 수준의 작업을 하기 위해 포인터를 타입 캐스팅해야 할 때는 반드시 32비트와 64비트 윈도우에서 모두 사용할 수 있는 타입인 UINT_PTR, INT_PTR을 사용해야 한다. 64비트 윈도우에서는 포인터의 크기가 64비트이고 int나 long은 32비트이기 때문에 포인터를 int, long, ULONG, DWORD로 타입캐스팅 해서는 안 된다. 다음 예를 참고하자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">&lt;포인터를 잘못 타입캐스팅 한 예&gt; <br>imageBase = (PVOID)((ULONG)ImageBase|1); <br>&lt;포인터를 정상적으로 타입캐스팅 한 예&gt; <br>imageBase = (PVOID)((ULONG_PTR)ImageBase|1); <br></span></div><p><br><span style="FONT-SIZE: 100%">참고로 HANDLE도 void*로 정의되어 있기 때문에 HANDLE도 포인터와 마찬가지로 취급해야 한다. <br><br>◆ 부득이하게 포인터의 데이터가 손실되더라도 32비트로 타입 캐스팅해야 할 경우에는 PtrToLong()이나 PtrToUlong() 함수를 이용해야 한다 <br>이 함수들은 Basetsd.h에 정의되어 있다. 이 함수들을 사용하면 데이터 손실 경고를 발생시키지 않는다. 이 함수들은 조심해서 사용해야 하는데 포인터가 타입 캐스팅된 이후에는 데이터가 손실된 것이므로 이 값들을 포인터로 다시는 사용해서는 안 된다. 이 함수들은 상위 32비트 값들을 얻어낸다. </span></p><div style="MARGIN-TOP: 20px; MARGIN-BOTTOM: 12px" align="center" width="100%"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/advertisement.gif" border="0"><br></span><!-- % iframe % --></div><p><br><br><span style="FONT-SIZE: 100%">◆ 값을 얻어오는 OUT 형태의 인자를 사용할 때 주의해야 한다 <br>다음과 같이 정의된 함수를 예로 생각해 보자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">void func( OUT PULONG *PointerToUlong ); <br></span></div><p><br><span style="FONT-SIZE: 100%">이 함수를 다음의 예와 같이 호출해서는 안 된다. &amp;ul을 PULONG*으로 타입캐스팅을 했기 때문에 컴파일러 오류는 발생하지 않지만 함수에서는 &amp;ul에 64비트 포인터 값을 쓰게 된다. 이 코드는 32비트 윈도우에서는 정상적으로 동작하겠지만 64비트 윈도우에서는 포인터 데이터의 손실이 발생하게 된다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">ULONG ul; <br>PULONG lp; <br>func((PULONG *)&amp;ul); <br>lp = (PULONG)ul; <br></span></div><p><br><span style="FONT-SIZE: 100%">대신에 다음과 같이 호출해야 한다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">PULONG lp; <br>func(&amp;lp); <br></span></div><p><br><span style="FONT-SIZE: 100%">◆ 다형성 인자를 사용할 경우 UINT_PTR이나 PVOID를 사용해야 한다 <br>32비트 윈도우에서는 어떤 타입의 데이터를 넘길지 결정할 수 없을 때 DWORD 등을 함수의 인자로 사용해서 인자를 넘길 때 타입 캐스팅을 해서 사용하기도 했었다. 그러나 64비트 윈도우에서는 반드시 UINT_PTR이나 PVOID와 같은 64비트 윈도우와 32비트 윈도우에서 모두 사용할 수 있는 데이터 형을 사용해야 한다. <br><br>◆ 새로운 윈도우 클래스 함수를 이용해야 한다 <br><br>윈도우나 클래스에 포인터 데이터를 포함하고 있다면 새로운 윈도우 클래스 함수(GetClassLongPtr/GetWindowLongPtr/SetClassLongPtr/SetWindowLongPtr)를 사용해야 한다. 또한 64비트 응용 프로그램 개발 환경의 WInUser.h에는 GWL_WNDPROC/GWL_HINSTANCE/GWL_HWDPARENT/GWL_USERDATA은 정의되어 있지 않고 대신에 GWLP_WNDPROC/GWLP_HINSTANCE/GWLP_HWNDPARENT/ <br>GWLP_USERDATA/GWLP_ID가 정의되어 있다. 예를 들어 다음과 같은 코드는 64비트 윈도우에서는 동작하지 않는다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">SetWindowLong(hWnd, GWL_WNDPROC, (LONG)MyWndProc); <br></span></div><p><br><span style="FONT-SIZE: 100%">이 예를 64비트 윈도우에서 동작하도록 수정하면 다음과 같다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)MyWndProc); <br></span></div><p><br><span style="FONT-SIZE: 100%">이밖에도 WNDCLASS 구조체의 cbWindExtra 멤버를 추가적인 값을 저장하기 위해 사용하려고 할 때 기존에는 sizeof(DWORD) 크기만큼만 할당해도 되었지만 64비트 윈도우에서는 sizeof(DWORD_PTR)만큼을 할당해 사용해야 한다. <br><br>◆ 윈도우나 클레스의 데이터를 접근할 때에 FIELD_OFFSET.을 이용해야 한다 <br>기존에는 윈도우 데이터를 접근할 때 오프셋 크기를 4바이트로 가정하고 하드코딩해 접근하기도 했다. 하지만 64비트 윈도우에서는 절대 사용해서는 안 되고 대신에 윈도우나 클래스 데이터를 접근할 때는 FIELD_OFFSET 매크로를 사용해야 한다. <br><br>◆ 플랫폼에 따라 LPARAM, WPARAM, LRESULT 타입의 크기는 변한다 <br>이 타입들은 포인터나 다형성 인자로 사용되는 타입이기 때문에 64비트 코드로 컴파일될 때 이 타입들은 64비트 크기로 컴파일된다. 그러므로 64비트 환경에서 정상적으로 동작하게 하려면 LPARAM, WPARAM, LRESULT 들을 32비트의 크기를 가지는 DWORD, ULONG, UINT, INT, int, long 값들과 같이 사용하면 안 된다. <br><br><b>구조체를 다룰 때 신경써야 할 것들</b> <br>64비트 윈도우에서는 32비트 윈도우와 달리 데이터의 팩킹을 8바이트 단위를 기본으로 한다. 그래서 구조체 내의 구성요소를 적절히 배치하는 것이 구조체가 실제 메모리에서 차지하는 양을 줄일 수 있는 좋은 방법이다. 또한 #pragma pack을 지정해 소스를 작성하는 것에 주의해야 하는데 기본 패킹인 8바이트를 4바이트나 2바이트, 심지어는 1바이트로 변경할 경우 코드 크기가 증가할 뿐만 아니라 동적인 메모리의 사용량도 늘어날 수밖에 없다. <br><br>그러므로 64비트 윈도우에서 동작하는 응용 프로그램 소스를 작성할 때는 구조체의 구성요소 배치 및 8바이트 정렬에 신경을 써야 하고 팩킹 크기에 의존적인 코드를 작성하지 않아야 한다. 그러나 예를 들어 유닉스, 32비트 윈도우, 64비트 윈도우 등에서 모두 동작하게 하려는 코드의 경우 어쩔 수 없이 패킹을 최소공배수로 조정해야 할 수도 있지만 그런 경우 코드 크기 증가와 처리 속도의 저하가 있을 수 있다는 것을 항상 고려해야 한다. <br><br><b>신경써야 할 다른 여러 가지 것들</b> <br>앞서 설명한 것들 외에도 64비트 응용 프로그램을 개발할 때는 다음과 같이 신경써야 할 것들이 몇 가지 더 있다. <br><br>◆ 32비트 윈도우에서 사용하던 라이브러리나 프레임워크 중에 DAO나 VBA와 같이 64비트에서 더 이상 사용할 수 없는 것들이 있으므로 64비트 응용 프로그램의 개발을 할 때 사용하려는 라이브러리나 프레임 워크가 64비트 윈도우를 지원하는지 확인해봐야 한다. <br><br>◆ 사용하는 API가 64비트 윈도우용인지도 살펴봐야 한다. 대부분의 윈도우 API는 64비트에서 사용 가능하지만 일부 API는 변경된 것이 있으므로 사용하는 API의 지원 여부를 MSDN을 통해서 항상 확인해야 한다. <br><br>◆ 비트연산에 대해서도 신경써야 하는데 기존의 32비트 윈도우에서는 -1을 비교할 때나 INVALID_HANDLE 대신 0xffffffff를 사용하는 소스도 있었지만 64비트 윈도우에서는 사용해서는 안 되는 값이다. 또한 32비트 소스에서 1&lt;&lt;33과 같이 비트 시프트 연산을 할 경우 정상 동작하겠지만 64비트 소스에서는 유효하지 않는 코드이다. 이와 유사하게 고려할만한 점으로는 기존에 사용하던 소스의 알고리즘이 비트 크기에 관련 있을 경우 수정을 해야 한다. <br><br>◆ 데이터 크기를 알아 올 때에는 반드시 컴파일 타임에 데이터 타입의 크기를 알아올 때 사용하는 sizeof()를 사용하도록 해야 한다. <br><br>◆ 구조체 내의 특정 필드의 오프셋을 알고 싶을 때에는 컴파일 타임에 오프셋을 얻어 오는 FIELD_OFFSET 매크로를 이용해야 한다. <br><br>◆ 플랫폼에 의존적인 어셈블리 코드를 소스 내에 사용하지 말아야 하며 필요할 경우 컴파일 타임에 각 플랫폼 별로 어셈블리 코드를 사용하도록 해야 한다. <br><br>◆ 꼭 필요한 경우가 아니라면 명시적인 구조체 팩킹을 하지 말고 64비트 윈도우에서는 8바이트를 기본으로 패킹되는 것이 좋다. <br><br>◆ 인터페이스를 개발할 때는 플랫폼에 의존적이지 않은 잘 분리되고 추상화된 인터페이스로 만들어야 한다. <br><br>◆ 64비트 윈도우에서는 _WIN16, _WIN32외에도 _WIN64가 추가되었기 때문에 다음과 같은 가정은 더 이상 유효하지 않다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">#ifdef _WIN32 // Win32 code <br>... <br>#else // Win16 code <br>... <br>#endif <br></span></div><p><br><span style="FONT-SIZE: 100%">◆ 데이터 타입 정렬에 주의해야 한다. TYPE_ALIGNMENT 매크로는 지정한 데이터 타입의 정렬 바이트를 리턴하는 기능을 한다. 다음 코드를 참조하자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">TYPE_ALIGNMENT( DWORD_PTR ) == x86에서는4, IA64/x64에서는 8 <br>TYPE_ALIGNMENT( UCHAR ) == 플랫폼에 상관없이 1 <br></span></div><p><br><span style="FONT-SIZE: 100%">데이터 정렬은 상당히 중요한데 32비트 윈도우에서는 커널 모드와 사용자 모드 모두에서 데이터 정렬이 되어 있지 않아도 시스템이 자동으로 처리했지만 64비트 윈도우에서는 커널 모드의 경우 자동으로 데이터 정렬 예외를 처리하지 않기 때문이다. 그래서 반드시 데이터 정렬을 맞추어 코드를 작성해야 한다. <br><br>◆ NOT 오퍼레이션을 사용할 때 주의해야 한다. 다음과 같은 경우를 생각해 보자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">UINT_PTR a; ULONG b; <br>a = a &amp; ~(b - 1); <br></span></div><p><br><span style="FONT-SIZE: 100%">이 코드의 문제는 ~(b?1) 연산이 생성하는 결과가 0xFFFF FFFF xxxx xxxx.이 아닌 0x0000 0000 xxxx xxxx 이라는데 있다. 그래서 다음과 같이 코드를 수정해야 한다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">a = a &amp; ~((UINT_PTR)b - 1); <br></span></div><p><br><span style="FONT-SIZE: 100%">◆ unsigned와 signed 데이터 연산에 주의해야 한다. 다음과 같은 경우를 생각해 보자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">ULONG x; LONG y; <br>LONG *pVar1; LONG *pVar2; <br>pVar2 = pVar1 + y * (x - 1); <br></span></div><p><br><span style="FONT-SIZE: 100%">x가 unsigned이기 때문에 문제가 발생하는데 x로 인해 전체 수식이 unsigned로 바뀌기 때문이다. 이 수식에서 y가 음수만 아니라면 정상적으로 동작할 수도 있다. 만일 y가 음수라면 수식에서 y는 unsigned 값으로 변경되고 32비트 정밀도로 pvar1과 곱셈과 덧셈을 수행하게 되고 32비트 unsigned 음수 값은 64비트 양수 값으로 변경되게 되어서 비정상적인 결과가 생성된다. 이 문제를 해결하려면 x를 signed 값으로 선언하거나 수식 내에서 명시적으로 LONG으로 타입캐스팅해야 한다. <br><br>◆ 작은 크기의 데이터 할당을 할 때 주의해야 한다. 다음과 같은 예를 살펴보자. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">struct xx { <br>DWORD NumberOfPointers; <br>PVOID Pointers[1]; <br>}; <br></span></div><p><br><span style="FONT-SIZE: 100%">다음 코드는 잘못된 코드인데 컴파일러는 8바이트 정렬을 맞추기 위해 4바이트를 추가적으로 패딩해서 할당할 것이기 때문이다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">malloc(sizeof(DWORD)+100*sizeof(PVOID)); <br></span></div><p><br><span style="FONT-SIZE: 100%">이 코드를 다음과 같이 수정하면 된다. <br></span></p><div style="MARGIN-LEFT: 15px"><br><span style="FONT-SIZE: 100%">malloc(offsetof(struct xx, Pointers) +100*sizeof(PVOID)); <br></span></div><p><br><span style="FONT-SIZE: 100%">◆ printf나 wsprintf를 이용해 포인터를 출력할 때는 포인터를 출력하는 형식인 %p를 사용해야 한다. 32비트 윈도우에서는 다른 형태로 포인터를 출력해도 되었지만 64비트 윈도우에서는 포인터만이 64비트이기 때문이다. <br><br><b>컴파일러를 적극적으로 활용하자</b> <br>64비트 개발환경에서는 새로운 최적화 옵션들이 추가되었다. 이 최적화 옵션들은 x64 계열보다는 IA64 계열에서 더욱 중요한데 이전의 x86 CPU들이 컴파일러의 최적화뿐만 아니라 CPU의 최적화 수행에도 의존했었지만 IA64의 경우 CPU에서의 최적화 수행보다는 컴파일러의 최적화가 더욱 중요해졌기 때문이다. <br><br>컴파일러에 새롭게 추가된 최적화 옵션은 크게 두 가지인데 하나는 수행성능 측정데이터를 이용한 최적화(Profile Guide Optimization)이고 다른 하나는 전체 프로그램 영역 기반의 최적화(Whole Program Optimization)이다. <br><br>수행성능 측정 데이터를 이용한 최적화는 두 단계의 컴파일 단계로 진행된다. 첫 번째 컴파일 단계에서는 생성된 프로그램을 주어진 테스트 상황에 따라 구동시키고 프로그램의 실행 패턴을 기록해 두었다가 이 정보를 이용해서 두 번째 컴파일 단계에 최적화 자료로 활용한다. 기존의 컴파일 방식을 생각해 보자. 다음의 간단한 두 코드 중 첫 번째를 참조해 보면 foo()와 bar() 함수 중 어떤 함수가 실제로 많이 호출될까? 즉 실제 코드가 수행될 경우 a가 b 보다 작은 경우는 몇 %나 될까? 두 번째 코드에서는 bar()가 반복 수행 되는 횟수는 얼마나 될까? 즉, count 값은 얼마나 될까? <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_08.jpg"></span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">이 값들은 컴파일 타임에는 결정할 수 없는 값으로서 코드가 수행 중에만 알 수 있는 값이다. 이러한 테스트 시나리오에 의해 생성된 이 값들을 코드 최적화에 활용하는 것이 수행성능 측정 데이터를 이용한 최적화이다. 전체 프로그램 영역 기반의 최적화 방법은 한 프로그램이 여러 개의 소스코드로 구성될 경우 각각의 소스코드 내에서만 최적화를 수행하는 것이 아니고 프로그램을 구성하는 모든 소스코드를 대상으로 최적화를 수행한다. 전체 프로그램 영역기반 최적화와 수행 성능 측정 데이터를 이용한 최적화를 적용하는 순서는 &lt;그림 2&gt;를 참고하면 손쉽게 알 수 있다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_09.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;그림 2&gt; 전체 프로그램 영역기반 최적화와 수행 성능 측정 데이터를 이용한 최적화</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">MS에서 측정한 값에 의하면 모든 아키텍처에서 수행성능 측정 데이터를 이용한 최적화를 하게 되면 정수연산과 부동소수점 연산 모두 &lt;그림 3&gt;과 같이 성능이 향상된다고 한다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_10.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;그림 3&gt; LTCG를 적용했을 때의 성능 향상 비율</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">LTCG를 적용했을 때의 성능 향상 비율(%) 인텔 아이테니엄 2 AMD AMD64 인텔 x86 정수 연산 부동소수점 연산 <br><br>그러나 수행 성능 측정 데이터를 이용한 최적화가 항상 좋은 것만은 아니다. 예를 들어 입력 조건이 일정치 않은 응용 프로그램의 경우 코드가 자주 수행되거나 코드의 반복 수행 횟수 등이 그때그때 달라질 수 있기 때문이다. 일반적으로 수행 성능 측정 데이터를 이용한 최적화는 입력이 예측 가능한 범주 내에서 일정 분포를 유지할 경우 유용한 성능 최적화 방법이라고 할 수 있다. <br><br>결론적으로 수행 성능 측정 데이터를 이용한 최적화는 실제 사용자 환경과 유사한 테스트 시나리오를 사용해야만 좋은 최적화 결과를 얻을 수 있다. <br><br><b>64비트 컴파일러의 경고</b> <br>앞에서 64비트 응용 프로그램을 개발하기 위한 환경을 구축하는 방법과 주의해야 할 점, 그리고 최적화하는 방법을 설명했다. 그렇다면 정작 64비트 소스의 컴파일을 수행한 후에 나타나는 컴파일 경고들은 어떤 것들이 있을까?이전에 설명했듯이 32비트와 64비트 응용 프로그램은 하나의 소스로 작성되는 것을 권장하고 있다. <br><br>대신 컴파일러에 ‘/Wp64’ 옵션을 제공하는데 이 스위치를 이용하면 컴파일을 수행할 때 소스 내에서 LLP64 데이터 모델, 즉 64비트 소스로서 문제가 있을 만한 포인터 타입 캐스팅, 데이터 타입 캐스팅, 기타 여러 가지 문제점들을 경고해 준다. 자세한 경고의 종류와 내용은 &lt;표 1&gt;을 참고하자. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_12.jpg"></span></td></tr><tr><td class="bk" align="middle"><span style="FONT-SIZE: 100%; FONT-FAMILY: 돋움">&lt;표 1&gt; /Wp64로 컴파일할 때 나타나는 경고 종류</span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">이중 가장 많이 보게 되는 경고가 C4311인데 다음의 간단한 두 코드 중 첫 번째 코드의 경우에 발생하는 경고이다. 64비트 윈도우에서는 ULONG은 32비트이고 PUCHAR는 64비트이므로 첫 번째 코드대로라면 64비트를 32비트로 형변환하게 되어서 포인터의 정보 손실이 발생할 수 있다. 그러므로 두 번째 코드와 같이 ULONG_PTR을 사용하도록 소스를 수정하면 경고를 제거할 수 있다. <br><!-- 큰 이미지 하나 중간에 놓을때 사용하는 소스입니다. --><br></span></p><center><table width="420"><tbody><tr><td align="middle"><span style="FONT-SIZE: 100%"><img src="http://www.zdnet.co.kr/images/stories/etc/2005/05/0520/39136563_11.jpg"></span></td></tr></tbody></table></center><p><br><span style="FONT-SIZE: 100%">64비트 응용 프로그램을 개발하기 위해서는 컴파일러가 알려주는 이러한 기본적인 경고들을 모두 제거하는 것이 64비트 소스의 잠재적인 문제를 해결하고 코드의 오류 발생 가능성을 최소화하는 방법이므로 반드시 경고를 제거하도록 해야 한다. <br><br><b>변화의 시대를 두려워 말자</b> <br>필자는 이번 연재를 통해 먼저 64비트 윈도우에서 32비트 응용 프로그램을 구동시키기 위한 방법을 언급했고 두 번째로 64비트 윈도우가 핵심적으로 변화된 점을 설명했으며, 마지막으로 64비트 윈도우에서 동작하는 순수한 64비트 응용 프로그램을 만드는 방법과 기존 32비트 소스를 64비트로 포팅하는 방법을 설명했다. 비록 짧은 설명이었지만 64비트 세상으로 가기 위한 작은 다리는 되었으리라고 생각한다. <br><br>흔히들 소프트웨어 분야는 아직 많은 기술들이 더 많이 개발되어야 하는 신생 학문이기 때문에 새로운 기술 습득에 어려움이 많다고 한다. 필자 역시 새로운 길로 가는 것을 두려워한다. 하지만 혼돈과 변화의 시대를 두려워하기 보다는 적극적으로 받아들여 그 시대의 주인이 되는 것이 최근 개발자들이 겪고 있는 정체성에 대한 답이 되지 않을까 생각한다. 무언가 필요한 것을 만들어내는 사람은 개발자라는 것을 잊지 말고 다가오는 64비트 세상을 주인이 되기를 바라며 이번 연재를 마치려 한다.@ <br><br><span style="COLOR: #003399">* 이 기사는 ZDNet Korea의 제휴매체인 </span><a class="con_link" href="http://www.imaso.co.kr/" target="_blank"><u><span style="COLOR: #0000ff">마이크로소프트웨어</span></u></a><span style="COLOR: #003399">에 게재된 내용입니다</span></span></p><p><span style="FONT-SIZE: 100%"></span>&nbsp;</p><p><a class="con_link" href="http://www.zdnet.co.kr/etc/mail/?email=t92Yu42ctBUZmlGbuFGa" target="_blank"><span style="FONT-SIZE: 100%">유병인 (안철수연구소)</span></a><span style="FONT-SIZE: 100%"></span></p><p><span style="FONT-SIZE: 100%"><span style="FONT-FAMILY: 굴림">2005/05/23</span> </span></p><p><span style="FONT-SIZE: 100%"></span>&nbsp;<span style="FONT-SIZE: 100%"></span>&nbsp;</p><p><span style="FONT-SIZE: 100%">원문 : </span><a class="con_link" href="http://www.zdnet.co.kr/techupdate/lecture/os/0,39024998,39136563,00.htm" target="_blank"><span style="FONT-SIZE: 100%">http://www.zdnet.co.kr/techupdate/lecture/os/0,39024998,39136563,00.htm <div class="autosourcing-stub"><p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 11px 0px 7px; PADDING-TOP: 0px; FONT-STYLE: normal; FONT-FAMILY: Dotum"><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">[출처]</strong> <a href="http://blog.naver.com/mybrainz/140013255685" target="_blank">[64비트 윈도우 프로그래밍] ③ 64비트 프로그램으로 가는 길</a><span style="PADDING-RIGHT: 7px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">|</span><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">작성자</strong> <a href="http://blog.naver.com/mybrainz" target="_blank">mybrainz</a></p></div></span><p></p></a></a><p></p><br/><br/>tag : <a href="/tag/64비트" rel="tag">64비트</a>			 ]]> 
		</description>
		<category>* Skill</category>
		<category>64비트</category>

		<comments>http://dokim.egloos.com/287172#comments</comments>
		<pubDate>Tue, 29 Apr 2008 01:48:10 GMT</pubDate>
		<dc:creator>오키</dc:creator>
	</item>
</channel>
</rss>
