<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>류종택의 프로그래밍 강의실</title>
		<link>http://ryulib.tistory.com/</link>
		<description></description>
		<language>ko</language>
		<pubDate>Mon, 30 Apr 2012 16:57:26 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<managingEditor>류종택</managingEditor>
		<image>
			<title>류종택의 프로그래밍 강의실</title>
			<url>http://cfile24.uf.tistory.com/image/201B9A184D036F6826DF06</url>
			<link>http://ryulib.tistory.com</link>
			<description></description>
		</image>
		<item>
			<title>New Rally X - BGM</title>
			<link>http://ryulib.tistory.com/199</link>
			<description>&lt;p&gt;작업하면서 마음을 안정시키기 위해 듣는 용도로 사용 중인, 일명 방구차의 BGM ㅋㅋ&lt;/p&gt;&lt;p&gt;디아블로와 스타크래프트 BGM도 사용한 적이 있었는데, 문제는 이게 반복할 때 끊어지는 느낌이 문제네 ㅡ.ㅜ&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display:inline-block;&quot;&gt;&lt;span id=&quot;m4be65b35d587c426498dd36f991e2d256428&quot;&gt;&lt;/span&gt;&lt;script type=&quot;text/javascript&quot;&gt;writeCode('&lt;embed pluginspage=&quot;http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer/&quot; src=&quot;http://cfile10.uf.tistory.com/media/132F42384F9E456903A0F3&quot; width=&quot;320&quot; height=&quot;45&quot; type=&quot;application/x-mplayer2&quot; autostart=&quot;0&quot;&gt;&lt;/embed&gt;', &quot;m4be65b35d587c426498dd36f991e2d256428&quot;)&lt;/script&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-199-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-199-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-199-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/199&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/etc&quot;&gt;etc&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/199&quot; &gt;New Rally X - BGM&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
16:55:28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/196&quot; &gt;TED - 8가지 성공의 비결&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/190&quot; &gt;Use the Magic Trackpad with your Windows PC&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/03/06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/187&quot; &gt;Tron 게임&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/186&quot; &gt;퍼포먼스를 위한 발악&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(2)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/181&quot; &gt;LED Display&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>etc</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/199</guid>
			<comments>http://ryulib.tistory.com/199#entry199comment</comments>
			<pubDate>Mon, 30 Apr 2012 16:55:28 +0900</pubDate>
		</item>
		<item>
			<title>Slump Slimp Slurpy</title>
			<link>http://ryulib.tistory.com/197</link>
			<description>&lt;p&gt;오랫만에 놀러 간 사이트에 퀴즈가 올라와 있길래 한 번 풀어봤습니다. &amp;nbsp;컴파일러와도 연관이 있어서 분류를 컴파일러로 해뒀습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문제 :&amp;nbsp;&lt;a href=&quot;http://codejob.co.kr/code/view/109/&quot;&gt;http://codejob.co.kr/code/view/109/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우선 문제를 BNF로 표시해 보면 다음과 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;Slurpy&amp;gt; --&amp;gt; &amp;lt;Slimp&amp;gt; &amp;lt;Slump&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;Slimp&amp;gt; --&amp;gt; AH | AB&amp;lt;Slimp&amp;gt;C | A&amp;lt;Slump&amp;gt;C&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;Slump&amp;gt; --&amp;gt; D&amp;lt;F&amp;gt;G | E&amp;lt;F&amp;gt;G | D&amp;lt;F&amp;gt;&amp;lt;Slump&amp;gt; | &amp;nbsp;E&amp;lt;F&amp;gt;&amp;lt;Slump&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;F&amp;gt; --&amp;gt; F | F&amp;lt;F&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 YACC를 이용해서 문제를 가볍게 해결할 수도 있겠지만, 퀴즈를 풀어 보는 것이 목적이므로 직접 코딩을 해보도록 하겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;코딩을 하기 이전에 위의 BNF가 어떻게 처리되야 하는 지를 [그림 1]과 같이 약간 변칙적인 상태도로 표현해봤습니다. &amp;nbsp;이전 포스트(&lt;a href=&quot;http://ryulib.tistory.com/73&quot;&gt;http://ryulib.tistory.com/73&lt;/a&gt;)에서도 상태도를 이용해서 BNF를 표현하는 방법에 대해서 설명했듯이, 저는 상태도를 이용하여 BNF를 저만의 방식으로 처리하고 있습니다. &amp;nbsp;이번에는 좌측 결합은 없고 우측 결합만이 있기 때문에 비교적 간단하게 처리할 수가 있습니다. &amp;nbsp;읽는 방법은 제가 프로젝트에 쫓기고 있어서 생략합니다. &amp;nbsp;첨부하는 코드를 참고하시기 바랍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; &quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display:inline-block;width:630px;&quot;&gt;&lt;a href=&quot;http://cfile3.uf.tistory.com/original/196048354F97A57D2192ED&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile3.uf.tistory.com/image/196048354F97A57D2192ED&quot; filemime=&quot;image/jpeg&quot; filename=&quot;Job Flow.png&quot; height=&quot;268&quot; style=&quot;width: 630px; height: 268px; &quot; width=&quot;630&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; &quot;&gt;[그림 1] BNF를 상태도로 표현&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[소스1]&amp;nbsp;&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;procedure TfmMain.FormCreate(Sender: TObject);
var
  Slurpy : TSlurpy;
begin
  Slurpy := TSlurpy.Create;
  try
    Slurpy.Source := 'AH';
    moMsg.Lines.Add(Format('%s IsSlimp is %s', [Slurpy.Source, BoolToStr(Slurpy.IsSlimp, true)]));

    Slurpy.Source := 'ABAHC';
    moMsg.Lines.Add(Format('%s IsSlimp is %s', [Slurpy.Source, BoolToStr(Slurpy.IsSlimp, true)]));

    Slurpy.Source := 'ADFGC';
    moMsg.Lines.Add(Format('%s IsSlimp is %s', [Slurpy.Source, BoolToStr(Slurpy.IsSlimp, true)]));

    Slurpy.Source := 'ABAHD';
    moMsg.Lines.Add(Format('%s IsSlimp is %s', [Slurpy.Source, BoolToStr(Slurpy.IsSlimp, true)]));

    Slurpy.Source := 'AHDFG';
    moMsg.Lines.Add(Format('%s IsSlurpy is %s', [Slurpy.Source, BoolToStr(Slurpy.IsSlurpy, true)]));

    Slurpy.Source := 'DFGAH';
    moMsg.Lines.Add(Format('%s IsSlurpy is %s', [Slurpy.Source, BoolToStr(Slurpy.IsSlurpy, true)]));
  finally
    Slurpy.Free;
  end;
end;
&lt;/pre&gt;&lt;p&gt;[소스 1]은&amp;nbsp;IsSlump, IsSlimp, IsSlurpy를 판별할 수 있는 TSlurpy 클래스의 사용방법입니다. &amp;nbsp;7: 라인에서처럼 Source 멤버에 검사할 문자열을 입력하시고,&amp;nbsp;&amp;nbsp;IsSlump / IsSlimp / IsSlurpy&amp;nbsp;등의 메소드를 통해서 해당 문자열이 Slump인지, Slimp인지 또는 Slurpy인지를 판별할 수가 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[소스 2]&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;function TSlurpy.IsSlurpy: boolean;
begin
  try
    Result := IsSlimp and IsSlump;
  except
    Result := false;
  end;
end;

function TSlurpy.IsSlimp: boolean;
begin
  try
    FState := FStateSlimpBase;
    FIsFinished := false;
    repeat
      FState.Execute;
    until FIsFinished;

    Result := true;
  except
    Result := false;
  end;
end;

function TSlurpy.IsSlump: boolean;
begin
  try
    FState := FStateSlumpBase;
    FIsFinished := false;
    repeat
      FState.Execute;
    until FIsFinished;

    Result := true;
  except
    Result := false;
  end;
end;
&lt;/pre&gt;&lt;p&gt;[소스 2]는 TSlurpy 클래스의 일부분 입니다. &amp;nbsp;IsSlurpy는 간단하여 설명을 생략합니다. &amp;nbsp;IsSlimp와 IsSlump의 경우에는 동일한 구조이기 때문에 IsSlimp만을 설명하도록 하겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;13: [그림 1]에서는 모든 시작을 Base라고 표시했으나, IsSlimp를 점검하는 조건만을 보면 처리가 달라지기 때문에&amp;nbsp;FStateSlimpBase를 기초 상태로 두고 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;14-17:&amp;nbsp;FIsFinished가 true가 될 때까지 반복을 하고 있습니다. &amp;nbsp;FIsFinished가 true라는 것은 현재의 검사가 성공적으로 완료되었다는 의미입니다. &amp;nbsp;반복하는 동안 계속 현재의 State의 Execute 메소드만을 실행합니다. &amp;nbsp;내부적으로 무엇을 할지는 캡슐화되어 있어서 정확히는 모르겠지만, 조건이 만족되거나 에러가 날 때까지 계속 문자열을 검색한다는 것을 직감적으로 알 수가 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;21: 만약 파싱 중간에 에러가 있다면 Exception을 발생시킬 에정입니다. &amp;nbsp;Exception이 발생된다면, 현재의 점검은 false로 리턴합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[소스 3]&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;procedure TStateSlimpBase.Execute;
begin
  case Next of
    'A': begin
      SetState(FSlurpy.FStateSlimpA);
    end;

    else raise Exception.Create('Error in ' + ClassName);
  end;
end;
&lt;/pre&gt;&lt;p&gt;3: 다음 문자를 읽어 들입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4-6: 'A'라는 문자열이면 상태를&amp;nbsp;FStateSlimpA로 옮겨서 검사를 계속 진행합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;8: 다른 문자열이 온다면 에러 입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[소스 4]&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;procedure TStateSlimpA.Execute;
begin
  case Peek(1) of
    'H': begin
      Next;
      FSlurpy.FIsFinished := true;
    end;

    'B': begin
      Next;
      SetState(FSlurpy.FStateSlimpAB);
    end;

    else begin
      if FSlurpy.IsSlump then FSlurpy.FState := FSlurpy.FStateSlimpASlump
      else raise Exception.Create('Error in ' + ClassName);
    end;
  end;
end;
&lt;/pre&gt;&lt;p&gt;3: 이번에는 다음 문자열을 읽지 않고, 살짜 훔쳐(Peek)&amp;nbsp;봅니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4-7: 'H' 일 경우에는 검사가 완료되고 IsSlimp는 true를 리턴하게 됩니다. &amp;nbsp;훔쳐보기만 했기 때문에, 문자열 하나를 읽어서 다음 문자를 읽을 준비가 되도록 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;9-12: 'B' 일 경우에는 상태만 계속 옮겨가면서 검사를 하게 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;14-17: 'B', 'H' 가 아닌 경우에는 다음에 &amp;lt;Slump&amp;gt;가 오게 되는 지 검사하게 됩니다. &amp;nbsp;이러한 과정들은 당연히 [그림 1]에 표시된 그대로 입니다. &amp;nbsp;3:에서 Next를 해서 문자를 읽어 버리면, IsSlump가 한 자를 생략한 채로 검사하게 되기 때문에 Peek(1)로 훔쳐보기만 한 것 입니다. &amp;nbsp;다음에 &amp;lt;Slump&amp;gt;가&amp;nbsp;오지 않는 다면 에러입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다른 모든 상태에 대해서도 원리는 같습니다. &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이처럼 상태도를 이용해서 State Pattern을 사용하다보면 전체의 줄거리와 각각의 구현이 완전히 분리가 되어 개발이 한층 쉬워지는 것을 알 수가 있습니다. &amp;nbsp;사실 이 문제 정도의 복잡도라면 State Pattern을 사용하지 않고 재귀 호출만으로도 쉽게 구현되기는 하지만, 코드의 가독성은 State Pattern이 훨씬 앞선다고 생각합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;언제가 될 지, 프로젝트가 한가해지면 그 동안 공부했었던 컴파일러 제작에 대한 강좌를 하고 싶지만, 잘 안되네요 ^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 첨부는 소스 전체와 사용된 비지오 파일입니다. &amp;nbsp;샘플이 작아서 제대로 동작하고 있는 지는 잘 모르겠습니다 ^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display:inline-block;&quot;&gt;&lt;a href=&quot;http://ryulib.tistory.com/attachment/cfile24.uf@176151434F97AB963352C4.7z&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/110706133414/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Slump Slimp Slurpy.7z&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-197-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-197-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-197-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/197&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/프로젝트&quot;&gt;프로젝트&lt;/a&gt;&amp;nbsp;&gt;&amp;nbsp;&lt;a href=&quot;/category/프로젝트/컴파일러&quot;&gt;컴파일러&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/197&quot; &gt;Slump Slimp Slurpy&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/73&quot; &gt;파싱 과정을 표기해 보자&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(1)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/11/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/72&quot; &gt;프로젝트 개요 - 컴파일러 제작&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/11/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/66&quot; &gt;계산기용 스캐너 만들기 - State Pattern&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(1)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/11/04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/62&quot; &gt;계산기용 스캐너 만들기 - Lex 편&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/11/01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/61&quot; &gt;계산기&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/10/27&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>컴파일러</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/197</guid>
			<comments>http://ryulib.tistory.com/197#entry197comment</comments>
			<pubDate>Wed, 25 Apr 2012 16:45:43 +0900</pubDate>
		</item>
		<item>
			<title>TED - 8가지 성공의 비결</title>
			<link>http://ryulib.tistory.com/196</link>
			<description>&lt;p&gt;&lt;p&gt;Passion, Work, Good, Focus, Push, Serve, Ideas, Persist&lt;/p&gt;&lt;p&gt;열정, 노력, 잘하는 것을 만들어라, 집중, 의지, 다른이가 필요한 것을 줘라, 아이디어, 인내&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.ted.com/talks/lang/ko/richard_st_john_s_8_secrets_of_success.html&quot;&gt;http://www.ted.com/talks/lang/ko/richard_st_john_s_8_secrets_of_success.html&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 대사가 귀에 들어오네요 ㅋㅋ&lt;/p&gt;&lt;p&gt;&lt;b&gt;&quot;It's not always easy to push yourself, and that's why they invented mothers.&quot;&lt;/b&gt;&lt;/p&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-196-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-196-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-196-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/196&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/etc&quot;&gt;etc&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/199&quot; &gt;New Rally X - BGM&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
16:55:28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/196&quot; &gt;TED - 8가지 성공의 비결&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/190&quot; &gt;Use the Magic Trackpad with your Windows PC&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/03/06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/187&quot; &gt;Tron 게임&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/186&quot; &gt;퍼포먼스를 위한 발악&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(2)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/181&quot; &gt;LED Display&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>etc</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/196</guid>
			<comments>http://ryulib.tistory.com/196#entry196comment</comments>
			<pubDate>Tue, 24 Apr 2012 14:43:32 +0900</pubDate>
		</item>
		<item>
			<title>MemoryPool</title>
			<link>http://ryulib.tistory.com/195</link>
			<description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;GetMem와 FreeMem 대신 사용할 수 있는 메모리 풀 유닛입니다. &amp;nbsp;[그림 1]과 같이 15배 이상의 속도 차이를 보이고 있습니다. &amp;nbsp;상황에 따라서 더 차이가 날 수도 있고 줄어 들 수도 있습니다. &amp;nbsp;멀티미디어 및 대용량 소켓 작성 때, 조금이라도 성능을 짜내기 위해서 사용하던 것인데, 조금 다듬어서 RyuLib에 포함 했습니다. &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;16KB 이상의 메모리 생성 및 해제는 풀을 사용하지 않고 바로 생성 및 삭제하도록 되어 있습니다. &amp;nbsp;또한, 메모리 풀의 한계를 지정하지 않아서, 메모리를 모두 잠식할 수도 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;RyuLib for Delphi&quot; 소스는 아래의 &quot;&lt;a href=&quot;http://ryulib.tistory.com/notice/11&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://ryulib.tistory.com/notice/11&lt;/a&gt;&quot;에서 받으시기 바랍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; &quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display:inline-block;width:240px;&quot;&gt;&lt;a href=&quot;http://cfile21.uf.tistory.com/original/1313B1394F8286700F56BD&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile21.uf.tistory.com/image/1313B1394F8286700F56BD&quot; filemime=&quot;image/jpeg&quot; filename=&quot;K-20120409-154901-6.png&quot; height=&quot;171&quot; width=&quot;240&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; &quot;&gt;[그림 1] 실행 결과&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사용법은 위의 소스 저장소에서 &quot;/XE2/Samples/MemoryPool&quot;를 참고하시기 바랍니다. &amp;nbsp;[소스 1]은 해당 샘플의 메인 유닛입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;TMemoryPool.GetMem()의 리턴 값인&amp;nbsp;TMemoryPage가 실제 할당받은 메모리 객체입니다. &amp;nbsp;TMemoryPage.Data 포인터가 할당 받은 메모리의 주소,&amp;nbsp;TMemoryPage.Size가 할당 받은 크기 입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[소스 1] 사용법&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;unit _fmMain;

interface

uses
  MemoryPool,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfmMain = class(TForm)
    moMsg: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    FList : TList;
    FMemoryPool : TMemoryPool;
    procedure do_SystemTest;
    procedure do_MemoryPoolTest;
  public
  end;

var
  fmMain: TfmMain;

implementation

{$R *.dfm}

procedure TfmMain.do_SystemTest;
var
  Loop1, Loop2 : Integer;
  Tick : cardinal;
  Data : pointer;
begin
  RandSeed := 0;

  Tick := GetTickCount;

  for Loop2 := 1 to 10000 do begin
    for Loop1 := 1 to 1000 do begin
      GetMem(Data, Random(16 * 1024));
      FList.Add(Data);
    end;

    for Loop1 := 0 to FList.Count-1 do FreeMem(FList[Loop1]);
    FList.Clear;
  end;

  moMsg.Lines.Add(Format('System.GetMem: %d ms', [GetTickCount-Tick]));
end;

procedure TfmMain.do_MemoryPoolTest;
var
  Loop1, Loop2 : Integer;
  Tick : cardinal;
  Page : TMemoryPage;
begin
  RandSeed := 0;

  Tick := GetTickCount;
  for Loop2 := 1 to 10000 do begin
    for Loop1 := 1 to 1000 do begin
      Page := FMemoryPool.GetMem(Random(16 * 1024));
      FList.Add(Page);
    end;

    for Loop1 := 0 to FList.Count-1 do FMemoryPool.FreeMem(TMemoryPage(FList[Loop1]));
    FList.Clear;
  end;

  moMsg.Lines.Add(Format('MemoryPool.GetMem: %d ms', [GetTickCount-Tick]));
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
//  IsMultiThread := true;
  FList := TList.Create;
  FMemoryPool := TMemoryPool.Create;

  do_SystemTest;
  do_MemoryPoolTest;
end;

end.&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-195-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-195-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-195-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/195&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/RyuLib&quot;&gt;RyuLib&lt;/a&gt;&amp;nbsp;&gt;&amp;nbsp;&lt;a href=&quot;/category/RyuLib/RyuLib%20for%20Delphi&quot;&gt;RyuLib for Delphi&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/195&quot; &gt;MemoryPool&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/177&quot; &gt;ThreadPool&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/85&quot; &gt;ObserverList&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/12/13&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>RyuLib for Delphi</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/195</guid>
			<comments>http://ryulib.tistory.com/195#entry195comment</comments>
			<pubDate>Mon, 09 Apr 2012 15:59:05 +0900</pubDate>
		</item>
		<item>
			<title>MEncoder MinGW 빌드</title>
			<link>http://ryulib.tistory.com/194</link>
			<description>&lt;p&gt;2012년 4월 03일 현재 MPlayer(MEncoder) 소스를 SVN에서 받고 필요한 라이브러리들을 모두 설치한 결과 대부분은 문제 없이 바로 빌드가 됩니다. &amp;nbsp;하지만 몇 가지 주의할 점이 있습니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc; &quot;&gt;&lt;li&gt;FreeType의 라이브러리의 버전이 너무 높으면 libass에서 문제가 된다. &amp;nbsp;libass 빌드에서는 문제 없으나, MEncoder 빌드 할 때 libass 소스에서 문제가 된다. &amp;nbsp;2.2.1 버전부터 빌드가 진행된다.&lt;/li&gt;&lt;li&gt;pkg-config-0.26 대신&amp;nbsp;pkg-config-0.25을 사용하였다. &amp;nbsp;pkg-config-0.26 설치가 잘 안된다.&lt;/li&gt;&lt;li&gt;맥북 프로에서 부트캠프로 Win7을 띄워서&amp;nbsp;빌드에 성공하고 사용하는데 지장이 없었으나, 다른 PC에서 실행할 수 없는 문제가 발생한다. &amp;nbsp;CPU 특성 때문인 것으로 보인다. &amp;nbsp;빌드할 때, 옵션으로 처리할 수도 있으나, 그냥 일반 PC에서 빌드하면, 맥북에서도 잘 돌아간다. &amp;nbsp;(configure 실행 할 때, 자동으로 인식하기 때문)&lt;/li&gt;&lt;li&gt;x264와 faac 등을 포함 시킬 때 make 중간에 에러가 발생한다. &amp;nbsp;&quot;gcc -o mencoder.exe....&quot; 를 하다가 중단되는데, 본인은 해당 부분을 수동으로 작성했다. &amp;nbsp;문제는 &quot;-lx264 -lfaac&quot; 가 포함되지 않았기 때문이다.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;현재 설치된 라이브러리들의 버전은 아래와 같습니다. &amp;nbsp;버전이 표기 안된 것은 현재 날짜로 구할 수 있는 최신 버전입니다. &amp;nbsp;MEncoder에서 사용하지 않고 있는 것도 있습니다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc; &quot;&gt;&lt;li&gt;faac&lt;/li&gt;&lt;li&gt;faad2&lt;/li&gt;&lt;li&gt;fontconfig-2.9.0&lt;/li&gt;&lt;li&gt;freetype-2.4.6&lt;/li&gt;&lt;li&gt;fribidi-0.19.2&lt;/li&gt;&lt;li&gt;glib-2.28.1&lt;/li&gt;&lt;li&gt;lame-3.98.4&lt;/li&gt;&lt;li&gt;liba52&lt;/li&gt;&lt;li&gt;libass-0.10.0&lt;/li&gt;&lt;li&gt;libogg-1.3.0&lt;/li&gt;&lt;li&gt;libtheora-1.1.1&lt;/li&gt;&lt;li&gt;libvorbis-1.3.2&lt;/li&gt;&lt;li&gt;libvpx&lt;/li&gt;&lt;li&gt;libxml2-2.7.8&lt;/li&gt;&lt;li&gt;pkg-config-0.25&lt;/li&gt;&lt;li&gt;x264-122&lt;/li&gt;&lt;li&gt;xvidcore&lt;/li&gt;&lt;li&gt;zlib-1.2.5&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;무엇인가 빠트린 것이 있는 것 같지만, 나중에 또 여유가 나면 정리하도록 하겠습니다.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-194-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-194-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-194-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-news-widget&quot; style=&quot;width: 100%; text-align: center&quot;&gt;
		  					&lt;embed src=&quot;http://api.v.daum.net/static/recombox1.swf&quot; quality=&quot;high&quot; flashvars=&quot;nid=27649474&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;false&quot; bgcolor=&quot;#ffffff&quot; width=&quot;400&quot; height=&quot;80&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot;&gt;&lt;/embed&gt;
						&lt;/div&gt;&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/194&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/프로그래밍&quot;&gt;프로그래밍&lt;/a&gt;&amp;nbsp;&gt;&amp;nbsp;&lt;a href=&quot;/category/프로그래밍/MinGW&quot;&gt;MinGW&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/194&quot; &gt;MEncoder MinGW 빌드&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/182&quot; &gt;MinGW 64 비트 윈도우 실행 파일 빌드&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/174&quot; &gt;MinGW에서 liba52 build&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/173&quot; &gt;MinGW에서 libfaac 설치&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/153&quot; &gt;Install libogg, libvorbis and libtheora with MinGW&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/11/04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/141&quot; &gt;MinGW 설치하기&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/08/05&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>MinGW</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/194</guid>
			<comments>http://ryulib.tistory.com/194#entry194comment</comments>
			<pubDate>Tue, 03 Apr 2012 22:14:23 +0900</pubDate>
		</item>
		<item>
			<title>비트 모아 기가 바이트</title>
			<link>http://ryulib.tistory.com/192</link>
			<description>통신 등에서는 조그만 데이터의 차이가 계속 쌓이면서 큰 차이를 만드는 경우가 종종 있습니다. &amp;nbsp;이런 경우 사용 할 수 있는 간단한 트릭을 소개하도록 하겠습니다. &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;우선 아래와 같이 불린을 구조체로 묶어서 보내는 경우를 생각해보겠습니다.&lt;br /&gt;
&lt;br /&gt;
[소스1]&lt;br /&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;type
  TPacket = packed record
    Data1 : boolean;
    Data2 : boolean;
    Data3 : boolean;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := IntToStr(SizeOf(TPacket));
end;
&lt;/pre&gt;



버턴을 클릭해보면 당연히 3바이트 크기임을 알 수가 있습니다. &amp;nbsp;하지만, true/false의 상태를 가지고 있기 때문에 1 바이트에 8개의 불린을 처리할 수가 있기 때문에 아래와 같이 표현 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
[소스 2]&lt;br /&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;type
  TPacket = packed record
    Data : byte;
  end;

function GetData(APacket:TPacket; AIndex:integer):boolean;
var
  BitMask : byte;
begin
  BitMask := 1;
  BitMask := BitMask shl AIndex;
  Result := (APacket.Data and BitMask) = BitMask;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := IntToStr(SizeOf(TPacket));
end;
&lt;/pre&gt;

이제 구조체의 크기는 1바이트로 줄었고, 최대 8개까지 불린 변수를 사용할 수 있게되었습니다. &amp;nbsp;SetData 함수는 일단 미뤄두기로 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
이제 이 넘을 좀 더 세련되게 바꿔 보도록 하겠습니다. &amp;nbsp;구조체에 메소드를 추가하는 것이 델파이 어느 버전에서부터인지 기억지 잘 안나는 군요. &amp;nbsp;오래된 버전을 사용하시는 분들은 &quot;packed record&quot;를 &quot;object&quot;로 바꿔서 사용하시기 바랍니다. &amp;nbsp;제가 도스 시절에 주로 사용하던 방법입니다. &amp;nbsp;구조체에 메소드를 추가한 타입이라고 생각하시면 됩니다. &amp;nbsp;다만, [소스 3]의 예제대로 사용하기에는 몇 가지 제약 사항이 있습니다.&lt;br /&gt;
&lt;br /&gt;
[소스 3]&lt;br /&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;type
  TPacket = packed record
  private
    FData : byte;
    function GetBooleans(AIndex: integer): boolean;
    procedure SetBooleans(AIndex: integer; const Value: boolean);
  public
    property Booleans[AIndex:integer] : boolean read GetBooleans write SetBooleans;
  end;

{ TPacket }

function TPacket.GetBooleans(AIndex: integer): boolean;
var
  BitMask : byte;
begin
  BitMask := 1;
  BitMask := BitMask shl AIndex;
  Result := (FData and BitMask) = BitMask;
end;

procedure TPacket.SetBooleans(AIndex: integer; const Value: boolean);
var
  BitMask : byte;
begin
  BitMask := 1;
  BitMask := BitMask shl AIndex;

  if Value then FData := FData or BitMask
  else FData := FData and (not BitMask);
end;
&lt;/pre&gt;

이제 데이터를 보관하는 변수를 캡슐화해서 안전하게 보관하였고, property를 통해서 필요한 인터페이스만 제공하도록 하였습니다. &amp;nbsp;그리고, 여전히 구조체의 크기는 1 바이트이기 때문에 해당 구조체를 소켓 등으로 주고 받는데에도 문제가 없습니다.&lt;br /&gt;
&lt;br /&gt;
저는 표현 범위가 byte, word, integer 등의 제한 범위 내에서만 사용 되면서 데이터의 크기를 줄여야 할 경우에 가끔 사용하는 방식입니다. &amp;nbsp;예를 들어 32 개수 미만의 열거형과 512 미만의 정수를 사용한다면, word 안에 집어 넣고도 몇 비트가 남게 될 것 입니다.&lt;br /&gt;
&lt;br /&gt;
[소스 4]는 제가 실무에서 사용했던 예 입니다. &amp;nbsp;word의 맨 앞의 비트는 불린 변수로 사용하고, 나머지는 정수 형태의 변수로 사용하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
[소스 4]&lt;br /&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;type
  THeader = packed record
  private
    FIndex : word;
    function GetHasKey: boolean;
    procedure SetHasKey(const Value: boolean);
    procedure SetFrameIndex(const Value: word);
    function GetFrameIndex: word;
  public
    property HasKey : boolean read GetHasKey write SetHasKey;
    property FrameIndex : word read GetFrameIndex write SetFrameIndex;
  end;

function THeader.GetFrameIndex: word;
begin
  Result := FIndex and $7FFF;
end;

function THeader.GetHasKey: boolean;
begin
  Result := (FIndex and $8000) = $8000;
end;

procedure THeader.SetFrameIndex(const Value: word);
begin
  FIndex := (FIndex and $8000) or Value;
end;

procedure THeader.SetHasKey(const Value: boolean);
begin
  if value then
    FIndex := FIndex or $8000
  else
    FIndex := FIndex and $7FFF;
end;
&lt;/pre&gt;

&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-192-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-192-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-192-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/192&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/프로그래밍&quot;&gt;프로그래밍&lt;/a&gt;&amp;nbsp;&gt;&amp;nbsp;&lt;a href=&quot;/category/프로그래밍/Delphi&quot;&gt;Delphi&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/198&quot; &gt;Record vs Object&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/192&quot; &gt;비트 모아 기가 바이트&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(3)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/03/26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/134&quot; &gt;변칙으로 사용하는 TDD&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/07/01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/131&quot; &gt;2008.03.29 - Flex &amp;amp; Delphi : 채팅 프로그램 만들기&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(2)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/06/02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/108&quot; &gt;Twitter API를 이용하여 메시지 전송하기&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(4)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/01/07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/88&quot; &gt;메소드 또는 함수의 interface 부분이 자주 변할 때&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(2)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/12/16&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>Delphi</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/192</guid>
			<comments>http://ryulib.tistory.com/192#entry192comment</comments>
			<pubDate>Mon, 26 Mar 2012 12:11:30 +0900</pubDate>
		</item>
		<item>
			<title>기초 분석 결과 보고서</title>
			<link>http://ryulib.tistory.com/191</link>
			<description>이번에 소개할 것은 제가 프리랜서로 프로젝트를 맡을 때 제일 처음 고객에게 보고하는 문서입니다. &amp;nbsp;학생 때부터 학교는 안가고 사업의 길에 뛰어 든 탓에 경력이 20년이 훌쩍 넘어 버렸고, 그 기간 동안 수 없이 수정 보안을 거쳤는데도 형편 없습니다. &amp;nbsp;초기의 복잡했던 형식에서 지속적으로 탈피해서 정말 필요하다는 것 이외에는 모두 간소화 하였습니다. &amp;nbsp;아무런 준비가 없는 분들에게 조금이라도 도움이 되길 바라며, 좋은 의견이 있으면 공유해 주셨으면 합니다. &lt;br /&gt;
&lt;br /&gt;저의 초기 문서 작업 형태는 제 동영상 강좌에 있습니다. &amp;nbsp;이 시기에는 도표를 남발하고, 규격화된 모양새를 갖추기 위해서 애를 썼었습니다. &amp;nbsp;지금은 문서를 꾸미기 보다, 쉽게 작성하고 눈에 들어오도록 간결화 하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;기초 분석 결과 보고서를 작성하는 이유&lt;/b&gt;는 고객의 의뢰를 수행하는데 &lt;b&gt;&quot;기간&quot;&lt;/b&gt;이 얼마나 걸리며, 어느 정도의 &lt;b&gt;&quot;비용&quot;&lt;/b&gt;이 필요한 지를 알리는 것 입니다. &amp;nbsp;그리고, 고객에게 이러한 예측이 얼마나 엉터리며, 프로젝트를 성공적으로 이끌기 위해서 서로 어떠한 협력과 원칙을 가지고 프로젝트에 임해야하는 지를 알리는 것이 가장 중요한 목표입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://ryulib.tistory.com/attachment/cfile9.uf@18064A394F6A8442215EC8.pdf&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/pdf.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; FF-Server.pdf&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://ryulib.tistory.com/attachment/cfile3.uf@152028344F6A845326F09F.pdf&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/pdf.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; EncodingServer.pdf&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;br /&gt;
사실 정확하게 정해진 형식을 따르지 않기 때문에 프로젝트 또는 의뢰자의 상황에 따라 내용이 크게 달라집니다. &amp;nbsp;하지만, 꼭 지키는 몇 가지 원칙이 있습니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;
&lt;li&gt;결론부터 작성한다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;기능위주의 요구사항을 정리한다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;비기능 요구사항 및 기타 중요한 이슈는 &quot;주요 이슈&quot;로 묶어서 정리한다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;일정 예측은 왜 엉터리가 될 수 밖에 없는 지 설명하고, 어떻게 대체해야 하는 지를 고객에게 설득한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;결론부터 작성한다&lt;/b&gt;&lt;br /&gt;
모든 보고서는 결론이 우선되어야 합니다. &amp;nbsp;기승전결은 흥미로운 소설을 읽을 때나 효과적이지, 보고서는 보고서의 목적이 무엇인지 핵심을 먼저 파악하고 상세한 내용을 읽어 갈 수 있도록 배려 해야 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;제일 골치 아픈 일정 예측&lt;/b&gt;&lt;br /&gt;
개발 의뢰를 맡을 때 가장 힘든 경우는 바로 고객이 밑도 끝도 없이 &quot;얼마나 걸려요? &amp;nbsp;얼마면 되요?&quot;&quot;라고 물어보는 경우입니다. &amp;nbsp;소프트웨어는 무형의 제품이기 때문에 아무리 노력해도 정확한 요구 수준을 파악하기는 어렵습니다. &amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;
&lt;li&gt;기간과 비용은 정확하게 예측 할 수 없습니다. &amp;nbsp;언제 단 한 번이라도 프로젝트가 예상대로 끝난 적이 있었습니까? &amp;nbsp;따라서, 개발을 진행하는 동안&amp;nbsp;예측이 얼마나 지켜졌는 지 또는 벗어났는 지를 보고하고, 심각한 경우 원인과 함께 대안을 제시합니다
&lt;/li&gt;
&lt;li&gt;&quot;우리의 요구사항은 이게 전부에요!&quot;, &quot;우리의 요구사항은 정말 간단해요!&quot;, &quot;바뀌더라도 상식적인 범위를 벗어나지 않을 겁니다&quot; &amp;nbsp;이렇게 도발하는 고객을, 근거와 함께 논리적으로 설득할 수 있어야 합니다.&amp;nbsp;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;개발해야 할 시스템이 제공해야 할 기능 목록이 준비되어야 합니다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;필수 비기능 요구사항들이 빠짐없이 분석되어야 합니다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;요구사항이 변하면 비용과 기간이 증가하거나 덜 중요한 요구사항을 포기해야 합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;우리의 요구사항은 이게 전부에요&lt;/b&gt;&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;
&lt;li&gt;고객이 생각하지 못한 배경조건을 찾아내거나, 필요할 거 같지만 요구되지 않은 기능을 찾아낸다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;유사한 또는 보다 좋은 조건 그리고 좀 더 큰 기업의 의뢰에서 조차 초기 요구사항은 항상 변한다는 것을 증거로 제시한다.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;고객에게는 당연하지만 전혀 경험이 없는 외부인에게는 생소한 것들이 걸림돌이 된다는 점을 인지시킨다. &amp;nbsp;예를 들어 외국인들이 문화적 차이 때문에 황당한 상황에 빠지는 것에 비유한다. &amp;nbsp;개발자는 고객에게 외국인이 아니라 외계인임을 잊지 않도록 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;요구사항이&amp;nbsp;바뀌더라도 상식적인 범위를 벗어나지 않을 겁니다&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
고려된 적 없는 상식을 소프트웨어가 받아주지 않습니다. &amp;nbsp;상식이라고 할 수 있는 요구사항도 분석되지 않은 것들은 프로젝트를 위험에 빠트리게 됩니다. &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
집을 지을 때, 전등 정도를 다른 것으로 바꿔 다는 것은 그렇게 어렵지 않을 수 있지만, 크게 문제될 거 같지 않은 던 파이프 하나를 빼트려 먹으면 콘크리트를 허물고 다시 뭍어야 합니다. &amp;nbsp;이미 굳어 버린 콘크리트 속에 파이프를 집어 넣을 수는 없습니다. &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
마찬가지로 요구사항 자체의 중요도와 상관없이, 변화된 요구사항이 프로그램의 내부에 배치되어 있다면, 프로젝트 전체를 위협하게 됩니다. &amp;nbsp;간단한 문제지만 간단하게 처리할 수 없는 것들은 항상 발생합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;일단 러프하게 좀 알려주세요&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
절대 안됩니다. &amp;nbsp;그것은 눈 감고 그림이 대충 얼마나 아름다운지 알려달라는 것과 같습니다. &amp;nbsp;저는 &quot;기초 분석 결과 보고서&quot;를 작성할 수 있을 정도의 활동 이전에는 대충이라도 비용이나 기간을 알려드리지 않습니다. &amp;nbsp;가방 하나 사려고 해도 수 천원에서 수 백만원이 넘는 것들이 있듯이, 프로젝트 개발의 비용과 기간은 전적으로 고객님의 요구사항에 달려 있습니다.&lt;br /&gt;
&lt;br /&gt;
그리고, 일단 얼굴 도장을 찍고, 고객에게 호객 행위를 할 수 있는 기회를 놓쳐서는 안됩니다 ㅡ.ㅡ;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;끝으로&lt;/b&gt;&lt;br /&gt;
하고 싶은 말은 정말 많았지만, 바쁜 일정 속에 살다보니 두서 없는 글이 되어 버려 아쉽습니다. &amp;nbsp;&quot;시작은 반이다&quot;라는 말처럼 처음 활동이 상당히 중요하긴 합니다. &amp;nbsp;그러나, 맡은 프로젝트를 끝까지 책임지고 완수하는 것만큼 중요한 것은 없습니다. &amp;nbsp;그러다 보면, 단골 고객이 생기고, 고객이 고객을 소개시켜주기 시작합니다. &amp;nbsp;시간이 흘러도 단골이 생기지 않고, 고객이 고객을 소개 시켜주지 않으면 자신에게 정말 심각한 문제가 있다는 것을 알아야 합니다.&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-191-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-191-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-191-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/191&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/소프트웨어%20공학&quot;&gt;소프트웨어 공학&lt;/a&gt;&amp;nbsp;&gt;&amp;nbsp;&lt;a href=&quot;/category/소프트웨어%20공학/Method-R&quot;&gt;Method-R&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/191&quot; &gt;기초 분석 결과 보고서&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(1)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/03/22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/160&quot; &gt;기초 분석 결과 보고&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(4)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/11/25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/135&quot; &gt;분할 정복에 대한 예제 #1&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(5)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2011/07/05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/54&quot; &gt;동영상 플래이어 만들기 #1&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/09/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/50&quot; &gt;Quick Snap Framework 소개&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(3)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/09/01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/47&quot; &gt;Database Application 구축 프로세스&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2010/08/19&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>Method-R</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/191</guid>
			<comments>http://ryulib.tistory.com/191#entry191comment</comments>
			<pubDate>Thu, 22 Mar 2012 11:51:13 +0900</pubDate>
		</item>
		<item>
			<title>미디어 서버 구축 프로젝트</title>
			<link>http://ryulib.tistory.com/189</link>
			<description>&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;
&lt;li&gt;서버: 델파이&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;클라이언트: &quot;안드로이드 + ffmpeg&quot; or &quot;MS-Windows + ffmpeg&quot;&lt;br /&gt;
&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
어제 1차 개발일정을 마치고 프로젝트를 간략하게 정리해 봅니다. &amp;nbsp;모든 프로젝트를 정리해야지 하면서도 잘 안되는 군요 ^^;&lt;br /&gt;
&lt;br /&gt;
이미 상용 미디어 서버가 시장을 장악한 상황에서 미디어 서버를 직접 개발하게 된 이유는 다음과 같습니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;
&lt;li&gt;실시간 방송 중 광고 송출&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;VOD 방송 중 배속 재생 등을 지원하는 미디어 서버 및 클라이언트 개발&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;VOD 방송 중 광고 송출&lt;/li&gt;
&lt;li&gt;통신사에서 RTSP를 막아버리고 있는 가 봅니다. &amp;nbsp;이것도 하나의 개발 이유&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
제 다른 포스트에서도 썼던 기억이 있지만, 현재 미디어 서버에서 제공하는 배속은 제약사항 때문에 고객의 니즈를 만족시키지 못하여, 직접 제작을 의뢰 받아서 제작 중 입니다.&lt;br /&gt;
&lt;br /&gt;
아래는 실시간 방송 모듈 테스트 화면, 의뢰 받은 XX일보의 실시간 골프 방송입니다. &amp;nbsp;원본 영상의 해상도는 640*480 입니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;

&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/3jIvFslA_Ws&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;서버의 Class Diagram&lt;/b&gt;&lt;br /&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile1.uf.tistory.com/original/147D5A334F4D42FD02098A&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/147D5A334F4D42FD02098A&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;cfile1.uf@147D5A334F4D42FD02098A.png&quot; height=&quot;516&quot; width=&quot;600&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;[그림 1]&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;&lt;li&gt;&lt;div&gt;
FFServer: 미디어 서버 클래스&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
FFConnection: 사용자의 컨넥션을 관리&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
MediaSourceList: 미디어서버를 통해 배포할 동영상의 소스&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
PackageBuffer: 동영상의 프레임 정보를 묶어서 관리&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
Package: 프레임의 묶음&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
기타 클래스는 도면에서 생략하였음&lt;/div&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;클라이언트의 Class Diagram&lt;/b&gt;&lt;br /&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile2.uf.tistory.com/original/11795E334F4D43630B509D&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile2.uf.tistory.com/image/11795E334F4D43630B509D&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;2.png&quot; height=&quot;582&quot; width=&quot;630&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;[그림 2]&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;&lt;li&gt;&lt;div&gt;
FFClient: 미디어 서버에 접속하여 동영상을 재상하는 클래스&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
State관련 클래스들: 클라이언트의 State Diagram 참고&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
StreamPlayer: 서버로부터 전송 받은 동영상 정보를 재생하는 클래스&lt;/div&gt;
&lt;/li&gt;&lt;li&gt;&lt;div&gt;
기타 클래스는 도면에서 생략하였음&lt;/div&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;클라이언트의 State Diagram&lt;/b&gt;&lt;br /&gt;
&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile23.uf.tistory.com/original/151B44394F4D43BA232C44&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile23.uf.tistory.com/image/151B44394F4D43BA232C44&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;3.png&quot; height=&quot;455&quot; width=&quot;630&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;[그림 3]&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;&lt;li&gt;스마트폰의 특성상 네트워크가 불안정해질 수 있기 때문에 의도하지 않게 접속이 끊어졌을 경우에는 재접속하여 재생을 계속 이어가도록 했습니다.&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-189-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-189-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-189-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/189&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/프로젝트&quot;&gt;프로젝트&lt;/a&gt;&amp;nbsp;&gt;&amp;nbsp;&lt;a href=&quot;/category/프로젝트/기타%20프로젝트&quot;&gt;기타 프로젝트&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/189&quot; &gt;미디어 서버 구축 프로젝트&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/29&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>기타 프로젝트</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/189</guid>
			<comments>http://ryulib.tistory.com/189#entry189comment</comments>
			<pubDate>Wed, 29 Feb 2012 06:17:25 +0900</pubDate>
		</item>
		<item>
			<title>Tron 게임</title>
			<link>http://ryulib.tistory.com/187</link>
			<description>&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://cfile6.uf.tistory.com/original/123E6D464F3D822C03AF82&quot; rel=&quot;lightbox&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://cfile6.uf.tistory.com/image/123E6D464F3D822C03AF82&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;tron_game3.jpg&quot; height=&quot;240&quot; width=&quot;275&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;br /&gt;초등학교 때였던가? &amp;nbsp;이게 영화가 있는 것도 모르고, 게임에 빠져들었던 적이 있었는데, PC에서 실행할 수 있는 프로그램이 있어서 올려봅니다.&lt;br /&gt;
&lt;br /&gt;&lt;p style=&quot;margin:0&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://ryulib.tistory.com/attachment/cfile2.uf@1363653D4F3D826A09EB3F.zip&quot;&gt;&lt;img src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Tron.zip&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;br /&gt;기억이 참 새롭네요 ^^*&lt;br /&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-187-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-187-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-187-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/187&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/etc&quot;&gt;etc&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/196&quot; &gt;TED - 8가지 성공의 비결&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/04/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/190&quot; &gt;Use the Magic Trackpad with your Windows PC&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/03/06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/187&quot; &gt;Tron 게임&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/186&quot; &gt;퍼포먼스를 위한 발악&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(2)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/181&quot; &gt;LED Display&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/179&quot; &gt;SoundTouch 버그 수정&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>etc</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/187</guid>
			<comments>http://ryulib.tistory.com/187#entry187comment</comments>
			<pubDate>Fri, 17 Feb 2012 07:26:24 +0900</pubDate>
		</item>
		<item>
			<title>퍼포먼스를 위한 발악</title>
			<link>http://ryulib.tistory.com/186</link>
			<description>오래 전부터 습관이 된 탓에 and 조건을 분별할 때에는 항상 확률이 낮은 것부터 나열하도록 신경을 쓰고 있었습니다. &amp;nbsp;그러다가, 요즘 PC에서 그런 것이 과연 얼마나 퍼포먼스 향상에 도움이 될 까 궁굼해 졌습니다. &amp;nbsp;바로 테스트에 들어 갔습니다.&lt;br /&gt;
&lt;br /&gt;
[소스 1]&lt;br /&gt;

&lt;pre name=&quot;code&quot; class=&quot;brush: delphi;  highlight: []; toolbar: false;&quot;&gt;procedure TForm1.Button1Click(Sender: TObject);
var
  Tick : Cardinal;
  Loop, a, b : integer;
begin
  Tick := GetTickCount;

  for Loop := 1 to 100000000 do begin
      a := Random(2);
      b := Random(100);
//      if (a = 1) and (b = 1) then Tag := Tag + 1;
      if (b = 1) and (a = 1) then Tag := Tag + 1;
  end;

  Caption := IntToStr(GetTickCount - Tick);
end;
&lt;/pre&gt;11: 라인과 12: 라인이 오늘의 주인공입니다. &amp;nbsp;결과적으로 똑같은 두 문장의 속도 차이는 아래와 같습니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc; &quot;&gt;
&lt;li&gt;11: 라인 평균 1200 ms 정도&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;12:&amp;nbsp;라인 평균 730 ms 정도&lt;/li&gt;
&lt;/ul&gt;
and 문장에서는 앞에서 false가 판별되었을 경우 다음 조건을 검사하지 않기 때문에 확률이 낮은 것을 먼저 분별하면 성능에 도움이 됩니다. &amp;nbsp;or 에서는 반대로 확률이 높은 것부터 나열하는 것이 조금이나마 이득이 됩니다.&lt;br /&gt;
&lt;br /&gt;
근래에는 PC의 성능이 워낙에 좋아졌기 때문에 일반적인 경우 퍼포먼스에 대한 고민을 많이 할 필요가 없었졌습니다. &amp;nbsp;하지만, 스마트폰, 게임 및 증권 시스템 트레이딩과 같이 반복 계산이 많은 프로젝트 등에서는 이런 작은 차이들이 엄청난 결과를 만들어 내기도 합니다.&lt;br /&gt;
&lt;br /&gt;그렇긴 해도 반복 횟수를 감안하면 상당한 뻘짓이네요 ^^;&amp;nbsp;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-186-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-186-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-186-2&quot; class=&quot;entry-ccl-nd&quot; src=&quot;http://i1.daumcdn.net/cfs.tistory/v/0/static/admin/editor/ccl_black03.png&quot; alt=&quot;변경 금지&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-nd/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align:center; padding-top:10px;&quot;&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?href=ryulib.tistory.com/186&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=310&amp;amp;action=like&amp;amp;font=tahoma&amp;amp;colorscheme=light&amp;amp;height=65&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:310px; height:65px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;another_category another_category_color_gray&quot;&gt;
&lt;h4&gt;'&lt;a href=&quot;/category/etc&quot;&gt;etc&lt;/a&gt;' 카테고리의 다른 글&lt;/h4&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/190&quot; &gt;Use the Magic Trackpad with your Windows PC&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/03/06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/187&quot; &gt;Tron 게임&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/186&quot; &gt;퍼포먼스를 위한 발악&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(2)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/02/11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/181&quot; &gt;LED Display&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/179&quot; &gt;SoundTouch 버그 수정&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;a href=&quot;/175&quot; &gt;아들 넘의 첫 번 째 게임 - 홀짝 맞추기&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;(0)&lt;/span&gt;
&lt;/th&gt;
&lt;td&gt;
2012/01/17&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</description>
			<category>etc</category>
			<author>류종택</author>
			<guid>http://ryulib.tistory.com/186</guid>
			<comments>http://ryulib.tistory.com/186#entry186comment</comments>
			<pubDate>Sat, 11 Feb 2012 23:52:25 +0900</pubDate>
		</item>
	</channel>
</rss>
