<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="html">::NPTEAM:: Network Programer Team</title>
  <id>http://npteam.net/</id>
  <link rel="alternate" type="text/html" hreflang="ko" href="http://npteam.net/" />
  <subtitle type="html"></subtitle>
  <updated>2010-03-10T21:55:20+09:00</updated>
  <generator>Textcube 1.7.6 : Staccato</generator>
  <entry>
    <title type="html">[STL] Vector Container Iterating 속도 비교</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/775" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/775" thr:count="4"/>
    <category term="STL" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/775</id>
    <updated>2010-03-03T00:47:28+09:00</updated>
    <published>2010-03-01T21:32:01+09:00</published>
    <summary type="html">std::vector container를 Iterating하는 방법은 여러가지가 존재합니다.&lt;div&gt;&lt;br&gt;&lt;div&gt;평소 컨테이너 Iterating은 크게 생각하지 않고 사용하던 중&lt;/div&gt;&lt;div&gt;for_each에 대한 속도 향상 관련 글을 읽고 도대체 얼마나 빨라지는지 테스트를 해 보았습니다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;방법 1. None Const Iterating&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;
&lt;pre class=&quot;brush: cpp&quot;&gt;std::vector&amp;lt; int &amp;gt;::iterator it     = vecInteger.begin();
std::vector&amp;lt; int &amp;gt;::iterator it_end = vecInteger.end();

for( ; it != it_end; ++it )
{
	const int&amp;amp; nValue = (*it);
	/* Do Something */
}&lt;/pre&gt;&lt;/div&gt;

방법 2. Const Iterating

&lt;pre class=&quot;brush: cpp&quot;&gt;std::vector&amp;lt; int &amp;gt;::const_iterator it     = vecInteger.begin();
std::vector&amp;lt; int &amp;gt;::const_iterator it_end = vecInteger.end();

for( ; it != it_end; ++it )
{
	const int&amp;amp; nValue = (*it);
	/* Do Something */
}
&lt;/pre&gt;
방법 3. std::for_each( Functor )를 사용함 

&lt;pre class=&quot;brush: cpp&quot;&gt;struct stVecInteger
{ 
	void operator() (int nElement)
	{
		const int&amp;amp; nValue = nElement;
		/* Do Something */
	};
} stVecIntergerFunctor;

std::for_each( vecInteger.begin(), vecInteger.end(), stVecIntergerFunctor );
&lt;/pre&gt;
방법 4. BOOST_FOREACH

&lt;pre class=&quot;brush: cpp&quot;&gt;BOOST_FOREACH( int nElement, vecInteger )
{
	const int&amp;amp; nValue = nElement;
	/* Do Something */
};
&lt;/pre&gt;


방법 5. for each(element in Container)

&lt;pre class=&quot;brush: cpp&quot;&gt;for each( int nElement in vecInteger )
{
	const int&amp;amp; nValue = nElement;
	/* Do Something */
};
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Vector 컨테이너에 int 자료형을 1억개 넣고, Iterating 했을때의 결과(Release 컴파일)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1165789061.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1165789061.png&quot; width=&quot;434&quot; height=&quot;133&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1078133804.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1078133804.png&quot; width=&quot;483&quot; height=&quot;291&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

Release 모드로 컴파일 했을때, &lt;div&gt;Functor가 최적화되어 어셈블리 코드가 없을때에는 0의 실행시간을 보여주는 엄청난 결과를 알게 되었다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Functor에 별도의 수행 코드가 추가되더라도 가장 빠른 수행 성능을 보여주었다.&lt;/div&gt;&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">[Python] Lua Reference Type Checker</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/773" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/773" thr:count="0"/>
    <category term="Python" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/773</id>
    <updated>2010-02-17T23:27:29+09:00</updated>
    <published>2010-02-11T16:56:29+09:00</published>
    <summary type="html">&lt;PRE class=&quot;brush: py&quot;&gt;import sys
import string


def Extract_RightSide_From_FileLines( FileLines ) :
	RightSideList = []
	for eachline in FileLines :
		if( IsExistOnlyOneEqual( eachline ) == True ) :
			RightSideValue = RightSideOfEqual( eachline )
			RightSideList.append( RightSideValue )
	return RightSideList


def Extract_LeftSide_From_FileLines( FileLines ) :
	LeftSideList = []
	for eachline in FileLines :
		if( IsExistOnlyOneEqual( eachline ) == True ) :
			LeftSideValue = LeftSideOfEqual( eachline )
			LeftSideList.append( LeftSideValue )
	return LeftSideList


def IsExistOnlyOneEqual( strLine ) :
	strLine = RemoveLuaComment( strLine )
	
	find_pos = strLine.find( &#039;=&#039;, 0 )
	if( find_pos == -1 ) :
		return False
		
	find_pos = strLine.find( &#039;=&#039;, find_pos + 1 )
	if( find_pos == -1 ) :
		return True
		
	return False


def RemoveLuaComment( strLine ) :
	find_pos = strLine.find( &#039;--&#039;, 0 )
	if( find_pos != -1 ) :
		return strLine[0 : find_pos].strip()
	return strLine.strip()


def LeftSideOfEqual( strLine ) :
	strLine = RemoveLuaComment( strLine )
	find_pos = strLine.find( &#039;=&#039;, 0 )
	if( find_pos != -1 ) :
		return strLine[0 : find_pos].strip()
	return strLine.strip()


def RightSideOfEqual( strLine ) :
	strLine = RemoveLuaComment( strLine )
	find_pos = strLine.find( &#039;=&#039;, 0 )
	if( find_pos != -1 ) :
		return strLine[find_pos + 1 : len(strLine)].strip()
	return strLine.strip()


def Extract_Alparbet_Number_UnderBar( strLine ) :
	strAlparbet_Number_UnderBar = string.letters + string.digits + &#039;_&#039;
	strList = []
	for OneWord in strLine :
		if( OneWord in strAlparbet_Number_UnderBar ) :
			strList.append( OneWord )
	strTemp = &#039;&#039;.join( strList )
	return strTemp


def RefTypeMaching( strStartKeyword, nLineNumber, strSourceLine, strRefTypeList ) :
	strSourceTempList = strSourceLine.split()
	for eachSource in strSourceTempList :
		strExtractedSource = Extract_Alparbet_Number_UnderBar( eachSource )
		
		if( strExtractedSource.startswith( strStartKeyword ) == True ) :
			if( strExtractedSource not in strRefTypeList ) :
				print &#039;RefType Mismatch. LineNumber : &#039; + str( nLineNumber ) + &#039;, Source String : &#039; + strExtractedSource




def main(argv) :
	Reference_file = argv[1]
	Programed_file = argv[2]
	
	# Reference File Loading(RefTypeList)
	Ref_fstream = open( Reference_file, &#039;r&#039; )
	RefFileList = Ref_fstream.xreadlines()
	RefTypeList = Extract_LeftSide_From_FileLines( RefFileList )
	Ref_fstream.close()
	
	# Programed File Loading(ProgramFileList)
	Programed_fstream = open( Programed_file, &#039;r&#039; )
	ProgramFileList = Programed_fstream.readlines()
	Programed_fstream.close()
	
	# Print Type Check	
	print &#039;---------------------------------------------------------&#039;
	print &#039;Start Type Check. File Name : &#039; + str( argv[2] )
	print &#039;---------------------------------------------------------&#039;
	for i, eachProgramLine in enumerate( ProgramFileList ) :
		strRemovedComment = RemoveLuaComment( eachProgramLine )
		RefTypeMaching( &#039;Item_&#039;, i + 1, strRemovedComment, RefTypeList )
	print &#039;---------------------------------------------------------&#039;



if __name__ == &quot;__main__&quot; :  
    main(argv=sys.argv)  
&lt;/PRE&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://npteam.net/attachment/1248802177.zip&quot;&gt;&lt;img src=&quot;http://npteam.net/image/extension/zip.gif&quot; alt=&quot;&quot; /&gt; RefTypeChecker.zip&lt;/a&gt;&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">[Python] Ini 파일 형식 라인별로 읽어서 &quot;=&quot; 연산자 양쪽 값 분리</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/771" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/771" thr:count="0"/>
    <category term="Python" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/771</id>
    <updated>2010-02-11T13:51:40+09:00</updated>
    <published>2010-02-10T22:31:18+09:00</published>
    <summary type="html">&lt;PRE class=&quot;brush: py&quot;&gt;
import sys

def IsExistOnlyOneEqual( strLine ) :
	strLine = RemoveLuaComment( strLine )
	
	find_pos = strLine.find( &#039;=&#039;, 0 )
	if( find_pos == -1 ) :
		return False
		
	find_pos = strLine.find( &#039;=&#039;, find_pos + 1 )
	if( find_pos == -1 ) :
		return True
		
	return False
	

def RemoveLuaComment( strLine ) :
	find_pos = strLine.find( &#039;--&#039;, 0 )
	if( find_pos != -1 ) :
		return strLine[0 : find_pos].strip()
	return strLine.strip()
	
	
def LeftSideOfEqual( strLine ) :
	strLine = RemoveLuaComment( strLine )
	find_pos = strLine.find( &#039;=&#039;, 0 )
	if( find_pos != -1 ) :
		return strLine[0 : find_pos].strip()
	return strLine.strip()
	
	
def RightSideOfEqual( strLine ) :
	strLine = RemoveLuaComment( strLine )
	find_pos = strLine.find( &#039;=&#039;, 0 )
	if( find_pos != -1 ) :
		return strLine[find_pos + 1 : len(strLine)].strip()
	return strLine.strip()	
	

def main(argv) :
	input_file = argv[1]
	
	f = open( input_file, &#039;r&#039; )
	filelist = f.readlines()
	
	for eachline in filelist :
		if( IsExistOnlyOneEqual( eachline ) == False ) :
			print &quot;\n[Error Line] &quot;, eachline
		else :
			print &quot;\n[Total]\n&quot;, eachline
			print &quot;\n[Remove Comment]\n&quot;, RemoveLuaComment( eachline )
			print &quot;\n[Left Side]\n&quot;, LeftSideOfEqual( eachline )
			print &quot;\n[Right Side]\n&quot;, RightSideOfEqual( eachline )
		
	f.close()
	
if __name__ == &quot;__main__&quot; :  
    main(argv=sys.argv)  
&lt;/PRE&gt;</summary>
  </entry>
  <entry>
    <title type="html">그레고리 닥터 하우스 수상소감</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/767" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/767" thr:count="1"/>
    <category term="TTF 개인 폴더" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/767</id>
    <updated>2010-02-03T01:41:28+09:00</updated>
    <published>2010-02-03T01:41:28+09:00</published>
    <summary type="html">&lt;object type=&#039;application/x-shockwave-flash&#039; width=&quot;502&quot; height=&quot;399&quot; align=&#039;middle&#039; classid=&#039;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&#039; codebase=&#039;http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0&#039;&gt;&lt;param name=&#039;movie&#039; value=&#039;http://flvs.daum.net/flvPlayer.swf?vid=U6qha4OuDYE$&#039; /&gt;&lt;param name=&#039;allowScriptAccess&#039; value=&#039;always&#039; /&gt;&lt;param name=&#039;allowFullScreen&#039; value=&#039;true&#039; /&gt;&lt;param name=&#039;bgcolor&#039; value=&#039;#000000&#039; /&gt;&lt;embed src=&#039;http://flvs.daum.net/flvPlayer.swf?vid=U6qha4OuDYE$&#039; width=&quot;502&quot; height=&quot;399&quot; allowScriptAccess=&#039;always&#039; type=&#039;application/x-shockwave-flash&#039; allowFullScreen=&#039;true&#039; bgcolor=&#039;#000000&#039; &gt;&lt;/embed&gt;&lt;/object&gt;&lt;BR&gt;역시 기대를 저버리지 않네요. ㅎㅎ</summary>
  </entry>
  <entry>
    <title type="html">[STL]  STL Container 자료구조 순환 삭제를 위한 코드</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/753" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/753" thr:count="0"/>
    <category term="STL" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/753</id>
    <updated>2009-12-09T19:22:39+09:00</updated>
    <published>2009-11-30T21:52:58+09:00</published>
    <summary type="html">&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;STL Container 자료구조 순환 삭제를 위한 코드&lt;/font&gt;&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;컨테이너가 표준 &lt;font color=&quot;#ff9900&quot;&gt;&lt;strong&gt;시퀀스 컨테이너&lt;/strong&gt;&lt;/font&gt;이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.&lt;br /&gt;(erase를 호출할 때마다 그 함수의 &lt;font color=&quot;#008000&quot;&gt;&lt;strong&gt;반환값으로 반복자를 업데이트&lt;/strong&gt;&lt;/font&gt; 하는 일을 꼭 해야 합니다.)&lt;br /&gt;&lt;br /&gt;컨테이너가 표준 &lt;font color=&quot;#ff9900&quot;&gt;&lt;strong&gt;연관 컨테이너&lt;/strong&gt;&lt;/font&gt;이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.&lt;br /&gt;(erase를 호출하면서 erase에 넘기는 반복자를 &lt;font color=&quot;#008000&quot;&gt;&lt;strong&gt;후위 증가 연산자로 &lt;/strong&gt;&lt;/font&gt;증가시킵니다.)&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#8e8e8e&quot;&gt;&lt;strong&gt;(출처 : Effective STL p88)&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;팁 : erase() 함수의 리턴값이 있으면 반환값을 받고, 없으면 후위 증가 연산자로 증가시킵니다.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;// std::vector 순환 삭제 코드
typedef std::vector&amp;lt; int &amp;gt; VEC_Container;
VEC_Container vecContainer;

vecContainer.push_back( 1 );
vecContainer.push_back( 2 );
vecContainer.push_back( 3 );
vecContainer.push_back( 4 );
vecContainer.push_back( 5 );

VEC_Container::iterator it = vecContainer.begin();
for( ; it != vecContainer.end(); )
{
	// erase 코드
	if( TRUE /*FALSE*/ )
	{
		it = vecContainer.erase( it );
		continue;
	}
	
	++it;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;// std::list 순환 삭제 코드
typedef std::list&lt; int &gt; LIST_Container;
LIST_Container listContainer;

listContainer.push_back( 1 );
listContainer.push_back( 2 );
listContainer.push_back( 3 );
listContainer.push_back( 4 );
listContainer.push_back( 5 );

LIST_Container::iterator it = listContainer.begin();
for( ; it != listContainer.end(); )
{
	// erase 코드
	if( TRUE /*FALSE*/ )
	{
		it = listContainer.erase( it );
		continue;
	}
	
	++it;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;// std::map 순환 삭제 코드
typedef std::map&lt; int, int &gt; MAP_Container;
MAP_Container mapContainer;

mapContainer.insert( std::make_pair(1, 5) );
mapContainer.insert( std::make_pair(2, 4) );
mapContainer.insert( std::make_pair(3, 3) );
mapContainer.insert( std::make_pair(4, 2) );
mapContainer.insert( std::make_pair(5, 1) );

MAP_Container::iterator it = mapContainer.begin();
for( ; it != mapContainer.end(); )
{
	// erase 코드
	if( TRUE /*FALSE*/ )
	{
		mapContainer.erase( it++ );
		continue;
	}
	
	++it;
}
&lt;/pre&gt;</summary>
  </entry>
  <entry>
    <title type="html">간단한 Doxygen 사용 방법</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/752" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/752" thr:count="0"/>
    <category term="Tip&amp;Tech" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/752</id>
    <updated>2009-11-29T21:15:00+09:00</updated>
    <published>2009-11-29T16:30:00+09:00</published>
    <summary type="html">&lt;P&gt;프로그래밍과 문서화, 문서화와 프로그래밍...&lt;BR&gt;프로그래머를 직업으로 가진 사람들은 한정된 시간에 프로그래밍 결과물과 문서화를 동시에 이루어야 하는 숙명을 지니고 살아간다.&lt;BR&gt;&lt;BR&gt;이 두마리 토끼를 한번에 잡을 수 있을까?&lt;BR&gt;한번에 두마리 토끼를 잡으려면, 토끼 한마리를 잡은 다음 토끼가 친구를 데려오게 하는 방법이 좋다.(-_-;)&lt;BR&gt;&lt;BR&gt;Doxygen은 주석을 문서화 해주는 측면에서 매우 유용하다. 쓸만하다. 좋다.... 라는 평은 많이 들었지만,&lt;BR&gt;실제로 사용하기 전에는 약간은 망설이게 된다.&lt;BR&gt;&lt;BR&gt;이제부터 Doxygen 사용법에 대해서 알아보자.&lt;BR&gt;&lt;A href=&quot;http://www.stack.nl/~dimitri/doxygen/&quot;&gt;http://www.stack.nl/~dimitri/doxygen/&lt;/A&gt;&amp;nbsp;여기에서 Doxygen을 다운로드 받는다.&lt;BR&gt;&lt;STRONG&gt;doxygen-1.6.1-setup.exe &lt;/STRONG&gt;파일을 실행하여 설치한다.&lt;BR&gt;&lt;BR&gt;그래프 구조로 보기 위해서&lt;BR&gt;&lt;A href=&quot;http://www.graphviz.org/Download..php&quot;&gt;http://www.graphviz.org/Download..php&lt;/A&gt;&amp;nbsp;여기에서 graphviz를 다운로드 받는다.&lt;BR&gt;graphviz-2.24.msi 파일을 실행하여 설치한다.&lt;BR&gt;&lt;BR&gt;이제 모든 준비는 끝났다. &lt;BR&gt;&quot;C:\Program Files\doxygen\bin\doxywizard.exe&quot; 를 실행한다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1298620026.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1298620026.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1292996932.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1292996932.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1239885677.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1239885677.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1161660547.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1161660547.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1143211492.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1143211492.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1338183295.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1338183295.png&quot; width=&quot;494&quot; height=&quot;356&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1280564209.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1280564209.png&quot; width=&quot;552&quot; height=&quot;512&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1314585591.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1314585591.png&quot; width=&quot;494&quot; height=&quot;356&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;위와 같이 설정후 Run을 누르면,&lt;BR&gt;D:\Project\TEST_CODE\Document\html\index.html 로 다음과 같은 출력물을 볼 수 있다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1315989484.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1315989484.png&quot; width=&quot;560&quot; height=&quot;420&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;기본적인 출력만 하더라도 노력한 결과에 비해서 상당히 예쁜(프로그래머 입장에서) 결과물을 볼 수 있었다.&lt;BR&gt;&lt;BR&gt;&lt;A href=&quot;http://www.atomineer.com/AtomineerUtils.html&quot;&gt;http://www.atomineer.com/AtomineerUtils.html&lt;/A&gt;&amp;nbsp;에서 atomineer 플러그인을 설치하면,&lt;BR&gt;비주얼 스튜디오에서 다음의 메뉴가 활성화 된다.&lt;BR&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1021106365.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1021106365.png&quot; width=&quot;456&quot; height=&quot;207&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;위 플러그인을 이용해서 함수와 클래스에 약간의 설명을 추가해 보도록 한다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1386556667.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1386556667.png&quot; width=&quot;497&quot; height=&quot;397&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1348879543.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1348879543.png&quot; width=&quot;577&quot; height=&quot;346&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</summary>
  </entry>
  <entry>
    <title type="html">[C++] ReturnMacro</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/750" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/750" thr:count="0"/>
    <category term="소스 코드" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/750</id>
    <updated>2010-01-04T00:41:22+09:00</updated>
    <published>2009-11-21T22:22:07+09:00</published>
    <summary type="html">&lt;P&gt;C++ 코드 작성시 가독성과 흐름처리를 원활하게 하기 위해서 다음과 같이 리턴 처리를 자주하게 된다.&lt;/P&gt;&lt;PRE class=&quot;brush: cpp&quot;&gt;bool LogicProcedure()
{
    if( A_Logic )
    {
        return false;
    }

    if( B_Logic )
    {
        return false;
    }

    return true;
}
&lt;/PRE&gt;위와 같이 중간에 흐름제어를 하기 위해서 try catch를 쓰고 싶어진다.&lt;BR&gt;&lt;BR&gt;이를 해결하기 위해서 ReturnMacro를 작성하였다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1208251094.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1208251094.png&quot; width=&quot;600&quot; height=&quot;231&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1231522220.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1231522220.png&quot; width=&quot;600&quot; height=&quot;329&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;프로그래머에게 금기시되는 goto 제어문을 define으로 감싸서 &lt;BR&gt;1. 코드 가독성&lt;BR&gt;2. 사용자 편의&lt;BR&gt;3. 성능상의 잇점&lt;BR&gt;3가지를 모두 얻을 수 있도록 헤더 파일을 제작하였다.&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://npteam.net/attachment/1197328157.h&quot;&gt;&lt;img src=&quot;http://npteam.net/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; ReturnMacro.h&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;PRE class=&quot;brush: cpp&quot;&gt;#pragma once

#include &amp;lt; strsafe.h &amp;gt;

//////////////////////////////////////////////////////////////////////////
// ReturnMacro For Singleton Class
template &amp;lt; typename T &amp;gt;
class CReturnMacroForSingleton
{
public:
	static T * InstancePtr()
	{
		if( ms_Instance == NULL ) ms_Instance = new T;
		return ms_Instance;
	};
	static T &amp;amp; Instance()
	{
		if( ms_Instance == NULL ) ms_Instance = new T;
		return *ms_Instance;
	};
	static void DestroyInstance()
	{
		delete ms_Instance;
		ms_Instance = NULL;
	};

private:
	static T * ms_Instance;
};

template&amp;lt; typename T &amp;gt; T* CReturnMacroForSingleton&lt;T&gt;::ms_Instance = 0;
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
class CReturnMacro : public CReturnMacroForSingleton&amp;lt; CReturnMacro &amp;gt;
{
public:
	explicit CReturnMacro()
		: m_nGetLastLine(0)
	{
		memset( m_tszFunctionName, 0, sizeof( m_tszFunctionName ) );
	};

	~CReturnMacro() {};

public:
	inline int	GetLastLine()							{ return m_nGetLastLine;		}
	inline void	SetLastLine( int nLine )				{ m_nGetLastLine = nLine;		}

	inline TCHAR* GetFunctionName()						{ return m_tszFunctionName;		}
	inline void	  SetFunctionName( TCHAR* ptszFnName )
	{
		if( FAILED( StringCchCopy( m_tszFunctionName, _countof( m_tszFunctionName ), ptszFnName ) ) )
		{
			memset( m_tszFunctionName, 0, sizeof( m_tszFunctionName ) );
		}
	}

private:
	int		m_nGetLastLine;
	TCHAR	m_tszFunctionName[256];
};

#define RETURNMACRO CReturnMacro::Instance()
//////////////////////////////////////////////////////////////////////////


struct RETURN_RESULT
{
	int		LastLine;
	TCHAR*	LastFnName;
};

#define RETURN_VOID

//////////////////////////////////////////////////////////////////////////
// RETURN FAIL
#define RETURN_FAIL()													\
	RETURNMACRO.SetLastLine( __LINE__ );								\
	RETURNMACRO.SetFunctionName( _T(__FUNCTION__) );					\
	goto RET_FAIL;

#define RETURN_FAIL_BEGIN()												\
	RET_FAIL:															\
	RETURN_RESULT Ret_Fail;												\
	Ret_Fail.LastLine	= RETURNMACRO.GetLastLine();					\
	Ret_Fail.LastFnName = RETURNMACRO.GetFunctionName();

#define RETURN_FAIL_END( ReturnValue )									\
	return ReturnValue;
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// RETURN_SUCCESS
#define RETURN_SUCCESS( )												\
	RETURNMACRO.SetLastLine( __LINE__ );								\
	RETURNMACRO.SetFunctionName( _T(__FUNCTION__) );					\
	goto RET_SUCCESS;

#define RETURN_SUCCESS_BEGIN()											\
	RET_SUCCESS:														\
	RETURN_RESULT Ret_Success;											\
	Ret_Success.LastLine   = RETURNMACRO.GetLastLine();					\
	Ret_Success.LastFnName = RETURNMACRO.GetFunctionName();

#define RETURN_SUCCESS_END( ReturnValue )								\
	return ReturnValue;
//////////////////////////////////////////////////////////////////////////&lt;/PRE&gt;&lt;STRONG&gt;&lt;BR&gt;&lt;BR&gt;Visual Assist Snippet code&lt;/STRONG&gt; &lt;PRE class=brush:cpp&gt;RETURN_SUCCESS();


#pragma region RETURN_MACRO

	RETURN_FAIL_BEGIN();
	// Fail Code.
	RETURN_FAIL_END( RETURN_VOID );

	RETURN_SUCCESS_BEGIN();
	// Success Code.
	RETURN_SUCCESS_END( RETURN_VOID );

#pragma endregion RETURN_MACRO
&lt;/PRE&gt;</summary>
  </entry>
  <entry>
    <title type="html">[WMI] 프로세스 (시작 / 종료) 이벤트 발생시 프로그램 실행하기</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/746" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/746" thr:count="0"/>
    <category term="WMI 스크립트" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/746</id>
    <updated>2009-11-07T02:56:16+09:00</updated>
    <published>2009-11-06T21:53:51+09:00</published>
    <summary type="html">&lt;DIV style=&quot;TEXT-ALIGN: right&quot;&gt;출처 : &lt;A href=&quot;http://www.npteam.net/746&quot;&gt;http://www.npteam.net/746&lt;/A&gt;&lt;/DIV&gt;프로세스 시작/종료 이벤트시에 하고 싶은 것들이 많다.&lt;BR&gt;서버 프로그래머라면 서버 프로그램이 이유없이 죽을때 시간 및 Log를 남길 수도 있고,&lt;BR&gt;프로그램이 죽으면, 다시 시작하도록 설정해서 24시간 스스로 유지되길 바라는 경우가 있다.&lt;BR&gt;이럴때 윈도우에서 실행가능한 VBS(WMI)스크립트로 간단하게 관리해 보자.&lt;BR&gt;&lt;BR&gt;아래의 스크립트는 다음과 같은 작동을 합니다.&lt;BR&gt;1. 무한 루프를 반복하면서 1초마다 프로세스가 생성되거나 삭제되는 이벤트를 감시한다.&lt;BR&gt;2. notepad.exe 프로세스가 생성되면, calc.exe를 실행합니다.&lt;BR&gt;3. notepad.exe 프로세스가 삭제되면, calc.exe를 종료합니다.&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://npteam.net/attachment/1331519571.vbs&quot;&gt;&lt;img src=&quot;http://npteam.net/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; ProcessEvent.vbs&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;PRE class=&quot;brush: vb&quot;&gt;Option Explicit

Dim strComputer
strComputer = &quot;.&quot;

&#039;기본 Object 가져오기
Dim Shell : Set Shell = WScript.CreateObject(&quot;WScript.Shell&quot;)
Dim FSO : Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Dim objWMIService : Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp;amp; strComputer &amp;amp; &quot;\root\cimv2&quot;)
Dim colMonitorCreateProcessesEvent : Set colMonitorCreateProcessesEvent = objWMIService.ExecNotificationQuery(&quot;select * from __InstanceCreationEvent within 1 where TargetInstance isa &#039;Win32_Process&#039;&quot; )
Dim colMonitorDeleteProcessesEvent : Set colMonitorDeleteProcessesEvent = objWMIService.ExecNotificationQuery(&quot;select * from __InstanceDeletionEvent within 1 where TargetInstance isa &#039;Win32_Process&#039;&quot; )

&#039;CMD 윈도우 98에서도 적용 가능하게 COMSPEC으로 가져온다.
Dim COMSPEC : COMSPEC = Shell.ExpandEnvironmentStrings(&quot;%comspec%&quot;)

&#039;메인 함수 실행
Call MainFunction()


Sub MainFunction
	&#039;중복 실행 방지 코드 - vbs 파일명을 입력합니다.
	If( IsExistSameVBS( &quot;ProcessEvent.vbs&quot; ) ) Then
		Wscript.Quit
	End If
	
	Do While True
		Call ProcessCreatedEvent()
		Call ProcessDeletedEvent()
		Wscript.Sleep( 1000 )
	Loop
	
	Wscript.Quit
End Sub


Sub ProcessCreatedEvent
	&#039;프로세스 시작시
	
	&#039;모니터링할 프로세스 이름
	Dim strMonitorProcessName : strMonitorProcessName = &quot;notepad.exe&quot;
	
	&#039;실행할 파일
	Dim strExecuteFilePath : strExecuteFilePath = &quot;C:\Windows\system32&quot;
	Dim strExecuteFileName : strExecuteFileName = &quot;calc.exe&quot;
	
	&#039;프로세스 시작 이벤트 검사
	Dim objLastestProcess : Set objLastestProcess = colMonitorCreateProcessesEvent.NextEvent
	If( StrComp(Lcase(objLastestProcess.TargetInstance.Name), Lcase(strMonitorProcessName), 1 ) = 0 ) Then
		&#039;프로그램 실행
		Call ExecuteOnce( strExecuteFilePath, strExecuteFileName, &quot;&quot; )
	End If
End Sub


Sub ProcessDeletedEvent
	&#039;프로세스 종료시
	
	&#039;모니터링할 프로세스 이름
	Dim strMonitorProcessName : strMonitorProcessName = &quot;Notepad.exe&quot;
	
	&#039;종료할 프로세스 이름
	Dim strKillProcessName : strKillProcessName = &quot;calc.exe&quot;
	
	&#039;프로세스 종료 이벤트 검사
	Dim objLastestProcess : Set objLastestProcess = colMonitorDeleteProcessesEvent.NextEvent
	If( StrComp(Lcase(objLastestProcess.TargetInstance.Name), Lcase(strMonitorProcessName), 1) = 0 ) Then
		&#039;프로세스 종료
		Call KillProcess( strKillProcessName )
	End If
End Sub


Sub ExecuteFile (strFileFullPath, Arguments)
	If( FSO.FileExists( strFileFullPath ) ) Then
		Shell.Run COMSPEC &amp;amp; &quot; /c &quot; &amp;amp; strFileFullPath &amp;amp; Arguments &amp;amp; &quot; &amp;amp; Exit&quot;, 0
	Else
		Shell.Popup strFileFullPath &amp;amp; &quot; 을(를) 찾을 수 없습니다.&quot;, 3, &quot;File Dose not exist&quot;, 48
		Wscript.Quit
	End If
End Sub


Function IsExistProcess( strProcessName )
	IsExistProcess = False
	
	Dim colProcessList, objProcess
	Set colProcessList = objWMIService.ExecQuery( &quot;select * from Win32_Process&quot; )
	For Each objProcess in colProcessList
		If( StrComp(Lcase(strProcessName), Lcase(objProcess.Name), 1) = 0 ) Then
			IsExistProcess = True
		End If
	Next
End Function


Sub ExecuteOnce( strFilePath, strFileName, Arguments )
	If( IsExistProcess( strFileName ) = False ) Then
		Call ExecuteFile( strFilePath &amp;amp; &quot;\&quot; &amp;amp; strFileName, Arguments )
		Wscript.Sleep 2000
	End If
End Sub


Sub KillProcess( strProcessName )
	Dim colProcessList, objProcess
	Set colProcessList = objWMIService.ExecQuery( &quot;select * from Win32_Process&quot; )
	For Each objProcess in colProcessList
		If( StrComp(Lcase(strProcessName), Lcase(objProcess.Name), 1) = 0 ) Then
			objProcess.Terminate()
		End If
	Next
End Sub


Function IsExistSameVBS( strFileName )
	IsExistSameVBS = False
	Dim nSameVBSCount : nSameVBSCount = 0
	
	Dim colProcessList, objProcess
	Set colProcessList = objWMIService.ExecQuery(&quot;SELECT * FROM Win32_Process WHERE Name = &#039;wscript.exe&#039; OR Name = &#039;cscript.exe&#039;&quot;)
	For Each objProcess in colProcessList
		If InStr( Lcase(objProcess.CommandLine), Lcase(strFileName) ) Then
			nSameVBSCount = nSameVBSCount + 1
		End If
	Next
	
	If( nSameVBSCount &amp;gt; 1 ) Then
		IsExistSameVBS = True
		Wscript.echo strFileName &amp;amp; &quot; 은 이미 실행중인 스크립트 입니다.&quot;
	End If
End Function
&lt;/PRE&gt;</summary>
  </entry>
  <entry>
    <title type="html">MS-SQL 2005의 TRY _ CATCH를 써보자</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/738" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/738" thr:count="0"/>
    <category term="MS-SQL" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/738</id>
    <updated>2009-10-23T00:49:26+09:00</updated>
    <published>2009-09-10T13:43:06+09:00</published>
    <summary type="html">&lt;PRE class=&quot;brush: sql;&quot;&gt;
CREATE PROCEDURE NormalInsert(
	@Context nvarchar(100)
)
AS
BEGIN
	SET NOCOUNT ON

	DECLARE @StartTime    DATETIME
	SET @StartTime = GETDATE()

	DECLARE @LoopCount INT
	SET @LoopCount = 10000

	WHILE( @LoopCount &amp;gt; 0 )
	BEGIN
		BEGIN TRANSACTION
			INSERT SendBox(Context) values (@Context)
			IF( @@Error &amp;lt;&amp;gt; 0 or @@RowCount = 0)
			BEGIN
				ROLLBACK TRANSACTION
				RAISERROR(&#039;Error when processing INSERT statement or Task Table.&#039;,15,1)
				RETURN -100
			END

		COMMIT TRANSACTION

		SET @LoopCount = @LoopCount - 1
	END

	PRINT &#039;Elapsed Time : &#039; + convert( varchar(128), GETDATE() - @StartTime, 114 )

	RETURN
END
GO
&lt;/PRE&gt;&lt;BR /&gt;
Normal Insert 사용시&lt;BR /&gt;Elapsed Time : 00:00:02:653 &lt;BR /&gt;Elapsed Time : 00:00:02:593 &lt;BR /&gt;Elapsed Time : 00:00:02:560 &lt;BR /&gt;Elapsed Time : 00:00:02:737 &lt;BR /&gt;Elapsed Time : 00:00:02:593&lt;BR /&gt;
&lt;PRE class=&quot;brush: sql;&quot;&gt;
CREATE PROCEDURE TryInsert(
	@Context nvarchar(100)
)
AS
BEGIN
	SET NOCOUNT ON

	DECLARE @StartTime    DATETIME
	SET @StartTime = GETDATE()

	DECLARE @LoopCount INT
	SET @LoopCount = 10000

	WHILE( @LoopCount &amp;gt; 0 )
	BEGIN
		BEGIN TRY
			BEGIN TRANSACTION
				INSERT SendBox(Context) values (@Context)
			COMMIT TRANSACTION
		END TRY

		BEGIN CATCH
			ROLLBACK TRANSACTION

			BEGIN
				RAISERROR(&#039;Error when processing INSERT statement or Task Table.&#039;,15,1)
				RETURN -100
			END
		END CATCH

		SET @LoopCount = @LoopCount - 1
	END

	PRINT &#039;Elapsed Time : &#039; + convert( varchar(128), GETDATE() - @StartTime, 114 )

	RETURN
END
GO
&lt;/PRE&gt;&lt;BR /&gt;
Try Insert 사용시&lt;BR /&gt;
Elapsed Time : 00:00:02:860&lt;BR /&gt;
Elapsed Time : 00:00:02:810&lt;BR /&gt;
Elapsed Time : 00:00:03:063&lt;BR /&gt;
Elapsed Time : 00:00:02:640&lt;BR /&gt;
Elapsed Time : 00:00:02:767&lt;BR /&gt;</summary>
  </entry>
  <entry>
    <title type="html">프로그램은 왜 실패하는가? (발표자료)</title>
    <link rel="alternate" type="text/html" href="http://npteam.net/734" />
    <link rel="replies" type="application/atom+xml" href="http://npteam.net/atom/response/734" thr:count="1"/>
    <category term="문서모음" />
    <author>
      <name>(TTF)</name>
    </author>
    <id>http://npteam.net/734</id>
    <updated>2009-07-25T15:30:51+09:00</updated>
    <published>2009-07-25T00:12:03+09:00</published>
    <summary type="html">아키텍트를 꿈꾸는 사람들에서 진행하는 토요일 스터디.&lt;BR /&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 class=&quot;extensionIcon&quot; href=&quot;http://npteam.net/attachment/1093796661.pptx&quot;&gt;&lt;img src=&quot;http://npteam.net/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; 프로그램은 왜 실패하는가.pptx&lt;/a&gt;&lt;/div&gt; 
&lt;DIV id=__ss_1764993 style=&quot;WIDTH: 425px; TEXT-ALIGN: left&quot;&gt;&lt;A title=&quot;프로그램은 왜 실패하는가&quot; style=&quot;DISPLAY: block; MARGIN: 12px 0px 3px; FONT: 14px Helvetica,Arial,Sans-serif; TEXT-DECORATION: underline&quot; href=&quot;http://www.slideshare.net/zone0000/ss-1764993&quot;&gt;프로그램은 왜 실패하는가&lt;/A&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-090724102328-phpapp02&amp;amp;stripped_title=ss-1764993&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-090724102328-phpapp02&amp;amp;stripped_title=ss-1764993&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt; 
&lt;DIV style=&quot;FONT-SIZE: 11px; PADDING-TOP: 2px; FONT-FAMILY: tahoma,arial; HEIGHT: 26px&quot;&gt;View more &lt;A style=&quot;TEXT-DECORATION: underline&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/A&gt; from &lt;A style=&quot;TEXT-DECORATION: underline&quot; href=&quot;http://www.slideshare.net/zone0000&quot;&gt;zone0000&lt;/A&gt;.&lt;/DIV&gt;&lt;/DIV&gt;</summary>
  </entry>
</feed>
