<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt (info@mypapit.net)" -->
<rss version="2.0">
    <channel>
        <title>삼성전자 소프트웨어 멤버십</title>
        <description>삼성전자 소프트웨어 멤버십 테크노트</description>
        <link>http://www.swssm.org/feed</link>
        <lastBuildDate>Mon, 06 Sep 2010 14:58:24 +0900</lastBuildDate>
        <generator>FeedCreator 1.7.2-ppt (info@mypapit.net)</generator>
        <image>
            <url>http://www.swssm.org/images/logo.png</url>
            <title>swssm.org logo</title>
            <link>http://www.swssm.org</link>
            <description><![CDATA[Feed provided by swssm.org Click to visit.]]></description>
        </image>
        <item>
            <title>IIC (Inter Intergrated Circuit)  Bus Interface</title>
            <link>http://www.swssm.org/index.php?idx=398</link>
            <description>&lt;p&gt;
	&lt;strong&gt;I&lt;sup&gt;2&lt;/sup&gt;C Bus Interface&lt;br /&gt;
	&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;
	1. I&lt;sup&gt;2&lt;/sup&gt;C, I2C(IIC) Bus Interface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	IIC(Inter Intergrated Circuit)은 Philips(현 NXP) 사가 제안한 통신 프로토콜입니다.&lt;/p&gt;
&lt;p&gt;
	간혹 &amp;quot;eye-two-see&amp;quot;로 읽는 경우가 있는데 이 통신 프로토콜은&amp;nbsp; &amp;quot;eye-squared-see&amp;quot; 로 읽는 것이 정식 명칭 입니다.&lt;br /&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	간단히 말해 통신방식의 하나로서, 주로 주변장치(Peripheral)와 통신/제어 용으로 많이 사용합니다.&lt;br /&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	SCLK, SDATA 두개의 line을 사용하는 동기식 직렬통신(Synchoronous Serial Communication)의 하나입니다.&lt;br /&gt;
	&lt;br /&gt;
	&lt;strong&gt;2. 기본적인 구성 및 통신 방식&lt;/strong&gt;&amp;nbsp;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; * 기본적인 구성&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - SCL : Serial Clock&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - SDA : Serial Data&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 이 두 SCL, SDA로 Send, Recieve를 모두 수행합니다.&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; *&amp;nbsp; Transferring bit/bytes&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; * 기본적인 특징 및 통신 방식&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Master Slave Relationship&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;모든 I2C 장치들은 Master와 Slave간의 통신입니다.&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 사실 이둘을 어떻게 구분하느냐는 것은 간단히 Clock generation을 누가 하느냐라고 보면 됩니다.&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Single Master, Multiple Slave&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 하나의 Master에 여러개의 Slave가 연결될 수 있습니다.&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이런 특징과 더불어 Slave&amp;nbsp;device는 device고유의 Slave address를 가지고 이를 통해 각각의 Slave와 통신합니다.&lt;br /&gt;
	&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Communication Protocol&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ▷ Slave Address를 지정&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ▷ I2C의 구성에서 보듯이 Read/Write에 대한 전용 line이 없고&amp;nbsp;통신 프로토콜 상에서&amp;nbsp;Read/Write를 결정.&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ▷&amp;nbsp;ACK(Acknowledgement),&amp;nbsp;NACK(Non-Acknowledgement)&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Slave Address][R/W][NACK/ACK]&amp;nbsp; [DATA][NACK/ACK]&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/제목 없음.jpg&quot; style=&quot;width: 856px; height: 871px;&quot; /&gt;&lt;strong&gt;3. 이종 전압간 통신&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	IIC 통신은 이종 전압간 통신시 level shifter 가 꼭 있어야 에러가 안납니다. level shifter는 아래회로와 같이 FET와 풀업 저항을 통해 간단히 구현할 수 있습니다.&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/I2C.jpg&quot; style=&quot;width: 730px; height: 243px;&quot; /&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Tue, 10 Aug 2010 01:58:03 +0900</pubDate>
        </item>
        <item>
            <title>[고스트체스왕] Embedded Board 와 Device Board 의 통신 포맷 </title>
            <link>http://www.swssm.org/index.php?idx=397</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;
	&amp;nbsp;고스트체스왕의 하드웨어 구조는 임베디드보드에서 디바이스에 좌표값을 전송하여 기물이 이동하게 된다.&lt;/h3&gt;
&lt;h3&gt;
	디바이스에서는 센서값을 임베디드보드로 전송하여 기물의 위치를 감지하게 된다.&lt;/h3&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/K-1325.jpg&quot; style=&quot;border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; width: 400px; height: 200px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;
	&lt;strong&gt;1. Embedded Board -&amp;gt; Device Board&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/K-115.jpg&quot; style=&quot;border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; width: 732px; height: 514px; &quot; /&gt;&lt;/p&gt;
&lt;h3&gt;
	ex)&amp;nbsp;$D6131125003001780035501125003001780035501125003001780035501*&lt;/h3&gt;
&lt;p&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;START, MODE, Count, Parity1, Parity2, Parity3, X좌표, Y좌표 ... X좌표, Y좌표, 자석컨트롤, END&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;
	&lt;strong&gt;2. Device Board -&amp;gt;&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;Embedded Board&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/K-114.jpg&quot; style=&quot;border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; width: 711px; height: 276px; &quot; /&gt;&lt;/p&gt;
&lt;h3&gt;
	ex) $D0000000000*&lt;/h3&gt;
&lt;p&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;START, MODE, Reed1, Reed2 ... Reed10, END&lt;/p&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Tue, 27 Jul 2010 09:04:38 +0900</pubDate>
        </item>
        <item>
            <title>[고스트 체스왕] 컨트롤 회로도 &amp; 센서보드</title>
            <link>http://www.swssm.org/index.php?idx=395</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;1. 메인보드 회로도&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/K-105(1).jpg&quot; style=&quot;width: 800px; height: 567px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;메인보드의 역활은 스탭모터 제어와 센서보드 SCAN이 주 기능이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	스탭모터 드라이브로는 L298을 사용하여 스탭모터를 제어 한다. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;2. 센서보드 회로도&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/K-101(1).jpg&quot; style=&quot;width: 800px; height: 566px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;자석 감지를 위하여 리드 센서를 사용하였다.&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 15 Jul 2010 15:22:10 +0900</pubDate>
        </item>
        <item>
            <title>UAV 서브보드 회로도 및 Layout</title>
            <link>http://www.swssm.org/index.php?idx=394</link>
            <description>&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/회로도.JPG&quot; style=&quot;width: 720px; height: 506px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	- &amp;gt; Atmega128 메인도면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/회로도2.JPG&quot; style=&quot;width: 720px; height: 532px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	-&amp;gt;서브보드 전원부&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	서브보드는 DSP와의 UART통신을 통하여 UAV의 모든 모터를 제어하고, 배터리를 체크하는데 사용된다. DSP하나의 모든 기능을 다 수행한다면 효율면에서 떨어지기 때문에, 모터제어를 Atmega128을 통해서 하게된다.&lt;/p&gt;
&lt;p&gt;
	회로도를 통하여 서브보드 Artwork 작업을 실시 하였고, 이는 아래 사진을 통하여 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/Layout.JPG&quot; style=&quot;width: 463px; height: 436px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	다음과 같이 Layout을 만들었다.&amp;nbsp;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jul 2010 19:28:12 +0900</pubDate>
        </item>
        <item>
            <title>5개의 점에 가장 근접한 원의 방정식 찾기</title>
            <link>http://www.swssm.org/index.php?idx=393</link>
            <description>&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/4.png&quot; style=&quot;width: 744px; height: 326px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp; 로봇의 이동경로를 결정 짓기 위해서5개의 점에 가장 근접하기 위한 원의 방정식을 찾으면, 로봇은 원 궤도 위에서는 일정한 좌,우측 모터 사이의 비율을 유지하게 된다. 로봇을 조종하기 위해서는 원 궤도가 시작점과 끝점을 지나는 것이 좋다. 이 조건을 만족하기 위해서는 원 궤도의 중심은 시작점과 끝점의 수직이등분선 위에 있어야 한다. 시작점이 (x&lt;sub&gt;1&lt;/sub&gt;,y&lt;sub&gt;1&lt;/sub&gt;)이고, 끝점이 (x&lt;sub&gt;5&lt;/sub&gt;,y&lt;sub&gt;5&lt;/sub&gt;)라면 두 점의 수직이등분선은 다음과 같은 식으로 주어진다.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/1.png&quot; style=&quot;width: 227px; height: 46px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	그리고, 시작점과 끝점 사이에 세 개의 점이 있다고 할 때, 세 점이 원 궤도에서 벗어나는 오차는 다음과 같은 식으로 표현할 수 있다. 세 점은 각각&amp;nbsp;&amp;nbsp;(x&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;2&lt;/font&gt;&lt;/sub&gt;,y&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;2&lt;/font&gt;&lt;/sub&gt;),&amp;nbsp;(x&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;3&lt;/font&gt;&lt;/sub&gt;,y&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;3&lt;/font&gt;&lt;/sub&gt;),&amp;nbsp;(x&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;4&lt;/font&gt;&lt;/sub&gt;,y&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;4&lt;/font&gt;&lt;/sub&gt;)이다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/2.png&quot; style=&quot;width: 611px; height: 44px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	x&lt;sub&gt;5&lt;/sub&gt;, y&lt;sub&gt;5&lt;/sub&gt;대신에 x&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;1&lt;/font&gt;&lt;/sub&gt;, y&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;1&lt;/font&gt;&lt;/sub&gt;&lt;font size=&quot;2&quot;&gt;을&amp;nbsp;사용하여도 결과는 같다. 이제 이 오차가0에 가장 가까울 조건, 다시 말해 위 오차 식의 절대값이 최소값을 가질 때의 x,y값의 찾는다면 그 x,y값은 원 궤도의 중심이 된다. 이렇게 찾은 원 궤도의 중심은 처음의 조건 시작점과 끝점을 지나며, 오차가 가장 작은 원 궤도의 중심이 된다. 이 원 궤도가 가지는 반지름은 중심에서 시작점 (x&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;1&lt;/font&gt;&lt;/sub&gt;,y&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;1&lt;/font&gt;&lt;/sub&gt;)까지의 거리 혹은 중심에서 끝점&amp;nbsp;(x&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;5&lt;/font&gt;&lt;/sub&gt;,y&lt;sub&gt;&lt;font size=&quot;2&quot;&gt;5&lt;/font&gt;&lt;/sub&gt;)까지의 거리가 된다.&lt;/font&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
	&lt;font size=&quot;2&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/3.png&quot; style=&quot;width: 451px; height: 22px&quot; /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;font size=&quot;2&quot;&gt;위&amp;nbsp;그래프들은 위 방법을 이용해서 구해본 몇 가지 원 궤도의 예이다.&lt;/font&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Wed, 30 Jun 2010 13:51:51 +0900</pubDate>
        </item>
        <item>
            <title>안드로이드 IME</title>
            <link>http://www.swssm.org/index.php?idx=391</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;font-family: Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); &quot;&gt;
	&lt;p style=&quot;text-align: center; &quot;&gt;
		IME(input method manager)&lt;/p&gt;
	&lt;p&gt;
		1. IME elements&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/visual elements.jpg&quot; style=&quot;width: 508px; height: 285px; &quot; /&gt;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;visual elements 로는 사용자가 단어를 입력할때 자동완성 기능을 제공해주는 candidate view,&lt;/p&gt;
	&lt;p&gt;
		키가 올라가있는 InputView ,&lt;/p&gt;
	&lt;p&gt;
		키를 누르면 현재 입력된 키가 어떤것인지를 보여주는 Bubble이 있습니다.&lt;/p&gt;
	&lt;p&gt;
		안드로이드에서는 이 모든 요소들을 개발자가 선택적으로 사용할 수 있게 제공하여줍니다.&lt;/p&gt;
	&lt;p&gt;
		또한 Keyboard Settings에서는 키보드에 대한 설정을 사용자가 선택할 수 있습니다.&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/keyboard.jpg&quot; style=&quot;width: 641px; height: 766px; &quot; /&gt;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&amp;nbsp; - 안드로이드에서는 기본적으로 3가지의 기본 키보드를 제공하여 줍니다.&lt;/p&gt;
	&lt;p&gt;
		Android Keyboard (Latin Keyboard), Japanese, Chinese 이렇게 세가지를 제공하여 주는데 아쉽게도&lt;/p&gt;
	&lt;p&gt;
		한글키보드는 추가 개발하여 설치를 하거나 다운을 받아서 설치하여야 합니다.&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/predict.jpg&quot; style=&quot;width: 573px; height: 285px; &quot; /&gt;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		-키보드의 기능에는 Predict, Suffestion, Auto correction이 있습니다&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&amp;nbsp; &amp;nbsp;Predict : 현재 선택한 단어 다음을 미리 예측해서 제시&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&amp;nbsp; &amp;nbsp;Suggestion : 입력중인 문자를 기반으로 단어를 추천&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&amp;nbsp; &amp;nbsp;Auto correction : 추천 단어중 사용자가 키보드를 잘못 누른 상황에 대비하여 추천단어중 추천&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/dictionary.jpg&quot; style=&quot;width: 576px; height: 424px; &quot; /&gt;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		또한 dictionary를 지원하여 주는데&lt;/p&gt;
	&lt;p&gt;
		기본 User Dictionary는 ContentResolver를 이용. 추가로 PreDefine 된 Raw Data resource를 이용할수도 있습니다.&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
	&lt;p&gt;
		&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Tue, 22 Jun 2010 07:29:37 +0900</pubDate>
        </item>
        <item>
            <title>제스처 입력 - 주요 알고리즘</title>
            <link>http://www.swssm.org/index.php?idx=390</link>
            <description>&lt;p&gt;
	본 시스템에서 제스처를 입력 할 시 그 데이터를 알기위하여 필요한 값은 크게 3가지, 시점, 종점, 체크타임 으로 구성된다.&lt;/p&gt;
&lt;p&gt;
	위의 3가지만 올바른 값을 알 수 있다면 방향에 따른 제스처의 분석은 간단하게 해결 할 수 있다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	(1) 제스처 입력 알고리즘 기술&lt;/p&gt;
&lt;p&gt;
	시점을 중심으로 종점까지의 기준방향에 대한 각도를 구하여 현재 방향을 체크하게 되는데, 여기서 기준방향이라는 것은 플랫폼에 따라 다르다.&lt;/p&gt;
&lt;p&gt;
	Vs C++은 스크린 오른쪽방향, 즉 +X방향이 기준방향으로 설정이 되어있고 개발중인 본 안드로이드(Java)에서는 기준방향이 -X방향으로 설정되어있기 때문에 각도를 이용한 제스처 구현시 주의하여야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/technote-gesture.png&quot; style=&quot;width: 438px; height: 226px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	입력 완료한 후 체킹하는 방식이 아닌 입력도중에 체크하는 방식을 구현하기 위해서 ( 중간 체크타임을 얻고자 하는 방법&amp;nbsp;) 실시간으로 이미 입력된이전의 Point들과의 각도의 변화량을 계산한다. 이 순간의 변화량이 지정한 크기를 벗어나게 되면 하나의 체크타임으로 설정이 되는데,팬을 이용하는것이 아닌 손가락으로 제스처를 입력하게 되므로 바로 이전점을 시점으로 잡고 계산을 하게되면 변화량의 값이 의도하지 않게 크게나오는 경우가 많다.&lt;/p&gt;
&lt;p&gt;
	이&amp;nbsp;때문에 입력 배열의 바로 앞지점이 아닌 어느정도의 거리를 둔 점을 시점으로 두고 계산하여야한다.&lt;/p&gt;
&lt;p&gt;
	( 개발중인 시스템의 FPS를 참고하여 어느정도의 거리를 앞으로 두고 계산할 것인지를 지정하여야 올바른 값을 얻을수 있다. )&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	(2) 각도값&lt;/p&gt;
&lt;p&gt;
	각도값은 Point의 위치값으로부터 구하게 되는데 DotProduct를 이용하여 구할 수 있으며,&amp;nbsp;같은방법으로 Arccos를 이용하여서도 구할 수 있다.&lt;/p&gt;
&lt;p&gt;
	이때 유의할 사항은 Cos그래프를 살펴보게 되면 알 수 있는데 이는 x와 y의 대응이 1:1로 이루어 지지 않기때문에 경우를 구분해 주어야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
	&lt;img alt=&quot;cos graph&quot; src=&quot;/ckfinder/userfiles/images/technote.png&quot; style=&quot;width: 333px; height: 144px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 10 Jun 2010 18:31:34 +0900</pubDate>
        </item>
        <item>
            <title>.NET Framework Generic Type에 관하여...</title>
            <link>http://www.swssm.org/index.php?idx=389</link>
            <description>&lt;p&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;박싱(Boxing)과 언박싱(UnBoxing)&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;데이터 타입의 종류는 여러가지가 있지만 크게는 값 타입과 참조 타입이라는 두개의 카테고리로 구분됨.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;이 두 카테고리에 속한 데이터 타입간의 형변환은 박싱과 언박싱이 발생하게 되는데 박싱은 값 타입을 참조 타입을 변환하는 것을 말하고 언 박싱은 박싱의 반대로 참조 타입을 값 타입으로 것을 의미한다&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;즉, 참조 타입과 값 타입을 사용하기 편리하게 분리하여 담는다고 할 때 참조 타입은 박스 안에 담고 값 타입은 박스에 담지 않은 채 옆에 쌓아 둔다고 가정을 하면, 이럴 경우 값 타입도 박스에 저장할 필요가&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;생겨서 박스에 담을 경우 이것을 박싱이라고 하고 박스에 담겨 있는 값 타입을 다시 박스 밖으로 꺼내는 것을 언박싱이라고 하면 이 둘을 구분짓는데 조금 쉽다.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;strong&gt;박싱 (Boxing) : 값 -&amp;gt; 참조&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;strong&gt;언박싱 (UnBoxing) : 참조 -&amp;gt; 값&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;문제는 이 박싱 / 언박싱 과정에서 내부적으로는 많은 리소스를 소비한다.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;그렇기 때문에 불필요한 메모리 사용 및 어플리케이션의 성능 저하는 피할 수 없는 문제가 된다.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;그러나 .NetFramework 2.0버젼 이후는 제네릭이 추가됨에 따라 이 문제를 해결 할 수 있게 되었다.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;제네릭은 컬렉션에 저장되는 데이터의 타입을 미리 지정한다. 그리고 지정된 타입만 컬렉션에 저장됨으로써 박싱/언박싱이 발생하지 않는다.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;제네릭 형식 정의와 사용&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;//제네릭을 사용하기 위한 Using문 선언&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;using System.Collections.Generic&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;u&gt;&lt;strong&gt;&lt;span style=&quot;font-size:14px;&quot;&gt;1. Generic Class Type&lt;/span&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;u&gt;&lt;strong&gt;&lt;span style=&quot;font-size:14px;&quot;&gt;class GeneriClass&amp;lt;T&amp;gt; //이런식으로 클래스를 선언할때 Type의 약자인 T를 명시적으로 선언한다.&lt;/span&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;u&gt;&lt;strong&gt;&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;u&gt;&lt;strong&gt;&lt;span style=&quot;font-size:14px;&quot;&gt;2. Generic Method Type&lt;/span&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;u&gt;&lt;strong&gt;&lt;span style=&quot;font-size:14px;&quot;&gt;public T GenericMethod&amp;lt;T&amp;gt; (T arg) 이런식으로 메소드 선언시 타입을 지정&lt;/span&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;제네릭의 제한 사항과 제약 사항(Limitation and Constraint)&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;제한 사항 1. 제네릭이 적용되는 클레스는 ContextBoundObject로 부터 파생될 수 없다.&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	코드를 컴파일 할 시에는 오류를 발생하지 않으나 빌드 후 실행하여 보면 TypeLoadException 오류가 발생한다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	제한 사항 2. 열거형(enum)에 사용될 수 없다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	제한 사항 3. Reflection을 이용해서 생성되는 동적 메서드는 제네릭 형식을 취할 수 없다.&lt;/div&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Wed, 26 May 2010 17:17:30 +0900</pubDate>
        </item>
        <item>
            <title>로터리 엔코더 E30S4-1000을 이용한 각도 추출의 문제점 해결 ( UAV ...</title>
            <link>http://www.swssm.org/index.php?idx=388</link>
            <description>&lt;p&gt;
	이번 글에서는 로터리 엔코더의 오차를 해결하는 방법에 대해서 기술해 보겠습니다.&lt;/p&gt;
&lt;p&gt;
	저번 글에서 기술한 로터리 엔코더 E30S4-1000의 문제점은&amp;nbsp;&amp;nbsp;진동(좌-우 미세반복 운동)에 의한 글리치 발생이었습니다.&lt;/p&gt;
&lt;p&gt;
	이를 해결하는 방법은 E30S4-1000에 기본적으로 제공되는 Z 채널의 출력 펄스를 이용하는 것입니다.&lt;/p&gt;
&lt;p&gt;
	원래는 2가지 방법으로 문제에 접근했습니다.&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;1. verilog HDL을 이용한 Digital Logic을 추가해서 글리치를 제거하는 방법&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;2. z 채널의 출력 펄스로 값을 리셋 시키는 방법&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	입니다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	첫번째 방법은 다음과 같은 문제로 사용하지 않았습니다.&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;1. 출력 펄스의 듀티는 일정하지 않다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;2. 펄스의 듀티의 크기와 상관없이 글리치가 발생&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	직접 로직을 구현해서 위 문제를 해결하기에는 엔코더에서 발생하는 글리치는 아날로그 회로에서 생기는 그것과는 달리 기계적인 문제(슬릿의 움직임)의 경우의 수가 너무 많았습니다. 따라서 로직을 구현한다 하더라도 오히려 딜레이가 크게 생길 수 있을 것으로 보고 고려대상에서 제외하였습니다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	두번째 방법인 z 채널의 출력 펄스로 값을 리셋시키는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;1. 시작점 근처에 (0도) z 펄스의 출력이 나오는 엔코더 축의 한 면을 위치시킨다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;2. 장치에 전원이 들어오면 시스템을 리셋시킨 후 측정장치의 축을 -90도에서 +90로 1회 회전시켜 엔코더의 z 펄스가 나오는 위치를 카운트해서 저장한다&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;3. 이후에는 엔코더의 회전축이 z펄스 출력 위치로 오면 출력되는 카운트 값은 항상 리셋되어 저장된 z펄스 카운트 값으로 대체된다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	위 방법에는 물론 단점이 있습니다. 그 단점이란&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;1. 항상 z 펄스는 회전의 시작점(0도) 근처에 존재하도록 조정해 주어야 하고&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;2. z펄스 위치에 오기전에 약간의 오차가 발생할 수도 있습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	따라서 &lt;strong&gt;누적 오차를 줄이기 위해서는 z 펄스는 회전의 시작점 근처에 최대한 접근시키는게 유리하겠습니다&lt;/strong&gt;.&lt;br /&gt;
	&lt;br /&gt;
	엔코더는 정밀 측정장치 입니다.&lt;br /&gt;
	물론 약간의 오차는 있을 수 있겠지만 IMU의 출력 정보를 측정하고 비교하는데는 문제가 없을 정도의 정밀도를 가지고 있으므로 로터리 엔코더 E30S4-1000을 이용해서 절대 회전각을 추출하는것은 신뢰할 수 있다고 생각합니다.&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Tue, 04 May 2010 19:05:40 +0900</pubDate>
        </item>
        <item>
            <title>로터리 엔코더 E30S4-1000을 이용한 각도 추출의 문제점</title>
            <link>http://www.swssm.org/index.php?idx=387</link>
            <description>&lt;p&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;개발을 하다보면 로터리 엔코더를 이용해서 회전량 및 각도를 추출하는 경우가 있습니다.&lt;br /&gt;
	과제를 진행하다 IMU 측정장치에서 엔코더를 이용해서 회전각을 측정했습니다.&lt;br /&gt;
	&lt;br /&gt;
	기본 측정 방법은 엔코더의 정회전시 한 클럭에 1의 클럭을 가감하는 방법으로 각을 추출할 경우 정확한 회전각을 계산했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;로터리엔코더는 내부에 슬릿이 있고 정해진 규격에 의해서 슬릿에 홈이 파여있고, 광센서를 이용해서 홀의 수를 측정합니다.&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/pulse.JPG&quot; style=&quot;width: 555px; height: 176px; &quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;span style=&quot;font-size:14px;&quot;&gt;위 펄스는 1x encoder 카운터의 출력 신호입니다.&lt;br /&gt;
	정회전과 역회전 모두 정확한 클럭이 만들어진 상태에서 정회전 역회전이 이루어진 신호입니다.&lt;br /&gt;
	이 경우에는 정확한 각도 측정이 가능합니다. 하지만 아래의 펄스의 경우에는 문제가 좀 발생합니다.&lt;br /&gt;
	&lt;font class=&quot;Apple-style-span&quot; size=&quot;3&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 12px;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 14px;&quot;&gt;&lt;br /&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/pulse2.JPG&quot; style=&quot;width: 678px; height: 201px; &quot; /&gt;&lt;br /&gt;
	위 펄스 역시 1x encoder 카운터의 출력 신호입니다. 위 펄스는 엔코더의 회전축이 작은 진동(반복 운동)을 했음을 가정했습니다. CH_B의 작은 HIGH 신호는 CH_B의 절반보다 작다고 가정합니다.(속도가 빨라서 작게 생긴 펄스가 아닌 진동에 의해서 생긴 펄스라고 가정)&lt;br /&gt;
	&lt;br /&gt;
	출력을 분석해보면 CH_B의 진동에 의해서 DIR이 1인 경우에(정회전) 1의 클럭 상승만 있어야 하지만 위의 경우는 3개의 상승이 발생합니다. 즉, 실회전은 하지 않았는데 진동에 의해서 총 회전 거리를 측정한 것과 같습니다.&lt;br /&gt;
	&lt;br /&gt;
	반대로 CH_B의 진동에 의해 DIR이 0인 경우에(역회전) -1의 클럭 감소만 있어야 하지만 위의 경우는 3개의 감소가 발생합니다. 즉, 정회전과 같이 총 회전거리만 증가해서 생기는 오차입니다.&lt;br /&gt;
	&lt;br /&gt;
	위 문제는 다음 글에서 해결해 보도록 하겠습니다.&lt;br /&gt;
	&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
	&lt;/span&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Mon, 03 May 2010 14:07:43 +0900</pubDate>
        </item>
        <item>
            <title>ENCODER LOGIC DESIGN</title>
            <link>http://www.swssm.org/index.php?idx=386</link>
            <description>&lt;p&gt;
	CPLD를 이용한 엔코더 측정 회로를 설계한다.&lt;/p&gt;
&lt;p&gt;
	사용 언어는 Verilog HDL을 사용하고, 설계 Tool은 Xilinx ISE11을 사용한다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;엔코더 카운터를 설계하기 위해서 엔코더에 대해서 분석해보면 다음과 같다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;엔코더의 출력펄스는 A상, B상 두개가 출력된다.(Autonics Rotary Encoder는 3상이지만 Z상은 사용하지 않았다.) A상과 B상은 서로 90degree의 위상차를 가지고 출력된다. A상이 B상보다 먼저 On이 되면 모터는 정회전 상태에 있다고 판단하며, 반대로 B상이 A상보다 먼저 On 되면 모터는 역회전 상태에 있다고 판단한다. 4개의 인터페이스 회로는 엔코더의 출력 펄스를 이용하여 모터의 회전 방향과 회전할 때 출력되는 펄스의 개수를 세도록 만든다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;엔코더 카운터의 종류에는 여러가지가 있지만 이번에 사용한 방식은 상의 출력을 그대로 출력해주는 1X(1배) 일반 카운터이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;&amp;nbsp;1X Encoder counter&amp;nbsp;회로도&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/x1.JPG&quot; style=&quot;width: 400px; height: 222px; &quot; /&gt;&lt;/p&gt;
&lt;p&gt;
	1X 카운터는 1개의 D-FF와 2개의 상의 신호만 가지고 구성되는 간단한 로직이다. B상의 신호의 Positive Edge를 카운트하게 되며, 채널 A상과의 순서차이를 이용해서 방향을 결정한다.&lt;/p&gt;
&lt;p&gt;
	정회전시에는 (A상이 90도 빠를 때) DIR=1 이 되고, 역회전시에는 (B상이 90도 빠를 때) DIR=0이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	ISE11툴을 이용해서 설계할 때, Verilog HDL을 사용하지 않고, Schemetic 디자인 기능을 사용해서 FF와 Inverter를 로드해서 회로를 구성한다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Counter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;1X Encoder Counter에서 출력된 펄스를 카운트 하는 회로이다. 출력 값을 16bit Signed Integer로 만들어주기 위해서 Register를 16bit 크기로 할당하고 DIR 방향에 따라 증감하여 그 값을 출력한다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;module Counter(reset, en_in, en_out);&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;input reset;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;input en_in;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;output [15:0] en_out;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;&lt;br /&gt;
	&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;reg [15:0] count = 16&amp;#39;h0;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;&lt;br /&gt;
	&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;always@(negedge reset or posedge en_in)&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;begin&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;if (reset == 0)&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;count &amp;lt;= 16&amp;#39;h0;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;else&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;if (en_in == 1)&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;count &amp;lt;= count + 1;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;else&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;count &amp;lt;= count - 1;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;end&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;&lt;br /&gt;
	&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;assign en_out[15:0] = count[15:0];&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;&lt;br /&gt;
	&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
	&lt;strong&gt;endmodule&lt;/strong&gt;&lt;/div&gt;
&lt;div style=&quot;margin-left: 40px; &quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	위와 같이 verilog로 로직을 설계하면 된다. 최상위 비트(15)는 자연스럽게 sign bit로서 작용하게 된다.(CPLD 내부에서는 signed와 unsigned의 의미가 C와 달리 사용자가 의미를 부여하는 것에 달렸다. 즉, register로 선언된 저장 공간의 값은 데이터 형이 정해진 것이 아니라 신호 그 자체이다.)&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;strong&gt;Latch&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;1X Encoder Counter와 Pulse Counter에서 만들어진 데이터는 Atmega128에 바로 전송해서는 안된다. 그 값이 실시간으로 계속 변하기 때문에 특정 저장공간을 마련해 두어서 데이터 전송 도중에는 값의 변동이 없도록 유지해야 한다. 따라서 Latch가 필요하게 된다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;여기에서 설계된 Latch는 avr128에서 전송된 interrupt 신호를 받으면 저장되는 데이터의 값을 홀드시키고, interrupt 신호가 풀리면 pulse 카운터에서 만들어진 데이터로 실시간으로 업데이트한다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;여기에서 Latch는 Counter 에 종속적이지만 Counter는 독립적이어야 한다. 그 이유는 데이터를 processor에 전송하는 도중의 데이터 변화를 Latch가 막아서는 안되며 따로 로직에 의해 데이터가 축적되어야 하기 때문이다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;module enLatch(clk, reset, en_in, en_out);&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;input clk;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;input reset;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;input [15:0] en_in;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;output [15:0] en_out;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&lt;br /&gt;
		&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;reg [15:0] temp = 16&amp;#39;h0;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&lt;br /&gt;
		&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;always@(negedge clk or negedge reset)&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;begin&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;if(reset == 0)&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;temp &amp;lt;= temp;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;else&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&amp;nbsp;if(en_in != temp)&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&amp;nbsp;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;temp &amp;lt;= en_in;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&amp;nbsp;else&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&amp;nbsp; &amp;nbsp;temp &amp;lt;= temp;&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;end&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&lt;br /&gt;
		&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;assign en_out[15:0] = temp[15:0];&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&lt;br /&gt;
		&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;cke_pastebin&quot; style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;endmodule&lt;/strong&gt;&lt;/div&gt;
	&lt;div style=&quot;margin-left: 40px; &quot;&gt;
		&lt;strong&gt;&lt;br /&gt;
		&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	위 로직 회로들을 종합하면 아래와 같은 블럭도로 나타낼 수 있다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/counter.JPG&quot; style=&quot;width: 600px; height: 285px; &quot; /&gt;&lt;/div&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 15 Apr 2010 13:52:57 +0900</pubDate>
        </item>
        <item>
            <title>UAV 측정장비 회로도</title>
            <link>http://www.swssm.org/index.php?idx=385</link>
            <description>&lt;p&gt;
	&lt;strong&gt;Autonics Rotary Encoder&lt;/strong&gt;를 사용한 &lt;strong&gt;UAV 측정장비&lt;/strong&gt; 회로도이다.&lt;/p&gt;
&lt;p&gt;
	1000pulse/rotate 의 A/B 상을 이용한 회전량 측정이 가능한 정밀할 엔코더를 사용한다. 1pulse는 0.36degree이고, UAV 측정장비는 +-90degree를 측정 가능하게 설계되므로 측정되는 pulse 수는 +- 250pulse, 즉 500pulse를 측정하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	진동 및 충격에 의해 발생 가능한 오차는 추후 4x encoder 측정회로 logic을 설계하여 보완한다.&lt;/p&gt;
&lt;p&gt;
	회로에 사용한 주요 부품은 다음과 같다.&lt;/p&gt;
&lt;p&gt;
	MCU : ATMega128&lt;/p&gt;
&lt;p&gt;
	CPLD : XC9572 TQ100&lt;/p&gt;
&lt;p&gt;
	ENCODER : Autonics Rotary Encoder E30S4-1000-3-T-5&lt;/p&gt;
&lt;p&gt;
	MCU의 역할은 CPLD로 계산된 ENCODER 출력 pulse를 10ms 마다 주기적으로 읽어와서 Serial 통신을 사용, PC에 전송한다.&lt;/p&gt;
&lt;p&gt;
	CPLD는 ENCODER에서 출력된 A, B 두 채널의 신호를 가지고 회전 방향과 출력 pulse를 분석하고, 분석된 방향과 출력 pulse를 count한다.&lt;/p&gt;
&lt;p&gt;
	회로도는 아래와 같다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/sch1(1).JPG&quot; style=&quot;border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; margin-left: 1px; margin-right: 1px; margin-top: 1px; margin-bottom: 1px; width: 640px; height: 452px; &quot; /&gt;&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/sch2.JPG&quot; style=&quot;border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; margin-left: 1px; margin-right: 1px; margin-top: 1px; margin-bottom: 1px; width: 640px; height: 452px; &quot; /&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 15 Apr 2010 13:16:18 +0900</pubDate>
        </item>
        <item>
            <title>선형시스템(Linear System)_2</title>
            <link>http://www.swssm.org/index.php?idx=384</link>
            <description>&lt;p&gt;
	IMU를 구성하는 데에는 자이로와 가속도를 합치기 위해서는 칼만필터의 구성이 중요합니다.&lt;/p&gt;
&lt;p&gt;
	칼만필터의 경우에는 선형시스템에서 사용되게 때문에 선형적 공식을 따라야합니다.&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;x_k+1 = Ax_k + Bu_k + w_k &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 식 1.1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;y_k = Cx_k &amp;nbsp;+ z_k &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 식 1.2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	두개의 식은 기초적인 선형시스템입니다.&lt;/p&gt;
&lt;p&gt;
	식 1.1은 상태수식으로서 시스템의 전반적인 형태를 설명하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	식 1.2는 출력 수식으로서 측정가능한 값들에 대해서 표현하는 것입니다.&lt;/p&gt;
&lt;p&gt;
	그렇기 때문에 w는 프로세서에서 나타나는 잡음이고, z는 측정에서 나타나는 잡음입니다.&lt;/p&gt;
&lt;p&gt;
	칼만필터에서 가장 중요한 것은 잡음입니다. 실제 칼만필터의 기본적인 동작이 가능할 때 잡음을 나타내는 값들을 조절해서 칼만필터의 감도나 응답의 특성을 변경하여 사용되는 시스템에 맞도록 튜닝하기 위해서는 잡음의 특성을 아는 것이 중요한 것입니다.&lt;/p&gt;
&lt;p&gt;
	그럼 이 두개의 식에 대하여 예를 들어 설명해 보겠습니다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	직선으로 주행 중인 자동차가 있다고 생각하고 그 주행중인 자동차의 현재위치는 p, 속도는 v로 움직이고 있다고 합니다.&lt;/p&gt;
&lt;p&gt;
	시스템의 입력은 가속도로서 u라고 나타냅니다. 그리고 y는 측정된 값으로 현재위치를 나타내고 있습니다.&lt;/p&gt;
&lt;p&gt;
	이 때, 다음의 속도&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;v_k+1 = v_k+T*u_k+v_k^~ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 식 1.3&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	로 나타낼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	식을 풀이하면 T초 후의 속도는 지금의 속도에 지시된 시간에 가속도를 곱하여 구하게 됩니다. 이때 여러가지 환경에 의하여 속도가 변할 수 있기 때문에 그것을 잡음으로 생각하게 됩니다.&lt;/p&gt;
&lt;p&gt;
	속도를 적분하게 되면 위치를 구할 수 있는 것 아시죠? 그렇게 다음의 위치 p_k+1를 구할 수 있습니다&lt;/p&gt;
&lt;p&gt;
	그것을 식으로 나타내면&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;p_k+1 = p_k + T*v_k + 1/2 * T^2 * u_k + p_k^~ &amp;nbsp; &amp;nbsp;식 1.4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	시스템의 상태를 나타내는 x는 위치와 속도로 구성되기 때문에&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; ____&lt;/p&gt;
&lt;p&gt;
	x= &amp;nbsp;l &amp;nbsp;p_k l&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;l &amp;nbsp;v_k l&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;------&lt;/p&gt;
&lt;p&gt;
	이렇게 표현될수 있습니다. 이제 식 1.3과 1.4를 1.1과 같은식으로 묶어 주게 되면 상태수식을 나타낼 수 있습니다.&lt;/p&gt;
&lt;p&gt;
	y = [1 0]*x_k + z_k로 표현하게 됩니다.&lt;/p&gt;
&lt;p&gt;
	이와같은 선형식을 이용하여 칼만필터를 표현하게 됩니다.&lt;/p&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Sun, 04 Apr 2010 18:00:29 +0900</pubDate>
        </item>
        <item>
            <title>선형시스템(Linear System)</title>
            <link>http://www.swssm.org/index.php?idx=383</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	칼만필터는&amp;nbsp;&lt;strong&gt;선형시스템의 예측을 위한 필터&lt;/strong&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	그렇기 때문에 모델링하려는 프로세스가 선형시스템의 기술이 가능한 형태여야 합니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	그래서 선형시스템에 대하여 설명을 해보려합니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	선형시스템은 2개의 간단한 수식으로 표현합니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	&lt;strong&gt;X_t+1 = A*X_t+B*U_t+W_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(식 1.1)&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	&lt;strong&gt;Y_t=C*X_t+Z_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (식 1.2)&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	식 1.1은 Process Model로서 시스템의 전반적인 신호 파형을 표현합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	식 1.2는 Measurement Model로서 시스템 신호 중에 측정 가능한 값들을 표현합니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	여기에서 식을 Bold 표시를 한 것은 A,B,C값은 행렬이고, X와 U, W,Z,Y는 벡터 값이기 때문입니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	각각의 값들을 말하자면 X는 시스템의 상태를 나타내고 Y는 센서의 측정값을 말하는 것입니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	W는 프로세스잡음 Z는 측정잡음입니다.&lt;/p&gt;
&lt;p style=&quot;padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;
	식에 대한 자세한 예는 다음 노트에 기술하겠습니다.&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Sat, 27 Mar 2010 15:11:13 +0900</pubDate>
        </item>
        <item>
            <title>설계도 3D 도면 사진</title>
            <link>http://www.swssm.org/index.php?idx=380</link>
            <description>&lt;p&gt;
	알루미늄 10T와 25T, 철판을 사용하여 제작 예정&lt;/p&gt;
&lt;p&gt;
	&lt;img alt=&quot;&quot; src=&quot;/ckfinder/userfiles/images/Untitled-1.jpg&quot; style=&quot;width: 660px; height: 479px&quot; /&gt;&lt;/p&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Sat, 27 Mar 2010 14:43:56 +0900</pubDate>
        </item>
        <item>
            <title>시각화 작업(과정) - 4. 거칠기 조정</title>
            <link>http://www.swssm.org/index.php?idx=378</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	① 거리에 따른 벡터 선별&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	스크롤 바(0~sqrt(150))를 이용하여 설정된 거리보다 가까운 거리의 벡터를 선택하지 않는 방법으로 거칠기를 조절한다. 0~sqrt(150)이란 값은 모양이 약 700개의 글립을 검사하여 최대한 모양이 무너지지 않는 거리의 최소의 값을 산정하여 정하였다. 거리에 대한 선별이 끝난뒤 거각도에 대한 선별을 하도록 하였다. 거리를 재는 공식은 두점 간의 거리 공식으로 하였다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	Math.Pow(a.X - b.X, 2) + Math.Pow(a.Y - b.Y, 2)&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	② 각도에 따른 벡터 선별&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	스크롤 바(0도~약 2.1430도)의 값을 70으로 나누어 해당 각도보다 큰 벡터를 선정하였다. 각도를 재는 방법은 두 벡터를 단위벡터로 만든뒤((lx1, ly1), (lx2, ly2))로 만든위 내적을 구한 뒤 그 값(inner)을 이용 하여 내적의 기본공식을 역이용하여 각도를 구하였다. inner변수를 이용한 수식은 아래와 같다. 값은 각 벡터의 각도의 차이로 작게는 0.0단위로 나왔으며 1~10도 안 팎 의 값을 보였다. 각도의 경우 모양을 무너 뜨리는 경우가 커서 0~약 2.14도 정도의 영향만 주도록 하였으며 스크롤 바를 이용하여 수정이 가능하도록 하여 모양이 무너지는 피해를 최소화 하였다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	double result = Math.Acos(inner) * 180 / Math.PI;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:42:51 +0900</pubDate>
        </item>
        <item>
            <title>시각화 작업(과정) - 3. 이미지 벡터화</title>
            <link>http://www.swssm.org/index.php?idx=377</link>
            <description>&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	① 글립 이미지 추출&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	사각형 검색 알고리즘을 이용하여 관심 사각형들을 찾아내고 2차례의 합병정렬(안정정렬)을 이용하여 행과 열로 정렬한다. 정렬하면 코드의 순서와 사각형의 순서가 같아 지게 되므로 추 후 코드와 글립의 매칭이 수월하다. 각 글립의 영역을 사각형으로 알아낸 뒤 해당 영역을 그림에서 ROI를 이용하여 추출하여 512,512로 확대한다.(일반적인 TTF포맷의 글립이 1024*1024에서 작업되나 해당 크기와 품질 면에서 차이가 적고 속도를 개선하기 위하여 512*512로 선정하였다.) 크기를 크게 한 뒤 검은 색을 제외한 색을 지운다. RGB값을 검사하여 각 색깔 바이트에 200보다 큰값이 들어있는 픽셀을 지웠다. U8을 사용하여 255가 최대 값이므로 200이 한 바이트에라도 들어있다면 밝은 색으로 간주되기 때문이다. 너무 값을 작게 주면 글립까지 지워지는 경우가 있어 글립을 지우지 않는 한에서 가장 작은 값을 채택하였다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	② 글립 이미지 보정&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	각 글립의 영역을 모폴로지 연산을 이용한 확대 축소를 하여 거친 것을 부드럽게 해준다. 전체 글립을 작은 상태에서 모폴로지 연산으로 보정결과 얇은 글씨는 외곡 되는 현상이 많아 확대한 후 각각의 글립을 따로 보정하는 방식을 취하였다.&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;모폴로지의 element 값은 아래와 같이 설정하였으며&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	IplConvKernel element = Cv.CreateStructuringElementEx(2,2, 1, 1, ElementShape.Ellipse, null)&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;Dilate, Erode연산을 수행하여 팽창, 침식 연산을 하여 볼펜이나 흑연의 필요이 &amp;nbsp; &amp;nbsp;상의 거침이나 우둘투둘한 표면을 매끄럽게 하였다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	③ 글립 이미지 외곽선추출&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	매끄러워진 각 글립에 Canny Edge메소드를 이용하여 외곽 선을 추출해 내었다. 이때 각 외곽선은 완전 한 폐곡선이 되며 단선으로 이루어지도록 하였다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	④ 글립 이미지 외곽선 트레이싱&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	추출된 단선 / 완전 폐곡선의 이미지에서 흰색으로 된 선을 트레이싱 하면서 각 점이 방향을 가진 벡터로서의 의미를 가지도록 하였다. 위 그림과 같이 바깥 선과 안쪽 선은 방향이 다르게 트레이싱 하도록 하였다. 이는 트루타입 폰트 표준에서 사용하는 벡터 방식에 부합하기 위함이다. 트레이싱 알고리즘은 위부터 아래까지 보면서 처음에 흰점을 발견하면 그점을 첫점으로 주고 다음 점의 순서를 정해줌으로 써 계속해서 인점한 점으로 방향이 나아가게 하였다. 한점을 지날 때마다 이미지를 지움으로써 뒤돌아가는 일이 없도록 하였다. 한 외곽선을 다돌고 나면 해당 외곽선 내부를 제외한 나머지 이미지에서 흰점을 찾아 같은 방식으로 외곽선을 찾고 같은 방향으로 회전한뒤 다시 이미지를 확인하여 남아있는 폐곡선은 반대방향으로 회전하며 순서를 부여하고 해당 작업을 모든 흰점이 없어질 때까지 계속 진행하여 모든 점을 벡터화 하였다.&lt;/div&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:41:16 +0900</pubDate>
        </item>
        <item>
            <title>시각화작업(과정) - 2. 코드 구성 및 판별</title>
            <link>http://www.swssm.org/index.php?idx=376</link>
            <description>&lt;p&gt;
	(1) 코드 구성&lt;/p&gt;
&lt;p&gt;
	코드는 시트지 좌측에 길게 적히며 시트지 타입 코드와 99개의 unicode혹은 한글 자소 코드를 표현 하도록 하였다. 코드는 4X4의 2진수 16개의 상태 비트와 우상단1비트의 한글 자소 구분 비트, 나머지 아래3개의 Check sum비트로 이루어진다. 한글인 경우는 우상단 색의 비트가 1로 이외에는 0으로 해준다. 한글 자소의 경우는 Unicode가 존재하지 않기 때문이다. 한글 자소 인경우는 내용 비트를 모종의 방법으로 채우고 되고 나머지 경우는 유니코드로 표현한다. 나머지 3비트를 이용하여 값이 4의 배수면 0개, 4의 배수 +1이면 3개의 비트를, 4의 배수 +2이면 2개의 비트를, 4의 배수+3이면 1개의 비트를 1로 세팅하여 전체 값을 4의 배수로 만들어 주어 검사하도록 하였다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	(2) 코드 판별&lt;/div&gt;
&lt;div&gt;
	각 벡터의 정보를 담은 코드를 위에서 아래로 20개(4*5) 씩 쌍을 이루어 수치로 바꾸어 검사하도록 한다. 코드의 상단과 하단에 □ 모양의 표식을 두어 기울 어진 각도를 찾도록 하여 행여 작은 각도로 코드가 휘어져 있어도 코드 비트를 찾는 것에 무리가 없도록 하였다. 각 사각형을 찾을 때마다 자신의 영역에 맞는 만큼 offset값이 변경되어 찾도록 하였다.&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&amp;nbsp;코드 부분은 각 각의 코드가 정사각형의 모습을 띄므로 해당 부분을 그림 에서 OpenCV의 ROI로 해당 부분을 오려내어 일정 크기로 각 부분을 읽을때 무리가 없는 크기로 키우고(너무 작은 크기에 코드 비트가 있을시 (하위 Y값 -상위 Y값) / 400줄 로 나눌시 한 사각형 크기가 소숫점이 나오기 때문) Threshold 처리 해주어 모호한 비트가 없도록 하여 값을 일어낸다.&amp;nbsp;&lt;/div&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:39:42 +0900</pubDate>
        </item>
        <item>
            <title>시각화작업(과정) - 1. 시트지 전처리</title>
            <link>http://www.swssm.org/index.php?idx=375</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	① 시트지 이상 판별(크기, 비율, 각도)&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	시트지 이상 판별의 가장 큰 목적은 코드, 글립의 정확한 인식을 목적으로 본격적으로 정보 추출전에 기준치를 벗어난 스캔의 에러처리를 해준다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	시트지의 비율이 일반 A4용지의 비율(210 * 297)과 많이 차이 나거나(종이 가로세로 비율 &amp;lt; 0.7f || 종이 가로세로 비율 &amp;gt; 0.8f) 코드를 찾아내는 표식을 찾지 못한 경우 &amp;quot;시트지 분석에 실패 하였습니다. 재스캔을 해주세요&amp;quot;라는 메세지를 내보내도록 한다. 물론 각도가 심하게 기울어져 그림파일이 A4용지 비율에서 많이 어긋날 경우도 에러 처리 해준다. 또한 A4용지 권장 사진 사이즈(1654*2340) 보다 작은 크기(1500,2064)의 그림 보다 작은 그림은 에러 처리를 해준다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	② 시트지 크기, 기울기 정규화&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	이상 판별에서 문제 없이 넘어온 시트지는 시트지를 1500,2064(A4용지 스캔 비율을 적용한 크기)로 축소 한 뒤 각 글립 사각형에서 알아낸 기울어진 각도에 따라 시트지 전체를 올바른 각도로 바꿔준다. 이때 0.2도 이하의 작은 각도는 회전 시키지 않음으로 혹시 생길지 모를 사각형 알고리즘의 각도 계산 실수를 최소화 하도록 하였다.&lt;/div&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:36:36 +0900</pubDate>
        </item>
        <item>
            <title>시각화 작업(주요 알고리즘) - 3. 거칠기 조정</title>
            <link>http://www.swssm.org/index.php?idx=374</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	과도하게 많고, 의미없는 벡터가 존재할 수 있으므로 선분을 근사화 하여 특 징점만 남긴다. 이때 자연스럽게 코너 벡터를 검출할 수 있다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;선분 근사화는 Curvature 방법과 Strip Algorithm 방법 중 성능이 더욱 좋은 &amp;nbsp;Curvature 방법을 사용한다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	그리고 그냥 선분을 잇는것이 아니라 베이지어 곡선을 생성한다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	선분을 근사화 하여 코너 지점을 알 수 있다. 따라서 코너와 코너 사이에 하 &amp;nbsp;나 이상의 벡터가 존재 한다면 곡선으로 간주 할 수 있다. 이를 베이지어 곡 &amp;nbsp;선의 방정식에 따라 최소 자승법(method of least squares)을 이용하여 베이지어 곡선으로 변환한다.&lt;/div&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:33:57 +0900</pubDate>
        </item>
        <item>
            <title>시각화작업(주요 알고리즘) - 2. 사각형 검출 알고리즘</title>
            <link>http://www.swssm.org/index.php?idx=373</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	영상을 이진화 하고 외곽선을 추출한 후 외곽선을 나타내는 리스트 또는 트리 시퀀스를 입력으로 받고 모든 외곽선에 대하여 근사화를 수행해주는 CvApproxPoly 메소드를 이용하여 각선분들의 포인트를 CvSeq에 모든 외곽선 정보를 담는다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	사각형 외곽은 반드시 4개의 정점을 가져야하며 노이즈를 없애기위해 영역은 비교적 넓은 지역이어야 하고 볼록한 부분이어야 하므로 이에 해당 하는 정점들을 걸러낸다.&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;이 후 이정점들의 최소 사잇각을 찾아낸다. 최소사잇각의 cosine이 0.3보다 작은 경우에 적절한 사각형이라고 인식한다.&lt;/div&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:32:15 +0900</pubDate>
        </item>
        <item>
            <title>시각화 작업(주요 알고리즘) - 1. 그림 입력과 분석 및 글맆 추출</title>
            <link>http://www.swssm.org/index.php?idx=372</link>
            <description>&lt;p&gt;
	전처리를 아래 과정으로 거치고 3번에서 외고가선 추출을 한다.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	① Auto deskew&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	먼저 입력 받은 그림의 회전 정도를 검사해서 수직, 수평에 맞도록 회전시킨다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	② Auto resize&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	정해진 해상도로 입력이 되지 않은 경우 자동으로 크기를 기준 크기로 조절한다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	1,2번을 마치고 글립의 영역들을 사각형 검출 알고리즘으로 얻어온다음 아래를 수행한다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	③ OpenCV 이미지 프로세싱 및 외곽선 추출&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	1. 이진화를 진행한다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	2. Erosion, Dilation, Opening 연산을 통해 노이즈를 제거한다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&amp;nbsp;- Erosion&amp;nbsp;&amp;nbsp;외각을 깍아내는 효과를 볼 수 있다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	- Dilation&amp;nbsp;실제 이미지에서는 이미지외각에 픽셀이 더해지게 된다.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	- Opening &amp;nbsp;이미지에 erosion을 취한 후 dilation을 취해서 얻어진다는 것을 알 수 있다. 이로 인해서 얻을 수 있는 효과는 이미지에서 점과 같이 찍혀진 부분들을 제거할 수 있다는 점이다. 최초 erosion을 취함으로 인해서 점으로 찍혀진 부분들은 완전히 제거가 되기 때문에, dilation을 적용하여도 다시 복원되지 않는 것이다. 반면에 전체 이미지는 축소된 만큼 다시 복원이 되기 때문에 이미지에 큰 영향을 주기 않으면서 이미지를 복원할 수 있게 된다.&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	3. Canny 연산을 통해 외곽선을 추출한다.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:31:16 +0900</pubDate>
        </item>
        <item>
            <title>OpenCvSharp을 이용한 그림관리(원그리기,채널수 관련 정보)</title>
            <link>http://www.swssm.org/index.php?idx=371</link>
            <description>&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(0, 158, 37); &quot;&gt;//추가된 네임스페이스&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(58, 50, 195); &quot;&gt;using&lt;/span&gt;&amp;nbsp;System.Diagnostics;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;은 검출 시간을 체크하기 위한 Stopwatch()를 사용하기 위해&amp;nbsp; 추가된 네임스페이스 입니다&lt;/span&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(58, 50, 195); &quot;&gt;using&lt;/span&gt;&amp;nbsp;KwsmLab.OpenCvSharp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;OpenCVsharp을 사용하기 위한 네임 스페이스&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;Tip : 추가된 네임스페이스가 많은데 사용되지 않은 네임스페이스를 걸러 내고 싶으면 코딩이&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;다 끝난후&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp; 네임스페이스 근처에서 마우스 우클릭 unused namespace를 찾아 클릭해주면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;사용되지 않은&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp; 네임스페이스를 자동으로 정리 해줍니다)&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CvColor[] colors = new CvColor[]{&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;컬러 구조체 입니다 CvColor(red, green, blue)값을 넣어주게 됩니다&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(0,0,255),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;나중에 찾은 얼굴에서 동그라미를 그려줄때 이 색을 이용해서&lt;/span&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(0,128,255),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;원을 그려주게 됩니다&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(0,255,255),&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(0,255,0),&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(255,128,0),&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(255,255,0),&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(255,0,0),&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CvColor(255,0,255),&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const double SCALE = 1.3;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp; 사진 크기를 줄이기 위해 사용 됩니다.&amp;nbsp; 크기를 줄이는 이유는 오히려 얼굴 검출을&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;용이하게 하기 위해서 인데 이건 좀 더 깊이 파 보아야 합니다 일단 지금은 1.5, 2.0등으로&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;크기를 바꿔 가 보면서 테스트해보세요&amp;nbsp; 얼굴 검출 내용이 틀려 질겁니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp; OpencvSharp 예제에서는 using문을 무척 많이 쓰게 되었는데 이유는 자동 메모리 해제를 위해서 입니다.&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;using문 다음 { 에서 시작해서 }이 끝나면 할당된 메모리도 자동으로 해제 됩니다 이런 방식이 싫다면&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;using문을 빼고 사용한 후 잊지말고 메모리를 해제 해주는것이 좋습니다 물론 가비지 컬렉터가 있긴 하지만&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;미래의 버그는 아무도 예측할 수 없습니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (IplImage img = new IplImage(&amp;quot;&lt;span style=&quot;line-height: 2em; color: rgb(149, 16, 21); &quot;&gt;misskorea.jpg&lt;/span&gt;&amp;quot;, LoadMode.Color))&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp; 이미지를 저장하기 위한 &amp;nbsp;메모리를 확보합니다 IplImage는 OpenCV에서 이미지&amp;nbsp; 담는 가장 기본이 되는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;선언형태이며 IplImage형 img를 선언하고 그곳에&amp;nbsp; misskorea.jpg를 컬러모드로 읽어서 저장하라는 뜻입니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (IplImage small_img = new IplImage(new CvSize(CV.Round(img.Width / SCALE), CV.Round(img.Height / SCALE)), BitDepth.U8, 1))&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp; 이번에 역시 small_img란 메모리가 확보 되었는데 이번에는 그림을 읽어 오는것이 아니라 원래 읽은 그림의 size / SCALE 크기만한 메모리 크기를 확보하고&amp;nbsp; 그메모리의 &amp;nbsp;비트뎁스는 8이고,&amp;nbsp;채널은 1개짜리 메모리입니다.&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&lt;strong style=&quot;line-height: 2em; &quot;&gt;비트뎁스는 픽셀에 할당된 바이트수&lt;/strong&gt;와 상관이 있습니다 모니터에 보이는 한 픽셀이 RGB처리이면 8비트&amp;nbsp;&amp;nbsp;X 8비트 X 8비트 해서&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;총 3바이트가 할당되게 됩니다 지금 여기서는 1바이트 즉&amp;nbsp;&lt;strong style=&quot;line-height: 2em; &quot;&gt;8비트가 사용되어지겠네요&lt;/strong&gt;&amp;nbsp;그리고 채널이란 RGB 모드의 경우&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;각각의 R, G, B 를 말하는데....&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;흠...이건 그림을 그려서 설명해야 겟네요 나중에 시간나면 그리겠습니다.&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;일단은 R를 담는 배열(메모리가 있고) G를 담는 B를 담는 배열(메모리)가 있고 우리가 필요로하는 R이나 G 값만 가져다&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;쓸 수 있다고 생각하시면 됩니다. 그리고 그게 담겨져 있는 부분이 채널이고 RGB모드인 경우 채널수는 3이 되며&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;aRGB인경우 채널수는 4개가 됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (IplImage gray = new IplImage(img.Size, BitDepth.U8, 1))&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;역시 gray란 메모리를 확보하네요&lt;/span&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CV.CvtColor(img, gray, ColorConversion.BgrToGray);&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;강좌시작에서 다운 받은 레퍼런스 파일을 보면 CV.cvtColor 메소드에 대한 사용법이 나와 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CvtColor 메소드는 말 그대로 색을&amp;nbsp;변환 해주는 기능을 가지고 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;CvtColor(원본을, 이곳에다가, 이런 모드로 바꿔라)&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;우리는 지금 misskorea.jpg&amp;nbsp;읽은 것을 gray 메모리에 칼라를 그레이 모드로 바꿔서 저장 이란 뜻이 됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CV.Resize(gray, small_img, Interpolation.Linear);&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;Resize는 그림의 크기를 바꿔 주는것입니다 gray에 담겨있는 이미지를 small_img 에 사이즈를 줄여서 담아줍니다&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 6em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp; CV.EqualizeHist(small_img, small_img);&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 6em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 2em; &quot;&gt;
	Equal&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;izeHist 메소드는 히스토그램 평활화를 시켜 줍니다 이것역시 공부가 필요한 부분이라 향후 기회가 있을때 다시 설명하겠습니다 지금은 그레이 이미지를 특출나게 어둡거나 밝은 부분을 적당히 펴줘서 전체 값이 일정해 지게 해준다라는 정도라만 이해하세요&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	}&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;아래 CvHaarClassifierCascade 관한 알고리즘을 설명하자고 하면 꽤 많은 분량의 설명이 필요합니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;기초강좌부터 머리아프게 가지 말고 그냥 대충 뭐하는것이다 훑고 지나가도록 하겠습니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (CvHaarClassifierCascade cascade = CvHaarClassifierCascade.FromFile(&amp;quot;&lt;span style=&quot;line-height: 2em; color: rgb(149, 16, 21); &quot;&gt;haarcascade_frontalface_alt2.xml&lt;/span&gt;&amp;quot;))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;&amp;nbsp;haarcascade_frontalface_alt2.xml 얼굴 검출에 대한 기계학습 자료가 담겨져 있는 데이타 파일입니다 얼굴을 검출할때&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;이 자료랑 비교해서 비슷하면 얼굴로 인식하게 되어 있습니다&lt;/span&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (CvMemStorage storage = new CvMemStorage())&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;메모리 확보입니다&lt;/span&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(0, 158, 37); &quot;&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stopwatch watch = Stopwatch.StartNew();&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;시간 측정을 위해 스톱워치를&amp;nbsp;생성해서 시작합니다&lt;/span&gt;&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CvSeq faces = CV.HaarDetectObjects(small_img, cascade, storage, 1.1, 2, 0, new CvSize(30, 30));&lt;/p&gt;
&lt;p 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; line-height: 2em; &quot;&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;검출된 얼굴을 faces에 저장합니다&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;line-height: 2em; color: rgb(0, 0, 0); &quot;&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;faces.Total 에 총 검출된 얼굴수가 들어가 있습니다&lt;/span&gt;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br style=&quot;line-height: 2em; &quot; /&gt;
	&lt;/span&gt;&lt;span style=&quot;line-height: 2em; color: rgb(110, 57, 26); &quot;&gt;그다음 처리는 찾은 얼굴의 중심을 구해서 원을 그려주는 과정입니다&lt;/span&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 11 Feb 2010 02:24:27 +0900</pubDate>
        </item>
        <item>
            <title>FPGA 를 이용한 영상처리 방법 </title>
            <link>http://www.swssm.org/index.php?idx=349</link>
            <description>&amp;nbsp;이번 저희 팀이 나갔던 대회는 임베디드 환경에서 영상처리를 하고 이 영상처리를 이용하여 로봇을 제어하는&lt;br /&gt;대회였습니다. 임베디드 환경에서의 프로세서는 일반 PC보다는 성능이 많이 떨어지기 마련입니다.&lt;br /&gt;&amp;nbsp;따라서 프로세서에서 영상처리를 하게된다면 영상처리에 부하가 많이 걸리게 됩니다.&amp;nbsp; 이로 인해 로봇은 상대로봇을 늦게 찾게 되고 공격 및 방어가 늦어지게 됩니다.&lt;br /&gt;&amp;nbsp;따라서 저희가 나갔던 대회는 영상처리를 FPGA를 사용하여 하기를 권장하는 대회였습니다. 즉 영상처리를 소프트&lt;br /&gt;웨어가 아닌 하드웨어 단에서 처리하는 것이였습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;우선 영상처리를 하기위해선 카메라가 필요하게 됩니다. 그리고 이 카메라들은 받아들인 영상을 아날로그 값으로&lt;br /&gt;출력하게 되죠.. 이 아날로그 값을 우리가 사용할수 있도록 디지털 값으로 만들어 주는 역할을 하는 것이 비디오&lt;br /&gt;디코더 입니다.&lt;br /&gt;&amp;nbsp;하드웨어 단에서 영상처리를 하기 위하여 필요한 가장 기초적인 지식은 비디오 디코더를 이해하는 것입니다.&lt;br /&gt;&amp;nbsp;보통 사용하는 USB 웹켐 같은 경우도 비디오 디코더를 거쳐서 나온 데이타를 이용하는 것입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;비디오 디코더는 홀 수 번째 라인과 짝수 번째 라인을 번갈아 가며 뿌려주게 됩니다.&lt;br /&gt;&amp;nbsp;즉, 720 * 480 짜리 영상이라고 한다면 1부터 480 줄 사이의 홀수 번째 줄을 먼저 뿌려주게 되고 짝수 번째 줄을&lt;br /&gt;&amp;nbsp;후에 뿌려주게 됩니다. 홀 수 번째 줄인지 짝수 번째 줄인지를 알려주는 신호가 odd 라는 신호입니다. &lt;br /&gt;&amp;nbsp;이 신호가 high 라면 홀수 번째 줄 신호이고 low 라면 짝수 번째 신호입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;그리고 vref 라는 신호가 있습니다.&amp;nbsp; 이 vref 로 우리는 필요한 480라인의 데이터인지 아닌지를 알 수 있습니다.&lt;br /&gt;&amp;nbsp;즉 720*480 중 480 을 알 수 있습니다.&lt;br /&gt;&amp;nbsp;이 신호의 경우 blank 신호와 active 신호를 번갈아 가며 보내줍니다.&lt;br /&gt;&amp;nbsp;이 때 active 신호일 때만이 우리가 원하는 영상데이타 값이 들어오게 되고 blank 일때는 소위 말하는 쓰레기&lt;br /&gt;&amp;nbsp;값 비슷한 값이 들어옵니다. 그냥 필요없는 값이라고 생각하시면 됩니다. 따라서 이를 불리해줘야합니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;다음으로 href 라는 신호가 있습니다. 이 신호가 High 일때 1줄의 데이터 신호가 들어오게 됩니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;따라서 우리는 href신호가 상승 엣지일때마다 카운트를 시킨다면 총 몇줄이 카운트되었는지를 알 수 있습니다.&lt;br /&gt;&amp;nbsp;하지만 이때 꼭 필요한 신호만 받아들여야 함으로 odd 신호와 vref 신호를 적절히 이용하여야합니다.&lt;br /&gt;&amp;nbsp;이를 간단히 verilog 코드로 표현해 보자면&lt;br /&gt;====================================&lt;br /&gt;&amp;nbsp;always @(posedge href)&lt;br /&gt;&amp;nbsp;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp; if(vref == 1)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; line &amp;lt;= line +1 ;&lt;br /&gt;&amp;nbsp;end&lt;br /&gt;===================================&lt;br /&gt;&amp;nbsp;이런식으로 표현할 수 있습니다.&amp;nbsp; 홀수 줄인지 짝수 줄인지를 알려고 한다면 odd신호를 적절히&lt;br /&gt;&amp;nbsp;and 시켜주면 되겠지요..&lt;br /&gt;&lt;br /&gt;&amp;nbsp;한줄의 신호에서 우리가 원하는 픽셀수는 720개입니다. 하지만 비디오 디코더는 720개의 유효픽셀과&lt;br /&gt;&amp;nbsp;138개의 필요없는 픽셀을 우리에게 보냅니다. 이것은 앞에서도 말했지만 href 신호가 high 일때가&lt;br /&gt;&amp;nbsp;유효 픽셀입니다 ㅎ &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;그럼 픽셀수는 어떻게 구분하는냐..&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;친절하게도 비디오 디코더는 clk_llc2 라는 클럭 신호를 또 우리에게 보내주게 됩니다.&lt;br /&gt;&amp;nbsp;이 신호가 상승 엣지 일때마다 한 픽셀이 들어오게 됩니다.&lt;br /&gt;&amp;nbsp;이때도 href를 적절히 이용하여야 겠지요 이를 코드로 표현해보면&lt;br /&gt;&amp;nbsp;====================================&lt;br /&gt; always @(posedge clk_llc2)&lt;br /&gt; begin&lt;br /&gt; &amp;nbsp; if(href == 1)&lt;br /&gt; &amp;nbsp; &amp;nbsp; pixel &amp;lt;= pixel +1 ;&lt;br /&gt; end&lt;br /&gt; ===================================&lt;br /&gt;이런식으로 표현 할 수 있습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이렇게 비디오 디코더에서 영상 데이터를 가져오는 것은 간단하게 할 수 있습니다.&lt;br /&gt;&lt;br /&gt;하지만 영상을 획득하는 것만으론 영상처리를 할 수 없습니다.&lt;br /&gt;들어온 영상데이터를 언제 초기화 시키고 언제 처리하고 언제 프로세서에게 결과 값을 알려주어야 &lt;br /&gt;될지가 더 중요합니다. 또한 여러가지 색 테이블 변환을 하여야지 시스템이 더 안정되게 되고&lt;br /&gt;이러한 것이 FPGA를 사용하는 이유일 것입니다. &lt;br /&gt;FPGA는 병렬처리를 하기 때문에 수십개의 색변환 공식을 써도 걸리는 시간은 1개의 변환 공식을&lt;br /&gt;쓴것과 같은 속도를 낼 수 있기 때문입니다.&lt;br /&gt;이에 대해서는 여러 말이 필요하기도 하고.. 코드를 보면서 이해하는 것이 빠르기 때문에...&lt;br /&gt;&lt;br /&gt;이에 대해서는 소스에 주석을 달아 알려드리도록 하겠습니다. ~&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>지능형 SOC로봇워 </title>
            <link>http://www.swssm.org/index.php?idx=348</link>
            <description>&lt;!--StartFragment--&gt; &lt;P class=바탕글&gt;저희팀이 SOC 지능형 로봇워에 참가하여 태권로봇 우승이라는 좋은 결과를 내게 되었습니다.&lt;/P&gt; &lt;P class=바탕글&gt;이번 블로그에서는 지능형 로봇워란 무엇인지, 또 경기가 어떻게 진행되는지에 대해서 알아보는 시간을 갖도록 하겠습니다.&lt;/P&gt; &lt;P class=바탕글&gt;SoC(System on Chip)를 활용한 지능형 로봇 구현을 통해 SoC 분야의 고급 기술인력 양성과 함께, 차세대 &lt;/P&gt; &lt;P class=바탕글&gt;성장동력 사업인 IT-SoC, 지능형 Robot 분야의 활성화를 통한 국가 경쟁력 발전의 초석을 마련하기 위해 &lt;/P&gt; &lt;P class=바탕글&gt;지난 2002년 11월 아시아-태평양 SoC 기술대전(AP-SoC 2002)에서 처음으로 개최되었습니다.&lt;/P&gt; &lt;P class=바탕글&gt;경기 종목에는 탱크로봇과 태권로봇 이렇게 두분야가 있습니다.&lt;/P&gt; &lt;P class=바탕글&gt;먼저, 탱크로봇에 대해서 알아보도록 하겠습니다.&lt;/P&gt; [##_1C|1172541718.gif|width=&quot;362&quot; height=&quot;254&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;대회의 규정은 다음과 같습니다.&lt;/P&gt; &lt;P class=바탕글&gt;01. 경기장 규격&lt;/P&gt; &lt;P class=바탕글&gt;A. 정사각형 (지름 4M) &lt;/P&gt; &lt;P class=바탕글&gt;B. 바닥 색은 흰색으로 한다. &lt;/P&gt; &lt;P class=바탕글&gt;C. 벽의 색은 흰색으로 한다. &lt;/P&gt; &lt;P class=바탕글&gt;D. 벽의 높이는 70cm로 한다. &lt;/P&gt; &lt;P class=바탕글&gt;E. 벽면 상단에는 약 15cm 두께의 노란색 띠를 두른다. &lt;/P&gt; &lt;P class=바탕글&gt;F. 경기장 바닥에는 지름 1.5M의 사각형 선(검정색)이 그려져 있으며 선의 안쪽을 경기장 내로 정한다. &lt;/P&gt; &lt;P class=바탕글&gt;G. 녹색 정사각형(35cm X 35cm X 35cm) 4개와 주황색의 'ㄱ'자 장애물이 2개 설치된다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;02. 선수 &lt;/P&gt; &lt;P class=바탕글&gt;H. 팀원&lt;/P&gt; &lt;P class=바탕글&gt;- 참가팀 구성은 2인 이상으로 구성해야 하며 최대 6명까지 가능하다. &lt;/P&gt; &lt;P class=바탕글&gt;I. 로봇 및 두뇌보드&lt;/P&gt; &lt;P class=바탕글&gt;- 로봇 몸체에 기본적으로 장착되어 있는 센서 이외에 다른 센서를 부착할 수 없다. &lt;/P&gt; &lt;P class=바탕글&gt;- 두뇌보드는 주최 측에서 제공하고 있는 두뇌보드 이외에 자체개발한 보드를 사용할 수 있다. &lt;/P&gt; &lt;P class=바탕글&gt;- 단, 자체개발한 보드의 경우도 센서 장착을 금한다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;03. 경기시간 &lt;/P&gt; &lt;P class=바탕글&gt;J. 경기시간 - 3분 3라운드 3전 2선승 제 &lt;/P&gt; &lt;P class=바탕글&gt;K. 휴식시간 - 3분 &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;04. 경기진행&lt;/P&gt; &lt;P class=바탕글&gt;L. 정해진 경기시간 동안 상대 로봇에 대해 레이저 공격을 실시함&lt;/P&gt; &lt;P class=바탕글&gt;M. 상대팀의 레이저 포가 로봇에 부착된 센서에 명중할 경우 에너지 게이지가 1개씩 감소됨 &lt;/P&gt; &lt;P class=바탕글&gt;N. 로봇의 에너지 게이지가 0이 될 경우 로봇 동작이 자동으로 정지 &lt;/P&gt; &lt;P class=바탕글&gt;O. 전, 후반 경기 시간 종료 후 상대팀에게 피해를 준 정도를 합산하여 승패를 결정&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;05. 로봇 및 인식기 &lt;/P&gt; &lt;P class=바탕글&gt;P. 1개팀 2대의 로봇과 2개의 보드로 구성&lt;/P&gt; &lt;P class=바탕글&gt;Q. 2대의 로봇은 각각 Master 로봇과 Slave 로봇으로 구분 &lt;/P&gt; &lt;P class=바탕글&gt;- Master 로봇: 원통 인식기 장착, 최대 30발 포 보유 &lt;/P&gt; &lt;P class=바탕글&gt;- Slave 로봇: 원뿔 인식기 장착, 최대 15발 포 보유 &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;06. 판정 &lt;/P&gt; &lt;P class=바탕글&gt;R. 무승부&lt;/P&gt; &lt;P class=바탕글&gt;- 에너지게이지가 남은(파괴되지 않은) 로봇의 수와 관계없이 동일한 개 수 일 경우 무승부로 인정 &lt;/P&gt; &lt;P class=바탕글&gt;S. Game Over&lt;/P&gt; &lt;P class=바탕글&gt;- 남은 경기시간과 관계없이 한 팀의 로봇이 모두 파괴되었을 경우 Game Over로 간주하여 경기를 끝마친다. &lt;/P&gt; &lt;P class=바탕글&gt;T. 에너지게이지에 의한 승패 결정 : &lt;/P&gt; &lt;P class=바탕글&gt;- 경기시간 3분경과 후 양 팀의 로봇이 파괴되지 않은 경우에 에너지 게이지의 남은 수에 따라 승패를 결정 &lt;/P&gt; &lt;P class=바탕글&gt;U. 재경기&lt;/P&gt; &lt;P class=바탕글&gt;- 배터리 소진으로 전원이 OFF 된 경우 (경기시작 후 2분까지)&lt;/P&gt; &lt;P class=바탕글&gt;- 심판의 판단 시 재 경기가 필요한 경우(경기 도중 언제라도 가능) &lt;/P&gt; &lt;P class=바탕글&gt;- 경기시작 1분 이내 양 팀의 합의하에 재경기를 요청한 경우&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;간단하게 설명하면 탱크로봇들이 2:2로 탱크로봇 경기장에서 3분간 적을 공격하여 더 많은 에너지 게이지를 가지는&lt;/P&gt; &lt;P class=바탕글&gt;팀이 이기는 경기인 것이죠.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;그렇다면 태권로봇 경기는 어떤 방식인 걸까요?&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;휴머노이드 형태의 지능로봇으로 로봇의 지능에 해당되는 두뇌보드가 등 부분에 장착되어 있으며, &lt;/P&gt; &lt;P class=바탕글&gt;로봇의 머리에는 카메라가 장착되어 있다. 카메라를 이용하여 상대로봇의 위치, 거리를 판단하여 &lt;/P&gt; &lt;P class=바탕글&gt;공격 및 방어 행동을 하도록 프로그램 하는 것으로 2005년 처음으로 개최되었습니다.&lt;/P&gt; &lt;P class=바탕글&gt;자세한 대회 규정은 다음과 같습니다.&lt;/P&gt; &lt;P class=바탕글&gt;01. 경기장 규격&lt;/P&gt; &lt;P class=바탕글&gt;A. 정팔각형 (지름 2M)&lt;/P&gt; &lt;P class=바탕글&gt;B. 바닥색은 흰색이며 포맥스 5T이다.&lt;/P&gt; &lt;P class=바탕글&gt;C. 벽의 색은 흰색이며 포맥스 3T이다.&lt;/P&gt; &lt;P class=바탕글&gt;D. 벽의 높이는 50cm로 한다.&lt;/P&gt; &lt;P class=바탕글&gt;E. 벽면 상단에는 약 15cm 두께의 노란색 띠를 두른다. &lt;/P&gt; &lt;P class=바탕글&gt;F. 경기장 바닥에는 지름 1.5M의 사각형 선(검정색)이 그려져 있으며 선의 안쪽을 경기장 내로 정한다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;02. 선수 &lt;/P&gt; &lt;P class=바탕글&gt;G. 로봇&lt;/P&gt; &lt;P class=바탕글&gt;- 주최 측에서 지원되는 로봇만이 사용 가능하다.&lt;/P&gt; &lt;P class=바탕글&gt;H. 로봇 복장&lt;/P&gt; &lt;P class=바탕글&gt;- 자유 복장으로 하되, Servo 모터(검정색부분, 카메라포함)와 가슴부위에는 색깔이나 장식을 금지한다.&lt;/P&gt; &lt;P class=바탕글&gt;- 로봇의 몸체에는 경기장 규격에 해당하는 색을 사용할 수 없다.&lt;/P&gt; &lt;P class=바탕글&gt;- 로봇의 영상처리에 방해되는 요소는 사용을 금한다.&lt;/P&gt; &lt;P class=바탕글&gt;- 구조물 변경 및 추가를 금한다. (ex. 서보모터 추가 및 교체, 무기장착 등)&lt;/P&gt; &lt;P class=바탕글&gt;- 기본 제공되는 센서 외에 추가 센서를 장착 할 수 없다.&lt;/P&gt; &lt;P class=바탕글&gt;- 공격 형태는 5가지 이상으로 구성해야 된다.&lt;/P&gt; &lt;P class=바탕글&gt;- 1round 경기 중, 5가지 미만의 공격패턴이 나올 경우, -10 Point &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;03. 경기시간 &lt;/P&gt; &lt;P class=바탕글&gt;I. 경기시간 - 3분 3라운드 3전 2선승 제 &lt;/P&gt; &lt;P class=바탕글&gt;J. 휴식시간 - 3분&lt;/P&gt; &lt;P class=바탕글&gt;K. 작전시간 - 경기를 진행하는 데에 있어, 로봇에 심각한 문제가 발생하였을 경우에 한하여 &lt;/P&gt; &lt;P class=바탕글&gt;작전시간을 요청할 수 있으며 작전시간은 1분으로 한다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;04. 경기진행&lt;/P&gt; &lt;P class=바탕글&gt;L. 로봇의 구조물 및 복장 점검 &lt;/P&gt; &lt;P class=바탕글&gt;- 경기에 임하는 로봇은 주최 측의 검사원에 의해 검사를 받는다. &lt;/P&gt; &lt;P class=바탕글&gt;- 검사원은 시정을 요구할 권리를 갖는다. &lt;/P&gt; &lt;P class=바탕글&gt;M. 로봇 입장 &lt;/P&gt; &lt;P class=바탕글&gt;- 검사를 끝마친 로봇은 경기장 내로 입장한다. &lt;/P&gt; &lt;P class=바탕글&gt;N. 경기의 시작과 종료 &lt;/P&gt; &lt;P class=바탕글&gt;- 매 라운드마다 심판의 시작 및 종료 신호에 따라 경기를 진행한다. &lt;/P&gt; &lt;P class=바탕글&gt;O. 경기 진행의 절차 &lt;/P&gt; &lt;P class=바탕글&gt;- 양쪽 로봇은 선수 대기위치에서 서로 마주보고 선후 심판 로봇의 시작 신호 를 받은 후 입례한다. &lt;/P&gt; &lt;P class=바탕글&gt;- 심판의 판단에 의해 서로를 감지하지 못하는 경우, 시작위치로 돌아가 경기를 진행한다. &lt;/P&gt; &lt;P class=바탕글&gt;- 선수는 마지막 라운드가 끝나면 심판 로봇의 신호에 따라 입례 한 후 바로 서서 판정을 기다린다. &lt;/P&gt; &lt;P class=바탕글&gt;- 선수 퇴장 &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;05. 득점&lt;/P&gt; &lt;P class=바탕글&gt;P. 다운에 의한 득점 &lt;/P&gt; &lt;P class=바탕글&gt;- 머리를 맞아 다운되는 경우 10 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 다리로 머리를 맞아 다운되는 경우 15 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 머리 외에 다른 부위를 맞아 다운되는 경우 5 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 로봇이 혼자 스스로 넘어질 경우 -3 Point (경기는 그대로 진행)&lt;/P&gt; &lt;P class=바탕글&gt;* 클린 히트와 다운이 동시에 일어난 경우 점수가 높은 Point를 적용 &lt;/P&gt; &lt;P class=바탕글&gt;* 넘어진 상태의 정의 &lt;/P&gt; &lt;P class=바탕글&gt;- 등, 전면, 또는 무릎이 완전히 땅에 닿은 상태를 다운으로 인정한다. &lt;/P&gt; &lt;P class=바탕글&gt;- 공격 동작 이외에 팔이 바닥면에 닿았을 경우 다운으로 인정한다. &lt;/P&gt; &lt;P class=바탕글&gt;Q. 클린 히트 &lt;/P&gt; &lt;P class=바탕글&gt;- 다리로 다리를 정확히 히트한 경우 1 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 팔로 몸통을 정확히 히트한 경우 2 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 팔로 머리를 정확히 히트한 경우 3 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 다리로 몸통을 히트한 경우 5 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 다리로 머리를 히트한 경우 10 Point &lt;/P&gt; &lt;P class=바탕글&gt;- 경기장 내에서 벗어날 경우 -2 Point (검정색 라인을 밟았을 경우도 경기장 내에서 벗어난 것으로 함) &lt;/P&gt; &lt;P class=바탕글&gt;* 일정 패턴의 공격일 경우, 1회에 한하여 점수 포인트 적용 &lt;/P&gt; &lt;P class=바탕글&gt;R. 공격행태에 따른 감점 &lt;/P&gt; &lt;P class=바탕글&gt;- 넘어지면서 공격할 경우, -3 Point &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;06. 판정 &lt;/P&gt; &lt;P class=바탕글&gt;S. 무승부&lt;/P&gt; &lt;P class=바탕글&gt;- 심판원의 채점 기준에 의해 승패가 결정되지 않을 경우, 연장전에서 득점을 먼저 따내는 로봇이 승리한다. &lt;/P&gt; &lt;P class=바탕글&gt;T. Knock-Out (KO)&lt;/P&gt; &lt;P class=바탕글&gt;- 심판에 의해 로봇이 싸울 의지가 없는 경우, 혹은 싸울 수 없다고 생각되는 경우&lt;/P&gt; &lt;P class=바탕글&gt;- 1라운드 중 공격에 의해 3회 이상 다운이 되는 경우&lt;/P&gt; &lt;P class=바탕글&gt;- KO를 당할 경우, 득점과 상관없이 패배&lt;/P&gt; &lt;P class=바탕글&gt;- 30초 이상 가만히 서있거나, 계속 뒤로만 이동하는 경우 해당경기 패배 &lt;/P&gt; &lt;P class=바탕글&gt;U. 작전시간&lt;/P&gt; &lt;P class=바탕글&gt;- 배터리 소진시 또는 로봇에 문제가 발생할 경우 작전타임을 요청할 수 있으며, 이때에는 - 2 Point 적용 &lt;/P&gt; &lt;P class=바탕글&gt;- 작전타임, 배터리 교환시간 이후 경기를 재개 할 경우는 처음 위치에서 경기를 시작&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;이 또한 간단히 설명을 해 드리도록 하겠습니다. &lt;/P&gt; &lt;P class=바탕글&gt;탱크로봇과 비슷하지만 장애물이 없는 경기장에서 태권로봇 2대가 3분간 치고 받는 싸움을 합니다.&lt;/P&gt; &lt;P class=바탕글&gt;이 싸움을 하는 동안 심판들이 각 로봇의 타격이나 다운에 대한 점수를 체크하게 되고 경기가 끝났을 때, 점수를&lt;/P&gt; &lt;P class=바탕글&gt;합산해서 보다 큰 점수를 획득한 팀이 우승하는 것이지요.&lt;/P&gt; [##_1C|1118106340.gif|width=&quot;362&quot; height=&quot;254&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;각 로봇 대회의 규정을 보면 좀 복잡한 것도 같고 헷갈리는 부분도 없지 않아 있지만, 언제까지나 상식 선에서 타협이&lt;/P&gt; &lt;P class=바탕글&gt;가능하며 이해가능한 규정들입니다. 무엇보다 중요한 것은 그 규칙내에서 얼마나 상대방보다 창의적으로 공격할 수 있느&lt;/P&gt; &lt;P class=바탕글&gt;냐하는 것이 경기를 하며서 느꼈던 노하우라고 생각합니다.&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>여러 가지 색 테이블에 대한 설명. </title>
            <link>http://www.swssm.org/index.php?idx=347</link>
            <description>안녕하세요.^^ 이번에 FPGA로 영상처리를 하는 기회가 생겼습니다. 옛날 부터 생각했지만 FPGA에서 영상처리를 하는 경우 역시 빠르더군요. 이번에 사용한 영상처리 관련 기술로는 Filter밖에 없지만 그래도 720, 480이라는 Size를 생각하면 처리 속도가 빨랐습니다. 이번에 블로그 제목을 &lt;STRONG&gt;'여러 가지 색 테이블'&lt;/STRONG&gt;로 잡았는데요. 영상 처리에서 중요한 부분이 색을 어떻게 다루는 것입니다. 이 색을 어떻게 다루냐에 따라서 Filter에서 처리하는 결과가 만족 할 수 있고 그렇지 않을 수도 있으니까요. 자 그럼 본격적으로 색 테이블에 대해 설명하겠습니다. 먼저 알고 계시는지요. &lt;STRONG&gt;각각 사람들이 보는 색이 다르다는 것을요.&lt;/STRONG&gt; 그 만큼 색이란 '이 것이다'라고 정의하기 힘들죠. 그렇기 때문에 이를 정의 하기 위해 여러 방법으로 색을 결정하게 됩니다. 그럼 어떤 것이 있는지 알아 보겠습니다. &lt;br /&gt;&lt;br /&gt;1. RGB Table [##_1C|1244563363.gif|width=&quot;373&quot; height=&quot;310&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &lt;DIV&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;[RGB Color Table] &lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;/DIV&gt;- 가장 기본적인 Table이라고 할 수 있습니다. CRT컬러 모니터가 처음 나올 시 Red, Blue, Green 값을 기준으로 이 세 가지 색을 혼합하여 여러가지 색을 만들 수 있습니다. 하지만 RGB Table에는 많은 허점이 있습니다. 조명에 매우 민감하다는 것입니다. 그렇기 때문에 영상처리를 함에 있어서 RGB값 만을 사용하는 경우는 거의 없습니다. &lt;br /&gt;&lt;br /&gt;2. HSI Table [##_1C|1358474031.jpg|width=&quot;569&quot; height=&quot;224&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [HSI Color Table]&lt;br /&gt;&lt;br /&gt;[##_1C|1282575519.jpg|width=&quot;295&quot; height=&quot;172&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;[RGB to HSI 색 변환 공식] &lt;/DIV&gt;&lt;br /&gt;- 색상(Hue), 채도(Saturation), 명도(Intensity)라는 세 가지 특성들이 컬러를 설명하는데 사용되기 때문에 이와 대응되는 컬러 모델을 HSI라고 합니다. HSI 컬러 공간을 사용할 때 어떤 컬러를 만들어 내기 위해서 몇 퍼센트의 파란색이나 녹색이 필요한지 알 필요가 없게 되죠. 진한 빨간색을 분홍색으로 바꾸기 위해 단순히 채도를 조절합니다. 어두운 것을 밝게 하려면 명도를 변경합니다. 색상 : 0도에서 360도의 범위를 가진 각도로 표현 합니다. 채도 : 0에서 1까지의 범위를 가지는 반지름에 해당합니다. 명도 : z축에 해당하는데 0일 때는 검정색을, 1일때는 흰색을 나타냅니다. 채도가 1일때, 그 컬러는 원뿔기반의 모형의 꼭대기 가장자리에 위치합니다. 채도가 강할수록 그 컬러는 명도에 따라서 흰색-&amp;gt;회색-&amp;gt;검정색이 됩니다. 색상의 조절은 각도에 따라 0도에서는 빨간색, 120도에서는 녹색, 240도에서는 파란색, 360도에서는 다시 빨간색으로 변합니다. 명도가 0이면 컬러는 검정색이어서 색상은 정의되지 않습니다. &lt;br /&gt;&lt;br /&gt;3. YUV Table [##_1C|1228968945.jpg|width=&quot;180&quot; height=&quot;180&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [YUV Color Table] &lt;br /&gt;&lt;br /&gt;[##_1C|1304542816.jpg|width=&quot;417&quot; height=&quot;75&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [RGB to YUV 색 변환 공식] &lt;br /&gt;&lt;br /&gt;[##_1C|1320372244.jpg|width=&quot;331&quot; height=&quot;73&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[YUV to RGB 색 변환 공식] &lt;br /&gt;&lt;br /&gt;- Y(Iuma component)와 U, V(chrominance components)로 구성된 YUV는 Y채널은 색의 명암을 나타내고 U와 V채널은 두 가지가 동시에 색을 결정합니다. YUV는 과거 흑백 티비 시절에 컬러 티비를 보기 위해 개발된 것 입니다. 흑백 티비에서는 Y채널정보만을 처리해 출력해 주고, 컬러 티비는 U, V채널 정보도 같이 처리해 컬러 영상까지 볼 수 있게 되는 것이죠, 이런 방식의 한 가지 장점은 밝기 정보와 컬러 정보를 분리할 수 있다는 점입니다. 사람의 눈은 컬러 보다는 밝기에 훨씬 민감합니다. 그렇기 때문에 대역폭을 줄이기 위해 밝기 정보는 그대로 두고 컬러 정보를 최대한 줄여 화질의 손상이 크게 눈에 띄지 않은 채 대역폭을 줄일 수 있게 되는 것 입니다. 이러한 이유로 Y채널 정보는 이미지 크기만큼만 필요하고 U, V채널정보는 2*2pixels를 한 색으로 나타내는 방식의 정보가 필요하게 됩니다. &lt;br /&gt;&lt;br /&gt;4. Lab Table [##_1C|1189537782.jpg|width=&quot;271&quot; height=&quot;324&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [Lab Color Table] &lt;br /&gt;&lt;br /&gt;[##_1C|1378478986.jpg|width=&quot;600&quot; height=&quot;340&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] [##_1C|1068992265.jpg|width=&quot;600&quot; height=&quot;271&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [RGB to Lab 색 변환 공식] &lt;br /&gt;&lt;br /&gt;- Lab Color는 CIE(Centre Internationale dEclairage)에서 만든 컬러 모델입니다. Lab Color의 가장 큰 목적은 &lt;STRONG&gt;'같은 색이라 해도 출력 장치에 따라 다르게 나오는 단점을 보완하는 것'&lt;/STRONG&gt;입니다. 출력장치에 따른 색의 차이를 완전히 없애는 것은 근본적으로 불가능 하지만 그 차이를 최소한으로 줄이는 것은 가능 합니다. 이에 Lab시스템은 CIE에서 이전에 사용해 왔던 CIE 모델을 기본으로 발표된 것으로 xyz 3개의 축상에서 입체적으로 색을 표현할 수 있습니다. L(Luminosity)축은 밝기를 나타냅니다. a는 green에서 magenta 까지의 보색, b는 blue에서 yellow까지의 보색을 나타 냅니다. a와 b는 색상(Hue)에 관한 정보를 가지고 있으며 L축은 색의 밝기에 관한 모든 정보를 가지고 있게 되는 셈이죠. Lab 시스템에서 L값을 조절하면 Hue의 값에 영향을 미치지 않지만 HSB시스템에서 보면 B(Brightness)로는 나타낼 수 없는 범위가 생깁니다. 이 때문에 Hue 값이 바뀌게 되죠. 간단하게 몇 가지 색 테이블을 살펴 봤는데요. 이 외에도 여러 가지의 색 테이블이 존재 합니다.(찾다보니...양이 많더라고요) 역시 아직까지는 우리의 눈으로 보는 모든 색을 디지털화 시키기에는 역부족이구나 하는 생각이 들었습니다. 그럼 색 테이블을 잘 이용해서 원하는 색을 잘 뽑아 낼 수 있길 바랍니다. 그럼 이만 마치겠습니다.
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>파일 접근에 대한 IRP 분석 </title>
            <link>http://www.swssm.org/index.php?idx=345</link>
            <description>&lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;안녕하세요. 19기 이지혜입니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;저는 이번 블로깅 주제로 파일 접근, 이동, 복사 등 다양한 파일 접근에 대해 &lt;/p&gt; &lt;p&gt;어떤 IRP가 파일 시스템으로 날라가는지에 대해 알아보고자 합니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;우리가 파일에 대해 열기나 복사 등 다양한 파일 관련 동작을 하기 위해 I/O 요청을 발생시키면&lt;/p&gt; &lt;p&gt;I/O 관리자는 적절한 I/O 동작을 요청하는 IRP(I/O Request Packet)를 만들어&lt;/p&gt; &lt;p&gt;파일시스템 드라이버에 전달하게 됩니다.&lt;/p&gt; &lt;p&gt;그럼 파일 시스템 드라이버는 그 IRP에 담긴 정보와 요청을 확인하고&lt;/p&gt; &lt;p&gt;해당 요청을 보낸 대상에 대한 파일접근 권한 등을 확인 한 후 그것을 허락할지 말지를 결정합니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;우리가 복사나 이동 등의 동작을 수행하게 되면 그 동작에 대한 단 하나의 IRP가 날라가는 것은 아닙니다.&lt;/p&gt; &lt;p&gt;파일 접근이 가능한지도 알아보고, 또 파일이 어떤 정보를 가지고 있는지 정보를 요구하기도 하고,&lt;/p&gt; &lt;p&gt;필요에 따라 적절히 정보를 다시 셋팅하도록 만들기도 하는 등의 작업이 조합되어야 하기 때문에&lt;/p&gt; &lt;p&gt;우리는 단순히 파일을 이동시켰음에도 불구하고 수많은 IRP들이 날라가 그 동작을 완성시키게 됩니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;우리는 이런 다양한 종류의 파일 접근 요청에 대해 파일 시스템 필터 드라이버를 작성해&lt;/p&gt; &lt;p&gt;특정 파일에 대해 다양한 동작을 했을 때 어떤 IRP들이 날라가는지 알아보았습니다.&lt;/p&gt; &lt;p&gt;(참고로 테스트 OS는 Windows XP, 테스트 파일은 jpg 형식이었습니다.)&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;우선 간단하게 개요하자면,&lt;/p&gt; &lt;p&gt;우리가 파일에 대해 특별히 어떠한 동작을 요구하지 않아도 단순히 마우스오버를 한다던지,&lt;/p&gt; &lt;p&gt;그 파일이 담긴 폴더를 연다던지 하는 동작을 할 때도 IRP가 발생합니다.&lt;/p&gt; &lt;p&gt;이유는 마우스 오버를 할 때나 그 파일에서 오른쪽 마우스 클릭을 할 때도&lt;/p&gt; &lt;p&gt;해당 파일에 대한 정보를 얻어와 그것을 보여주어야 하고,&lt;/p&gt; &lt;p&gt;그 파일이 담긴 폴더를 열 때도 파일 정보 등을 얻어와야 하기 때문에&lt;/p&gt; &lt;p&gt;마우스로 단순히 스쳐가는 것 같은 실질적으로 우리는 큰 의미를 담지 않은 동작에도 많은 IRP가 발생합니다.&lt;/p&gt; &lt;p&gt;예를 들면 마우스 오버에는&lt;/p&gt; &lt;p&gt;IRP_MJ_create&lt;/p&gt; &lt;p&gt;IRP_MJ_query_volume_information, FileFsVolumeInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_query_information, FileAllInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_read&lt;/p&gt; &lt;p&gt;IRP_MJ_close&lt;/p&gt; &lt;p&gt;IRP_MJ_cleanup&lt;/p&gt; &lt;p&gt;위와 같은 IRP들을 발생시킵니다.&amp;#160; (앞에 있는 것이 IRP type, 뒤에 있는 것이 option입니다.)&lt;/p&gt; &lt;p&gt;IRP_MJ_create는 파일 오브젝트에 대한 핸들을 얻어오고자 하는 것이고&lt;/p&gt; &lt;p&gt;주로 qeury_information 같은 IRP들은 어떠한 정보를 얻고 싶을 때 보내는 IrP인데,&lt;/p&gt; &lt;p&gt;뒤의 옵션들을 볼 때 파일이 있는 볼륨에 대한 정보와 파일의 All Information 을 얻어오고자 하는 것 같습니다.&lt;/p&gt; &lt;p&gt;그리고 파일을 읽고, 핸들을 닫습니다.&lt;/p&gt; &lt;p&gt;주로, create, close, cleanup 같은 경우는 모든 파일 접근과 관련하여 거의 기본적으로 필수로 필요한 IRP들이라&lt;/p&gt; &lt;p&gt;이후 설명에서 이 IRP들과 관련된 내용은 생략하고,&lt;/p&gt; &lt;p&gt;qeury_information이나 set_information같이 좀더 특수한 상황에 발생하는 IRP를 중점적으로 알아보겠습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;lt;파일 열기&amp;gt;&lt;/p&gt; &lt;p&gt;파일을 열게되면 위에서 언급한 create, close 같은 IRP 외에도 &lt;/p&gt; &lt;p&gt;RP_MJ_query_volume_information, FileFsVolumeInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_query_information, FileAllInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_query_volume_information, FileFsControlQueryInformation&lt;/p&gt; &lt;p&gt;가 발생합니다.&lt;/p&gt; &lt;p&gt;위의 두개는 아까 설명한 단순한 클릭에도 발생하는 것들이었고,&lt;/p&gt; &lt;p&gt;좀 특별하게는 IRP_MJ_query_volume_information, FileFsControlQueryInformation 가 발생하는 것이 특징입니다.&lt;/p&gt; &lt;p&gt;그러나 이것은 파일을 여는 프로세스나 여는 방식에 따라서도 좀 달라보이기 때문에 &lt;/p&gt; &lt;p&gt;좀 더 관찰이 필요할 것 같습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;lt;파일 저장&amp;gt;&lt;/p&gt; &lt;p&gt;파일 저장을 할 때도 다양한 IRP들이 나타나지만&lt;/p&gt; &lt;p&gt;IRP_MJ_set_information, FileEndOfFileInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_set_information, fileAllocationInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_write&lt;/p&gt; &lt;p&gt;가 연달아 나타나는 것이 특징입니다.&lt;/p&gt; &lt;p&gt;파일 저장을 할 때는 write IRP가 많이 날라가는데, 파일을 쓰는 동작이니 당연한거겠죠?&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;위의 IRP 시퀀스 조합은 다른이름으로 저장이나 새로 저장 등을 할 때도 동일하게 나타나지만,&lt;/p&gt; &lt;p&gt;아쉽게도 다른 이름으로 저장은 기존 파일에 대해서가 아니라 새로운 파일에 대해서만 나타나기 때문에&lt;/p&gt; &lt;p&gt;기존 파일에서는 내가 다른 이름으로 저장 당하는지 알 길이 없습니다.&lt;/p&gt; &lt;p&gt;query_information 등을 날려서 정보를 좀 참조할 법도 한데요..&lt;/p&gt; &lt;p&gt;이유는 기존 파일은 프로세스가 파일을 열 때 필요한 내용을 모두 읽어오고 핸들을 닫아버리기 때문입니다.&lt;/p&gt; &lt;p&gt;그 이후에는 그 파일에 다시 접근(저장한다던지)하지 않는 이상 그 파일에 대해서는 참조하지 않습니다.&lt;/p&gt; &lt;p&gt;따라서 다른이름으로 저장같은 것을 알고싶을 때는 IRP 분석이 아니라&lt;/p&gt; &lt;p&gt;SDT 후킹 등의 방식을 사용하여야 합니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;lt;파일 복사&amp;gt;&lt;/p&gt; &lt;p&gt;파일 복사는 조금 복잡합니다.&lt;/p&gt; &lt;p&gt;전송되는 IRP들이 다양하기도 하고,&lt;/p&gt; &lt;p&gt;또 기존파일에 어떠한 연결고리를 가지고 내가 복사된다~~ 이것을 알려주는 것이 아니라&lt;/p&gt; &lt;p&gt;단순히 파일을 읽을 때처럼 정보만을 요청하여 필요한 정보를 쏙쏙 집어먹은 후&lt;/p&gt; &lt;p&gt;그것을 토대로 새로운 파일을 새로 저장하는 방식과 유사하게 저장하기 때문입니다.&lt;/p&gt; &lt;p&gt;따라서 복사는 내가 이 파일을 그대로 카피한다는 개념보다는&lt;/p&gt; &lt;p&gt;어떤 파일을 읽은 후, 유사한 이름으로 다시 저장한다, 로 이해하시면 더 쉬우실 것 같습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;그러나 그렇다고 복사를 알 수 있는 어떠한 특이점도 없느냐? 그것은 아닙니다.&lt;/p&gt; &lt;p&gt;복사를 할 때도 그들만의 특이한 IRP들이 날라갑니다.&lt;/p&gt; &lt;p&gt;좀 눈여겨 볼 것들이&lt;/p&gt; &lt;p&gt;IRP_MJ_query_information, FileObjectIdInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_query_information, FileStreamInformation&lt;/p&gt; &lt;p&gt;IRP_MJ_query_information, FileEaInformation&lt;/p&gt; &lt;p&gt;..&lt;/p&gt; &lt;p&gt;IRP_MJ_query_volume_information, FileFsAttributeInformation(copy되는 새로운 파일)&lt;/p&gt; &lt;p&gt;IRP_MJ_query_volume_information, FileFsAttributeInformation&lt;/p&gt; &lt;p&gt;..&lt;/p&gt; &lt;p&gt;IRP_MJ_set_information, FileEndOfFileInformation(copy되는 새로운 파일&lt;/p&gt; &lt;p&gt;IRP_MJ_set_information, FileBasicInformation(copy되는 새로운 파일)&lt;/p&gt; &lt;p&gt;IRP_MJ_write(copy되는 새로운 파일)&lt;/p&gt; &lt;p&gt;이 아이들인데요.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;먼저 복사할 파일에 대해 FileObjectIdInformation, FileStreamInformation, FileEaInformation 옵션을 가진&lt;/p&gt; &lt;p&gt;qeury information IRP들을 나란이 쏙쏙쏙 날립니다.&lt;/p&gt; &lt;p&gt;그리고 복사할 파일과 복사될 파일에 대한 볼륨 정보를 얻기 위해&lt;/p&gt; &lt;p&gt;FileFsAttributeInformation 옵션으로 하여 두개를 나란히 날리구요.&lt;/p&gt; &lt;p&gt;마지막 세개는 위에서 보았던 파일저장과는 조금 다르지만&lt;/p&gt; &lt;p&gt;어쨌든 파일을 저장하는 형태임을 알 수 있겠습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;따라서 저런 형태가 연달아서 나란히 나타나면 복사로 추측합니다.&lt;/p&gt; &lt;p&gt;The Kerberos 시스템에서는 좀 더 정확성을 기하기 위해&lt;/p&gt; &lt;p&gt;IRP가 쏟아져 들어오면 저 시퀀스가 무너질 수도 있다는 가능성을 감안하여&lt;/p&gt; &lt;p&gt;저 IRP들이 들어올 때 복사되는 파일과 복사하는 파일의 경로 또는 파일이름의 유사성까지 비교하였는데요,&lt;/p&gt; &lt;p&gt;그렇지만 보통 저 IRP들은 하나의 동작에 대해 어느 도 단일성을 가지고 날라오는 IRP이므로&lt;/p&gt; &lt;p&gt;순서가 바뀌거나 다른 것이 끼어들 확률은 지극히 낮다고 보시면 됩니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;lt;파일 이동 / 이름변경&amp;gt;&lt;/p&gt; &lt;p&gt;파일 이동이나 이름 변경의 경우에는 분석이 가장 간단한 경우인데요.&lt;/p&gt; &lt;p&gt;많은 query_information같은 IRP 들이 날라오긴 하지만&lt;/p&gt; &lt;p&gt;IRP_MJ_set_information, FileRenameInformation&lt;/p&gt; &lt;p&gt;이 IRP 하나로 모든 수사를 깔끔하게 종결시킬 수 있습니다.&lt;/p&gt; &lt;p&gt;이 IRP에 파일의 full path가 변경되며, 이것으로 다시 set 해달라는 정보를 담고있는데요.&lt;/p&gt; &lt;p&gt;full path에 대한 변경에 해당하는 IRP이기 때문에&lt;/p&gt; &lt;p&gt;파일 이동과 이름변경 모두 이 IRP를 날립니다.&lt;/p&gt; &lt;p&gt;따라서 만약 두가지를 분리하고 싶다면 IRP가 대상으로 하는 파일의 full path와 &lt;/p&gt; &lt;p&gt;IRP 시스템 버퍼에 들어있는 이 rename에 관련된 정보에 담긴 full path를 비교하면 &lt;/p&gt; &lt;p&gt;이동인지 이름변경인지를 알 수 있겠지요. &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;한가지 주의할 점은 이 IRP가 성공할 수도 있고 실패할 수도 있는데요.&lt;/p&gt; &lt;p&gt;만약 같은 폴더에 동일한 이름이 있다면 이름변경을 거부당하겠지요.&lt;/p&gt; &lt;p&gt;이것은 파일 시스템 드라이버에서 처리가 완료되어 나오는 내용을 분석하면 성공 여부를 알 수 있습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;lt;파일 삭제&amp;gt;&lt;/p&gt; &lt;p&gt;마지막으로 파일 삭제인데요.&lt;/p&gt; &lt;p&gt;이것도 위의 이동처럼 &lt;/p&gt; &lt;p&gt;IRP_MJ_set_information, FileDispositionInformation&lt;/p&gt; &lt;p&gt;이 IRP 하나로 깔끔하게 알 수 있습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;그러나 주의할 것은 휴지통으로 삭제와 영구삭제의 차이인데요.&lt;/p&gt; &lt;p&gt;영구삭제는 저 IRP들을 끝으로 깔끔하게 끝나지만 휴지통 삭제는 조금 다릅니다.&lt;/p&gt; &lt;p&gt;휴지통으로 삭제하는 것은 삭제긴 하지만 실질적으로 휴지통에 그 정보가 남아있는 것이기 때문에&lt;/p&gt; &lt;p&gt;저 IRP를 날린 후 다시 IRP_MJ_set_information, FileRenameInformation 을 날려&lt;/p&gt; &lt;p&gt;파일의 full path를 휴지통 내에서 고유한 파일 path를 부여받아 그것으로 변경하기 때문에&lt;/p&gt; &lt;p&gt;실질적으로는 파일 삭제보다는 이동쪽에 더 가깝다고 여기시면 될 것 같습니다.&lt;/p&gt; &lt;p&gt;마찬가지로 복원시에도 휴지통의 경로에서 원래의 경로로 rename됩니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;이상 다양한 파일접근에 대한 IRP들을 분석해보았습니다.&lt;/p&gt; &lt;p&gt;이 정보가 다양한 파일 시스템과 필터드라이버 제작에 도움이 되었으면 합니다.&lt;/p&gt; &lt;p&gt;감사합니다.&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Clipboard Hook : ‘복사/ 붙여 넣기’를 막아보자! </title>
            <link>http://www.swssm.org/index.php?idx=346</link>
            <description>&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;안녕하세요!!&amp;nbsp; ‘The Kerberos’ 프로젝트의 박병훈입니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;소프트웨어멤버십에서 진행한 프로젝트인 ‘The Kerberos’는 보안 관리자가 지정한 &lt;strong&gt;중요한 파일들을 감시하는&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;&lt;strong&gt; 보안 프로젝트&lt;/strong&gt;입니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;이 프로젝트에서는 보안 파일들에 대한 특정 액세스( 복사, 삭제, 이름 변경 등 )들을 파일 필터 드라이버를 통해 감시하게&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt; 되는데 다음과 같은 경우에는 필터 드라이버만으로 보안 파일이 유출 되는 것을 감시하는데 한계가 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face=&quot;나눔고딕&quot;&gt;보안 파일(text type)을 열어두고 텍스트 내용을 다른 텍스트 편집기로 ‘&lt;strong&gt;복사 &amp;amp; 붙여 넣기&lt;/strong&gt;’를 하여 유출하는 경우&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt; &lt;br /&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;위와 같은 경우는 보안 파일을 직접적으로 이동이나 복사를 하지 않았기 때문에 파일 필터 드라이버에서는 유출 과정을&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;알아차리지 못하게 됩니다. 그래서 이러한 경우를 막기 위하여 &lt;strong&gt;Dll Injection&lt;/strong&gt; 기법을 사용했습니다. 그래서 이번 포스팅에&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;서는 Dll Injection에 관한 전반적인 설명과 간단한&amp;nbsp; 메모장에서 ‘복사 &amp;amp; 붙여 넣기’를 방지하는 방법을 소개할까 합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;제가 제목에 Clipboard Hook이라고 적어 놓은 이유는 Dll Injection을 통하여 클립보드의 내용을 가로채서 따로 조작해보려&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;고 하기 때문입니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;다들 다 아시겠지만 윈도우에서 ‘복사’ 또는 ‘ctrl + c’를 하게 되면 그 내용이 클립보드라는 곳으로 이동하게 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;클립보드는 윈도우 운영체제가 관리하는 공유 메모리 공간입니다. 이를 통해서 서로 다른 프로그램 사이에 데이터를 주고 받&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;을 수 있는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;클립보드를 이용하는 방법에는 크게 다음과 같은 두 가지 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face=&quot;나눔고딕&quot;&gt;API 함수를 호출하여 전역 메모리 블록을 두고 받는 방법&lt;/font&gt; &lt;/li&gt;&lt;li&gt;&lt;font face=&quot;나눔고딕&quot;&gt;IDataOnject 표준 COM 인터페이스를 통해 데이터를 주고 받는 방법&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt; &lt;br /&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;여기서 저는 API 함수 호출로 클립보드의 내용을 지우는 방법을 사용해보겠습니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;그럼 일단 Dll Injection 기법이 무엇인지 간단히 알아보겠습니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;윈도우에는 수 많은 .dll 파일들이 존재합니다. DLL(Dynamic Link Library: 동적 링크 라이브러리)은 어떤 기능이 실행 파일&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;에 직접 덧붙여지지 않고, .dll 파일에 독립적으로 존재하다가 프로그램이 실행될 때 동적으로 링크되어 사용됩니다. 따라서 &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;메모리와 하드 디스크를 절약할 수 있고 프로그램 실행 속도가 빨라질 수 있으며 프로그램의 모듈화가 가능합니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;제가 하고자 하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;font face=&quot;나눔고딕&quot;&gt;.dll 파일 생성&lt;/font&gt;&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font face=&quot;나눔고딕&quot;&gt;클립보드 내용을 지우는 코드 작성 후 .dll 파일에 추가&lt;/font&gt;&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font face=&quot;나눔고딕&quot;&gt;메모장에&amp;nbsp; 1, 2번을 통해 만들어진 .dll 파일을 끼어 넣어서 클립보드가 지원지게 함&lt;/font&gt;&lt;/strong&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;정말 간단합니다~! 단 3단계의 과정만 거치면 끝입니다. 그럼 1, 2, 3번 과정을 구체적으로 알아 보겠습니다.&lt;/font&gt;&lt;/p&gt; &lt;br /&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot; size=&quot;5&quot;&gt;&lt;strong&gt;■ .dll 생성 및 클립보드 내용 지우기&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;나눔고딕&quot; size=&quot;5&quot;&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;img style=&quot;width: 645px; height: 570px;&quot; src=&quot;http://lh4.ggpht.com/_AIK0xcRuTKk/Sqj_BuzRi6I/AAAAAAAAAPQ/razN-ePTBFI/s800/dll.JPG&quot;&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot; size=&quot;5&quot;&gt;&lt;strong&gt;&lt;strong&gt;■&lt;/strong&gt; .dll 파일 특정 프로세스에 삽입하기&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;img style=&quot;width: 664px; height: 630px;&quot; src=&quot;http://lh4.ggpht.com/_AIK0xcRuTKk/Sqj_Bs1V9yI/AAAAAAAAAPM/r8MYqJiNdg4/s800/main.JPG&quot;&gt; &lt;br /&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;지금까지 소스 코드로 Dll Injection 방법으로 메모장의 클립보드를 막는 방법을 알아보았습니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;보시면 아시겠지만 몇 줄 안 되는 코드로 간단하게 클립보드를 막았습니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;이 소스를 조금만 변형하고 응용한다면 더 재미있는 프로그램을 만들 수 있을 것이라 생각합니다.&lt;/font&gt;&lt;/p&gt; &lt;br /&gt; &lt;p&gt;&lt;font face=&quot;나눔고딕&quot;&gt;그럼 이번 포스팅을 이것으로 마치겠습니다^^&lt;/font&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>FLEX - Socket 통신 및 UTF 16 처리 방법 </title>
            <link>http://www.swssm.org/index.php?idx=343</link>
            <description>&lt;p&gt;안녕하세요? 수원멤버십 18-2기 백성욱입니다.&lt;/p&gt; &lt;p&gt;이번 포스팅 주제는 FLEX 에서 Socket 통신하는 방법과 UTF-16 처리 방법입니다. &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;FLEX에서 소켓통신을 하기 위해서는 Socket 객체를 사용해야 됩니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1136096892.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1026634537.png&quot; width=&quot;220&quot; height=&quot;48&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1040400890.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1085785508.png&quot; width=&quot;563&quot; height=&quot;97&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;먼저 소켓 객체를 생성하고 connect(“연결할 서버”, “포트번호) 이런 식으로 함수를 호출하면 연결이 완료됩니다. 그리고 FLEX에서는 거의 모든 객체가 EventListener 라는 함수를 가지고 있는데 소켓통신에서도 상당히 유용하게 쓰입니다.&lt;/p&gt; &lt;p&gt;위의 코드를 예로 설명 드리겠습니다.&lt;/p&gt; &lt;p&gt;먼저 socket에서 사용하는 이벤트로 Event.CONNECT 와 ProgressEvent.SOCKET_DATA 가 있습니다.&lt;/p&gt; &lt;p&gt;Event.CONNECT:&lt;/p&gt; &lt;p&gt;소켓이 연결이 되었을 경우 발생하는 이벤트로서 addEventListener 함수의 2번째 파라미터에 호출할 함수를 지정해주면 해당 이벤트가 발생할 때마다 호출하게 됩니다.&lt;/p&gt; &lt;p&gt;ProgressEvent.SOCKET_DATA:&lt;/p&gt; &lt;p&gt;연결된 socket 객체로부터 전달받는 DATA가 있을 경우 발생하는 이벤트입니다. 쉽게 이야기해서 보통 C 에서는 while(1) 상태로 소켓으로부터 전달받는 DATA를 기다리고 있는 데 FLEX 에서는 위와 같이 addEventListener 함수에 이벤트와 함수를 등록함으로써 해결할 수 있습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;다음으로 소켓으로 서버에게 데이터를 전송하고 받는 과정을 설명 드리겠습니다.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1277010387.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1114818072.png&quot; width=&quot;462&quot; height=&quot;260&quot; /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;일단 FLEX에서 서버로 전송하는 내용이 총 12 byte 라고 가정하고 설명 드리겠습니다.&lt;/p&gt; &lt;p&gt;4byte : 전체 전송하는 바이트 크기&lt;/p&gt; &lt;p&gt;4byte : 데이터 번호&lt;/p&gt; &lt;p&gt;4byte : 패킷 Number&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;위와 같은 정보를 서버에게 보내기 위해서 일단 ByteArray 이라는 객체를 선언합니다. 일반적인 Array 와 다른 점은 모든 데이터를 byte로 처리한다는 점입니다. &lt;/p&gt; &lt;p&gt;숫자관련 정보의 경우 다음과 같은 함수들을 사용합니다.&lt;/p&gt; &lt;p&gt;4byte의 정보를 숫자로 보내고 싶을 경우&lt;/p&gt; &lt;p&gt;writeInt();&lt;/p&gt; &lt;p&gt;2byte의 정보를 숫자로 보내고 싶을 경우 &lt;/p&gt; &lt;p&gt;writeShort();l&lt;/p&gt; &lt;p&gt;만약 Unsigned형으로 보내고 싶을 경우 위의 함수에 Unsigned만 붙여주면 됩니다. &lt;/p&gt; &lt;p&gt;ex) writeUnsignedInt() ;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;ByteArray에 저장된 내용을 서버와 연결된 Socket 객체를 통해 전송하고 싶을 경우 일단 Socket 객체의 버퍼에 전송할 내용을 저장합니다.&lt;/p&gt; &lt;p&gt;이 방법은 ByteArray 에 정보를 저장하는 것과 동일합니다.&lt;/p&gt; &lt;p&gt;writeBytes(ByteArray 객체, 전송할 내용의 시작 번지, 전송할 내용의 총 Byte 사이즈);&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;위에서 보면 bytesAvailable 이라는 것이 있는 데 이것은 ByteArray 객체가 가지고 있는 바이트의 크기를 의미합니다. 이 함수는 특히 서버로부터 전송 받는 데이터를 처리할 때 유용하게 쓰입니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;마지막으로 flush() 함수를 호출함으로써 연결된 서버에게 데이터를 전송하게 됩니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;다음은 소켓으로부터 받은 데이터 처리 방법입니다. &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1406235283.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; align=&quot;left&quot; src=&quot;http://tt_attach_path/1224401137.png&quot; width=&quot;538&quot; height=&quot;801&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;다음은 UTF 16 처리 방법입니다. 사실 FLEX에서 기본적으로 UTF 16을 지원해주는 줄 알고 있었고 실제로 FLEX 개발문서를 보아도 이 부분에 대한 지원이 명시되어있었습니다.&lt;/p&gt; &lt;p&gt;하지만 FLEX 개발자 커뮤니티 같은 곳에서 확인해보면 이 문제에 대한 논의가 많습니다. 된다, 안 된다 등등… 이번에 프로젝트할때도 사실 readMultiByte(“읽을 바이트 수”, “char-set”) 이런 식으로 해보았지만 해결되지 않아서 별도로 클래스를 만들어서 처리하는 작업을 진행하였습니다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;서버로부터 받은 UTF-16 정보를 String로 변환하는 함수&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1318200811.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1250095609.png&quot; width=&quot;543&quot; height=&quot;186&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;FLEX 에서 서버로 전송할 때 String 정보를 UTF-16 로 변환하는 함수&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1346328847.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1388676321.png&quot; width=&quot;544&quot; height=&quot;479&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;이상으로 포스팅을 마치겠습니다. 감사합니다. ^^&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>식물에게 영향을 주는 소리 분석은 어떻게 할까. </title>
            <link>http://www.swssm.org/index.php?idx=342</link>
            <description>&lt;P&gt;안녕하세요. 김혜진입니다. 오늘은 소리 분석 알고리즘에 대해 설명하도록 할게요. 그런데 그림이 안올라가서..;; 글만 쓸게요;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;우리가 소리를 분석하는 기준은 식물이 들었을 때 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;좋은 소리인가 나쁜 소리인가를 판단하는 것이다. 이러한 기준은 여러 가지 실험을 통해서 증명된 바 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;있듯 &lt;FONT color=#ff0000&gt;1/f의 패턴&lt;/FONT&gt;을 가진 자연의 소리 패턴과 가까운 소리에 대해서 좋은 소리라고 판단하고 식물에게 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;좋은 영향을 끼친다는 것을 사용자에게 알려준다. 실제로 그린농법 등 좋은 소리가 식물의 성장과 밀접&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;한 관계가 있다는 것은 모두가 잘 아는 사실이다. 다만, 어떤 소리가 좋은 지는 실험을 통해서만 증명&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;이 가능하기 때문에 그 시간 투자 비용도 만만치가 않다. 이번에 우리 프로젝트를 통해서 좋은 소리와 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;나쁜 소리를 구분하도록 한다.&lt;br /&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;1&quot; b:bi=&quot;4&quot; b:bd=&quot;3&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;① Detect Voice &amp;amp; End Detect Point(EDP)&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;1&quot; b:bi=&quot;4&quot; b:bd=&quot;7&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- 오른쪽은 소리가 음성인지 아닌지를 &amp;nbsp;판단하는 &amp;nbsp;Detect Voice 함수이다. 한 음성 데이타값은 1024개&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;의 주파수로 이루어져 있다. 이 각 음성 데이타값들의 크기를 모두 저장해서 총 프레임의 에너지를 구&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;한다.&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;1&quot; b:bi=&quot;4&quot; b:bd=&quot;8&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- 레퍼런스 에너지값을 미리 정해놓았다가 이 에너지값보다 큰 데이타값이 들어오면 이것은 음성일지도 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;모른다는 가정을 하고 일정 StartLimit만큼 기다렸다가 그 뒤부터는 음성으로 판단하게 된다.&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;1&quot; b:bi=&quot;4&quot; b:bd=&quot;7&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- 레퍼런스 에너지값보다 작은 소리가 들어오면 일정 EndLimit만큼 기다렸다가 에너지가 다시 오르지 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;않으면 음성이 끊겼다고 간주하고 목소리를 파일로 저장하게 된다.&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; int i;&lt;br /&gt;&amp;nbsp;int data = 0, nTotal = 0, tmData;&lt;br /&gt;&amp;nbsp;static int IsRecording = 0, IsLowCombo = FALSE;&lt;br /&gt;&amp;nbsp;static long EndOffset = 0;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp;// current frame's energy&lt;br /&gt;&amp;nbsp;for(i=0; i &amp;lt; nCount; i++)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; tmData = abs(pData[i] - 128);&lt;br /&gt;&amp;nbsp; data += tmData*tmData;&lt;br /&gt;&amp;nbsp; nTotal += tmData;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;UpdateData(FALSE);&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;br /&gt;&amp;nbsp;if(data &amp;gt;= (int) m_nReferancEnergy) // 음성 신호가 기준 전력보다 클때. &lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; if(!IsRecording) // 시작 점 탐지.&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;//m_InfoText.SetWindowText(&quot;음성 감지 시작&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp;IsRecording = TRUE;&lt;br /&gt;&amp;nbsp; &amp;nbsp;IsLowCombo = FALSE;&lt;br /&gt;&amp;nbsp; &amp;nbsp;m_fp = fopen(FTMP,&quot;wb&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(!m_fp){return FALSE;}&lt;br /&gt;&amp;nbsp; }&amp;nbsp;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; SetDlgItemText(IDC_STATUS, _T(&quot;음성신호들어옴&quot;));&lt;br /&gt;&amp;nbsp; fwrite(pData, sizeof(unsigned char)*nCount, 1, m_fp);&lt;br /&gt;&amp;nbsp; m_cntspeech++;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else // 음성 신호가 기준 전력보다 작을때 &lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; if(m_cntspeech != 0)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;// 바뀐부분, 음성신호가 아님&lt;br /&gt;&amp;nbsp; &amp;nbsp;if(m_cntspeech &amp;lt; m_nStartPointLimit &amp;amp;&amp;amp; m_cntspeech &amp;gt;= 1)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; IsRecording = FALSE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; fclose(m_fp);&lt;br /&gt;&amp;nbsp; &amp;nbsp; m_fp = NULL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; m_cntspeech = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; m_cntNotspeech = -1;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;else // 기준 전력보다 작아도 진행중으로 판단.&lt;br /&gt;&amp;nbsp; &amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; if(IsLowCombo) // 전 프레임에서 기준 전력보다 낮았음.&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;EndOffset += nCount;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IsLowCombo = TRUE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; else // 전단계에서 기준 전력보다 높았음.&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;EndOffset = nCount;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IsLowCombo = TRUE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(m_cntNotspeech &amp;gt;= 0 &amp;amp;&amp;amp; m_cntNotspeech &amp;lt; m_nEndPointLimit) // 데이타 저장.&lt;br /&gt;&amp;nbsp; &amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;fwrite(pData, sizeof(unsigned char)*nCount, 1, m_fp);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;m_cntNotspeech++;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;data = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return FALSE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; else &lt;br /&gt;&amp;nbsp; &amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;m_SoundSize = ftell(m_fp);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if(m_fp != NULL) { fclose(m_fp); m_fp = NULL;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;m_cntspeech = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;m_cntNotspeech = -1; // 끝점이라고 인식. &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IsRecording = FALSE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;OptimaizeEndPoint(EndOffset - nCount);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;EndOffset = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;IsLowCombo = FALSE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return TRUE;&lt;br /&gt;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/DIV&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;2&quot; b:bi=&quot;4&quot; b:bd=&quot;3&quot;&gt;&lt;br /&gt;&lt;br /&gt;② LPF&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- 저역 통과 필터이다. 이는 특정 주파수 이하의 신호만 통과시키는 것이다. 위 알고리즘을 모든 음성&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;으로 검출된 데이터에 적용시키는데 여기서는 0.95로 지정해놓았다.&lt;br /&gt;&lt;/P&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;//m_PreEmphasysCoef = 0.95&lt;br /&gt;&amp;nbsp; YData =&amp;nbsp; (Data - 128) - (unsigned char)(0.95*(double)(PreData - 128));&lt;br /&gt;&amp;nbsp; YData += 128;&lt;br /&gt;&lt;br /&gt;PreData = Data;&lt;/DIV&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;3&quot; b:bi=&quot;4&quot; b:bd=&quot;3&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;③ Hamming window&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- 윈도우를 취하는 함수는 retangular, bartlett, hamming, hanning 등 여러 가지 있다. 우리는 이 중 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;해밍 윈도우를 취하였다. 윈도우 크기마다 아래의 해밍함수를 적용시켜 주파수 분석하기 좋은 파형을 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;만든다.&lt;br /&gt;&lt;/P&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;for(i = 0; i &amp;lt; WINDOWLENGTH; i++)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;InValue = (double)(DataBlk[i] - 128);&lt;br /&gt;&amp;nbsp; &amp;nbsp;Value = 0.0;&lt;br /&gt;&amp;nbsp; &amp;nbsp;Wn = 0.54 - 0.46 * cos( factor*( i) );&lt;br /&gt;&amp;nbsp; &amp;nbsp;Value = Wn*InValue;&lt;br /&gt;&amp;nbsp; &amp;nbsp;DataBlk[i] = (unsigned char)(Value+128);&lt;br /&gt;&amp;nbsp; &amp;nbsp;OptimaVal += (long)(Value*Value) ;&lt;br /&gt;}&lt;br /&gt;&lt;/DIV&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;아래는 다른 윈도우 함수들을 비교해놓은 것이다.ㅠㅠ 그림을 올리고 싶어라.&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;&lt;br /&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;4&quot; b:bi=&quot;4&quot; b:bd=&quot;3&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;④ FFT &amp;amp; MFCC&lt;br /&gt;// fft 수식&lt;br /&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- 해밍 윈도우 함수 처리된 값을 저장한 파일을 읽어들이고 FFT, FFT 특징점, Energy, MFCC 들에 대&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;한 각 함수를 만든다. 여기까지의 과정을 거쳐 레퍼런스들과 분석 자료들이 만들어져서 DB에 저장된다.&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:oo=&quot;5&quot; b:bi=&quot;4&quot; b:bd=&quot;3&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;&lt;br /&gt;⑤ Reference 비교&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;- DTW(Dynamic Time Warping)이라는 알고리즘에서 참고하여 이 비교 알고리즘을 만들었다. DTW는 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;연산량이 적고 구조가 간단하여 실시간 검출이 필요한 프로그램 등에서 많이 사용된다. 우리는 실시간&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;성이어야 하며 긴 대화 문장이나 실제 단어를 인식하는 것이 아닌 패턴을 비교하는 것이므로 DTW의 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;패턴 비교 알고리즘을 차용하여 분석을 하였다. &lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;우선, 분석한 자료들과 음성의 분석 자료들을 비교하는데 그 파라미터 개수를 비교하여 같지 않으면 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;두 개가 다른 것으로 판단한다. 이런 식으로 데이타베이스에 저장되어있는 레퍼런스들과 비교를 한다. &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;파라미터 개수가 같으면 각 파라미터들 사이 거리를 구한다. 그 거리는 특징점 사이의 거리이다. 즉, 파&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;형에서 특징점을 추출하여 파라미터로 만들고 각 비교 음성들에 대해서 특징점 사이 간격이 다를 수 있&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;으므로 그것을 계산한다. 특징점들 사이의 간격을 gain이라고 하여 가지고 있다가 gain이 최소가 되는 &lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;레퍼런스의 패턴이 좋은 패턴이면 좋은 소리라고 나쁜 패턴이면 나쁜 소리라고 식물이 말을 하게 해준&lt;/FONT&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 돋움&quot;&gt;다.&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 1.6&quot; b:bd=&quot;4&quot;&gt;&lt;FONT style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: 바탕&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P&gt;&lt;FONT size=2&gt;⑥ 다른 알고리즘&lt;/FONT&gt;&lt;/P&gt; &lt;P&gt;&lt;FONT size=2&gt;- 위 알고리즘은 여러 음성을 검출하는 데는 편리하고 탁월하지만 실제로 좋은 패턴이냐 나쁜 패턴이냐 두 가지 구분하는 데는 뛰어나지 않다. 레퍼런스가 충분히 많지 않아서기도 했을 테지만 사람이 좋다고 생각하는 말도 식물에게 나쁜 영향을 준다고 판단하기도 하고 같은 말인데도 화자가 다를 경우 다른 말로 인식하여 다른 결과를 도출하기도 했다. 좀 더 많은 실험이 필요하겠지만 위 알고리즘 외에도 새로운 알고리즘을 통해 식물과 사람이 좀 더 교감할 수 있도록 할 수 있어야 할 것이다.&lt;/FONT&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>영상 스트리밍 서비스 </title>
            <link>http://www.swssm.org/index.php?idx=344</link>
            <description>&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;안녕하세요. 19-1기 임승훈입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;이번에는 영상 스트리밍 서비스와 그 방식에 관해 간단한 설명을 하겠습니다.^^&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;우선 스트리밍 서비스는&lt;SPAN lang=EN-US&gt; 1995&lt;/SPAN&gt;년 리얼네트워크사가 개발한 리얼오디오에서 처음으로 선보였습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;스트리밍 서비스란 콘텐츠를 하드디스크 드라이브에 다운로드 받아 재생하던 것을 다운로드 없이 실시간으로 재생해 주는 기법을 말합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;전송되는 데이터가 마치 물이 흐르는 것처럼 처리된다고 해서&lt;SPAN lang=EN-US&gt; '&lt;/SPAN&gt;스트리밍&lt;SPAN lang=EN-US&gt;(streaming)'&lt;/SPAN&gt;이라는 명칭이 붙여졌습니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;스트리밍과 일반&lt;SPAN lang=EN-US&gt; http &lt;/SPAN&gt;프로토콜의 차이는 다음과 같습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;스트리밍은 클라이언트의 하드디스크에 파일을 위치 시키지 않으며 콘텐츠를 실시간으로 재생합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;또한 원하는 시간으로 탐색할 수 있는 특징이 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;반면&lt;SPAN lang=EN-US&gt; http &lt;/SPAN&gt;프로토콜을 이용한 콘텐츠 재생은 파일이 일정량 이상 다운로드 되지 않으면 재생이 불가하고 완전히 다운로드 되기 전까지는 원하는 시간으로의 탐색이 불가능 합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;또한 스트리밍 서비스는 무단 다운로드를 방지할 수도 있어 보안이 용의하여 월드와이드웹의 콘텐츠 서비스에서 많이 사용되고 있습니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;스트리밍이 동작하려면 데이터를 수신하고 있는 클라이언트 측은 데이터를 모으고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;그 데이터를 사운드나 그림으로 변환해 주는 응용프로그램에 끊임없이 보내줄 수 있어야 합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;만약 클라이언트가 데이터를 수신하는 속도가 너무 빠르면 여분의 데이터를 버퍼에 저장하면서 동시에 스트리밍하게 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;그러나 데이터 수신 속도가 빠르지 않으면 데이터의 표현이 매끄럽지 않게 됩니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;하지만 현재 인터넷회선의 속도 증진과 서버 및 컴퓨터 그리고&lt;SPAN lang=EN-US&gt; OS &lt;/SPAN&gt;및 솔루션&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;코덱들이 고루 발전함에 따라 그러한 문제점들은 차츰 사라져가고 있습니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;스트리밍 서비스는 압축&lt;SPAN lang=EN-US&gt;(encoding)&lt;/SPAN&gt;된 콘텐츠를 작은 단위&lt;SPAN lang=EN-US&gt;(&lt;/SPAN&gt;패킷&lt;SPAN lang=EN-US&gt;)&lt;/SPAN&gt;로 쪼갠 다음&lt;SPAN lang=EN-US&gt;, IP&lt;/SPAN&gt;에 연속적&lt;SPAN lang=EN-US&gt;(Streaming)&lt;/SPAN&gt;으로 전송하고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;이를 원격지의 사용자의 단말기&lt;SPAN lang=EN-US&gt;(PC)&lt;/SPAN&gt;에서 다시 연속적으로 재생&lt;SPAN lang=EN-US&gt;(&lt;/SPAN&gt;조합&lt;SPAN lang=EN-US&gt;,&lt;/SPAN&gt;압축해제&lt;SPAN lang=EN-US&gt;-Decoding)&lt;/SPAN&gt;하여 콘텐츠를 서비스 받을 수 있게 되는 것입니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;이렇게 작은 단위&lt;SPAN lang=EN-US&gt;(&lt;/SPAN&gt;패킷&lt;SPAN lang=EN-US&gt;)&lt;/SPAN&gt;로 쪼개서&lt;SPAN lang=EN-US&gt; IP&lt;/SPAN&gt;에 연속적으로 전송하기 위해서는 스트리밍 서버가 필요합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;스트리밍서버에서는 콘텐츠를 정해진 위치를 찾아 패킷단위로 전송해주어야 하고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;네트워크의 트래픽 증가를 제어하며 안정적인 서비스를 제공해야 합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;이러한 기능들을 담당하는 것이 바로 스트리밍 솔루션입니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;스트리밍 솔루션의 기능으로는 유니캐스트&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;멀티캐스트&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;브로드캐스트를 통한 패킷 전송&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;네트워크 트래픽의 제어&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;콘텐츠관리 등 서버의 안정성과 관리자의 편의성을 고려하여 제작됩니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;스트리밍 서버의&lt;SPAN lang=EN-US&gt; OS&lt;/SPAN&gt;의 종류로는&lt;SPAN lang=EN-US&gt; Windows Server, LINUX, Solaris &lt;/SPAN&gt;가 있습니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;. &lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; mso-bidi-font-family: 굴림&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;스트리밍 솔루션의 종류로는 대표적인 예가&lt;SPAN lang=EN-US&gt; Windows NT,2003 Server&lt;/SPAN&gt;와 함께 운영되는&lt;SPAN lang=EN-US&gt; Windows Media Service(&lt;/SPAN&gt;이하&lt;SPAN lang=EN-US&gt; WMS)&lt;/SPAN&gt;가 있습니다&lt;SPAN lang=EN-US&gt;. WMS&lt;/SPAN&gt;는 사용하기 편리한&lt;SPAN lang=EN-US&gt; GUI&lt;/SPAN&gt;를 제공하며&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;주문형 게시지점을 생성함으로서&lt;SPAN lang=EN-US&gt; VOD(Video On Demand) &lt;/SPAN&gt;스트리밍 서비스를 제공합니다&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;콘텐츠를 라이브로 브로드캐스트하려면 스트림을 인코더에서&lt;SPAN lang=EN-US&gt; Windows Media &lt;/SPAN&gt;서버로 &lt;SPAN style=&quot;FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림&quot;&gt;푸시&lt;SPAN lang=EN-US&gt;(push)&lt;/SPAN&gt;&lt;/SPAN&gt;할 것인지 클라이언트&lt;SPAN lang=EN-US&gt;(Windows Media &lt;/SPAN&gt;서버 또는 플레이어&lt;SPAN lang=EN-US&gt;)&lt;/SPAN&gt;가 스트림을 &lt;SPAN style=&quot;FONT-FAMILY: 굴림; mso-bidi-font-family: 굴림&quot;&gt;풀&lt;SPAN lang=EN-US&gt;(pull)&lt;/SPAN&gt;&lt;/SPAN&gt;하도록 할 것인지 선택해야합니다.&lt;br /&gt;자신의 현재 상황에 맞는 방법을 선택하면 되겠죠.^^&lt;br /&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;우선, 푸시(push) 방식에 대해서 설명드리겠습니다. &lt;/FONT&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;인코더가 방화벽 안쪽에 있거나 인코더를 출발점으로 하여 연결을 시작하려는 경우 인코더에서 스트림을 푸시&lt;SPAN lang=EN-US&gt;(push)&lt;/SPAN&gt;하는 것이 좋습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;예를 들어&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;갑자기 사장님 직원들에게 이야기하는 내용을 스트리밍해야 하는 경우를 가정해 보겠습니다&lt;SPAN lang=EN-US&gt;. Windows Media &lt;/SPAN&gt;서버는 회사 방화벽 밖의 원격 위치에 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;게다가 서버 관리자는 아무 것도 전달 받지 못한 상태입니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;인코더에서 스트림을 푸시&lt;SPAN lang=EN-US&gt;(push)&lt;/SPAN&gt;하면 방화벽을 통과하여 스트림을 얻을 수 있으므로 사장님의 요구를 충족시킬 수 있으며 서버 관리자를 급히 호출하지 않아도 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;푸시&lt;SPAN lang=EN-US&gt;(Push) &lt;/SPAN&gt;배포는&lt;SPAN lang=EN-US&gt; Windows .NET Server 2003&lt;/SPAN&gt;과 함께 제공되는&lt;SPAN lang=EN-US&gt; Windows Media &lt;/SPAN&gt;서비스&lt;SPAN lang=EN-US&gt; 9 &lt;/SPAN&gt;시리즈에서만 사용할 수 있습니다.&lt;br /&gt;&amp;nbsp;아래는 푸시(push) 방식에 관한 간단한 샘플 코드입니다.&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; // Pushing a Stream to a Windows Media Server&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Configure the encoding session including the input sources and profile.&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Create a push distribution object.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IWMEncPushDistribution PushDist = (IWMEncPushDistribution)Encoder.Broadcast;&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Declare variables.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sServerName;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sPubPoint;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sPubTemplate;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sBrdcstInfo;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sMyNSCFile;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sMyNSCURL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; string sMyASXFile;&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Provide values for the following variables.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sServerName = &quot;211.189.127.80:8888&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sPubPoint = &quot;test&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sPubTemplate = &quot;EXISTING_PUBLISHING_POINT_NAME&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sBrdcstInfo = &quot;NAME OF THE BROACAST INFORMATION FILE&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sMyNSCFile = &quot;NAME OF THE NSC FILE TO CREATE&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sMyNSCURL = &quot;URL TO THE NSC FILE YOU CREATE&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; sMyASXFile = &quot;NAME OF THE ANNOUNCMENT FILE&quot;;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Specify the server name, publishing point, an existing publishing&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // point, and then generate an NSC file and announcement file.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; PushDist.ServerName = sServerName;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; PushDist.PublishingPoint = sPubPoint;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //PushDist.Template = sPubTemplate;&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Specify whether to destroy the publishing point.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; PushDist.AutoRemovePublishingPoint = false;&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Initialize the encoding session.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Encoder.PrepareToEncode(true);&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Generate the announcement file.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //PushDist.GenerateMulticastInfoFile(sMyNSCFile);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //PushDist.GenerateAnnouncementFile(sMyNSCURL, sMyASXFile);&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Start encoding.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Encoder.Start();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=s0 style=&quot;TEXT-JUSTIFY: inter-ideograph; MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // TODO: Handle exceptions.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MessageBox.Show(ex.Message + &quot;:&quot; + ex.StackTrace.ToString());&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;풀(pull)방식은 W&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;indows Media &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt; LINE-HEIGHT: 140%&quot;&gt;서버를 사용해 스트림을 말그대로 풀&lt;SPAN lang=EN-US&gt;(pull)하게 됩&lt;/SPAN&gt;니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;우선&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;배포 서버가 여러 개이고 모든 연결이 서로 다른 시간에 이루어질 경우 각 서버에서 스트리밍할 준비가 완료되면 인코더와의 연결을 시작할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;다음으로&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;서버와 인코더 간의 대역폭 사용을 최소화하는 게 중요한 경우 서버에서 풀&lt;SPAN lang=EN-US&gt;(pull)&lt;/SPAN&gt;하는 것이 좋습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;예를 들어&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;서버 관리자는 게시 지점을 추가하고 클라이언트가 요청하면 게시 지점이 자동으로 시작되도록 구성할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;이렇게 하면 첫 번째 클라이언트가 연결할 때까지 서버와 인코더의 연결이 시작되지 않습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;따라서 서버와 인코더 간에 대역폭이 불필요하게 사용되지 않습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;이 시나리오는&lt;SPAN lang=EN-US&gt; Windows .NET Server 2003&lt;/SPAN&gt;과 함께 제공되는&lt;SPAN lang=EN-US&gt; Windows Media &lt;/SPAN&gt;서비스&lt;SPAN lang=EN-US&gt; 9 &lt;/SPAN&gt;시리즈에서만 사용할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;마지막으로&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;서버가 방화벽을 사용하는 경우에도 서버에서 풀&lt;SPAN lang=EN-US&gt;(pull)&lt;/SPAN&gt;하는 것이 좋습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;예를 들어&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;회의 때 이벤트를 스트리밍해야 하기 때문에 공용 네트워크에서 인코더를 설정한다고 가정해 보겠습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;보호된 네트워크의 배포 서버로 스트림을 가져오면 서버 관리자는 방화벽을 통해 스트림을 풀&lt;SPAN lang=EN-US&gt;(pull)&lt;/SPAN&gt;할 수 있습니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&amp;nbsp;아래는 풀(pull) 방식에 대한 간단한 샘플 코드입니다.&lt;br /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; // Pull a Stream to a Windows Media Server&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Create an IWMEncBroadcast object.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IWMEncBroadcast Brdcst;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Brdcst = Encoder.Broadcast;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Retrieve the port number. The port number defaults to zero.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int iPortNum;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; iPortNum = Brdcst.get_PortNumber(WMENC_BROADCAST_PROTOCOL.WMENC_PROTOCOL_HTTP);&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Set the port number.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Brdcst.set_PortNumber(WMENC_BROADCAST_PROTOCOL.WMENC_PROTOCOL_HTTP, 2356);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // TODO: Handle exceptions.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MessageBox.Show(ex.Message + &quot;:&quot; + ex.StackTrace.ToString());&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;이번 AITV 프로젝트에서는 방송자 측에서 인증과정의 복잡함을 제거하기 위해 풀(Pull) 방식을 채택하였으며, 방화벽은 설정을 통해 해당 Port만을 접근 가능하도록 설정하였습니다.&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>간단한 mp3 플레이어 만들어 보기!@ </title>
            <link>http://www.swssm.org/index.php?idx=341</link>
            <description>&lt;P&gt;안녕하세요 !&lt;br /&gt;&lt;br /&gt;간단한 자작 mp3플레이어를 만들수있는 코드와 설명을&amp;nbsp; 하겠습니다.&lt;br /&gt;&lt;br /&gt;먼저 directshow SDK 가 깔려있어야 겠죠?&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////&lt;br /&gt;#include &amp;lt;dshow.h&amp;gt;&lt;br /&gt;#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt; &lt;P&gt;void main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;char c = 0;&lt;br /&gt;&amp;nbsp;HRESULT hr;&lt;br /&gt;&amp;nbsp;IGraphBuilder * pFGM;&lt;br /&gt;&amp;nbsp;IMediaControl * pMC;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;// COM 라이브러리를 초기화해야 합니다.&lt;br /&gt;&amp;nbsp;hr = CoInitialize(NULL);&lt;br /&gt;&amp;nbsp;if (FAILED(hr))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; printf(&quot;COM 라이브러리를 초기화할 수 없습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt; &lt;P&gt;&amp;nbsp;// 필터 그래프 매니저 컴포넌트를 생성하고, 인터페이스를 가져 와야하겠죠?&lt;br /&gt;&amp;nbsp;hr = CoCreateInstance(&lt;br /&gt;&amp;nbsp; CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,&lt;br /&gt;&amp;nbsp; IID_IGraphBuilder, (LPVOID*)&amp;amp;pFGM);&lt;br /&gt;&amp;nbsp;if (FAILED(hr))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; printf(&quot;필터 그래프 매니저를 생성할 수 없습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt; &lt;P&gt;&amp;nbsp;printf(&quot;필터 그래프 매니저가 성공적으로 만들어졌습니다.\n&quot;);&lt;/P&gt; &lt;P&gt;&amp;nbsp;// 필터 그래프를 만들기 위해 널 렌더링을 실행한다.(디폴트 랜더러가 실행됩니다^^)&lt;br /&gt;&amp;nbsp;hr = pFGM-&amp;gt;RenderFile(L&quot;ayaysir - BPM 156.mp3&quot;, NULL);&lt;br /&gt;&amp;nbsp;if (FAILED(hr))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; printf(&quot;필터 그래프를 만드는데 실패했습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt; &lt;P&gt;&amp;nbsp;printf(&quot;필터 그래프가 성공적으로 만들어졌습니다.\n&quot;);&lt;/P&gt; &lt;P&gt;&amp;nbsp;// 필터 그래프 매니저로부터 미디어 제어 인터페이스를 가져옵니다.&lt;br /&gt;&amp;nbsp;hr = pFGM-&amp;gt;QueryInterface(IID_IMediaControl, (void**)&amp;amp;pMC);&lt;br /&gt;&amp;nbsp;if (FAILED(hr))&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; printf(&quot;필터 그래프 매니저로부터 IMediaControl 인터페이스를 가져올 수 없습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;}&lt;/P&gt; &lt;P&gt;&amp;nbsp;// 아래 루프에서 미디어 제어 인터페이스를 이용하여 미디어 파일을 제어한다.&lt;br /&gt;//IMediaControl * pMC; 변수 선언한것 기억 나시죠?&lt;br /&gt;//이 변수를 가지고 미디어 파일을 제어 한답니다.&lt;br /&gt;//이 기능을 수행하기 위해&lt;br /&gt;//바로 위에서 &amp;nbsp; hr = pFGM-&amp;gt;QueryInterface(IID_IMediaControl, (void**)&amp;amp;pMC);&lt;br /&gt;//이런 작업을 해준 것입니다.&lt;br /&gt;&amp;nbsp;while (c != 'q')&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; printf(&quot;Commands: r(run/resume), s(stop), p(pause), q(quit)\n&quot;);&lt;br /&gt;&amp;nbsp; printf(&quot;&amp;gt; &quot;);&lt;br /&gt;&amp;nbsp; c = _getche();&lt;/P&gt; &lt;P&gt;&amp;nbsp; switch (c)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;case 'r':&lt;br /&gt;&amp;nbsp; &amp;nbsp; hr = pMC-&amp;gt;Run();&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&quot;\n미디어 파일을 재생합니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (FAILED(hr))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printf(&quot;미디어 파일을 재생할 수 없습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp;case 's':&lt;br /&gt;&amp;nbsp; &amp;nbsp; pMC-&amp;gt;Stop();&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&quot;\n미디어 파일 재생을 중지합니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (FAILED(hr))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printf(&quot;미디어 파일 재생을 중지할 수 없습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp;case 'p':&lt;br /&gt;&amp;nbsp; &amp;nbsp; pMC-&amp;gt;Pause();&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&quot;\n미디어 파일 재생을 일시정지합니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (FAILED(hr))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printf(&quot;미디어 파일 재생을 일시정지할 수 없습니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp;case 'q':&lt;br /&gt;&amp;nbsp; &amp;nbsp; printf(&quot;\n프로그램을 종료합니다.\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; // 특별한 조치를 취하지는 않음.&lt;br /&gt;&amp;nbsp; &amp;nbsp; break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp;default:&lt;br /&gt;&amp;nbsp; &amp;nbsp; ;&lt;br /&gt;&amp;nbsp; }&lt;/P&gt; &lt;P&gt;&amp;nbsp; printf(&quot;\n&quot;);&lt;br /&gt;&amp;nbsp;}&lt;/P&gt; &lt;P&gt;&amp;nbsp;// 종료 전에 리소스 해제&lt;br /&gt;&amp;nbsp;pMC-&amp;gt;Stop();&lt;br /&gt;&amp;nbsp;pMC-&amp;gt;Release();&lt;br /&gt;&amp;nbsp;pFGM-&amp;gt;Release();&lt;br /&gt;&amp;nbsp;CoUninitialize();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;이렇게하면 mp3를 실행하는 간단한 플레이어가 만들어진답니다.&lt;br /&gt;&lt;br /&gt;데이터의 흐름은 스트림과 같아서&amp;nbsp; Source에서 Renderer로 흐르게 되는데&lt;br /&gt;&lt;br /&gt;사이에 &amp;nbsp;hr = pFGM-&amp;gt;QueryInterface(IID_IMediaControl, (void**)&amp;amp;pMC) 이런 인터페이스를&lt;br /&gt;&lt;br /&gt;이용하여 멈추거나 , 재생하거나 하는것이죠^^&lt;br /&gt;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Mixing &amp; Volume 조절 </title>
            <link>http://www.swssm.org/index.php?idx=340</link>
            <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;　 &lt;SPAN lang=EN-US&gt;Ring My Bell&lt;/SPAN&gt;팀의 이용희회원입니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;　 이번 글에서는&lt;SPAN lang=EN-US&gt; PCM &lt;/SPAN&gt;데이터의&lt;SPAN lang=EN-US&gt; &lt;STRONG&gt;Mixing&lt;/STRONG&gt;&lt;/SPAN&gt;과&lt;SPAN lang=EN-US&gt; &lt;STRONG&gt;Volume&lt;/STRONG&gt;&lt;/SPAN&gt;에 대해 설명 드리겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;　 일단 글 본론에 대해 설명하기 전에&lt;SPAN lang=EN-US&gt; PCM&lt;/SPAN&gt;이 무엇인지 먼저 알아보겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;　 &lt;SPAN lang=EN-US&gt;PCM(Pulse Code Modulation)&lt;/SPAN&gt;은 아날로그 데이터 전송을 위한 디지털 설계로&lt;SPAN lang=EN-US&gt;, PCM &lt;/SPAN&gt;내의 신호들은 바이너리&lt;SPAN lang=EN-US&gt;(1&lt;/SPAN&gt;과&lt;SPAN lang=EN-US&gt; 0)&lt;/SPAN&gt;로 표현되는 두 가지 상태만 가능합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;아무리 복잡한 아날로그 파형이라도 이 사실은 변하지 않습니다&lt;SPAN lang=EN-US&gt;. PCM&lt;/SPAN&gt;을 사용하여 동영상&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;비디오&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;음성&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;음악&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;원격측정&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;가상 현실 등을 포함한 모든 형태의 아날로그 데이터를 디지털화하는 것이 가능합니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;　 아날로그 신호를&lt;SPAN lang=EN-US&gt; PCM&lt;/SPAN&gt;화 시키는 데에는 표본화&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;양자화&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;부호화의 과정을 거칩니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;　 표본화&lt;SPAN lang=EN-US&gt;(Sampling)&lt;/SPAN&gt;과정은 필요한 정보를 취하기 위해 원 신호를 시간 축에서 일정한 주기로 추출하는 것을 말합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;따라서 표본 값으로 이루어진 펄스 열은 펄스진폭변조&lt;SPAN lang=EN-US&gt;(PAM, Pulse Amplitude Modulation)&lt;/SPAN&gt;가 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;표본화는 일정시간 간격으로 아날로그 신호의 순시치를 취하는 과정으로 표본화의 주기가 짧을수록 원래의 신호를 충실히 재현할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;신호의 최고 주파수&lt;SPAN lang=EN-US&gt; 2&lt;/SPAN&gt;배 이상으로 데이터를 표본화하면 원래 데이터 신호를 거의 재현할 수 있습니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;[##_Gallery|1087444404.jpg||width=&quot;400&quot; height=&quot;300&quot;_##]양자화 과정은 표본화 과정을 통해 얻은 펄스진폭변조신호를 디지털화하기 위해 부호화에 필요한 비트 수를 정하고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;해당 비트 수에 의해서 표현이 가능한 독립적인 개수만큼의 양자화 레벨을 선정하여 표본의 크기를 그와 가까운 크기의 양자화 레벨에 근사화 시키는 것입니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;양자화 비트수가 많으면 원 신호를 충실히 부호화할 수 있으나&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;부호&lt;SPAN lang=EN-US&gt;-&lt;/SPAN&gt;복호기&lt;SPAN lang=EN-US&gt;(CODEC)&lt;/SPAN&gt;와 중계기 등의 고속화가 필요합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;따라서 품질의 경제성을 고려하여 비트 수를 결정해야 합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;양자화 과정에서는 아날로그 신호를 디지털 신호로 변환하면서 반올림 절차를 거치게 됨으로 약간의 오차가 생길 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;이로 인해 생기는 잡음을 양자화 잡음이라고 하며&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;이를 줄이기 위해서는 양자화 레벨을 증가시켜 양자화 레벨 사이의 간격을 적게 하거나&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;신호의 크기에 따라 양자화 간격을 달리 취하는 비선형 양자화 방법을 취할 수 있습니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;[##_Gallery|1386273367.jpg||width=&quot;400&quot; height=&quot;300&quot;_##]　부호화 과정은 양자화된 값을 이진수로 표현하는 것입니다&lt;SPAN lang=EN-US&gt;. 4Bit&lt;/SPAN&gt;의 양자화라면&lt;SPAN lang=EN-US&gt; 1&lt;/SPAN&gt;을&lt;SPAN lang=EN-US&gt; 0001&lt;/SPAN&gt;로&lt;SPAN lang=EN-US&gt;, 2&lt;/SPAN&gt;를&lt;SPAN lang=EN-US&gt; 0010&lt;/SPAN&gt;로&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;나머지 값들도 앞과 같은 방식으로 저장하게 됩니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;[##_Gallery|1139551892.jpg||width=&quot;400&quot; height=&quot;300&quot;_##]　위와 같은 방식으로 아날로그 데이터를 &lt;SPAN lang=EN-US&gt;PCM Data&lt;/SPAN&gt;로 변환하여 저장할 수 있습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;이제 본론으로 들어가겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;STRONG&gt;첫 번째로 다룰 것은&lt;SPAN lang=EN-US&gt; Mixing&lt;/SPAN&gt;입니다&lt;/STRONG&gt;&lt;SPAN lang=EN-US&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; Mixing&lt;/SPAN&gt;이란 두 개 이상의 소리를 합쳐 하나의 소리로 만드는 것을 의미합니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;직접 음악을 들으면서 이해해보도록 하겠습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;여기&lt;SPAN lang=EN-US&gt; A&lt;/SPAN&gt;와&lt;SPAN lang=EN-US&gt; B&lt;/SPAN&gt;라는 각각 독립된 소리가 있습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;[##_Jukebox|1280558985.mp3|A|autoplay=0 visible=1|_##][##_Jukebox|1334804880.mp3|B|autoplay=0 visible=1|_##]&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;이 두 개의 소리를&lt;SPAN lang=EN-US&gt; Mixing&lt;/SPAN&gt;하면 다음과 같이 &lt;SPAN lang=EN-US&gt;C&lt;/SPAN&gt;라는 소리가 됩니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;[##_Jukebox|1105970212.mp3|C|autoplay=0 visible=1|_##]&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;이것을 그래프로 표현하면 다음과 같습니다&lt;SPAN lang=EN-US&gt;. Sin X, Sin 2X, Sin 3X&lt;/SPAN&gt;의 그래프가 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;각각의 파형을 독립된 개체로 표현하면 다음과 같습니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;[##_Gallery|1403540973.jpg||width=&quot;400&quot; height=&quot;300&quot;_##]&lt;FONT size=2&gt;&lt;/FONT&gt;이 그래프를 합치면 다음과 같이 변하게 됩니다&lt;SPAN lang=EN-US&gt;.[##_Gallery|1026815767.jpg||width=&quot;400&quot; height=&quot;300&quot;_##]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;결과적으로&lt;SPAN lang=EN-US&gt; Mixing&lt;/SPAN&gt;이란 결국 아날로그 파형이 합쳐져 진폭이 커지는 것을 의미합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;디지털로 표현된&lt;SPAN lang=EN-US&gt; PCM&lt;/SPAN&gt;데이터에서는 같은 시간에 같은 주파수를 가지고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;같은 양자화 레벨을 가진 데이터의 경우 서로 합하는 것으로 표현할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;Music Is My Life &lt;/SPAN&gt;프로젝트의 경우&lt;SPAN lang=EN-US&gt; PCM &lt;/SPAN&gt;데이터를 동일한 규격으로&lt;SPAN lang=EN-US&gt; Decoding&lt;/SPAN&gt;하기 때문에 별다른 데이터 변환 없이 각 표본 값을 합하는 것으로&lt;SPAN lang=EN-US&gt; Mixing&lt;/SPAN&gt;을 할 수 있었습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;STRONG&gt;두 번째로 다룰 것은&lt;SPAN lang=EN-US&gt; Volume &lt;/SPAN&gt;조절입니다&lt;/STRONG&gt;&lt;SPAN lang=EN-US&gt;&lt;STRONG&gt;.&lt;/STRONG&gt; Volume &lt;/SPAN&gt;조절은 파형의 진폭을 조절하는 것으로 구현할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;파형의 진폭을 조절하는 것은 의외로 간단합니다&lt;SPAN lang=EN-US&gt;. PCM &lt;/SPAN&gt;데이터에 일정 값을 곱하는 것으로 구현이 가능합니다&lt;SPAN lang=EN-US&gt;. 1&lt;/SPAN&gt;보다 큰 값을 곱하면 볼륨이 증가하는 것이고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;작은 값을 곱하면 볼륨이 감소하게 되는 것입니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;Music Is My Life &lt;/SPAN&gt;프로젝트의 경우&lt;SPAN lang=EN-US&gt; Volume&lt;/SPAN&gt;을 조절하는 기능을&lt;SPAN lang=EN-US&gt; Fade In/Out&lt;/SPAN&gt;기능에 사용했습니다&lt;SPAN lang=EN-US&gt;. Fade In/Out&lt;/SPAN&gt;은 서서히 볼륨을 높이거나 낮추는 기술입니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;결국 원하는 시간 동안 &lt;SPAN lang=EN-US&gt;Volume&lt;/SPAN&gt;을 서서히 높이거나 낮추면&lt;SPAN lang=EN-US&gt; Fade In/Out&lt;/SPAN&gt;이 되는 것입니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;STRONG&gt;마지막으로&lt;/STRONG&gt; 위의 두 가지 과정에서 아직 말하지 않은 중요한 과정이 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;바로 수정한 값에 대한 범위를 체크하는 것입니다&lt;SPAN lang=EN-US&gt;. Mixing&lt;/SPAN&gt;이나&lt;SPAN lang=EN-US&gt; Volume&lt;/SPAN&gt;를 조절하는 경우&lt;SPAN lang=EN-US&gt; PCM&lt;/SPAN&gt;의 각 데이터 표본 값이 범위를 넘어가는 경우가 생기게 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;이런 경우 범위를 넘지 않도록 최대&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;최소 값을 적용시켜야 합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;또한 이런 값이 많아져 최대&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;최소 값이 많이 적용되면 음이 왜곡되어 찌그러지는 소리가 생깁니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;Mixing&lt;/SPAN&gt;의 경우&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;혹은 단순히 &lt;SPAN lang=EN-US&gt;Volume&lt;/SPAN&gt;을 많이 높이거나 많이 낮추는 경우 이런 현상이 많이 발생할 수 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;하지만&lt;SPAN lang=EN-US&gt; Music Is My Life&lt;/SPAN&gt;에서는 이런 현상을 다음과 같이 해결했습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 27pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-font-family: '맑은 고딕'; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: '맑은 고딕'; mso-bidi-theme-font: minor-latin&quot;&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;1.&lt;/FONT&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;Mixing&lt;/SPAN&gt;의 대상이 되는&lt;SPAN lang=EN-US&gt; A&lt;/SPAN&gt;와&lt;SPAN lang=EN-US&gt; B&lt;/SPAN&gt;가 있을 때&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 27pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-font-family: '맑은 고딕'; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: '맑은 고딕'; mso-bidi-theme-font: minor-latin&quot;&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;2.&lt;/FONT&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;같은 시간 동안 &lt;SPAN lang=EN-US&gt;A&lt;/SPAN&gt;에는&lt;SPAN lang=EN-US&gt; Fade In&lt;/SPAN&gt;효과를&lt;SPAN lang=EN-US&gt;, B&lt;/SPAN&gt;에는&lt;SPAN lang=EN-US&gt; Fade Out&lt;/SPAN&gt;효과를 적용합니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 27pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-font-family: '맑은 고딕'; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: '맑은 고딕'; mso-bidi-theme-font: minor-latin&quot;&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;3.&lt;/FONT&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;Fade In/Out&lt;/SPAN&gt;효과가 적용된&lt;SPAN lang=EN-US&gt; A&lt;/SPAN&gt;와&lt;SPAN lang=EN-US&gt; B&lt;/SPAN&gt;를&lt;SPAN lang=EN-US&gt; Mixing&lt;/SPAN&gt;합니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10pt; mso-char-indent-count: 1.0&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;이렇게 함으로써&lt;SPAN lang=EN-US&gt; Mixing&lt;/SPAN&gt;되는 각 음의 최대범위를 자연스럽게 맞춰 음이 왜곡되는 현상을 막고&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;소리의 연결을 자연스럽게 만들 수 있었습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;이것으로 이번 프로젝트의 블로그 포스팅을 마치겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;더 궁금한 사항이 있으면 따로 문의해주세요&lt;SPAN lang=EN-US&gt;! ^^&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Equalizer </title>
            <link>http://www.swssm.org/index.php?idx=339</link>
            <description>&lt;P&gt;안녕하세요^^&lt;br /&gt;자람입니다!&lt;br /&gt;저번엔 MP3 Decoding에 대해서 설명드렸고,&lt;br /&gt;오늘은 Equalizer에 대해서 설명드리겠습니다.&lt;br /&gt;&lt;br /&gt;저희가 만드는 벨소리제작 프로그램에는 Eqaulizer를 조절하는 부분도 있는데요 ㅎ&lt;br /&gt;먼저 Equalizer가 뭔지 부터 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;아주 낮은 소리와 아주 높은 소리는 소리의 영역이 다르죠.&lt;br /&gt;베이스의 낮게 둥둥 깔리는 소리와 비올라의 높은 소리는 분명 서로 다른 영역에서 나는 소리들입니다.&lt;br /&gt;그렇다면 저음을 크게 들으면 베이스가 더 잘 들릴테고 고음을 크게 들으면 비올라가 더 잘 들리겠죠?&lt;br /&gt;여러가지 악기의 소리가 합쳐져서 하나의 음악이 이뤄져 있는데 각 악기마다 차지하고 있는 소리의 영역에 차이가 있으니까 각 영역별로 소리의 세기를 조절해주면 전체적인 음악이 주는 인상도 달라질 수 있을 겁니다.&lt;br /&gt;&lt;br /&gt;그런 원리를 이용하는 것이 이퀄라이저입니다.&lt;br /&gt;이퀄라이저는 재생할 수 있는 소리의 영역을 몇개로 나누어서 각 영역별로 소리의 세기를 조절해주는 장치죠.&lt;br /&gt;&lt;br /&gt;저번 블로깅에서 MP3에 대해서 알아봤었는데,&lt;br /&gt;MP3의 압축 방법이 인간이 들을 수 없는 가청 주파수 밖의 범위를 없애 용량을 줄이는 거라고 말씀드렸죠 ㅎ &lt;/P&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;인간이 귀로 들을 수 있는 주파수 대역(가청주파수)은 일반적으로 20hz ~ 20000hz로 알려져있습니다. mp3 포멧의 특성상 가청주파수외의 데이터들은 날려 버리기 때문에 윈엠프(winamp)는 이퀄라이져를 조절하는 범위가 60hz ~ 16000hz 대까지로 나와있는 것입니다^^&lt;br /&gt;&lt;br /&gt;이 수치는 초당 공기의 진동수를 의미하는겁니다. 쉽게 비유를 하면서 설명 하겠습니다.&lt;br /&gt;기타라는 현이 달린 악기로 설명해볼까요??ㅎ&lt;br /&gt;기타줄을 느슨하게 풀어서&amp;nbsp; &quot;대충 1 초에 60 번정도 울리게 만들어봤다&quot; 라고 했을때 이 진동수를 60hz 라 부릅니다. 저음일꺼 같다고 느낄실껍니다&lt;/P&gt; &lt;P&gt;&amp;nbsp;반대로 기타줄을 팽팽하게 땡겨보면, &amp;nbsp;줄이 떨리에 속도가 더 늘어 나겟죠? &lt;br /&gt;&amp;nbsp;그래서 대충 1 초에 2000 번 울린다고 칩니다 .이것을 2khz 라고 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;주파수별 음의 느낌은 다음과 같다고 한다.&lt;/P&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; MARGIN-RIGHT: 0px; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;~70Hz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; MARGIN-RIGHT: 0px; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;소리에 박력이나 볼륨을 줍니다만, 출력이 지나치면 투명감이 없어집니다.&lt;br /&gt;라이브 녹음의 경우, 이 대역에 잔향음의 성분이 많이 포함되므로, 실제감에 영향을 줍니다.&lt;/P&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;70~150Hz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;락이나 팝을 들었을때 「저음」이라고 느끼는 것은 주로 이 대역.&lt;br /&gt;베이스에 대한 욕구나 소리의 윤택을 내는데는 이 대역의 조정이 중요하게 됩니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;150~300Hz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;저음의 「힘찬 느낌」이나 「밀도감」에 영향을 줍니다.&lt;br /&gt;이 대역의 소리는 차내에서 반사하기 쉽고, 정재파도 발생 출력이 지나치면 압박감이 있는 소리가 됩니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;300~400Hz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;보컬의 저음 성분을 포함한 대역으로, 소리의 풍부함이나 생생함에 영향을 줍니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;400~800Hz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;대부분의 악기나 보컬음의 기음은 이 대역에 포함되어 소리의 골격을 만드는 중요한 대역 입니다.&lt;br /&gt;소리의 「깊은 곳」이나 「실제감」에 영향을 줍니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;800~1.5kHz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;악기나 보컬의 성향이나 윤택에 영향을 줍니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;1.5~3kHz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;악기나 보컬의 투명감에 영향을 줍니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;3~6kHz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;특히 4 kHz 부근은 인간이 가장 감도 깊게 청취할 수 있는 대역입니다.&lt;br /&gt;소리가 얌전하거나 시끄럽다는 등의 느낌에 크게 영향을 줍니다.&lt;br /&gt;출력이 지나치면 시끄러워서 오래 들으면 귀를 혹사하게 합니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;6~12kHz&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;「고음」이라고 느끼는 것은 주로 이 대역입니다.&lt;br /&gt;소리의 밝음에 영향을 줍니다.&lt;/P&gt; &lt;br /&gt;&lt;/BLOCKQUOTE&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;STRONG&gt;12kHz~&lt;/STRONG&gt;&lt;/P&gt; &lt;BLOCKQUOTE style=&quot;MARGIN-RIGHT: 0px&quot;&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&amp;nbsp;소리, 음장의 해방감, 느긋하고 평안함에 영향을 줍니다.&lt;/P&gt;&lt;/BLOCKQUOTE&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt; &lt;br /&gt; &lt;P class=view style=&quot;FONT-SIZE: 9pt; FONT-FAMILY: 돋움&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>멀티 스레드 TCP/IP 를 이용한 실시간 영상 송수신 모듈 </title>
            <link>http://www.swssm.org/index.php?idx=337</link>
            <description>&lt;br /&gt;지능형 군사로봇의 포탑을 맡고있는 김현수 회원입니다. 지난번엔 영상패턴인식을 블로깅하였습니다만 이번에 제가 블로깅할 내용은 실시간 영상송수신 모듈입니다. 이러한 시스템이 필요한 최초의 이유는 로봇이 보고 판단하는 모습을 원격 컴퓨터에서도 같이 보자 하는 이유였습니다. 그렇지만 영상처리과 각종 로봇을 제어하는 일을 담당하는 로봇 PC에서 영상처리부분을 원격컴퓨터에서 처리해주고 대신 로봇은 로봇제어에 필요한 간단한 명령만을 처리하자 라는 컨셉으로 바뀌었습니다. 일단 전체 그림을 설명드리겠습니다[##_1C|1409536436.jpg|width=&quot;600&quot; height=&quot;369&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;총기가 달린 로봇에 미니 노트북이 탑제됩니다. 또한 총기의 가늠쇠부근에는 카메라가 부착됩니다. 미니 노트북에서는 카메라가 보는 내용을 TCI/IP&amp;nbsp; 통신을 통해서 원격 클라이언트 컴퓨터에 영상을 송신합니다. 영상을 실시간으로 계속해서 송신하고 다른 제어 명령도 처리해줘야하기 때문에 두개의 스레드를 사용해서 모듈을 제작하였습니다. 첫번째 스레드는 영상 전송용 스레드이고 두번째 스레드는 각종 커맨드 셋 과 제가 미리 정의 한 영상 송수신 및 데이터 송수신 프로토콜 패킷을 분석해내는 스레드입니다. &lt;br /&gt;클라이언트 컴퓨터에서도 마찬가지로 영상을 받아서 영상처리를 한 후, 데이터 처리 결과를 로봇에 알려주고 영상을 화면에 뿌려주는 역할을 합니다. 그렇지만 클라이언트에서는 위의 과정이 순차적으로 수행되어도 관계가 없기에 싱글 스레드로 제작을 하였습니다. &lt;br /&gt;&lt;br /&gt;부가적인 사항으로 영상인식을 위한 최종 등록 마커입니다.[##_1C|1391528858.jpg|width=&quot;600&quot; height=&quot;304&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;역시 사각형 인식이 기준입니다. 적군과 아군을 구분지어 오직적군만을 공격하고 최종 목표지점이 인식되면 그곳으로 질주한다는 컨셉입니다. &lt;br /&gt;&lt;br /&gt;이상입니다. 영상송수신 모듈에 관해서 궁금한 사항은 따로 문의주세요~&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>거리와 기울기 회전에 대처가능한 영상 패턴 인식 </title>
            <link>http://www.swssm.org/index.php?idx=338</link>
            <description>&lt;br /&gt;저는 지능형 군사로봇에서 포탑을 맡고있습니다. 주요 목표는 적군과 아군을 구분하고 최종 목적지를 찾아내는 일을 하고 적군일시에는 총을 쏴서 맞추는 일까지가 저의 임무입니다. 이런 역할을 하기위해서는 패턴인식기술이 반드시 적용되어야 할텐데 지금부터 제가 사용한 패턴인식 방식을 설명하도록 하겠습니다. &lt;br /&gt;&lt;br /&gt;먼저 인식할 패턴의 기본전제는 사각형 기반의 영상마커를 사용한다는 것입니다. 우선적으로 사각형을 인식하고 사각형 내부에 있는 마커를 변화시킨후 최종적으로 마커를 인식하는 시나리오입니다. 먼저 사각형을 인식하는 방법입니다. &lt;br /&gt;&lt;br /&gt;[##_1C|1349161171.jpg|width=&quot;600&quot; height=&quot;398&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;br /&gt;위의 그림에 나온 알고리즘 순서에 따라서 카메라의 영상으로부터 사각형을 분리해냅니다. 사각형을 검출하기 위해서 영상 이진화, Contour, Skeletonization 알고리즘등을 사용하였으며 최종적으로 위 표에서 언급한 C값을 구해내는 원형지수화 공식에 근거하여 사각형을 구분하였습니다. &lt;br /&gt;&lt;br /&gt;[##_1C|1018943398.jpg|width=&quot;600&quot; height=&quot;370&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;일단 사각형 영역이 검출되면 해당영역의 마커를 미리 등록된 마커와 비교하여서 구분을 지어야 합니다. 그렇지만 회전되거나 거리가 다르거나 기울어져있다면 영상을 올바로 구분짓기가 어렵기 때문에 사각형 워핑 알고리즘을 사용합니다. 모핑과 워핑의 차이점은 다음과 같습니다. ( 워핑 ( A -&amp;gt; A' ) , 모핑 ( A -&amp;gt; B ) ) 즉 약간의 변화를 주는것은 워핑 사람에서 원숭이처럼 전혀 다른 성질의 것으로 변화시키는것은 모핑이 되겠습니다. 참고하시라고요..&lt;br /&gt;다시 본론으로 돌아와서 영역이 추출된 사각형을 이용해서 워핑알고리즘을 이용해서 64x64사이즈의 정사각형 마커로 변화시킵니다. 사각형을 기준으로 내부의 이미지 데이터도 워핑되는것입니다. 그렇다면 다소 왜곡은 생길지라도 마커의 정면에서 봤을때의 모습이 어느정도 복원되는것을 볼수있겠네요. 이제 검출된 마커를 비교하기 위해 다시 영상을 이진화합니다. &lt;br /&gt;&lt;br /&gt;[##_1C|1013984490.jpg|width=&quot;600&quot; height=&quot;400&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;어렵사리 마커를 잘 구분지었다면 미리 등록된 마커와 템플릿 매칭을 합니다. 미리등록된 마커와 같은 그림이 가장 많은 녀석을 최종 인식된 패턴으로 판단하는것입니다. 여기서 부수적으로 얻을 수 있는 정보가 있습니다. 최초에 인식된 사각형의 넓이에 따라서 카메라와 마커간의 대략적인 거리를 산출할 수 있습니다. 물리적으로 인식될 마커의 크기를 동일하게 하고 미리 알고있다면 대략적으로 거리값을 역산출할 수 있습니다. 과제 후반기에 이러한 정보는유용하게 활용될 수도 있겠습니다. &lt;br /&gt;&lt;br /&gt;[##_1C|1366734580.jpg|width=&quot;600&quot; height=&quot;420&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;위에서는 제가 테스트로 각종 마커를 등록하고 회전을 준상태에서 인식하여 본 샘플영상입니다. 보시는데로 다소간의 회전에도 불구하고 모든마커를 정확하게 구분하는것을 볼 수 있습니다. 이제 저는 이러한 영상인식 모듈을 이용해서 적군을 조준하고 목적지로 이동하는 등의 지능형 알고리즘을 구현해보려 합니다. &lt;br /&gt;&lt;br /&gt;이상으로 영상패턴인식에대한 블로깅을 마치도록하겠습니다. 더 궁금한 점있으면 따로 연락주세요~ㅋ&lt;br /&gt;&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>[ 대발이의 그까이꺼~! ] Kalman Filter게 섯거라~! </title>
            <link>http://www.swssm.org/index.php?idx=335</link>
            <description>&lt;style&gt; &lt;!-- P.HS0 {style-name:&quot;바탕글&quot;;font-family:&quot;바탕&quot;; font-size:10.0pt; color:#000000; font-weight:&quot;normal&quot;; font-style:&quot;normal&quot;;margin-left:0.0px; margin-right:0.0px; margin-top:0.0px; margin-bottom:0.0px; text-align:justify; line-height:21.3px; text-indent:0.0px; letter-spacing:0.0px;} --&gt; &lt;/style&gt;&lt;!-- Document Start --&gt;&lt;!-- Document End --&gt; &lt;p style=&quot;margin: 0px; font-family: &amp;quot;바탕&amp;quot;; font-size: 10pt; text-align: justify; line-height: 160%; text-indent: 0px;&quot;&gt; 안녕하세요^^ 이번시간에는 KalmanFilter에 대해서 알아보도록 하겠습니다.&lt;br /&gt; &lt;style&gt; &lt;!-- P.HS0 {style-name:&quot;바탕글&quot;;font-family:&quot;바탕&quot;; font-size:10.0pt; color:#000000; font-weight:&quot;normal&quot;; font-style:&quot;normal&quot;;margin-left:0.0px; margin-right:0.0px; margin-top:0.0px; margin-bottom:0.0px; text-align:justify; line-height:21.3px; text-indent:0.0px; letter-spacing:0.0px;} --&gt; &lt;/style&gt;&lt;!-- Document Start --&gt;&lt;!-- Document End --&gt; &lt;/p&gt;&lt;p style=&quot;margin: 0px; font-family: &amp;quot;바탕&amp;quot;; font-size: 10pt; text-align: justify; line-height: 160%; text-indent: 0px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;바탕&amp;quot;; font-size: 10pt; line-height: 21.333px; letter-spacing: 0px; text-align: justify;&quot;&gt;결국 필터라는 것도 알고리즘 이므로, 짜기 나름입니다만 이 필터는 검증된 것이므로 한번 이해해 두시면 좋을 것입니다. &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; font-family: &amp;quot;바탕&amp;quot;; font-size: 10pt; text-align: justify; line-height: 160%; text-indent: 0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0px; font-family: &amp;quot;바탕&amp;quot;; font-size: 10pt; text-align: justify; line-height: 160%; text-indent: 0px;&quot;&gt;아래에 보이는 그림이 KalmanFilter가 돌아가는 원리를 나타내는 것입니다.&lt;/p&gt;&lt;p style=&quot;margin: 0px; font-family: &amp;quot;바탕&amp;quot;; font-size: 10pt; text-align: justify; line-height: 160%; text-indent: 0px;&quot;&gt;[##_1C|1340387633.jpg|width=&quot;500&quot; height=&quot;240&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/p&gt; 음... 무슨말일까요? &lt;br /&gt;하나하나 알아보도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;일단 그림을 보니까 왼쪽 하단에 'Initial estimates for x(k-1) and P(k-1)'이라고 되있군요...&lt;br /&gt;여기서 x는 '상태벡터'이고 P는 '공분산오차'입니다. 상태벡터라는 것은 [각 바이어스]이라는 1 x 2형태의 벡터를 얘기합니다. 그리고 공분산오차라는 것을 알기 위해... 일단 공분산이 무엇인지 알아야 하겠습니다.&lt;br /&gt;공분산이란... '둘 이상의 변량이 서로 관련성을 가지며 분포하는 모양을 전체적으로 나타내는 분산'이라 하겠습니다. 간단하게 '편차의 곱'이라 알고 넘어가도록 합니다.&lt;br /&gt;&lt;br /&gt;위 그림을 보니, 초기값을 잡아줘야 한다는것을 알수 있습니다.&lt;br /&gt;&lt;br /&gt;그렇다면 초기값을 잡고 알고리즘을 순회해보도록 하겠습니다. &lt;br /&gt;이 초기값을이 어디로 들어가나 보니... 'Time Update(&quot;Predict&quot;)'로 들어가는 군요.&lt;br /&gt;시간을 업데이트한다... 아직 타이틀이 의미하는 바를 모르겠으니... 내용을 한번 알아보겠습니다.&lt;br /&gt;(1)을 보니... Project the state ahead라고 써있습니다... '이전상태를 투영한다' 이런 뜻이 되겠군요.&lt;br /&gt;수식을 보니 x(k-1)에다가 이것저것 붙이고 더해서 결국 x(k)가 된것을 확인할수 있습니다. 의미하는 바, 이전상태의 '상태벡터'에 이것저것 붙이니 현재의 '상태벡터'가 되었다... 이말입니다. 그런데 말이죠... 값자기 나타난 u(k)는 뭘까요? u(k)는 현재 확인된 입력...즉, [변한각도 0]이라는 1 x 2 형태의 벡터라는 말이 됩니다. 또한 벡터 A,B는 아래 수식과 같은 값을 같게 됩니다. (1)수식을 풀면...&lt;br /&gt;&lt;br /&gt;x = [1&amp;nbsp; -dt][angle] + [ dt ][dotangle 0]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; [0&amp;nbsp; &amp;nbsp; 1] [bias] &amp;nbsp; &amp;nbsp; [ 0&amp;nbsp; ]&lt;br /&gt;&lt;br /&gt;위와 같은 수식을 같는 것입니다.&lt;br /&gt;&lt;br /&gt;이제 (2)을 보아하니... Project the error envariance ahead라고 적혀있습니다. '이전의 공분산오차를 투영한다' 이런뜻이 되겠군요. 이건 또 뭥미...&lt;br /&gt;&lt;br /&gt;차근차근 알아보도록 합시다.&lt;br /&gt;수식을 보니까 P(k-1)에대가 이것저것 붙여서 결국, P(k)을 뽑아내는군요. 의미하는 바, 이전상태의 '공분산오차'에 이것저것 붙이니 현재의 '공분산오차'가 되었다는 것입니다. 여기서 중요한 점은 Q가 붙었다는 것이죠.&lt;br /&gt;Q는 Process Noise Covariance입니다. 즉, 2 x 2의 벡터형태를 갖는 잡음이라 생각하시면 됩니다. &lt;br /&gt;수식으로 표현하면 아래와 같이 됩니다.&lt;br /&gt;&lt;br /&gt;P = [1&amp;nbsp; -dt][P00 P01][ 1 &amp;nbsp;&amp;nbsp; 0] + [Q00 Q01]&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; [0 &amp;nbsp;&amp;nbsp; 1] [P10 P11][-dt&amp;nbsp; 1] &amp;nbsp;&amp;nbsp; [Q10 Q11]&lt;br /&gt;&lt;br /&gt;지금 까지 Time Update(&quot;Predict&quot;)에 대해서 알아보았습니다. 한마디로 정리하면 처음 그림에서 보았던 왼쪽 박스에 있는 수식은 '이전상태를 받아 다음상태를 예측한다'라는 것이죠. 이것을 센서와 접목하여 생각하면...&lt;br /&gt;즉, 자이로센서가 이 역할을 한다는 것입니다. 이전상태를 기반으로 1step동안 '변한각도'을 갱신한다는 것입니다. &lt;br /&gt;&lt;br /&gt;다시 맨 위의 그림을 살펴보니, Time Update(&quot;Predict&quot;)에서 Measurement Update(&quot;Correct&quot;)로 화살표가 넘어가는 것을 볼 수 있습니다. Measurement Update(&quot;Correct&quot;)를 살펴보니... '측정치를 업데이트 한다'... 무슨말일까요? &lt;br /&gt;&lt;br /&gt;하나하나 살펴봅시다.&lt;br /&gt;(1)을 보면, Compute the Kalman gain이라 적혀있습니다. 말 그대로 우리가 정확하게, 수렴하게 하기 위한 값을 얻기 위해서는 gain값을 조정하게 되어있습니다. 그 gain값을 얻기 위한 방법입니다. 내용을 보면, 새롭게 갱신된 오차공분산을 이용하여 gian값을 얻음을 알 수 있습니다. 그런데 R이라는 놈이 보이는군요... ㅡㅡ;&lt;br /&gt;요 R이라는 놈은 Measurement Noise Covariance라고 합니다. 요놈도 잡음이라고 생각하시면 됩니다. 그러고 보니 gain이라는 놈은 우리가 미래를 예측해서 정확한 값을 뽑아내기 위한 핵심이라고 할 수 있는데, 이 gain이라는 놈이 Q와 R로 구성되있음을 알 수 있습니다. 즉, 잡음인 Q, R에 의해서 gain이 결정되고, 그 gain에 의해 예측값이 틀려질수 있다는 것입니다. 그러니까 Q와 R이 핵심이군요! &lt;br /&gt;KalmanFilter는 Q와 R에 의해 좌지우지 된다는 말입니다... 음... 좀더 살펴보도록 하죠.&lt;br /&gt;&lt;br /&gt;(1)을 수식으로 나타내면 아래와 같습니다.&lt;br /&gt;&amp;nbsp;S = H x P x transpose(H) + R&lt;br /&gt;&amp;nbsp; &amp;nbsp; = [ 1 0 ] x P x [ 1, 0 ] + R&lt;br /&gt;&amp;nbsp; &amp;nbsp; = P(0,0) + R&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;K(칼만게인) = P x transpose(H) x (S)^-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = [ P(0,0), P(1,0) ] / S&lt;br /&gt;&lt;br /&gt;(2)을 살펴보도록 합시다. Update estimate with measurement z(k)라고 써있군요. '현재의 측정치 z(k)를 계산해서 업데이트 한다'라고 보시면 되겠습니다. 여기서 z(k)는 뭘까요? 눈치 챈분들도 있겠지만 z(k)는 현재 가속도센서에 의해서 측정된 값이라 보시면 되겠습니다. 그렇다면 수식의 우측에 (z(k)-Hx(k))가 의미하는 바는 뭘까요? &lt;br /&gt;앞의 박스 (Time Update)에서... 즉, 자이로센서에서 예측했던 값과 실제 가속도센서로 측정된 값의 차이가 되는 것입니다. 그 오차에다가 gain을 곱해서 예측치에 다시 더하면 새롭게 갱신되는 값(2)이 되는 것입니다. 이렇게 갱신된 값은 다시 Time Update로 넘어가게 되는 것이죠^^&lt;br /&gt;이를 수식으로 표현하면 아래와 같습니다.&lt;br /&gt;&lt;br /&gt;y = z(가속도센서측정값) - (H x (x))&lt;br /&gt;x(측정치값이 입력된 추정치) = x + (K x y)&lt;br /&gt;&lt;br /&gt;드디어 1개 남았습니다.^^&lt;br /&gt;(3)을 알아보도록 하겠습니다. Update the error covariance라고 되어있군요^^ 어디서 본듯한.... 앞의 박스에서 본것과 유사하죠? 위의 그림을 보면 두 박스가 서로 순환구조를 가지고 있으므로, 다시 Tiem Update로 넘겨줄 값을 갱신하여야 합니다. 오차공분산도 새롭게 갱신되어야 겠죠?^^&lt;br /&gt;아래와 같은 수식으로 갱신합니다.&lt;br /&gt;&lt;br /&gt;P(측정치값이 입력된 공분산행렬) = (I - K x H) x P&lt;br /&gt;&amp;nbsp;&amp;nbsp; = ( [ 1 0, &amp;nbsp;&amp;nbsp; [ K(0),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 1 ] - &amp;nbsp; K(1) ] * [ 1 0 ] ) P&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; = [ P(0,0)-P(0,0)*K(0)&amp;nbsp; P(0,1)-P(0,1)*K(0),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; P(1,0)-P(0,0)*K(1)&amp;nbsp; P(1,1)-P(0,1)*K(1) ]&lt;br /&gt;&lt;br /&gt;gian값이 반영되었음을 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;휴~ 다 끝났군요... 이제 코드화 할 시간만 남았습니다. 이렇게 알고리즘을 짜고도 코드화 시키지 못한다면 낭패겠죠^^; 코드화는 각자 생각해보시기 바랍니다...&lt;br /&gt;&lt;br /&gt;지금까지 설명을 쭉 읽어도 한번에 이해하기란 여의치가 않습니다. 따라서 이런저런 논문을 많이 읽어보실것을 추천합니다.&lt;br /&gt;내용을 한번더 정리하면... &lt;br /&gt;첫번째로 초기값이 필요하며, &lt;br /&gt;두번째로 Time Update에서는 자이로 센서를 이용하여 미래의 값을 예측하여 오차공분산과 함께 Measurement Update로 넘겨주고, &lt;br /&gt;세번째로 이렇게 값을 받은 Measurement Update는 Q와 R을 이용하여 gain을 뽑고, gain을 이용하여 가속도센서로 얻은 측정값을 업데이트 하여 갱신된 오차공분산과 함께 다시 Time Update로 넘겨준다는 것입니다.^^&lt;br /&gt;&lt;br /&gt;핵심은 Q와 R을 잘 조절해서 자신이 원하는 어떤 값을 뽑아내는 것인데... 그것은 많은 실험을 해봐야 할 것입니다.&lt;br /&gt;&lt;br /&gt;이상으로 [ 대발이의 그까이꺼~! ]&amp;nbsp; Kalman Filter게 섯거라~!를 마치겠습니다. 감사합니다^^ 땡큐!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>옴니아 블루투스 셋팅 및 이와 관련된 프로그램 </title>
            <link>http://www.swssm.org/index.php?idx=336</link>
            <description>안녕하세요. 19기 조민수입니다. 이번에 올릴 글은 옴니아 블루투스와 관련된 글입니다. 옴니아에는 블루투스가 있는데요. 그것을 이용하여 프로그램을 만들어야 하기에 이와 관련된 글을 씁니다. 옴니아 블루투스 이용에 있어 약간은 셋팅이 필요하더라고요. 그럼 먼저 옴니아 셋팅은 어떻게 해야 하는지 말씀드리죠. 1. 다른 기기에도 블루투스가 있어야 한다. - 물론 당연한 소리겠죠? 2. 옴니아에서 설정에 있는 무선 접속 관리자에게 블루투스를 설정해 줍니다. [##_1C|1027221623.jpg|width=&quot;288&quot; height=&quot;462&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 3. 이제 블루투스 버튼을 누르고 블루투스 검색을 시작합니다. [##_1C|1043375961.jpg|width=&quot;284&quot; height=&quot;423&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 4. 다른 기기에 있는 블루투스를 찾습니다. 찾기가 완료되면 이제 페어링을 시작합니다. 5. 페어링시 암호를 설정해주고 확인을 누르면 이제 블루투스는 연결 완료 입니다. 이제 데이터를 받아오기 위해 COM 포트를 설정해야 하는데요. [##_1C|1207989642.jpg|width=&quot;245&quot; height=&quot;362&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 여기서 중요한 점은....옴니아는 COM포트가 두개밖에 존재하지 않습니다. COM2와 COM6....그러니 둘중에 하나만 이용 가능하겠죠? 이제 블루투스를 이용해서 시리얼 통신이 가능해 졌습니다. 프로그램은 어떻게 짜느냐!!이제 프로그램을 설명해볼까요? 먼저 블루투스를 연결하면 시리얼 통신이 되기 때문에 시리얼 프로그램을 응용하면 되는데요. 먼저 핸들을 선언해 줍니다. [##_1C|1336823646.jpg|width=&quot;81&quot; height=&quot;24&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 이렇게 선언된 핸들을 CreateFile을 이용해서 핸들을 열어 줍니다.여기서 핸들 안의 파라메터를 보면 파일 이름이 아니라 COM포트 이름을 [##_1C|1014584688.jpg|width=&quot;419&quot; height=&quot;89&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 적어주게 됩니다.하지만 이렇게 해서 통신이 제대로 될꺼라 라는 생각은 버리시기 바랍니다. 일단..DCB 변수를 선언해 줘야 합니다. [##_1C|1217875782.jpg|width=&quot;66&quot; height=&quot;21&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 이렇게 선언해 주는 이유는...BaudRate와 ByteSize, Paritiy비트를 선언해 주기 위함 입니다. 이 dcb를 설정해 주는데요. [##_1C|1364376667.jpg|width=&quot;275&quot; height=&quot;215&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 이제 이렇게 해서 속도를 설정했습니다. 이제 파일에 쓰듯이 데이터를 쓰면 됩니다. [##_1C|1026128266.jpg|width=&quot;405&quot; height=&quot;37&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 이제 이걸 가지고 프로그램을 해야 하는데요. 이런게 하는데는 기본적으로 windows mobile이 옴니아에 깔려 있기 때문에 windows programming 하듯이 하면 되는거죠. 이제 이걸 이용해서 프로그램을 만들면 됩니다. 참....기본적인 것을 블로깅 하려니 그렇지만 그래도 이거 찾느라 이리저리 돌아댕겼(?)었죠. ㅎㅎ;; 저처럼 많이 돌아다니시는 분이 없기를 바라며...
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Remote Desktop Protocol(Desktop Ver. &amp; Mobile Ver.) 두 번째 이야기. </title>
            <link>http://www.swssm.org/index.php?idx=334</link>
            <description>&lt;P&gt;원격 지원 솔루션의 큰 역할을 하고 있는 Remote Desktop Protocol의 그 두번째 이야기 입니다.&lt;br /&gt;&lt;br /&gt;지난 시간에 거론했듯이 Remote Desktop Protocol(이하 RDP)은 근본적으로 Citrix사의 가상화 기술이였으나,&lt;br /&gt;MS에게 기술을 넘겼고, 이후 MS는 이 기술을 부분적으로 이용하여 RDP 솔루션을 Windows에 끼워 사용자에게 제공하기 시작합니다.&lt;br /&gt;이 기술이 터미널 서비스를 기반으로 하고 있기 때문에, MS에서는 터미널 서비스에 대한 대략적인 Document를 제공하고 있지만,&amp;nbsp; 이 기술을 개발자가 적용함에 있어서는 그다지 큰 정보를 제공하고 있지 않습니다.&lt;br /&gt;종합적으로 말씀드리자면 Citrix/MS 모두 이 기술에 대해서는 굳게 함구하고 있는게 현실입니다.&lt;br /&gt;&lt;br /&gt;하지만, 예전 MS의 개발자라고 알려진 사람이 &lt;A href=&quot;http://www.rdesktop.org&quot;&gt;www.rdesktop.org&lt;/A&gt;를 통해 사람들에게 Linux Ver. 으로 부분적으로 Open Source를 제공하고 있습니다. 따라서 본 프로젝트팀은 Rdesktop.org의 오픈소스를 참고하여 프로젝트를 진행하였습니다.&lt;br /&gt;Remote Desktop Protocol에 대한 핵심적인 얘기는 첫 번째 이야기에서 하였기 때문에, 이번에는 RDP의 Desktop Version과 함께 Mobile Version에 대해 이야기 하려고 합니다.&lt;br /&gt;본 프로젝트에서는 Mobile에 RDP를 올리기 위해 많은 시간을 투자하였습니다. 그리고 크고, 많은 문제에 치닫게 되었고, 결국 Mobile Version의 RDP를 포팅하는데 성공하였으나, 퍼포먼스적인 측면에서 SKT에서 제공하는 RDP(배포판)을 사용하였음을 먼저 알립니다.&lt;br /&gt;Linux Platform이나 Windows Platform이 되었든 RDP는 System에 따른 함수명과 다를뿐 근본적인 로직과 메카니즘은 같습니다. 지난번 첫번째 이야기에서 제시했던바와 같이 좌표별로 패킷만 서버에서 가져와, Rect &amp;amp; Line 별로 그림을 그려주며, 상황에 따라서는 서버측에서 보내주는 이미지를 캐싱해 사용자에게 그림을 그려주는 방식입니다.&lt;br /&gt;이러한 Desktop Version의 RDP를 Mobile로 포팅하기 위해 우리는 많은 노력을 했어야 했습니다.&lt;br /&gt;먼저 우리 개발팀의 작업환경이 Windows Platform 이였기 때문에 Rdeskop.org의 오픈소스를 Win32 Version으로 포팅하여야 했습니다. 이러한 과정은 지난번 첫 째 이야기에서 하였기 때문에 생략하겠습니다.&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Mobile Version RDP.&lt;br /&gt;&lt;br /&gt;완성된 Desktop Version RDP를 Mobile에 포팅시에 가장 크게 고려해야 할 부분이 바로 SSL 이라는 부분입니다. 서버로 사용하는 Windows Server 2003은 터미널 서비스를 기반으로 통신을 할 때 보안상의 이유로 SSL을 이용합니다.&lt;br /&gt;따라서 Desktop User가 서버와 터미널 서비스 기반으로 통신을 할 때 SSL 통신을 통해 패킷을 전송하는데 Client는 Open SSL 라이브러리를 사용하여 이를 변.복조화 시킵니다.&lt;br /&gt;참고로 SSL은 MD5나 RC4와 같은 복잡한 변,복조 알고리즘을 사용합니다.&lt;br /&gt;&lt;br /&gt;헌데 우리 개발팀은 한 가지를 간과하고 있었는데, 바로 모바일(Smart Phone Omnia. )의 코어가 Arm 이라는 것입니다. Desktop과 달리 옴니아는 Arm Core를 사용하고 있고, 바이너리 코드가 다르기 때문에 옴니아에 이식이 안된다는 것입니다.&lt;br /&gt;더 근본적은 것은 RDP 소스는 Mobile 버젼으로 포팅하는 문제라기 보다는 RDP가 Desktop Version의 Open SSL 이라는 라이브러리를 갖다 쓴다는 것입니다.&lt;br /&gt;그렇다면 RDP를 Mobile에 올려도 SSL까지 Arm Version으로 포팅해야 한다는 것인데, 시간관계상 거기까지 손을 쓰기가 어렵더군요. 따라서 우리팀은 많은 시간소비와 노력 후에, Open SSL 라이브러리를 갖고와 사용하지 않고 SSL을 RDP Mobile 버젼에 소스화 시켰습니다. 소위 &quot;구겨 넣는다&quot;라는 표현을 쓰는 분이 많이 이러한 표현을 쓰겠습니다. 따라서 SSL문제까지 해결하였고 이를 Mobile에 포팅하는데 성공하였습니다.&lt;br /&gt;&lt;br /&gt;SSL 문제만을 갖고 갖가지 해결방안을 찾느라, 근 한달을 소비하였습니다. 비록 프로젝트 시연에서 퍼포먼스의 문제로 Mobile측은 SKT의 RDP를 사용하여 많은 아쉬움이 남았습니다만, Desktop측에서의 RDP 시연은 이상 없이 끝났기에 매우 기뻤던 프로젝트 였습니다.&lt;br /&gt;&lt;br /&gt;그래서 결국 SSL을 소스화 &lt;br /&gt;&lt;br /&gt;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>라인 감지 센서 </title>
            <link>http://www.swssm.org/index.php?idx=329</link>
            <description>[##_1C|1341107758.jpg|width=&quot;530&quot; height=&quot;515&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]지능형 모형차의 센서는 사람의 눈 역할을 대신합니다.&lt;br /&gt;&lt;br /&gt;빠른속도로 주행하므로 가능한 먼거리를 보는것이, 제어 측면에서 쉬워집니다.&lt;br /&gt;&lt;br /&gt;이 때 빠른 응답과 예측성을 갖기 위해 일부 팀에서는 발광부와 수광부 모두 혹은 수광부에만 렌즈를 달아서 먼 거리의 데이터를 수집할 수 있도록 하기도 합니다.&lt;br /&gt;&lt;br /&gt;먼 거리의 데이터를 얻어야 하므로 발광량이 쎈 발광 센서를 쓰는 것이 중요합니다.&lt;br /&gt;&lt;br /&gt;센서를 MCU 직접적으로 포트 제어를 하게 되면 많은 양의 전류를 흘릴 수 없기 때문에 TR을 이용합니다.&lt;br /&gt;&lt;br /&gt;보다 간단하게 제작하기 위해서 ULN2803이라는 Array TR을 이용하기도 합니다.&lt;br /&gt;&lt;br /&gt;ULN2803의 스펙을 보면 500mA라는 대용량의 전류를 흘릴 수 있으므로 발광센서를 구동하기에 충분합니다.&lt;br /&gt;&lt;br /&gt;[##_1C|1087056041.jpg|width=&quot;473&quot; height=&quot;320&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt; &lt;DIV&gt;&amp;lt;UNL2803 스펙&amp;gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;물론 발광 센서를 500mA로 계속 켜 두게 되면 얼마 못가서 발광센서가 타버려 동작을 하지 않는 상태가 발생하게 되지요.&lt;br /&gt;&lt;br /&gt;아래의 발광센서 데이터 시트를 보면 센서마다 스펙이 다르지만 일반적으로 발광센서는 100mA의 전류를 흘려서 구동하게 되어있습니다.&lt;br /&gt;&lt;br /&gt;[##_1L|1375785147.jpg|width=&quot;600&quot; height=&quot;211&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;br /&gt; &lt;DIV&gt;&amp;lt;발광 센서 전류 및 전압 스펙&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/DIV&gt;그럼 어떻게 500mA 혹은 그 이상의 전류를 흘리냐하면 펄스 구동으로 순간적으로 강한 출력을 낼 수 있습니다.&lt;br /&gt;&lt;br /&gt;주기와 폭은 센서 데이터 시트를 찾아서 확인하여 결정하여 주시면 되구요.&lt;br /&gt;&lt;br /&gt;그리고 펄스 구동을 하는 이유 중 다른 한가지가 또 있는데요.&lt;br /&gt;&lt;br /&gt;일반적으로 형광등, 백열등 등 다른 주변환경에 대한 외란에 대한 민감도를 줄이기 위해서도 사용합니다.&lt;br /&gt;&lt;br /&gt;이 때 수광부에 RC 하이패스 필터를 장착하여 사용합니다.&lt;br /&gt;&lt;br /&gt;형광등의 경우 60Hz 등 낮은 주파수 대역의 신호를 걸러 내어 주면 되기 때문에 발광센서로 높은 주파수로 구동을 하여 읽어 주면 외란이나 노이즈에 대한 민감도를 줄일수 있습니다.&lt;br /&gt;&lt;br /&gt;발광과 수광 센서에 대한 선택시 주의하여야 할 점은&lt;br /&gt;&lt;br /&gt;기본적이지만 두 센서의 파장을 비슷한 파장의 대역에 대해서 선택하여야 합니다.&lt;br /&gt;&lt;br /&gt;[##_1C|1174942402.jpg|width=&quot;600&quot; height=&quot;314&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt; &lt;DIV&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;lt;왼쪽 : 발광센서&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;오른쪽: 수광센서&amp;gt;&lt;br /&gt;&lt;/DIV&gt;&lt;/DIV&gt;위의 데이터 시트와 같이 발광센서는 950nm의 파장에서 강한 적외선을 내보내고,&lt;br /&gt;&lt;br /&gt;수광센서는 700~950nm에서의 반응이 가장 좋으므로 이들 센서로 한 쌍을 구성하시면 되겠습니다.&lt;br /&gt;&lt;br /&gt;그리고 센서마다 각도 특성이 있는데, 그 각도 특성을 고려하여 거리 등을 고려하여 센서를 배치하면 되겠습니다.&lt;br /&gt;&lt;br /&gt;수광센서를 사용 할 때 아래와 같은 회로를 구성하여 사용합니다.&lt;br /&gt;[##_1C|1205935942.jpg|width=&quot;420&quot; height=&quot;205&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;lt;수광 센서 회로&amp;gt;&lt;br /&gt;&lt;br /&gt; &lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;센서의 분해능을 최대화하기 위해서 저항을 적절하게 선택을 잘 하면 정밀한 제어와, 안전한 주행이 가능합니다.&lt;br /&gt;&lt;br /&gt;일반적으로 센서는 저항성분이 변하고 그 저항성분은 최대와 최소값을 갖게 됩니다. &lt;br /&gt;&lt;br /&gt;R2의 변화에 따른 센서의 Vout의 최소값과 최대값의 차이를 아래 식을 통해 그래프를 그려보았습니다.&lt;br /&gt;&lt;br /&gt;[##_1C|1240017143.jpg|width=&quot;600&quot; height=&quot;234&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;위 그래프에서 보듯이 600옴의 저항을 쓰면 분해능을 최대화 할 수 있을것입니다.&lt;br /&gt;&lt;br /&gt;이러한 과정을 통해 가장 이상적인 R2 값을 구할 수 있습니다.
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>FPGA 를 이용한 통합 제어 시스템 </title>
            <link>http://www.swssm.org/index.php?idx=330</link>
            <description>&amp;nbsp; 이번 프로젝트에서는 모든 구현 시스템을 통합 하여 제어하고 관리하는 디바이스로 FPGA를 선택하였다.&lt;br /&gt;&amp;nbsp; 프로젝트 기획 당시는 AVR로 구현할 예정이었으나 우리 프로젝트에는 FPGA가 더 알맞은 칩이라 생각되어.&lt;br /&gt;&amp;nbsp; 과제의 마지막달인 7월달에 총 제어칩을 바꾸게 되었다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 우리 프로젝트에선 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;칼만필터 데이터&lt;/span&gt; , &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Encoder 데이터&lt;/span&gt; , &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;초음파 데이터&lt;/span&gt; , &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;영상처리의 의한 제어 데이터&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp; 를 동시에 처리하여야지만&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; DC 모터의 구동&lt;/span&gt; 및 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;서보 모터의 구동&lt;/span&gt;이 신뢰감을 줄 수 있었다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 일반 적인 마이크로 프로세서인 경우 한번에 한가지 동작 밖에는 구현될 수 밖에 없다.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 이러한 이유는 Firmware 적인 구성이라 일반적인 소프트웨어와 같이 순차적으로 진행되기 때문이다.&lt;br /&gt;&amp;nbsp;&amp;nbsp; 따라서 칼만필터에 데한 데이터를 받아들이고 있는 동안에는 다른 encoder데이터 ,초음파 데이터 , &lt;br /&gt;&amp;nbsp;&amp;nbsp; 영상처리에 대한 데이터를 받아 들일 수 없다. 즉 각각의 데이터가 동시에 받아 들인 데이터가 아닌,&lt;br /&gt;&amp;nbsp;&amp;nbsp; 시간차가 있는 신뢰할 수 없는 데이터가 된다. 따라서 DC 모터의 구동 및 서보 모터의 구동 값이 &lt;br /&gt;&amp;nbsp;&amp;nbsp; 원하지 않게 동작되는 확률이 높았다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 하지만 , FPGA 의 경우는 하드웨어적인 구성으로 같은 시간대에 병렬적으로 모든 데이터를 처리 할 수가&lt;br /&gt;&amp;nbsp;&amp;nbsp; 있다. 이러한 이유는 클럭에 동기화 시킴으로써 클럭에 따라 구현된 모든 프로세서들이 동시적으로 돌아가기&lt;br /&gt;&amp;nbsp;&amp;nbsp; 때문이다. 따라서 마이크로 프로세서를 통합 칩으로 쓰는 것보다는 FPGA를 통합칩으로 쓰는것이 더 안정된&lt;br /&gt;&amp;nbsp;&amp;nbsp; 구동을 보장할 수가 있었다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; [##_1C|1340585725.jpg|width=&quot;552&quot; height=&quot;425&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt; &amp;lt; FPGA SCHEMETIC&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 위의 그림은 FPGA안에 구현된 회로도이다 . &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 영상처리에 의한 명령값을 시리얼 통신으로 받아들이는 UART RX를 구현하였고,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 두개의 모터 드라이버 구동 칩을 구현 하기 위하여 2개의 UART TX 를 구현하였다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 칼만필터가 구현된 AVR로 부터 데이터를 받는 칼만 필터 수신부, 이 데이터를 이용하여 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 서보모터를 제어하는 서보모터 구동부 , 엔코더 데이터를 받는 엔코더 수신부 , &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 초음파 8개의 데이터를 받아들이는 초음파 수신부및&amp;nbsp; Control 부 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 그리고 이러한 데이터들을 종합적으로 처리하여, DC 모터와 서보 모터를 구동시키는 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 종합 시스템 제어부를 설계하였다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>IP Balancer의 역할과 기능 </title>
            <link>http://www.swssm.org/index.php?idx=331</link>
            <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;/FONT&gt;&lt;/FONT&gt;GSS System&lt;/SPAN&gt;의&lt;SPAN lang=EN-US&gt; IP Balancer&lt;/SPAN&gt;의 역할은 &lt;SPAN lang=EN-US&gt;IP&lt;/SPAN&gt;의 생성 및 분배 역할을 한다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN lang=EN-US&gt;IP Balancer&lt;/SPAN&gt;는 &lt;SPAN lang=EN-US&gt;Agent Verifier&lt;/SPAN&gt;가 검사할&lt;SPAN lang=EN-US&gt; Target agent&lt;/SPAN&gt;를 설정한다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;생성은 랜덤하게 생성되기 보다는 각 클래스 대역에 맞게 일정한 그룹이 형성된&lt;SPAN lang=EN-US&gt; IP &lt;/SPAN&gt;대역을 자동으로 할당하여&lt;SPAN lang=EN-US&gt; Agent Verifier&lt;/SPAN&gt;에게 넘겨준다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;즉, &lt;SPAN lang=EN-US&gt;IP Balancer&lt;/SPAN&gt;가 작업 &lt;SPAN lang=EN-US&gt;IP &lt;/SPAN&gt;클래스 영역을 결정하고 &lt;SPAN lang=EN-US&gt;Crawler&lt;/SPAN&gt;가 이 정보들을 토대로 네트워크 상의 데이터들을 수집하게 된다&lt;SPAN lang=EN-US&gt;. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;[IP Balancer Application] &lt;br /&gt;[##_1C|1270249724.png|width=&quot;600&quot; height=&quot;342&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;[IP Balancer의 구조]&lt;br /&gt;&lt;br /&gt;[##_1C|1341819354.png|width=&quot;331&quot; height=&quot;300&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 38pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-font-family: '맑은 고딕'; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: '맑은 고딕'; mso-bidi-theme-font: minor-latin&quot;&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;1.&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Log Manager&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Log Manager&lt;/SPAN&gt;의 역할은 각각의 로그 정보들을 저장하고 추가하는 역할을 한다&lt;SPAN lang=EN-US&gt;. &lt;br /&gt;&lt;br /&gt;[##_1C|1370114827.png|width=&quot;549&quot; height=&quot;396&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 32.2pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-font-family: '맑은 고딕'; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: '맑은 고딕'; mso-bidi-theme-font: minor-latin&quot;&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;2.&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Multi-Threaded Controller&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: '맑은 고딕'; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; 각각의 여러 크롤러들과 연동되어야 하기 때문에 &lt;SPAN lang=EN-US&gt;Multi-Threaded &lt;/SPAN&gt;형태로 구현 되었다&lt;SPAN lang=EN-US&gt;. &lt;br /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;br /&gt;[##_1C|1400191552.png|width=&quot;542&quot; height=&quot;530&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 32.2pt; TEXT-INDENT: -18pt; mso-para-margin-left: 0gd; mso-list: l0 level1 lfo1&quot;&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-font-family: '맑은 고딕'; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: '맑은 고딕'; mso-bidi-theme-font: minor-latin&quot;&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&lt;FONT face=&quot;맑은 고딕&quot; size=2&gt;3. &lt;/FONT&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;Load Balancing &amp;amp; IP &lt;/SPAN&gt;동기화 &lt;br /&gt;각각의 크롤러들이 분산되어&lt;SPAN lang=EN-US&gt; IP &lt;/SPAN&gt;영역들을 검색하기 위해서 &lt;SPAN lang=EN-US&gt;Load Balancing &lt;/SPAN&gt;기술이 사용되었다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoListParagraph style=&quot;MARGIN: 0cm 0cm 0pt 38pt; mso-para-margin-left: 0gd&quot;&gt;또한 크롤러들이 작업을 수행하면서 서버가 중단되는 역할을 방지하는 역할과 실제&lt;SPAN lang=EN-US&gt; IP&lt;/SPAN&gt;를 할당하는 역할을 한다&lt;SPAN lang=EN-US&gt;. &lt;br /&gt;&lt;br /&gt;[##_1C|1352414519.png|width=&quot;537&quot; height=&quot;474&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>directshow를 이용하여 웹캠의 영상을 wmv로 저장해 봅시다~! </title>
            <link>http://www.swssm.org/index.php?idx=350</link>
            <description>&lt;P&gt;&amp;nbsp;웹캠을 이용하여 수신된 영상을 wmv로 인코딩을 하는 소스를 만들었습니다.&lt;br /&gt;&lt;br /&gt;간단하게 살펴 보겠습니다.^^&lt;br /&gt;&lt;br /&gt;Direct Show를 이용하여 &lt;br /&gt;&lt;br /&gt;IMediaControl * g_pMC = NULL;&lt;br /&gt;-&amp;gt;미디어 컨트롤을 하는 인터 페이스&lt;/P&gt; &lt;P&gt;g_pMC-&amp;gt;run()을 할경우 그래프 에디터가 실행 됩니다.&lt;/P&gt; &lt;P&gt;IGraphBuilder * g_pGraph = NULL;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;-&amp;gt;그래프에 필터를 추가할때 addfilter를 할경우 쓰인다.&lt;br /&gt;&lt;/P&gt; &lt;P&gt;ICaptureGraphBuilder2 * g_pCapture = NULL;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;-&amp;gt;이 캡쳐그래프빌더를 이용하여 renderstream를 설정한다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;초기에 &lt;/P&gt; &lt;br /&gt; &lt;P&gt;&amp;nbsp; // Create the filter graph&lt;br /&gt;&amp;nbsp; &amp;nbsp; hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IID_IGraphBuilder, (void **) &amp;amp;g_pGraph);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; // Create the capture graph builder&lt;br /&gt;&amp;nbsp; &amp;nbsp; hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IID_ICaptureGraphBuilder2, (void **) &amp;amp;g_pCapture);&lt;/P&gt; &lt;br /&gt; &lt;P&gt;코드를 실행하여 그래프&amp;nbsp; 인터페이스를 얻는다. &lt;br /&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;#################################################################################&lt;br /&gt;&lt;br /&gt;&lt;/P&gt; &lt;P&gt;&amp;lt;필터를 CoCreateInstance를 이용하여 필터를 로드하고&lt;/P&gt; &lt;P&gt;renderstream을 이용하여 그래프를 연결한다.&amp;gt;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;&amp;nbsp;1)디바이스 찾기(캠과 오디오 비슷하다.)&lt;/P&gt; &lt;br /&gt; &lt;br /&gt; &lt;P&gt;IBaseFilter * pSrc = NULL;&lt;/P&gt; &lt;P&gt;CComPtr &amp;lt;IMoniker&amp;gt; pMoniker =NULL; //검색되는 하나 하나의 장치를 모니카라고 함.&lt;/P&gt; &lt;P&gt;ULONG cFetched;&lt;/P&gt; &lt;P&gt;CComPtr &amp;lt;IEnumMoniker&amp;gt; pClassEnum = NULL;&lt;/P&gt; &lt;br /&gt; &lt;br /&gt; &lt;P&gt;//--&amp;gt;웹캠을 찾는 소스&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; hr = pDevEnum-&amp;gt;CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &amp;amp;pClassEnum, 0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (FAILED(hr))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Msg(TEXT(&quot;Couldn't create class enumerator!&amp;nbsp; hr=0x%x&quot;), hr);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/P&gt; &lt;br /&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; // If there are no enumerators for the requested type, then &lt;br /&gt;&amp;nbsp; &amp;nbsp; // CreateClassEnumerator will succeed, but pClassEnum will be NULL.&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (pClassEnum == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MessageBox(ghApp,TEXT(&quot;No video capture device was detected.\r\n\r\n&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TEXT(&quot;This sample requires a video capture device, such as a USB WebCam,\r\n&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TEXT(&quot;to be installed and working properly.&amp;nbsp; The sample will now close.&quot;),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TEXT(&quot;No Video Capture Hardware&quot;), MB_OK | MB_ICONINFORMATION);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return E_FAIL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/P&gt; &lt;br /&gt; &lt;P&gt;//장치를 검색한후 첫번째 장치를 BindToObject를 이용하여&amp;nbsp; pSrc에 담는 모습 &lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; if (S_OK == (pClassEnum-&amp;gt;Next (1, &amp;amp;pMoniker, &amp;amp;cFetched)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Bind Moniker to a filter object&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hr = pMoniker-&amp;gt;BindToObject(0,0,IID_IBaseFilter, (void**)&amp;amp;pSrc);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (FAILED(hr))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Msg(TEXT(&quot;Couldn't bind moniker to filter object!&amp;nbsp; hr=0x%x&quot;), hr);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Msg(TEXT(&quot;Unable to access video capture device!&quot;)); &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return E_FAIL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;그다음은 필터들을 조립해야 한다^^&lt;br /&gt;&lt;br /&gt;&lt;/P&gt; &lt;P&gt;&amp;lt;그래프 에디터에서 디쇼 필터 찾기&amp;gt;&lt;/P&gt; &lt;P&gt;-이런 필터는 장치를 검색하는것과 비슷하게 찾는다.&lt;/P&gt; &lt;P&gt;-&quot;Microsoft Windows Media Video 9&quot; 필터를 찾아 보면,,&lt;/P&gt; &lt;br /&gt; &lt;P&gt;IBaseFilter * pSrcWMV9 = NULL; &lt;/P&gt; &lt;P&gt;CComPtr &amp;lt;IMoniker&amp;gt; pMonikerWMV9 = NULL;&lt;/P&gt; &lt;P&gt;ULONG cFetchedWMV9;&lt;/P&gt; &lt;P&gt;CComPtr &amp;lt;IEnumMoniker&amp;gt; pClassEnumWMV9 = NULL;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;&amp;nbsp;hr = pDevEnum-&amp;gt;CreateClassEnumerator (CLSID_VideoCompressorCategory, &amp;amp;pClassEnumWMV9, 0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (FAILED(hr))&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Msg(TEXT(&quot;Couldn't create class enumerator!&amp;nbsp; hr=0x%x&quot;), hr);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return hr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/P&gt; &lt;br /&gt; &lt;P&gt;&amp;nbsp; // If there are no enumerators for the requested type, then &lt;br /&gt;&amp;nbsp; &amp;nbsp; // CreateClassEnumerator will succeed, but pClassEnum will be NULL.&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (pClassEnumWMV9 == NULL)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MessageBox(ghApp,TEXT(&quot;No wmv9 was detected.\r\n\r\n&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TEXT(&quot;This sample requires a video capture device, such as a USB WebCam,\r\n&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TEXT(&quot;to be installed and working properly.&amp;nbsp; The sample will now close.&quot;),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; TEXT(&quot;No Video Capture Hardware&quot;), MB_OK | MB_ICONINFORMATION);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return E_FAIL;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/P&gt; &lt;P&gt;&lt;br /&gt;이후에는 이것을 파일로 만들고 오디오 인코더를 붙이는 부분을 기재하겠습니다 ^^&lt;br /&gt;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Beautiful Garden에 대해서 </title>
            <link>http://www.swssm.org/index.php?idx=328</link>
            <description>&lt;P&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&amp;nbsp;저희 프로젝트를 모르는 분들이 많은 것 같아 순서는 바뀐 듯 하지만 저희 프로젝트 소개하는 글을 하나 올리려고 합니다. 식물을 키우는 것은 동물에 비해서 큰 비용이 들지 않으며 주변 환경의 공기를 정화시키거나 전자파를 차단하는 등 우리 생활에 도움을 주는 역할을 합니다. 이런 식물들의 장점을 이용해서 실제 건축 분야에서도 새집증후군을 없애는 용도로 또는, 화장실의 암모니아 냄새를 제거하는 용도 등의 이유로 식물을 배치하기도 합니다. 이렇게 점점 식물을 키우는 사람들은 늘어 가고 있지만 움직이지 않는 식물을 살아있는 생명체라고 느끼는 데 부족함이 있습니다. 이런 인식의 부족은 &lt;FONT size=2&gt;식물에 대한 관심 부족으로 이어지고 이에 따라 관리 또한 소홀해지게 되어 식물을 죽이고 맙니다. 다들 이런 경험 한번씩은 해봤을 겁니다. 저 또한 식물을 죽인 경험이 있어 식물을 키우는 게 좋다는 건 알지만 식물을 잘 키우려고 하지 않습니다. 식물도 생물체라는 것을 강하게 인식시킬 수 있다면 식물에게 작은 관심 한번 더 보이게 할 수 있다면 식물을 쉽게 죽이거나 상처입히는 일은 없을 것입니다. 내 책상에 작은 친구 만드는 프로젝트입니다. 늦었지만 저희 팀의 이름은 Goodmen입니다.^^&lt;br /&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;br /&gt;즉, 식물에 대한 어떤 부분을 조사하는가 하면 생장에 필요한 필수 정보, 식물에게서 나오는 네츄럴 시그널 즉 전기신호, 그리고 인터랙티브한 교감을 위해 음성신호에 대한 반응을 조사할 것입니다. 식물 생장에 필요한 정보는 온도, 습도, 해당 식물에 대한 생장주기를 조사하여 어떤 조치가 필요할 때 소스를 제공하여 효과적으로 식물을 기를 수 있도록 도움을 주게 됩니다. 또, 간단한 음성을 패턴을 디비로 두어 식물의 입장에서 반응하도록 하고, Natural Signal을 이용해 외부 변화에 대한 반응을 주어 식물에 대한 관심 증대와 살아있는 생물이라는 인식을 심어 줄 것입니다.&lt;/P&gt; &lt;P&gt;&lt;br /&gt;간단하게 네츄럴 시그널(Natural Signal;NS)이 무엇인지 살펴보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;식물은 각기 자신만의 전기적 전위차를 가지고 있다. 이것은 그 식물만의 고유한 특성으로서 자신의 상태를 나타내거나 자신을 표현하기도 한다. 식물에 흐르는 전기적 전위차를 생체 전류라고 표현하는데 이 생체 전류의 흐름에는 특정 패턴이 생긴다. 이 같은 분야의 획기적인 업적을 남긴 사람은 크레이브 백스터(Cleve Backster)이다. 그의 발견 중 일부는 백스터 현상이라고 명명되어 있다. 그는 1966년 자신의 학교에서 연구에 몰두하던 중 자신의 방에 놓여 있던 열대식물인 드러시너와 거짓말 탐지기로 실험을 통해 식물의 생체 전류가 흐르는 것에 일정 패턴이 존재한다는 것을 증명했다. 우리는 특정 나무가 처한 다양한 상태( 온도, 압력, 습도 등)에 따라 그 나무에 흐르는 전기적 전위, 즉 생체 전류의 측정 값을 Natural Signal 이라고 한다.&lt;/DIV&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;실제 NS(Natural Signal) 처리에 대해서 간단하게 설명하자면,&lt;br /&gt;&amp;nbsp;Natural Signal 즉, 전위차(Voltage)를 처리한다.&lt;br /&gt;&amp;nbsp;1. 한쪽 극은 토양에, 한쪽 극은 식물에 연결하게 되면 토양과 식물간의 약 10mV의 NS가 발생한다. 이 때 사람의 손과 같이 전류를 가지고 있는 물체가 식물을 만지게 되면 10mV의 NS가 40~50mV로 커지게 된다. &lt;br /&gt;&amp;nbsp;2. 이렇게 발생하는 Signal은 사용하기에는 작기 때문에 앰프를 이용해서 증폭을 시켜준다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;3. 앰프로 인해 증폭된 Signal을 식물에 접촉했을 때와 그렇지 않을 경우의 차이를 통해 접촉했을 때의 시간을 얻어낸다. 이렇게 얻어낸 값은 미리 DB화 시켜놓은 정보를 이용해 사용자에게 해당하는 반응을 출력해준다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이런 방식이 실제로 통하는 지 안 통하는 지 궁금하실 분들도 많으실거라고 생각됩니다만 실제 저희가 전압 계산을 해본 결과 차이가 발생합니다. 또한, 김광진 박사의 '말하는 식물' 도 이러한 방식으로 만들어진 것입니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/P&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; 식물의 생체전위를 이용해 몇가지 사람의 행동에 화분에 미리 설치된 스피커로 음성이 출력되는 이른바 ‘말하는 식물’로 유명해진 김광진 연구원은 이 화분으로 특허 출원까지 한 상태이다. 우리는 김광진 연구원이 수원농촌진흥청에 있다는 것을 알고 '말하는 식물'의 동작원리를 눈으로 보기 위해 찾아갔다. 이 화분은 시판된 다른 제품들과 같이 습도, 조도, 온도를 측정한다. 다른 제품들과 다른 점이 있다면 생체전위를 이용하는 것과 음성으로 화분의 상태를 출력해 주는 것이다. 예를 들어 물이 부족할 경우 화분은 '목말라, 물줘 !' 라는 말을 미리 설치된 화분 안의 스피커를 통해 출력하게 된다. 또한 생체전위를 이용해 식물을 툭 치거나, 쓰다듬을 때 그에 맞는 음성이 출력된다. 이러한 음성 출력으로 '말하는 식물'이라 불리게 되었고, 실제로 아이들에게 교육용으로나 재미적 요소로도 인기가 좋다. 이러한 인기에 힘입어 여러 박람회에 전시되고 있고, 최근에 열리고 있는 고양시의 꽃 박람회에도 전시되어 있다. &lt;br /&gt;&amp;nbsp;하지만 이 경우 스피커 장착 등의 이유로 크기가 굉장히 커지며, 단순히 약 6개 정도의 상태를 똑같은 말로 출력하기 때문에 처음 접했을 때와 다르게 금방 질리게 되는 단점이 있다. 또한 항상 전극을 식물 줄기에 꽂아 두기 때문에 연구용으로 적합하다는 생각이 더 들게 한다. 이러한 점으로 볼 때 제품으로 판매되기에는 부족한 점이 아직 많다.&lt;/DIV&gt; &lt;P&gt;이 방법은 검증된 것이라고 생각되었고 저희가 직접 측정해본 결과 가능하다는 것을 확신하면서 프로젝트를 진행하고 있습니다. 다만, 이상하게 프로젝트 진행 중 다른 종의 식물, 같은 종의 다른 화분들 또는 다른 장소에서 다각도로 실험해보았을 때 알 수 없는 이유로 특정 화분의 식물에 대해서는 값이 제대로 나오지 않는 경우가 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. A 화분의 식물이 값을 제대로 뿌려주지 않는 놈이라고 해봅시다. 값이 제대로 나오던 B 화분 옆에 A 화분을 두고 B화분의 전압차를 검사하면 값이 A 화분처럼 나옵니다. &lt;br /&gt;&lt;br /&gt;2. 갑과 을이라는 사람이 C 화분을 만졌을 때 모두 값이 잘 나왔습니다. 그런데 D 화분을 만졌을 때 갑이 만졌을 때 반응이 조금 다르게 나올 경우 다시 C 화분을 갑과 을 모두 만졌을 때 아까와는 다르게 갑의 반응이 D 화분을 만졌을 때와 같은 반응이 나옵니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;저희가 식물이나 생물 쪽을 집중적으로 공부하지않아 이것이 어떤 작용을 하고 있는 지는 알 수 없기 때문에 신기해하면서 그리고 두려워하면서(;;) 실험을 계속 해보고 있습니다. 혹시 이것이 사람의 호르몬과 같은 무언가에 의해 이루어지는 것이라고 한다면 결국 이것도 일종의 감정이라고 볼 수 있지 않을까 하는게 제 생각입니다만... 피엘님의 생각은 과학적으로 증명해야된다고 합니다.-_-;&lt;br /&gt;&amp;nbsp;이 쪽 분야에 대한 연구는 과학으로 증명하기 어려운 것들이 많고 여러가지 다양한 많은 실험들을 통해서만 증명 가능한 것들이 많으므로 논문 자료가 극히 적은 편입니다. 하지만 연구는 아주 오래 전 부터 쭉 계속되어 오고 있습니다. &quot;환경 자극에 따른 식물의 엽표면 전위포텐셜의 변화(Changes in Electric Potentials of Leaf Surface Induced by Environmental Stimuli)&quot;라는 논문에서는&lt;/P&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;현재까지 알려진 바로는 식물체는 외부자극에 대해 체내 약 10~50mV 범위의 약한 전류가 반응한다.(Spillane, 1991) 한편, 잎을 핀셋 등의 도구로 짓눌러 부수거나 잎 끝을 태우는 것과 같은 일부 상해를 줄 경우에도 전기적 변화가 발생한다. 그러나 이와 같은 전기적 반응은 자극을 주는 위치와 강도에 따라 매우 다르게 나타난다.(Malone과 Stankovic, 1991;Robin과 Bonnemain, 1985; Roblin, 1985) 음악이 작물의 생육을 촉진시킴과 동시에 체내의 특정성분을 증가시켜 병충해 발생억제에 효과적이라고 보고하였다.(Lee 등, 1997) 한편, 식물에게 사랑하는 감정으로 대했을 때와 불에 태워지거나 뿌리째 뽑히게 될 것이라는 예감만 해도 격렬한 반응을 보인다(Robert, 1989) 등 과학적 객관성이나 재현성 없는 것으로 판단되는 사례들을 서론으로 제시, 자체 개발한 생체 전위 측정방법을 이용하여 외부자극에 따른 식물의 전기적 특성에 대해서 조사하였다. &lt;br /&gt;&amp;nbsp;논문에 의하면 &lt;br /&gt;&amp;nbsp;본 실험의 결과에 따라서 1) 외부자극에 대한 식물체의 전위포텐셜 변화가 분명히 발생하는 것을 볼 수 있었으며, 2) 중요한 사실은 자극뿐만 아니라 식물체의 종류 및 시간에 따라서도 다양하게 반응하며, 이러한 사실은 일반적인 전위차 변화 뿐만 아니라 변이차 및 주파수 분석을 통해서도 확인할 수 있었다.&amp;nbsp; &lt;/DIV&gt;&lt;br /&gt;고 말하고 있습니다. 또한 흥미로운 점은&lt;br /&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;또한, 특이한 사실은 현재 사용된 식물재료 대부분이 생체전위변화 측정을 위한 주파수 분석 시 자극유무와 상관없이 1~10Hz 대역에서 주파수 분포가 높았으며, 식물에 따라 자극 전후에 상당한 차이를 보였다는 것이다. 현재까지 조사된 바로는 이러한 결과를 이전에 보고한 예가 없었던 것으로 판단되며, 인간의 대뇌 피질에서 발생되는 뇌파(δ, θ, α, wave)도 이 대역에 속한다는 점에서 매우 흥미롭다(Son 등, 1998). &lt;/DIV&gt;&lt;br /&gt;이라는 것입니다. 우리가 실험 중에 발생한 문제들과 이것이 매우 유사함을 볼 수 있습니다. 논문 속의 실험 결과만으로 이것이 얼마나 신뢰가 가는 자료인지 확인할 순 없을 테지만 실제로 실험을 해볼 수 있는 상황이 아니므로 이정도로 저희의 NS 연구자료에 대한 이야기를 마칠까합니다.&lt;br /&gt;&lt;br /&gt;다음은 Beautiful Garden 프로젝트 실험 자료들과 사운드 관련 자료들로 찾아뵙겠습니다.^^&lt;br /&gt;ps. 사진들이 안올려져서 후에 다시 수정하겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Windows Media Encoder 9 Series SDK </title>
            <link>http://www.swssm.org/index.php?idx=332</link>
            <description>&lt;FONT color=#000000&gt;안녕하세요. 19기 임승훈입니다.&lt;br /&gt;영상 스트리밍 서비스를 위해 Windows Media Encoder 9 Series SDK에 대해 공부하게 되었습니다.&lt;br /&gt;처음하는 부분이라 생소하고 어색해 처음에는 많이 어색했지만, 이제는 조금 익숙해진 듯 합니다.&lt;br /&gt;이번에는 그 중에서 Windows Media Encoder 9 SDK의 간단한 특징에 대해 설명드리겠습니다.&lt;br /&gt;SDK - Software Dvelopment Kit...이번에 알았습니다...;;&lt;br /&gt;&lt;!--StartFragment--&gt;&lt;/FONT&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;FONT color=#000000&gt;&lt;!--StartFragment--&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;FONT size=4&gt;Windows Media Encoder 9 Series SDK(Software Development Kit)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Microsoft Windows Media 9 Series SDK의 주성분들 중의 하나로서 다른 성분들은 다음과 같습니다.&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; · Microsoft Windows Media Services 9 Series SDK&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; · Microsoft Windows Media Format 9 Series SDK&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; · Microsoft Windows media Rights Manager 9 Series SDK&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; · Microsoft Windows Media Player 9 Series SDK&lt;br /&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; · Windows Media 9 Series Embedded Product Adaptation Kit (PAK)&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder 9 Series SDK는 Application Programming Interface(API)에 근거한 강한 자동화를 사용해 Windows Media Encoder 어플리케이션을 개발하기를 원하는 모두를 위해 디자인되었습니다. 이 SDK와 더불어 C++나 Microsoft Visual Basic®, 스크립트 언어를 사용하는 개발자는 multimedia 컨텐츠를 캡쳐해서 Windws Media(file이나 stream 방식)으로 Encode할 수 있습니다. 예를 들어, Broadcast live content나 Batch-process content, Create a custom user interface, Remotely administer Windows Media Encoder applications 등과 같은 자동화 API에 이용할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&amp;nbsp; &lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold; FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;FONT size=3&gt;About the Windows Media Encoder SDK&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Microsoft Windows Media Encoder Software Development Kit (SDK)는 오디오나 비디오 컨텐츠를 윈도우즈 미디어 파일이나 스트림 형태로 압축하거나 저장하기 위해 사용합니다. 또한 이 SDK는 사용자들이 그들의 컴퓨터에 부착된 장치들에서 오디오와 비디오 파일들을 Windows Media Format으로 번역해 멀티미디어 작품을 제작하는 것을 가능하게 해줍니다. 그리고 이들을 로컬 파일 형태로서 windows Media를 저장하거나, 인터넷을 통해 방송을 하거나, Windows Media server로 push할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder 9 Series를 사용할 수 있기 위해서는 반드시 Windows Media Encoder 9 Series SDK를 설치되어 있어야 합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold; FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;FONT size=3&gt;What's New&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;다음 리스트는 Windows Media Encoder 9 Series SDK에 어떤 새로운 기능이 더해졌는지와 우리가 무엇을 할 수 있는지에 대해 요약한 것입니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 향상된 Multiple Bit Rate(MBR) 지원, 새로운 Variable Bit Rate(VBR) 지원, Multichannel Source Support, Nonsquare Pixel 지원, 타임 코드 지원, 2-pass Encoding, 새로운 오디오와 비디오 codec 추가로 인한 인코딩 효율성의 향상.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Server에 스트림을 push하는 것으로 방송을 분배할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder SDK를 사용해 디지털 장치를 제어할 수 있습니다. 그리고 인코딩을 위한 클립을 선택하기 위해 Edit Decision Lists(EDLs)를 사용합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩 프로필을 만들고 수정할 수 있습니다. Fine-tune 컨트롤은 우리가 오디오와 비디오 코덱, Encoding 방법(VBR or CBR), 그리고 비디오와 최적화 환경을 지정하는 것을 가능하게 해줍니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩된 파일들에 watermarks를 추가할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 파일의 지속도 또는 사이즈로써 파일 저장을 제한할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 스트림 안에 HyperText Markup Language(HTML) 문서를 포함하는 것으로 방송을 할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Metadata, indexing, script, 그리고 marker를 추가하는 것으로 후 작업 파일 처리가 가능합니다. 파일 편집을 위해 mark-in과 mark-out을 사용할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩된 파일 내에서 스트림을 쪼개거나 재조합할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 적용하기에 최적한 환경을 결정하기 위해 비디오 내용을 분석할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩된 내용을 Digital Rights Management(DRM) 기술을 사용해 보호받을 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 새로운 Plug-in 모델을 사용해 오디오와 비디오 변환 Plug-in을 만들 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;STRONG&gt;아래 변화는 Windows Media Encoder 7.1 SDK를 기반으로 만들어졌습니다.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder 9 Series SDK를 사용하기 위해서는 Windows Media Encoder 9 Series의 설치가 반드시 필요합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Microsoft Visual Basic, C++, 그리고 C# 같은 프로그램 언어들에 Windows Media Encoder의 특징을 어떻게 사용할 수 있는지를 설명하는 새로운 Code 샘플을 포함하고 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- WMEncDataview 오브젝트와 함께 Visual Basic을 이용해 스트림의 프리뷰와 포스트뷰가 가능합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder 어플리케이션을 제공하는 컴퓨터에 연결될 수 있는 클라이언트의 수는 50에서 5로 감소했습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 새로운 Property 페이지가 이용 가능합니다. 하지만 새로운 Property 페이지가 Windows Media Encoder 7.1 SDK에 근거한 어플리케이션에는 적절히 표시되지 않을 수도 있음을 숙지해야합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- C++을 이용해 프로그래밍을 할 때에는 반드시 BSTR 포맷을 사용해야 하고, wide-character 포맷은 더 이상 사용할 수 없습니다. 예를 들어, L&quot;text&quot;대신 CComBSTR(&quot;text&quot;)를 사용해 스트링을 명기해야합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;STRONG&gt;아래 다이어그램은 Windows Media Encoder 9 Series SDK에 추가된 새로운 interface들을 보여주고 있습니다.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;IMG src=&quot;http://estworks.com/swssm/wme.gif&quot;&gt; &lt;P class=바탕글&gt;&lt;?xml:namespace prefix = v ns = &quot;urn:schemas-microsoft-com:vml&quot; /&gt;&lt;v:shapetype id=_x0000_t75 coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;&gt;&lt;/v:path&gt;&lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;v:shape id=_x62658024 style=&quot;WIDTH: 425.2pt; HEIGHT: 563.42pt; v-text-anchor: top&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;v:imagedata o:title=&quot;EMB0000128c676e&quot; src=&quot;file:///C:\DOCUME~1\임승훈\LOCALS~1\Temp\Hnc\BinData\EMB0000128c676e.bmp&quot;&gt;&lt;/v:imagedata&gt;&lt;?xml:namespace prefix = w ns = &quot;urn:schemas-microsoft-com:office:word&quot; /&gt;&lt;w:wrap type=&quot;topAndBottom&quot;&gt;&lt;/w:wrap&gt;&lt;/v:shape&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold; FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;FONT size=3&gt;Understanding the Windows Media Encoder SDK&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 개발자들이 어플리케이션과 워크플로우로 Windows Media를 통합하는 것을 가능하게 해주는 풍부한 인터페이스를 제공함으로써 Windows Media Encoder SDK는 강력하고 믿을만 합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder SDK는 C++, Visual Basic, Visual Basic Scripting Edition(VBScript), Visual Basic for Applications, 그리고 모든 종류의 Microsoft .NET 프로그래밍 언어들을 포함하는 다양한 언어들을 제공합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 많은 다양한 어플리케이션들 즉, Video e-mail, 안전 감시 보관, 인코더 배치, 화면 캡쳐 유틸리티, Microsoft PowerPoint, Microsoft Office add-ins, 디지털 레코더, 그리고 관습적인 인코딩 어플리케이션들이 Windows Media Encoder SDK를 사용함으로써 개발되어집니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;&lt;STRONG&gt;Windows Media Encoder SDK는 당신이 아래와 같은 것을 할 수 있도록 허락하면서 광범위한 범위의 기능을 제공합니다.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 매우 다양한 파일 형태들과 장치 종류로부터의 인코딩이 가능합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩 과정 동안에 컨텐츠의 입출력 버전을 확인할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 컨텐츠를 스트림이나 파일 형식으로 인코딩 가능합니다. 스트림들은 인코딩 어플리케이션에서 pull되거나 Windows Media server로 push될 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩 어플리케이션을 사용해 디지털 장비들을 직접적으로 제어할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩 과정 도중, 혹은 그 이후에 통계를 검색할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 관습적인 인코딩 프로필들을 창조하거나 수정할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 하나의 Multiple Bit Rate(MBR) 파일로부터 복수의 파일을 만드는 것이나 복수의 파일들로부터 하나의 MBR 파일을 만드는 것으로 스트림을 수정할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 시작점과 끝점을 정돈함으로써, 그리고 메타 데이터, 스크립트, 마커와 색인을 추가함으로써 Windows Media 파일을 수정할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 인코딩 과정 동안에 Digital Rights Management(DRM) 기술을 사용해 컨텐츠를 보호할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Encoder SDK는 Windows Media Format SDK에 의해 만들어지고, 그것은 하위 레벨의 기능을 제공할 수 있습니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- Windows Media Format SDK와는 달리 Windows Media Encoder SDK는 스크립트 언어를 지원하고 적은 코드를 가지고 복잡한 어플리케이션을 만드는 것이 가능합니다.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-FAMILY: 맑은 고딕; mso-fareast-font-family: 맑은 고딕; mso-hansi-font-family: 맑은 고딕&quot;&gt;- 추가적으로, Windows Media Encoder SDK는 다양한 입출력 옵션들을 지원해줌으로써 우리가 스스로 하위 레벨 성분들을 개발하지 않아도 됩니다.&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/SPAN&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Windows Winsock2로 구현하는 고성능 서버 </title>
            <link>http://www.swssm.org/index.php?idx=333</link>
            <description>&lt;p&gt;서버를 구현함에 있어서 가장 중요한 것은 아마도 성능과 안정성 일 것이다. 고성능 서버를 구현한다는 말은 결국 운영체제에서 제공하는 가장 빠른 I/O 모델하고도 연관이 되는데, 윈도우에서 가장 많이 사용되는 방식은 아마도 IOCP(I / O Completion Port) 서버 모델 일 것이다. 반대로 리눅스 운영체제에서는 Epoll I / O 모델을 사용하거나, 솔라리스 특유의 Kqueue 모델이 고성능 서버를 짤 때 가장 많이 사용되는 I / O 모델 일 것이다.&lt;/p&gt; &lt;p&gt;Linux 운영체제와 달리 Windows는 윈속이라는 Socket Programming 확장 모델을 제공하는데, 이로 인한 장점은 운영체제에서 제공하는 부가 기능을 원활히 이용할 수 있다는 점이 있다. 하지만 그로 인해 다른 운영체제로의 이식에 제한을 갖는 부분은 트레이드 오프라고 할 수 있다.&lt;/p&gt; &lt;p&gt;서버를 구현함에 있어서 가장 염두에 두었던 부분은 크게 몇가지로 요약할 수 있다.&lt;/p&gt; &lt;p&gt;1. 서버가 동작할 때 부가적인 메모리 할당 연산을 최소화한다.&lt;/p&gt; &lt;p&gt;2. 서버와 클라이언트의 구현상에 공유되는 함수는 래퍼 클래스를 작성하여 확장성을 갖게 한다.&lt;/p&gt; &lt;p&gt;3. 클래스의 각 멤버 함수는 Thread-Safe 해야 하며, 재진입성을 확보해야 한다.&lt;/p&gt; &lt;p&gt;각 부분에 대해서 조금 더 자세히 설명을 해보겠다.&lt;/p&gt; &lt;p&gt;첫번째로 메모리 할당 연산에 대한 부분을 언급했는데, 기본적으로 전역 메모리에 할당하는 전역 변수는 속도는 빠르지만, 동적 메모리에 비해서 유연성이 떨어진다. 하지만 동적 메모리는 유연성이 높지만, 메모리 할당 연산에 대한 연산에 대한 부담이 크다. 만약 C++ 에서 제공하는 메모리 할당 연산을 그대로 사용했을 경우, 그렇지 않았을 경우와 상당한 성능적인 차이가 발생하게 된다. 이 부분에 대한 해결책으로 가장 많이 사용되는 것이 바로 메모리 할당기를 만드는 것이다. &lt;/p&gt; &lt;p&gt;C에서 상대적으로 메모리 할당기를 구현하는 것이 부담스러운 작업이지만, C++에서는 operator new 연산을 중복 적재하는 것으로 쉽게 구현할 수 있다. &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;2&quot;&gt;&lt;/td&gt; &lt;td width=&quot;6&quot;&gt;&lt;/td&gt; &lt;td width=&quot;594&quot;&gt;&lt;/td&gt; &lt;td width=&quot;6&quot;&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;td&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td width=&quot;73&quot;&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;td&gt;&lt;a href=&quot;http://tt_attach_path/1007234089.gif&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;clip_image001[8]&quot; border=&quot;0&quot; alt=&quot;clip_image001[8]&quot; src=&quot;http://tt_attach_path/1365412665.gif&quot; width=&quot;579&quot; height=&quot;923&quot; /&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;a href=&quot;http://tt_attach_path/1021661652.gif&quot;&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot;&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt; &lt;p&gt;MultiThreadSync&amp;lt;T&amp;gt; 클래스는 Win32 API의 CriticalSection에 대한 래퍼 클래스로 메모리 할당에 대한 연산이 멀티 스레드 안정성을 가지도록 한다. &lt;/p&gt; &lt;p&gt;메모리 할당 클래스는 미리 할당될 객체 크기만큼의 메모리를 50개의 연결리스트로 관리하며, 이 메모리가 다 소비 될 때까지 메모리 할당을 하지 않고, 미리 할당된 메모리에서 할당하여 준다.&lt;/p&gt; &lt;p&gt;C++에서 제공하는 new 연산자는 크게 두가지 연산을 한다.&lt;/p&gt; &lt;p&gt;1. operator new 연산을 통해 메모리를 할당한다.&lt;/p&gt; &lt;p&gt;2. 해당하는 객체의 생성자를 호출한다.&lt;/p&gt; &lt;p&gt;다음과 같이 C++ new 연산을 분리되어 있기 때문에, 온전한 크기의 메모리만 확보되었다면 해당 클래스가 온전히 생성자를 호출하여 초기화할 수 있다는 것을 보장해준다.&lt;/p&gt; &lt;p&gt;서버내에서 빈번히 사용되는 객체들에 대해서는 저 메모리 풀 클래스를 상속받아서, 구현하였기 때문에 메모리 할당으로 인한 성능 감소를 최소화 하였다.&lt;/p&gt; &lt;p&gt;덤으로, STL에서 사용되는 vector, list, map 등 같은 컨테이너들도 STL 룰에 맞는 메모리 할당기를 구현한다면, 자료구조의 성능을 최적화 할 수 있지만 이 부분에 대해서는 구현하지 않았다.&lt;/p&gt; &lt;p&gt;두번째로 서버와 클라이언트에서 사용하는 Winsock2 함수들에 대해서는 래퍼 라이브러리를 작성하여 서버와 클라이언트에서 사용되는 코드의 중복을 최소화하여, 유지보수에 열려 있도록 작성하였다.&lt;/p&gt; &lt;p&gt;다음은 라이브러리 클래스의 계층도 이다.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://tt_attach_path/1119387265.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;class&quot; border=&quot;0&quot; alt=&quot;class&quot; src=&quot;http://tt_attach_path/1033543363.jpg&quot; width=&quot;586&quot; height=&quot;308&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;해당 클래스 라이브러리는 정적 라이브러리로 구현하였고, 서버와 클라이언트는 해당 라이브러리 파일을 임포트하여 사용하고 있다.&lt;/p&gt; &lt;p&gt;마지막으로 멀티 스레드 안정성과 재진입 가능에 대한 구현 또한 클래스 다이어그램의 최상위 클래스인 MultiThreadSync 클래스를 상속 받기 때문에 각 루틴에 대한 안정성을 확보하였다.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;[참고 도서]&lt;/p&gt; &lt;p&gt;온라인 게임 서버 프로그래밍(정보문화사, 한동훈 저)&lt;/p&gt; &lt;p&gt;Network Progarmming For Microsoft Windows 2th Edition(정보문화사, 김남식 역)&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>DirectShow를 이용한 화면녹화 모듈 [화면녹화 -&amp;gt; flv 저장] - 두 번째 ...</title>
            <link>http://www.swssm.org/index.php?idx=327</link>
            <description>&lt;p&gt;지난 시간에 이어서 이번에 설명드릴 내용은 다음과 같습니다. ^^ &lt;br /&gt; &lt;br /&gt;3. COM 에 대한 이해 &lt;br /&gt;4. Visual Studio 2008에서 DirectShow를 이용한 어플리케이션 제작 방법 &lt;br /&gt;5. Kerberos Capture 프로그램 &lt;br /&gt; &lt;br /&gt;먼저 COM에 대해 간단히 알아볼까요? &lt;br /&gt;DirectShow는 COM 을 기반으로 구현되었기 때문에 이에 대한 이해 없이는 어플리케이션을 구현하기가 어렵습니다.&amp;#160; &lt;br /&gt; &lt;br /&gt;먼저 COM을 사용하기 위해서는 반드시 CoInitialize(NULL) 함수를 호출해 주어야만 합니다. &lt;br /&gt;사용이 끝날 때도 역시 CoUninitialize()&amp;#160; 함수를 호출해야 합니다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;COM 객체 생성하기. &lt;br /&gt;&lt;/strong&gt; &lt;br /&gt;CoCreateInstance() API 함수를 통해 생성하며 이때 넘겨주는 파라미터들은 다음과 같습니다. &lt;br /&gt; &lt;br /&gt;CoCreateIntance(&lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#ff80c0&quot;&gt;CLSID_FilterGraph&lt;/font&gt;, &lt;br /&gt;NULL, &lt;br /&gt;CLSCTX_INPROC_SERVER, &lt;br /&gt;&lt;font color=&quot;#ff80c0&quot;&gt;IID_IGraphBuilder&lt;/font&gt;, &lt;br /&gt;&lt;font color=&quot;#ff80c0&quot;&gt;(void**)&amp;amp;m_pGB&lt;/font&gt; &lt;br /&gt;); &lt;br /&gt; &lt;br /&gt;먼저 1번 째 파라미터인 CLSID_FilterGraph 는 생성할 객체의 종류이다. 앞에 CLSID는 COM 컴포넌트의 Class ID를 의미한다. 예를 들어 GraphEdit에서 추가했던 여러 가지 필터 중에서 스트림을 파일로 저장하는 Rendering Filter의 종류 중 하나인 File Writer 필터 객체를 생성하고 싶을 때 CLSID_FileWriter 이런 식으로 파라미터를 넘겨주면 된다. &lt;br /&gt; &lt;br /&gt;4 번째 파라미터인 IID_IGraphBuilder 는 인터페이스를 의미한다.&amp;#160; 앞에 IID는 Interface ID를 의미하며 생성하는 &lt;br /&gt;COM 객체가 어떤 용도로 사용될 것인가를 지정해주는 부분이다. COM 객체가 그래프일 경우 IID_IGraphBuilder 로 파라미터를 지정해주면 되고 필터일 경우는 IID_IBaseFilter 로 지정해주면 이러한 용도에 맞게 COM 객체를 생성해준다. &lt;br /&gt; &lt;br /&gt;5번째 파라미터는 생성된 COM 객체의 인터페이스에 대한 포인터를 받아올 포인터 변수이다. COM 객체가 CoCreateInstance 함수로 부터 생성이 되면 이 객체에 대한 인터페이스 포인터를 얻을 수 있다. 이러한 인터페이스가 필요한 이유는 COM의 구조상 COM 컴포넌트나 COM 인터페이스에 직접 명령을 내릴 수 없기 때문이다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1128134192.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1317913227.png&quot; width=&quot;358&quot; height=&quot;88&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;분홍색으로 표시하지 않은 2, 3번째 파라미터들은 DirectShow에서 대부분 디폴트로 쓰기 때문에 일단 설명에서 제외했습니다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;COM 인터페이스에 대한 이해&lt;/strong&gt; &lt;br /&gt; &lt;br /&gt;CoCreateIntance( &lt;/p&gt; &lt;p&gt;&lt;font color=&quot;#ff80c0&quot;&gt;CLSID_FilterGraph&lt;/font&gt;, &lt;br /&gt;NULL, &lt;br /&gt;CLSCTX_INPROC_SERVER, &lt;br /&gt;&lt;font color=&quot;#ff80c0&quot;&gt;IID_IGraphBuilder&lt;/font&gt;, &lt;br /&gt;&lt;font color=&quot;#ff80c0&quot;&gt;(void**)&amp;amp;m_pGB&lt;/font&gt; &lt;br /&gt;);&lt;/p&gt; &lt;p&gt;이 함수에서 m_pGB 라는 포인터 변수가 생성된 COM 객체에 대한 인터페이스를 가리킨다는 거 기억하시죠? &lt;br /&gt;그렇다면 이렇게 얻어온 인터페이스 포인터로 무엇을 할 수 있을까요? &lt;br /&gt; &lt;br /&gt;바로 명령을 내릴 수 있습니다. 이 말을 좀 더 쉽게 표현한다면 COM 객체에서 사용 가능한 함수들을 호출할 수 있습니다.&amp;#160; 예로 들면 IID_IMediaControl 에 대한 인터페이스 포인터를 가지고 있다면 run(), pause(), stop() 등의 멀티미디어 데이터의 재생에 관련된 명령들을 내릴 수 있습니다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;IUnknown 인터페이스 &lt;br /&gt;&lt;/strong&gt;모든 COM 인터페이스들은 반드시 IUnkown 인터페이스 상속해야만 한다. 이 인터페이스에는 크게 3가지 종류의 함수를 포함하고 있으며 예제를 통해 간단히 살펴보면 다음과 같다. &lt;br /&gt; &lt;br /&gt;QueryInterface() &lt;br /&gt;: 프로그래머가 어떤 특정한 IID에 대한 명령을 내리고 싶을 때… 해당 IID가 있는지 COM 인터페이스 포인터에게 물어보는 역할을 수행하는 함수이다. &lt;br /&gt; &lt;br /&gt;AddRef() &lt;br /&gt;: Add Reference count의 약자로서 COM 객체에게 자신이 참조하고 있다는 것을 알려주기 위해 카운트를 증가시켜 주는 역할을 수행한다. &lt;br /&gt; &lt;br /&gt;Release() &lt;br /&gt;:&amp;#160; Release Reference count를 의미하며 COM 객체에게 자신이 더 이상 참조하고 있지 않다는 것을 알리는 역할을 수행하며 카운트를 감소시켜 준다. &lt;br /&gt; &lt;br /&gt;COM 객체는 자신을 참조하는 카운트의 수가 0일 경우 자동 소멸하는 방식이므로 프로그램 작성시 몇 가지 주의 &lt;br /&gt;해야 될 점이 있다. &lt;br /&gt; &lt;br /&gt;1. QueryInterface() 함수를 통해 포인터를 받아온 경우 사용 전에 AddRef() 함수를 호출해 주지 않아도 된다. &lt;br /&gt;그 이유는 QueryInterface() 함수에서 알아서 COM 객체에게 어떤 포인터가 참조하고 있다는 사실을 알려주기 때문이다. 그러나 사용 후 Release() 함수는 자동으로 호출해 주지 않으므로 반드시 Release() 함수를 호출해 주도록 하자. &lt;br /&gt; &lt;br /&gt;2.&amp;#160; 단순히 포인터를 복사해서 쓰는 경우 사용 전에 반드시 AddRef() 함수를 호출하여 COM 객체에게 자신이 참조하고 있다는 사실을 알려주도록 하자. 이렇게 하지 않고 무분별하게 포인터를 복사해서 쓰는 경우 COM 객체 입장에서는 자신을 가리키고 있는 포인터의 개수를 알지 못하게 되며 COM 객체를 소멸시키지 못하는 사태가 발생할 수 있다. &lt;br /&gt; &lt;br /&gt;위의 내용이 조금 두서 없이 쓴 것 같아서 … 조금 더 보충설명을 해드리겠습니다. &lt;br /&gt; &lt;br /&gt;QueryInterface() 로 부터 얻어온 포인터는 다른 인터페이스 포인터에게 복사해줄 수 있다. &lt;br /&gt; &lt;br /&gt;예를 들면 &lt;br /&gt;// QueryInterface() 함수를 통해 COM 인터페이스 포인터를 받아올 인터페이스 포인터 선언 &lt;br /&gt;&lt;font color=&quot;#0080ff&quot;&gt;IFileSinkFilter&lt;/font&gt; *pFSF; &lt;br /&gt;// QueryInterface() 함수 없이 COM 인터페이스 포인터를 복사할 인터페이스 포인터 선언 &lt;br /&gt;&lt;font color=&quot;#0080ff&quot;&gt;IFileSinkFilter&lt;/font&gt; *pFSF2; &lt;br /&gt; &lt;br /&gt;//pFilterFileWriter 는 FileWriter 필터에 대한 COM 인터페이스 포인터 &lt;br /&gt;&lt;font color=&quot;#0080ff&quot;&gt;pFilterFileWriter&lt;/font&gt;-&amp;gt;QueryInterface(IID_IFileSinkFilter, (void **)&amp;amp;pFSF)); &lt;br /&gt; &lt;br /&gt;위에서 QueryInterface() 함수를 통해 IID_IFileSinkFilter 에 대한 인터페이스 포인터를 pFSF 가 받아오게 된다. &lt;br /&gt; &lt;br /&gt;//pFSF2 변수에 QueryInterface() 함수를 통해 받아온 pFSF 포인터를 복사 &lt;br /&gt;pFSF2=pFSF; &lt;br /&gt; &lt;br /&gt;지금부터 집중하시고~~!! 지금부터 AddRef() 함수에 대한 설명 들어갑니다. &lt;br /&gt; &lt;br /&gt;pFSF-&amp;gt;SetFileName(L”C:\secmem\the kerberos\results.flv”, NULL); &lt;br /&gt;위의 코드는 정상적으로 수행됩니다. 왜냐하면 QueryInterface() 함수가 정상적으로 pFSF 에게 IID_IFileSinkFilter &lt;br /&gt;에 대한 일종의 사용허가증을 발급해주었기 때문입니다. &lt;br /&gt; &lt;br /&gt;그렇다면 pFSF 를 복사한 pFSF2 변수도 위와 같이 사용이 가능할까요? &lt;br /&gt;pFSF2-&amp;gt;SetFileName(L”C:\secmem\the kerberos\results.flv”, NULL); &lt;br /&gt; &lt;br /&gt;답은… 가능하다! 하지만 중요한 것은 모든 COM 객체들은 사용 후 소멸시켜주는 Release() 함수를 호출해줘야 하는데.. AddRef() 함수 없이 무분별하게 복사해서 사용한다면 COM 객체 입장에서는 자신을 가리키고 있는 포인터가 몇 개인지 알 수 없기 때문에 소멸시기를 판단할 수가 없게 된다.&amp;#160; COM 객체는 자신이 사용되고 있는 곳의 개수를 관리하고 있다가 0이 되었을 경우 자동 소멸하는 방식이기 때문에 복사한 후 사용 전에 반드시 &lt;br /&gt;AddRef() 함수를 호출한 후 사용하도록 하자. &lt;br /&gt; &lt;br /&gt;이상으로 COM 에 대한 설명을 마치고 Visual Studio 2008로 DirectShow를 이용한 어플리케이션 개발 방법에 대해 설명 드리고 저희 프로그램에 대해서 소개를 하겠습니다. &lt;br /&gt; &lt;br /&gt;1. 개발에 필요한 환경 설정 &lt;br /&gt;#pragma comment(lib, &amp;quot;&lt;font color=&quot;#0080ff&quot;&gt;Strmiids.lib&lt;/font&gt;&amp;quot;) &lt;br /&gt;이것은 위에서 설명한 CLSID와 IID에 대한 정의 및 DirectShow 기술을 사용하기 위한 라이브러리 파일입니다. &lt;br /&gt; &lt;br /&gt;#include &amp;lt;&lt;font color=&quot;#0080ff&quot;&gt;DShow.h&lt;/font&gt;&amp;gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1142201997.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1264217727.png&quot; width=&quot;579&quot; height=&quot;272&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Dshow.h 파일의 내용 중 일부를 캡쳐했습니다. 전반적으로 DirectShow 개발에 필요한 오류 정보 및 인터페이스, CLSID 정보들이 포함되어 있다는 것을 알 수 있습니다. 다음에 이어질 설명을 이해하기 위해 위의 그림에서 &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;60 번째 라인 uuids.h&lt;/font&gt; 파일이라는 것이 있구나~ 이 정도만 생각하시고 계속 읽어주시기 바랍니다. &lt;br /&gt; &lt;br /&gt;2. 필터를 사용하기 위한 DEFINE_GUID &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1086134373.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1223633432.png&quot; width=&quot;583&quot; height=&quot;207&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;GraphEdit 에서는 간단하게 마우스 클릭만으로 컴퓨터에 설치되어 있는 필터들의 목록에서 사용할 필터들을 추가할 수 있었습니다. 그렇다면 Visual Studio 2008에서 위의 필터들을 사용하기 위해서는 어떻게 해야 되는지 설명 드리겠습니다. &lt;br /&gt; &lt;br /&gt;먼저 사용할 필터의 CLSID 부터 정의를 하셔야 됩니다. COM 기술에서 사용하는 DEFINE_GUID() 란 매크로를 사용하여 정의를 할 수 있습니다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)\ &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EXTERN_C const GUID FAR name&lt;/strong&gt; &lt;br /&gt; &lt;br /&gt;보시면 아시겠지만 name에는 정의할 CLSID 그리고 나머지는 필터의 CLSID 이다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1266695246.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1377553143.png&quot; width=&quot;604&quot; height=&quot;211&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;위의 소스는 사용할 필터들에 대해서 CLSID 를 정의한 부분입니다. 사실 uuids.h 파일에 필터에 대한 CLSID가 정의되어 있습니다. 하지만 컴퓨터에 설치된 모든 필터에 대해 100% CLSID가 등록되어 있는 것은 아니므로 개발할 때 사용할 필터에 대해 따로 CLSID를 정의하여 사용하는 것이 일반적입니다. &lt;br /&gt; &lt;br /&gt;그렇다면 여기서 또 궁금증이 하나 생깁니다. CLSID 이름이야.. 변수 선언하듯이 작명해서 쓰면 되겠는데… 그 뒤에 0xc123 어쩌구 하는 번지들에 대한 정보는 어디서 얻어와야 될까요? &lt;br /&gt; &lt;br /&gt;해답은 GraphEdit 에 있습니다. 자 예를 들어 CLSID_Kerberos_FileWriter라고 거창하게 지어낸 File Writer 필터에 대한 번지 정보(정확히는 필터 CLSID 라고 합니다.)를 확인해볼까요? &lt;br /&gt; &lt;br /&gt;&amp;#160;&lt;a href=&quot;http://tt_attach_path/1205243014.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1232862176.png&quot; width=&quot;585&quot; height=&quot;552&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;Graph –&amp;gt; Insert Filter 를 선택하신 후 . DirectShow Filters 에서 File writer 필터를 클릭해 봅시다. &lt;br /&gt;그럼 위와 같은 정보가 나오며 녹색박스를 보시면 &lt;font color=&quot;#0080ff&quot;&gt;@device:sw:{083863F1-70DE-11D0-BD40-00A0C… &lt;/font&gt;라는 정보가 보이실 겁니다. &lt;br /&gt; &lt;br /&gt;&amp;#160;&lt;a href=&quot;http://tt_attach_path/1117661846.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1207903816.png&quot; width=&quot;593&quot; height=&quot;171&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;필터의 CLSID 는 그럼 어디에 있을까요? &lt;br /&gt;@device:sw:&lt;font color=&quot;#0080ff&quot;&gt;{083863F1-70DE-11D0-BD40-00A0C911CE86}&lt;/font&gt;\&lt;font color=&quot;#ff0000&quot;&gt;{8596E5F0-0DA5-11D0-BD21-00A0C911CE86}&lt;/font&gt; &lt;br /&gt;파란색은 클래스 관리자의 CLSID 이며 빨간색으로 표시한 부분이 필터의 CLSID 입니다.&amp;#160; &lt;br /&gt; &lt;br /&gt;다시 한번 코드를 살펴보면…. &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1038460581.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1146493463.png&quot; width=&quot;597&quot; height=&quot;68&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;{8596E5F0-0DA5-11D0-BD21-00A0C911CE86}&lt;/font&gt; &lt;br /&gt; &lt;br /&gt;자 이제 이해가 되시나요?&amp;#160; 그럼 이제부터 필터그래프매니저를 생성하고 필터 추가 및 연결 방법에 대해서 설명 드리겠습니다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1348054613.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1375601272.png&quot; width=&quot;417&quot; height=&quot;214&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;코드의 최적화를 위해 사용한 매크로 함수들 &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1117882615.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1000951067.png&quot; width=&quot;606&quot; height=&quot;227&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;필터그래프를 생성하고 AddFilter 인터페이스를 통해 필터를 추가하는 부분입니다. CoCreateInstance 에 대한 설명은 첫 번째 장에서 설명했으니 참고해주시기 바랍니다. ^^ &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1080926272.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1265438430.png&quot; width=&quot;609&quot; height=&quot;171&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt; &lt;br /&gt;SetFileName 인터페이스를 이용하여 녹화된 파일을 저장할 경로 및 파일명을 지정해줍니다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1085987026.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1073473139.png&quot; width=&quot;429&quot; height=&quot;415&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;자 이로서 윈도우 화면을 녹화함과 동시에 압축필터를 거쳐서 Flash Video 파일로 포멧을 변환하고 파일로 저장하는 Kerberos Capture 프로그램이 완성되었습니다. 이 모든 과정이 한번에 처리됨에도 불구하고 매우 좋은 성능을 보여주어서 상당히 만족스럽습니다.&amp;#160; &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;http://tt_attach_path/1156385372.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://tt_attach_path/1294796915.png&quot; width=&quot;244&quot; height=&quot;142&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;완성된 The Kerberos Capture 프로그램. &lt;br /&gt; &lt;br /&gt;아직 테스트 버전이라 UI 라든가… 기타 등등 보완해야 될 점들이 조금은 남아있네요. &lt;br /&gt;그럼 이상으로 DirectShow를 이용한 화면 녹화 모듈을 마치겠습니다. 긴 글 읽어주셔서 감사합니다. &lt;br /&gt; &lt;br /&gt;[참고서적 : 한빛미디어 DirectShow 멀티미디어 프로그래밍 (신화선 저)] &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 삼성전자 소프트웨어멤버십 18기 백성욱&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Chart Control in WPF Application </title>
            <link>http://www.swssm.org/index.php?idx=325</link>
            <description>&lt;P&gt;안녕하세요. 18-2기 김혜진입니다.&lt;br /&gt;WPF로 프로젝트를 진행하면서 플래시 차트를 쓸 일이 있어서 WPF로 만들 수 있는 다양한 차트에 대해서 조사하게 되었습니다. 제 블로그에는 이미 다 블로깅해놓았습니다. 므흣^^*&lt;br /&gt;&amp;nbsp;&lt;br /&gt;우선 여러 차트들에 대해서 간단하게 소개하고 실제 이용하는 방법과 코드를 첨부하도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;첫번째로 히포차트(&lt;A href=&quot;http://cafe.naver.com/hippochart&quot;&gt;http://cafe.naver.com/hippochart&lt;/A&gt;)는 이 곳에서 다운받을 수 있습니다. 이 곳에서 컨트롤 라이브러리와 코어 모듈을 찾아볼 수 있는데요, 아래와 같은 차트를 그려줍니다. 이미지는 다른 곳에서 퍼왔습니다.^^;;&lt;/P&gt; &lt;P align=center&gt;&lt;A class=con_link href=&quot;http://cfile2.uf.tistory.com/original/204EA51E49D2FD47A7D9FD&quot; target=_blank rel=lightbox&gt;&lt;IMG style=&quot;CURSOR: pointer&quot; onclick=popview(this) height=232 src=&quot;http://cfile2.uf.tistory.com/image/204EA51E49D2FD47A7D9FD&quot; width=371&gt;&lt;/A&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;사용 방법은 매우 간단합니다. 아! WPF는 닷넷 3.5 기반이지만 히포차트는 닷넷 2.0 버전으로 만들어졌기 때문에 상위 버전 프레임워크 환경에서도 무리가 없이 잘 돌아간다고 합니다.&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#9b18c1&gt;&lt;FONT color=#000000&gt;&lt;STRONG&gt;HippoChartLibBeta2&lt;br /&gt;HippoWinFormChart2&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;br /&gt;이 두 어셈블리를 추가하고 단 몇 줄로 간단하게 차트를 만들 수 있다. &lt;SPAN style=&quot;FONT-SIZE: 100%; COLOR: #ff0000&quot;&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;두번째는 WPF-powered 3D graphing library라고 Dustin Metzgar씨께서 만들어주셨다. 3차원 막대그래프와 파이그래프를 만들 수 있다. 위와 달리 플래시도 제공하고 툴팁 등 다양한 기능이 들어있다.&lt;br /&gt;&lt;A href=&quot;http://www.codeproject.com/KB/WPF/Wpf3DGraphingLibrary.aspx&quot;&gt;http://www.codeproject.com/KB/WPF/Wpf3DGraphingLibrary.aspx&lt;/A&gt;&lt;br /&gt;이 곳에서 다운이 가능하며 사용방법 또한 잉글리쉬로 자세하게 소개되어있다.&lt;br /&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;A class=con_link href=&quot;http://cfs10.tistory.com/upload_control/download.blog?fhandle=YmxvZzc3NjM2QGZzMTAudGlzdG9yeS5jb206L2F0dGFjaC8wLzcuZ2lm&quot; target=_blank&gt;&lt;IMG style=&quot;CURSOR: pointer; HEIGHT: 356px&quot; onclick=popview(this) height=600 src=&quot;http://cfs12.tistory.com/upload_control/download.blog?fhandle=YmxvZzc3NjM2QGZzMTIudGlzdG9yeS5jb206L2F0dGFjaC8wLzMuZ2lm&quot; width=383&gt;&lt;/A&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;세번째는 오픈 플래시 차트이다. 홈페이지는 &lt;A href=&quot;http://openflashchartlib.codeplex.com/&quot;&gt;http://openflashchartlib.codeplex.com/&lt;/A&gt;&amp;nbsp;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;자세한 설명과 다양한 소스코드 또한 제공해주니 활용하기 편하다. 아래와 같은 다양한 차트들을 제공해주며 사용이 편해서 많은 사람들이 사용한다.&lt;/FONT&gt;&lt;br /&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;A class=con_link href=&quot;http://cfile3.uf.tistory.com/original/1866A01249CE809F058671&quot; target=_blank rel=lightbox&gt;&lt;IMG style=&quot;WIDTH: 365px; CURSOR: pointer; HEIGHT: 186px&quot; onclick=popview(this) height=250 src=&quot;http://cfile3.uf.tistory.com/image/1866A01249CE809F058671&quot; width=498&gt;&lt;/A&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;A class=con_link href=&quot;http://cfile22.uf.tistory.com/original/11669A1249CE809F09C223&quot; target=_blank rel=lightbox&gt;&lt;IMG style=&quot;WIDTH: 451px; CURSOR: pointer; HEIGHT: 147px&quot; onclick=popview(this) height=188 src=&quot;http://cfile22.uf.tistory.com/image/11669A1249CE809F09C223&quot; width=550&gt;&lt;/A&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;A class=con_link href=&quot;http://cfile5.uf.tistory.com/original/20668F1249CE809F040C5A&quot; target=_blank rel=lightbox&gt;&lt;IMG style=&quot;WIDTH: 360px; CURSOR: pointer; HEIGHT: 245px&quot; onclick=popview(this) height=300 src=&quot;http://cfile5.uf.tistory.com/image/20668F1249CE809F040C5A&quot; width=501&gt;&lt;/A&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;네번째는 이번에 3.5 버전으로 새로 나온 MS chart이다. 다른 사이트를 돌다가 히포차트를 광고하는 카페에서 ms chart와 히포차트를 비교한 글을 보고 두 개의 이미지를 비교 이미지로 바꿨다. 차트 자체는 거의 두개가 비슷하다. 혹시나 둘 중 고민한다면 더 편한 걸로 쓰면 될 것 같다. 절대 고민하지 않아도 될듯.&lt;/FONT&gt;&lt;br /&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;A href=&quot;http://cfile3.uf.tistory.com/original/194EA51E49D2FD47A602B6&quot; target=_blank rel=lightbox&gt;&lt;IMG height=232 alt=&quot;&quot; src=&quot;http://cfile3.uf.tistory.com/image/194EA51E49D2FD47A602B6&quot; width=371&gt;&lt;/A&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;다섯번째는 Visifire라고 실버라이트와 wpf로 만들 수 있는 오픈 소스 데이타 컨트롤을 제공하는 곳이다. 우리가 프로젝트에 쓴 차트는 이 것이다. xml, html, c# 등의 다양한 소스로 구현이 가능하며 플래시 차트라 예쁘다.&lt;br /&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;A href=&quot;http://www.visifire.com/popup.php?url=Column2D7.xml&quot; target=_blank&gt;&lt;IMG onclick=&quot; MM_openBrWindow('popup.php?url=Column2D7.xml&amp;amp;width=600&amp;amp;height=375','chart_7','status=yes,scrollbars=no,resizable=yes,width=600,height=375'); return false&quot; alt=&quot;Silverlight 2D Column Chart&quot; src=&quot;http://www.visifire.com/images/gallery/Column2D/Column2D7.jpg&quot; border=0&gt;&lt;/A&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;Silverlight &amp;amp; WPF Charts &lt;/FONT&gt;&lt;A href=&quot;http://www.visifire.com/&quot;&gt;&lt;FONT color=#000000&gt;http://www.visifire.com/&lt;/FONT&gt;&lt;/A&gt;&amp;nbsp;&lt;br /&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color=#000000&gt;간단한 xaml 파일형식부터 보겠다.&lt;br /&gt;WPF 어플을 만들고 xaml에서 &amp;lt;Grid&amp;gt;&amp;lt;/Grid&amp;gt;사이에 아래와 같은 소스를 붙여넣으면 만들어진다. 간단하다. &lt;br /&gt;차트를 만들고 폭과 높이를 지정하고 3차원으로 할지 결정, 그림자속성에는 체크한다. &lt;br /&gt;차트의 타이틀을 만들고 차트 형식을 Column으로 정한다. &lt;br /&gt;데이타값은 DataSeries의 DataPoints의 XValue나 AxisXLabel과 YValue에 값을 넣어서 만들 수 있다.&lt;/P&gt; &lt;DIV style=&quot;BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; FONT-SIZE: 12px; PADDING-BOTTOM: 10px; BORDER-LEFT: gray 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: gray 1px solid; FONT-FAMILY: Courier,Lucida Grande,Geneva,Arial,Verdana,sans-serif&quot;&gt;&lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:Chart&lt;/FONT&gt; &lt;FONT color=red&gt;xmlns:vc&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;clr-namespace:Visifire.Charts;assembly=WPFVisifire.Charts&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;Width&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;300&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;Height&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;300&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;BorderThickness&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;0&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;Theme&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Theme2&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;View3D&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;False&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;Watermark&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;False&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;Bevel&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;False&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;LightingEnabled&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;False&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;ShadowEnabled&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;True&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:Chart.Titles&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:Title&lt;/FONT&gt; &lt;FONT color=red&gt;Text&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Global Fortune 5 Companies 2007&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;/&lt;FONT color=brown&gt;vc:Chart.Titles&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:Chart.AxesY&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:Axis&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=red&gt;AxisType&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Primary&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;/&lt;FONT color=brown&gt;vc:Chart.AxesY&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:Chart.Series&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataSeries&lt;/FONT&gt; &lt;FONT color=red&gt;RenderAs&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Column&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;AxisYType&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Primary&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataSeries.DataPoints&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataPoint&lt;/FONT&gt; &lt;FONT color=red&gt;AxisXLabel&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Wall-Mart&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;YValue&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;351139&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataPoint&lt;/FONT&gt; &lt;FONT color=red&gt;AxisXLabel&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Exxon Mobil&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;YValue&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;345254&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataPoint&lt;/FONT&gt; &lt;FONT color=red&gt;AxisXLabel&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;Shell&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;YValue&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;318845&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataPoint&lt;/FONT&gt; &lt;FONT color=red&gt;AxisXLabel&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;BP&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;YValue&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;274316&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=brown&gt;vc:DataPoint&lt;/FONT&gt; &lt;FONT color=red&gt;AxisXLabel&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;General Motors&quot;&lt;/FONT&gt; &lt;FONT color=red&gt;YValue&lt;/FONT&gt;&lt;FONT color=blue&gt;=&quot;207349&quot;&lt;/FONT&gt; &lt;FONT color=black&gt;/&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;/&lt;FONT color=brown&gt;vc:DataSeries.DataPoints&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;/&lt;FONT color=brown&gt;vc:DataSeries&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;/&lt;FONT color=brown&gt;vc:Chart.Series&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color=black&gt;&amp;lt;&lt;/FONT&gt;/&lt;FONT color=brown&gt;vc:Chart&lt;/FONT&gt;&lt;FONT color=black&gt;&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;위와 같은 그래프를 만드는 c# 코드이다. 위처럼 데이타를 똑같이 넣는다면 같은 차트가 만들어진다.&lt;/P&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;public void CreateChart()&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// 차트 attributes를 정한다.&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart = new Chart();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.Width = 300;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.Height = 300;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.Theme = &quot;Theme2&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.AnimationEnabled = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.ColorSet = &quot;VisiAqua&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.Watermark = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.Bevel = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chart.ScrollingEnabled = false;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// 타이틀 인스턴스를 만든다&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Title title = new Title();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; title.Text = &quot;&lt;FONT color=#0000ff&gt;Global Fortune 5 Companies 2007&lt;/FONT&gt;&quot;;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// 차트에 타이틀을 연결한다.&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#ff3399&gt;chart.Titles.Add(title);&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;FONT color=#009966&gt;// DataSeries 인스턴스를 만든다&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DataSeries dataSeries = new DataSeries();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#ff3399&gt;dataSeries.RenderAs = RenderAs.Column&lt;/FONT&gt;; &lt;FONT color=#009966&gt;// 보여질 그래프의 모양을 결정한다. &lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;FONT color=#009966&gt;// DataPoint 인스턴스를 만든다&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DataPoint dataPoint;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataPoint = new DataPoint(); &lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// DataPoint 의 x와 y 값을 결정한다.&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataPoint.&lt;FONT color=#000000&gt;AxisXLabel=&quot;Wall-Mart&quot;&lt;br /&gt;&lt;/FONT&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dataPoint.YValue = 351139;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ....&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// DataPoint 를 dataSeries에 연결한다.&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#ff3399&gt;dataSeries.DataPoints.Add(dataPoint); &lt;br /&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// 차트에 dataSeries를 연결한다.&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#ff3399&gt;chart.Series.Add(dataSeries);&lt;/FONT&gt;&lt;/DIV&gt; &lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #e4e4e4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;FONT color=#009966&gt;// 그리드 이름을 ChartGrid로 붙였다면 아래처럼 차트를 차일드로 붙여준다.&lt;br /&gt;&lt;/FONT&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ChartGrid.Children.Add(chart);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Chart chart; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // Chart 오브젝트&lt;/DIV&gt; &lt;P&gt;&lt;br /&gt;위 차트가 돌아가려면 WPFVisifire.Charts 어셈블리가 참조되어있어야한다. 어셈블리는 위 사이트에서 다운받을 수 있다. xaml파일과 c#코드를 보면 둘 사이의 연관성을 볼 수 있다. 위처럼 계속 차트에 연결시키는 방식을&lt;br /&gt;통해 다양한 모양의 차트를 만들 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/P&gt; &lt;P align=center&gt;&lt;IMG height=308 src=&quot;file:///C:/Users/KimHyejin/Desktop/6.jpg&quot; width=305&gt;&lt;/P&gt; &lt;P&gt;&lt;br /&gt;&lt;br /&gt;오늘은 여기까지. 감사합니다^^&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;/SPAN&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>[Advanced Internet TV] Windows Media Service SDK 설명 및 개발환경 구축 </title>
            <link>http://www.swssm.org/index.php?idx=326</link>
            <description>&lt;P class=바탕글&gt;안녕하세요. SWSSM 19-1기 권순관이라고 합니다.&lt;br /&gt;&lt;br /&gt;이번에 Advanced Internet TV 프로젝트에서 사용하게 되는 Windows Media Service SDK에 대하여 간략하게 설명하고 개발환경을 구축하는 법을 설명하고자 합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;지난 번, 신입회원 세미나에 Windows Media Service와 WME를 이용한 인코딩 시연을 한적이 있었는데, 당시에 WMS SDK 구조에 대해서는 간략하게 설명만 하고 넘어갔었기에, 이렇게 블로그에 WMS SDK 관련 글을 포스팅합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br /&gt;[Windows Media Service란?]&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt;Windows Media Service는 Microsoft에서 제공하는 스트리밍 미디어 서버로 실시간 영상 송출 및 VOD(Video On Demend)서비스를 가능케해주는 서비스입니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;최신 버전으로는 Windows Server 2008 버전에서 제공되는 Windows Media Service 9.5버전이 존재하나, AITV 프로젝트에서는 Windows Media Service 9 버전을 사용하게 됩니다. 9.5버전에서는 다음과 같은 기능이 추가/변경 되었다고 합니다. (Server Core에 대하 지원과 OOB설치 지원(OOB란 Out of Band의 약자로, Windows에 기본 포함되지 않고 별도 설치를 해야 함을 말함), WMS Cache/Proxy 플러그인, 향상된 상태 모니터링, MMS 프로토콜 지원 중지)&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br /&gt;[Windows Media Service SDK Architecture]&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;?xml:namespace prefix = v ns = &quot;urn:schemas-microsoft-com:vml&quot; /&gt;&lt;v:shapetype id=_x0000_t75 stroked=&quot;f&quot; filled=&quot;f&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; o:preferrelative=&quot;t&quot; o:spt=&quot;75&quot; coordsize=&quot;21600,21600&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:connecttype=&quot;rect&quot; gradientshapeok=&quot;t&quot; o:extrusionok=&quot;f&quot;&gt;&lt;/v:path&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:lock aspectratio=&quot;t&quot; v:ext=&quot;edit&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;v:shape id=_x83921256 style=&quot;WIDTH: 337.75pt; HEIGHT: 172.2pt; v-text-anchor: top&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;v:imagedata src=&quot;file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\Hnc\BinData\EMB00000ef46140.bmp&quot; o:title=&quot;EMB00000ef46140&quot; croptop=&quot;24963f&quot; cropright=&quot;8637f&quot; cropleft=&quot;18057f&quot; cropbottom=&quot;15181f&quot;&gt;&lt;/v:imagedata&gt;&lt;?xml:namespace prefix = w ns = &quot;urn:schemas-microsoft-com:office:word&quot; /&gt;&lt;w:wrap type=&quot;square&quot;&gt;&lt;/w:wrap&gt;&lt;/v:shape&gt;&lt;/P&gt;&lt;!--StartFragment--&gt; &lt;P class=바탕글&gt;&lt;v:shapetype id=_x0000_t75 stroked=&quot;f&quot; filled=&quot;f&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; o:preferrelative=&quot;t&quot; o:spt=&quot;75&quot; coordsize=&quot;21600,21600&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:connecttype=&quot;rect&quot; gradientshapeok=&quot;t&quot; o:extrusionok=&quot;f&quot;&gt;&lt;/v:path&gt;&lt;o:lock aspectratio=&quot;t&quot; v:ext=&quot;edit&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;v:shape id=_x83615256 style=&quot;WIDTH: 337.75pt; HEIGHT: 172.2pt; v-text-anchor: top&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;v:imagedata src=&quot;file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\Hnc\BinData\EMB00000ef46144.bmp&quot; o:title=&quot;EMB00000ef46144&quot; croptop=&quot;24963f&quot; cropright=&quot;8637f&quot; cropleft=&quot;18057f&quot; cropbottom=&quot;15181f&quot;&gt;&lt;/v:imagedata&gt;&lt;w:wrap type=&quot;square&quot;&gt;&lt;/w:wrap&gt;&lt;/v:shape&gt;&lt;/P&gt;&lt;IMG src=&quot;http://estworks.com/swssm/aitv_blog_01.gif&quot;&gt; &lt;P class=바탕글&gt;&lt;br /&gt;&lt;br /&gt;Windows Media Service SDK의 architecture를 나타낸 그림은 위와 같습니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;이 WMS SDK를 이용하면, Windows Media Service를 기반으로 스트리밍과 관련된 다양한 서비스 프로그램을 개발할 수 있습니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;각 Interface에 대한 설명은 다음과 같습니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;1. Publishing Point Interfaces : WMS에서 Publishing Point란 하나의 방송 채널과 같은 의미로 생각하면 됩니다. MS에서는 한글로 번역하기를 ‘게시지점’이라 칭합니다.&lt;/P&gt; &lt;P class=바탕글&gt;Publishing Point Interfaces에서는 WMS에서 지원하는 Broadcast 방송 혹은 VOD 방송을 처리하기 위한 IWMSBroadcastPubishingPoint Interface와 IWMSOnDemandPublishingPoint Interface를 제공합니다. 그 외에도 멀티케스트 처리를 위한 IWMSAnnouncementStreamFormats 등이 존재합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;2. Playlist Interfaces : Broadcast Publishing Point에서는 여러 가지 스트리밍 소스를 조합하여 재생목록을 작성하는 것이 가능합니다. 이를 제어하기 위한 Interface로 Playlist Interfaces를 제공합니다.&lt;/P&gt; &lt;P class=바탕글&gt;WMS에서 인식가능한 Playlist는 XML DOM(Document Object Model) 기반의 SMIL(Synchronized Multimedia Integration Language)이라는 언어가 사용됩니다. SMIL은 &lt;/P&gt; &lt;P class=바탕글&gt;W3C(World Wide Web Consortium)에서 개발한 언어로, 웹 개발자가 콘텐트를 별도의 스트림(오디오, 비디오, 텍스트 및 이미지)으로 구분하여 클라이언트 컴퓨터로 보낸 다음 단일 스트림으로 표시할 수 있는 XML 기반 언어입니다.&lt;/P&gt; &lt;P class=바탕글&gt;실시간 인코딩 방송만을 서비스 목표로하는 AITV에서는 Playlist Interface는 사용하지 않습니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;3. Client Interfaces : 미디어서버에 접속한 시청 Client를 제어하기 위한 기능을 제공하는 Interfaces입니다. IWMSOutgoingDistributionConnection, IWMSOutgoingDistributionConnections, IWMSPlayer, IWMSPlayers와 같은 Interface를 제공합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;4. Plug-In Interfaces : WMS의 여러 추가 기능은 Plug-In이라는 형태로 제공됩니다. Plug-In 기능을 통해, WMI나 Multicast 제어 등의 작업을 수행하게 됩니다. 이러한 Plug-In을 개발자가 직접 제작할 수 있는 기반 Interfaces를 제공합니다. IWMSAvailableIPAddresses, IWMSPlugin, IWMSPlugins, IWMSRootDirectories 등의 Interface를 제공합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;5. Counter Interfaces : WMS에서는 서버의 각종 동작 상태를 수집할 수 있는 Interface들을 제공합니다. PublishingPoint별 현재, 최대, 누적 접속자 수를 확인할 수 있는 IWMSPublishingPointCurrentCounters, IWMSPublishingPointPeakCounters, IWMSPublishingPointTotalCounters 와 서버 전체의 현재, 최대, 누적 접속자 수를 확인할 수 있는 IWMSServerCurrentCounters, IWMSServerPeakCounters, IWMSServerTotalCounters Interface를 제공합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;6. Limit Interfaces : WMS 및 각 Publishing Point로의 사용자 접속을 다양한 형태로 제한할 수 있는 Interfaces를 제공합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;그밖에 서버의 상태를 진단할 수 있는 Diagnostic Event Interfaces와 Cahce Interfaces, Name-value Interfaces 등이 존재합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;SPAN lang=EN-US style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br /&gt;[C#에서 Window Media Service SDK 개발을 하기 위한 준비]&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;1. Windows Server 2003 Enterprise/Standard가 설치된 PC를 준비합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;2. Microsoft Windows Media Service 9 SDK를 다운받습니다.&lt;/P&gt; &lt;P class=바탕글&gt;주소는 다음과 같습니다. (Windows Server 2003 SP1 Platform SDK에 포함)&lt;/P&gt; &lt;P class=바탕글&gt;&lt;U style=&quot;text-underline: #0000ff single&quot;&gt;&lt;SPAN lang=EN-US style=&quot;COLOR: #0000ff&quot;&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&amp;amp;displaylang=en&lt;/SPAN&gt;&lt;/U&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;3. WMS 9 SDK를 설치합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;4. C# 프로젝트를 생성합니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;5. 프로젝트의 .NET참조 리스트의 microsoft.windowsmediaservices 를 추가합니다.&lt;/P&gt;&lt;IMG src=&quot;http://estworks.com/swssm/aitv_blog_02.gif&quot;&gt; &lt;P class=바탕글&gt;&lt;v:shapetype id=_x0000_t75 stroked=&quot;f&quot; filled=&quot;f&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; o:preferrelative=&quot;t&quot; o:spt=&quot;75&quot; coordsize=&quot;21600,21600&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:connecttype=&quot;rect&quot; gradientshapeok=&quot;t&quot; o:extrusionok=&quot;f&quot;&gt;&lt;/v:path&gt;&lt;o:lock aspectratio=&quot;t&quot; v:ext=&quot;edit&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;v:shape id=_x83607416 style=&quot;WIDTH: 307.58pt; HEIGHT: 195.87pt; v-text-anchor: top&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;v:imagedata src=&quot;file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\Hnc\BinData\EMB00000ef4613a.bmp&quot; o:title=&quot;EMB00000ef4613a&quot;&gt;&lt;/v:imagedata&gt;&lt;w:wrap type=&quot;topAndBottom&quot;&gt;&lt;/w:wrap&gt;&lt;/v:shape&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;br /&gt;6. Windows Media Service의 이벤트를 수집하기 위해선, WMI(Windows Management Instrumentation)을 이용해야 합니다. 이를 위해선, COM 참조 리스트의 Microsoft WMI Scripting V1.2 Library를 추가합니다. &lt;/P&gt;&lt;IMG src=&quot;http://estworks.com/swssm/aitv_blog_03.gif&quot;&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;v:shapetype id=_x0000_t75 stroked=&quot;f&quot; filled=&quot;f&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; o:preferrelative=&quot;t&quot; o:spt=&quot;75&quot; coordsize=&quot;21600,21600&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:connecttype=&quot;rect&quot; gradientshapeok=&quot;t&quot; o:extrusionok=&quot;f&quot;&gt;&lt;/v:path&gt;&lt;o:lock aspectratio=&quot;t&quot; v:ext=&quot;edit&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;v:shape id=_x83612576 style=&quot;WIDTH: 322.42pt; HEIGHT: 205.34pt; v-text-anchor: top&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;v:imagedata src=&quot;file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\Hnc\BinData\EMB00000ef4613b.bmp&quot; o:title=&quot;EMB00000ef4613b&quot;&gt;&lt;/v:imagedata&gt;&lt;w:wrap type=&quot;topAndBottom&quot;&gt;&lt;/w:wrap&gt;&lt;/v:shape&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;br /&gt;7. 추가적으로, WMS의 Playlist를 제어하기 위해서는 XML DOM Library를 이용해야 합니다. 이를 위해서 .NET 참조 리스트에서 interop_msxml을 추가합니다.&lt;/P&gt;&lt;IMG src=&quot;http://estworks.com/swssm/aitv_blog_04.gif&quot;&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;&lt;v:shapetype id=_x0000_t75 stroked=&quot;f&quot; filled=&quot;f&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; o:preferrelative=&quot;t&quot; o:spt=&quot;75&quot; coordsize=&quot;21600,21600&quot;&gt;&lt;v:stroke joinstyle=&quot;miter&quot;&gt;&lt;/v:stroke&gt;&lt;v:formulas&gt;&lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 1 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum 0 0 @1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @2 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @0 0 1&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @6 1 2&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @8 21600 0&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;&gt;&lt;/v:f&gt;&lt;v:f eqn=&quot;sum @10 21600 0&quot;&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;v:path o:connecttype=&quot;rect&quot; gradientshapeok=&quot;t&quot; o:extrusionok=&quot;f&quot;&gt;&lt;/v:path&gt;&lt;o:lock aspectratio=&quot;t&quot; v:ext=&quot;edit&quot;&gt;&lt;/o:lock&gt;&lt;/v:shapetype&gt;&lt;v:shape id=_x83617640 style=&quot;WIDTH: 323.66pt; HEIGHT: 206.11pt; v-text-anchor: top&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;v:imagedata src=&quot;file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\Hnc\BinData\EMB00000ef46142.bmp&quot; o:title=&quot;EMB00000ef46142&quot;&gt;&lt;/v:imagedata&gt;&lt;w:wrap type=&quot;topAndBottom&quot;&gt;&lt;/w:wrap&gt;&lt;/v:shape&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;이로써, Windows Media Service SDK를 이용한 개발 환경 구축이 완료되었습니다.&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;※ 참고로 C++에서 WMS SDK를 사용하기 위한 개발 환경 구축 방법 링크를 추가합니다.&lt;/P&gt; &lt;P class=바탕글&gt;&lt;U style=&quot;text-underline: #0000ff single&quot;&gt;&lt;SPAN lang=EN-US style=&quot;COLOR: #0000ff&quot;&gt;http://msdn.microsoft.com/en-us/library/dd874782(VS.85).aspx&lt;/SPAN&gt;&lt;/U&gt;&lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;다음 포스팅에서는 실제로 WMS SDK를 이용한 코드 샘플 예제를 설명하도록 하겠습니다.&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>MS Chart Control based on ASP.NET </title>
            <link>http://www.swssm.org/index.php?idx=324</link>
            <description>&lt;LINK href=&quot;file:///C:%5CUsers%5Ccandoism%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml&quot; rel=File-List&gt;&lt;LINK href=&quot;file:///C:%5CUsers%5Ccandoism%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso&quot; rel=Edit-Time-Data&gt; &lt;STYLE&gt; v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} &lt;/STYLE&gt; &lt;LINK href=&quot;file:///C:%5CUsers%5Ccandoism%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx&quot; rel=themeData&gt;&lt;LINK href=&quot;file:///C:%5CUsers%5Ccandoism%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml&quot; rel=colorSchemeMapping&gt; &lt;STYLE&gt; &lt;!-- /* Font Definitions */ @font-face {font-family:&quot;Cambria Math&quot;; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:&quot;맑은 고딕&quot;; panose-1:2 11 5 3 2 0 0 2 0 4; mso-font-charset:129; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:-1879047505 165117179 18 0 524289 0;} @font-face {font-family:&quot;\@맑은 고딕&quot;; panose-1:2 11 5 3 2 0 0 2 0 4; mso-font-charset:129; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:-1879047505 165117179 18 0 524289 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:&quot;&quot;; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; text-autospace:none; word-break:break-hangul; font-size:10.0pt; mso-bidi-font-size:11.0pt; font-family:&quot;맑은 고딕&quot;; mso-ascii-font-family:&quot;맑은 고딕&quot;; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:&quot;맑은 고딕&quot;; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:&quot;맑은 고딕&quot;; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:&quot;Times New Roman&quot;; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:40.0pt; margin-bottom:.0001pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:0cm; mso-para-margin-left:4.0gd; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; text-autospace:none; word-break:break-hangul; font-size:10.0pt; mso-bidi-font-size:11.0pt; font-family:&quot;맑은 고딕&quot;; mso-ascii-font-family:&quot;맑은 고딕&quot;; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:&quot;맑은 고딕&quot;; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:&quot;맑은 고딕&quot;; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:&quot;Times New Roman&quot;; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-ascii-font-family:&quot;맑은 고딕&quot;; mso-ascii-theme-font:minor-latin; mso-bidi-font-family:&quot;Times New Roman&quot;; mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:3.0cm 72.0pt 72.0pt 72.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:664213438; mso-list-type:hybrid; mso-list-template-ids:2144771820 1318764178 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:38.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --&gt; &lt;/STYLE&gt; &lt;P class=MsoNormal&gt;이번 &lt;SPAN lang=EN-US&gt;GSS System&lt;/SPAN&gt;에서&lt;SPAN lang=EN-US&gt; GUI &lt;/SPAN&gt;부분 &lt;SPAN lang=EN-US&gt;chart&lt;/SPAN&gt;는 &lt;SPAN lang=EN-US&gt;MS-Chart&lt;/SPAN&gt;를 이용해서 구현하였습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;Ms-chart&lt;/SPAN&gt;를 사용하기 위한 기본적인 환경 구축과 활용방법에 대해서 알아보도록 하겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;다운 받아서 설치해야 할 파일들은 링크를 걸지 않고 &lt;SPAN lang=EN-US&gt;SWSSM &lt;/SPAN&gt;파일서버에 업로드 하도록 하겠습니다&lt;SPAN lang=EN-US&gt;.&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;B&gt;&lt;SPAN lang=EN-US&gt;[MS Chart&lt;/SPAN&gt;의 장점&lt;SPAN lang=EN-US&gt;]&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;닷넷용 차트 솔루션이다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;다른 차트 솔루션처럼 라이센스를 구매할 필요가 없다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;무료로&lt;SPAN lang=EN-US&gt; ASP.NET 3.5&lt;/SPAN&gt;에서 사용할 수 있으며 풍부한 브라우저 기반 차트 시나리오를 가능하게 한다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;[##_1C|1291541438.jpg|width=&quot;600&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;B&gt;&lt;SPAN lang=EN-US&gt;[&lt;/SPAN&gt;환경 구축&lt;SPAN lang=EN-US&gt;] &lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;br /&gt;1. 닷넷 Framework 3.5 install&lt;br /&gt;2. 만약 닷넷 Framework 3.5 설치 실패 시, windows installer 4.5 install 후 다시 시도. &lt;br /&gt;3. Visual studio 9.0 sp1 install&lt;br /&gt;4. Ms Chart Control install&lt;br /&gt;5. Ms Chart_visual_studio_Add_on 파일 설치(Visuala studio 2008의 Toolbox 연동)&lt;br /&gt;6. Ms Chart Document 참고&lt;br /&gt;7. Ms Chart Web&amp;amp;Win Form 예제 참고 &lt;br /&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;위의 순서대로 설치를 한다면 이제 &lt;SPAN lang=EN-US&gt;MS-Chart&lt;/SPAN&gt;를 개발할 수 있는 환경은 모두 구축되었습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;B&gt;&lt;SPAN lang=EN-US&gt;[MS Chart &lt;/SPAN&gt;소개&lt;SPAN lang=EN-US&gt;] &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&amp;lt;asp:chart&amp;gt; &lt;/SPAN&gt;는 파이&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;면적&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;범위&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;점&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;원통&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;누적&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;데이터 분포&lt;SPAN lang=EN-US&gt;, AJAX, &lt;/SPAN&gt;도넛 차트 등 많은 차트 선택 사항을 지원합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;컨트롤 선언부에서 정적으로 차트 데이터를 선언할 수 있고 데이터 바인딩을 사용해서 동적으로 보여지게 할 수도 있습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;실행 시간에 서버 컨트롤은&lt;SPAN lang=EN-US&gt; .png &lt;/SPAN&gt;같은 그림 파일을 만드는데&lt;SPAN lang=EN-US&gt;, &amp;lt;asp:chart&amp;gt;&lt;/SPAN&gt;가 &lt;SPAN lang=EN-US&gt;HTML&lt;/SPAN&gt;에서&lt;SPAN lang=EN-US&gt; &amp;lt;img&amp;gt;&lt;/SPAN&gt;로 출력되어진다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;서버 컨트롤은 차트 그림 파일을 캐시하는 기능을 제공하며 이 그림 파일을 디스크에 저장하여 사용할 수도 있다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;어떠한 다른 서버 소프트웨어의 설치 없이도 모든&lt;SPAN lang=EN-US&gt; ASP.NET &lt;/SPAN&gt;페이지에서 잘 작동합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;또한 손쉽게 풍부한 비쥬얼라이제이션과 데이터 흐름 시나리오를&lt;SPAN lang=EN-US&gt; ASP.NET &lt;/SPAN&gt;응용프로그램에 추가할 수 있게 해줍니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;B&gt;&lt;SPAN lang=EN-US&gt;[MS Chart &lt;/SPAN&gt;활용&lt;SPAN lang=EN-US&gt;] &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;MS Chart&lt;/SPAN&gt;에서 지원하는 차트들의 내용들은 정말 많이 존재합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;우선 여기서는 간단히&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;원형(파이) 차트의 활용에 대해서 알아보도록 하겠습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;ASP.NET&lt;/SPAN&gt;으로 구현 시 웹폼을 추가하면&lt;SPAN lang=EN-US&gt; .aspx &lt;/SPAN&gt;파일과&lt;SPAN lang=EN-US&gt; .aspx.cs &lt;/SPAN&gt;파일 두 개가 생성된다는 것을 알고 계실겁니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;원리는 간단합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;.aspx&lt;/SPAN&gt;는 웹에서 보여질 화면을 디자인 하는 것이며 &lt;SPAN lang=EN-US&gt;.aspx.cs &lt;/SPAN&gt;파일은 차트 내부에서 수치 값이라던지 웹에서 보여지는 부분을 제외한 모든 &lt;SPAN lang=EN-US&gt;Action&lt;/SPAN&gt;들을 처리하면 됩니다&lt;SPAN lang=EN-US&gt;. &lt;br /&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;br /&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;[##_1C|1054167882.jpg|width=&quot;600&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;우선 위와 같이&lt;SPAN lang=EN-US&gt; apsx &lt;/SPAN&gt;파일 디자인 보기를 이용하여 웹폼을 구성합니다&lt;SPAN lang=EN-US&gt;. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Visual Studio 2008 Toolbox&lt;/SPAN&gt;에 추가된 &lt;SPAN lang=EN-US&gt;Chart Control&lt;/SPAN&gt;을 이용하여 구성하면 간단히 해결됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;그 밖의 &lt;SPAN lang=EN-US&gt;Chart &lt;/SPAN&gt;옆 리스트 박스 내용들은 파이 차트가 &lt;SPAN lang=EN-US&gt;3D &lt;/SPAN&gt;형태라던 지&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;그림자 효과라든지&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;여러가지 스타일들을 테스트 할 수 있도록 예제를 구성하였습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;위 구성된 소스들을 살펴보면 다음과 같습니다&lt;SPAN lang=EN-US&gt;. &lt;br /&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;br /&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;[##_1C|1051899473.png|width=&quot;600&quot; height=&quot;257&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;이번엔 &lt;SPAN lang=EN-US&gt;.aspx.cs&lt;/SPAN&gt;에 데이터가 들어가는 모습을 살펴보겠습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;[##_1C|1128586010.png|width=&quot;600&quot; height=&quot;342&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;위와 같이&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;배열 형태로 데이터가 들어가는 모습을 확인 하실 수 있을 것입니다&lt;SPAN lang=EN-US&gt;. &lt;br /&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;물론 이런 형태를 응용해서 프로젝트에 적용해야 겠죠. &lt;br /&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;데이터 들어가는 소스 밑에는 각종 파이 차트의 옵션들을 나타내고 있답니다&lt;SPAN lang=EN-US&gt;.&amp;nbsp; &lt;SPAN&gt;&lt;br /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;br /&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN&gt;예전에 차트를 만드려면 각종 dll 파일들과 여러 복잡한 컨트롤을 사용했던 기억이 납니다. &lt;br /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN&gt;하지만 MS Chart Control을 이렇게 사용하면 깔끔하고 보기 좋은 차트를 구성할 수 있다는 사실을&amp;nbsp; 기억해주세요!!&amp;nbsp; &lt;br /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>DirectShow를 이용한 화면녹화 모듈 [화면녹화 - &amp;gt; FLV 저장] - 첫 번째 ...</title>
            <link>http://www.swssm.org/index.php?idx=323</link>
            <description>&lt;p&gt;안녕하세요? The Kerberos 팀의 18-2기 백성욱입니다. &lt;br /&gt; &lt;br /&gt;이번에 소개해 드릴 내용은 DirectShow 를 이용한 윈도우 화면 녹화입니다. &lt;br /&gt; &lt;br /&gt;개발환경은 다음과 같습니다. &lt;br /&gt; &lt;br /&gt;OS : Windows Vista&amp;#160;&amp;#160; &lt;br /&gt;Tool : Visual Studio 2008, GraphEdit&amp;#160; &lt;br /&gt;Language : Win32 API , DirectShow &lt;br /&gt; &lt;br /&gt;시작하기 앞서 잠깐 Directshow 에 대한 기본 개념에 대해서 설명 드리겠습니다.&amp;#160; &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image118.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb68&quot; border=&quot;0&quot; alt=&quot;image_thumb68&quot; src=&quot;http://tt_attach_path/1322063832.png&quot; width=&quot;602&quot; height=&quot;355&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&amp;lt;그림 1. DirectShow 기본 구조&amp;#160; &amp;gt; &lt;br /&gt;뭔가 복잡한 듯 보이지만 가장 중요한 것은 바로 필터입니다. &lt;br /&gt;이러한 필터들은 Microsoft의 COM(Component Object Model) 기술로 제작되며 생성된 객체 역시 독립된 COM 객체로서 취급되어집니다.&amp;#160; &lt;br /&gt; &lt;br /&gt;이러한 필터들은 크게 3가지로 분류됩니다. &lt;br /&gt;1. Source Filter &lt;br /&gt;입력되는 데이터를 의미합니다. 예를 들어 오디오에 음악CD를 삽입했다고 가정했을 때 바로 음악CD가 Source Filter의 역할을 하게 되는 것입니다. 필터에 입력방향은 없으며 오직 출력방향만 존재하는 필터입니다. &lt;br /&gt; &lt;br /&gt;2. Transform Filter &lt;br /&gt;위에서 삽입한 음악CD를 MP3 또는 다른 종류의 오디오 포멧으로 압축하거나 변형하고 싶을 때 이러한 역할을 수행하는 필터가 Transform Filter 입니다. Source Filter로부터 입력을 받아야 하기 때문에 입력방향이 존재하며 Rendering Filter에게 결과물을 넘겨줘야 되기 때문에 출력방향 역시 존재합니다. &lt;br /&gt; &lt;br /&gt;3. Rendering Filter &lt;br /&gt;변형시킨 오디오 포멧을 파일로 쓰거나 화면에 출력해주는 역할을 담당하는 필터입니다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;DirectShow가 멀티미디어 프로그래밍에 적합한 이유! &lt;br /&gt;&lt;/strong&gt;멀티미디어 데이터의 경우 크기가 크고 스트림 형태로 처리해줘야 되기 때문에 다른 프로그램보다는 상대적으로 컴퓨터의 자원을 많이 합니다. 멀티미디어데이터를 효율적으로 처리해주기 위해 탄생한 Directshow는 일반적인 데이터 처리과정과는 다르게 설계되었습니다. 그 대표적인 예로 버퍼 공유를 들 수 있습니다.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image26.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb16&quot; border=&quot;0&quot; alt=&quot;image_thumb16&quot; src=&quot;http://tt_attach_path/1125581255.png&quot; width=&quot;590&quot; height=&quot;168&quot; /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;br /&gt; &lt;br /&gt;&amp;lt;그림 2. 버퍼 공유를 하지 않는 VFW 방식&amp;#160; &amp;gt; &lt;br /&gt; &lt;br /&gt;빨간색 동그라미 : 버퍼 &lt;br /&gt;Source : 소스 필터 &lt;br /&gt;VidRen : 비디오 랜더 필터(화면출력) &lt;br /&gt;InPlace : 변환 필터 (버퍼의 크기 변경 없이 내용만 변경하는 경우) &lt;br /&gt;CopyDec : 변환 필터 ( 버퍼의 크기와 내용 모두를 변경하는 경우 ex 디코딩 ) &lt;br /&gt;&amp;#160; &lt;br /&gt;vfw 같은 방식은 위의 그림과 같이 각자 자신만의 버퍼를 보유하고 있으며 상대방에게 데이터를 전달 할 경우 반드시 복사의 과정을 거쳐야만 한다. DirectShow 와는 달리 데이터를 전달하는 물길이 갖추어져 있지 않기 때문이다.&amp;#160;&amp;#160; &lt;br /&gt; &lt;br /&gt;그렇다면 vfw 방식일 경우 Source A 에서 VidRen 까지 총 몇 번의 복사과정을 거쳐야 될 까? &lt;br /&gt; &lt;br /&gt;1번 : Source A&amp;#160;&amp;#160; –&amp;gt; InPlace B &lt;br /&gt;1번 : InPlace B&amp;#160;&amp;#160; –&amp;gt; CopyDec C &lt;br /&gt;1번 : CopyDec C –&amp;gt; InPlace D &lt;br /&gt;0번 : InPlace D&amp;#160;&amp;#160;&amp;#160; -&amp;gt; InPlace E &lt;br /&gt;1번 : InPlace E&amp;#160;&amp;#160; –&amp;gt; VidRen F &lt;br /&gt; &lt;br /&gt;답은 총 5번이다. 위의 그림에서 주황색으로 표시해 둔 d –&amp;gt; e 의 과정은 버퍼복사가 발생하지 않는다. 그 이유는 InPlace 변환필터는 내용만 변경하는 변환필터로서 같은 InPlace 필터간에는 데이터의 성격이 달라지지 않기 때문에 버퍼를 따로 복사할 필요 없이 이전 버퍼에 있던 내용만 변경해도 상관없다. &lt;br /&gt; &lt;br /&gt;&amp;#160;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image45.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb29&quot; border=&quot;0&quot; alt=&quot;image_thumb29&quot; src=&quot;http://tt_attach_path/1322186929.png&quot; width=&quot;598&quot; height=&quot;170&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;&amp;lt;그림 4. 버퍼 공유를 하는 DirectShow 방식 &amp;gt; &lt;br /&gt; &lt;br /&gt;물길(스트림)이 갖추어져 있는 DirectShow의 경우 Source A 에서 VidRen F 까지 버퍼의 복사과정 없이 공유를 함으로써 멀티미디어 데이터를 직접 전달할 수 있다. &lt;br /&gt; &lt;br /&gt;VidRen F 필터의 경우 비디오를 랜더링해야 하기 때문에 버퍼가 필요하지만 InPlace E와 InPlace D 필터의 경우 단순히 내용만 변경하기 때문에 VidRen F 필터의 버퍼를&amp;#160; 공유할 수 있다. 하지만 CopyDec C 는 버퍼의 크기 및 내용을 변경하므로 VidRen F 필터의 버퍼를 그대로 공유하여 사용할 수 없기 때문에 별도의 버퍼를 생성한다. 하지만 InPlace B의 경우 CopyDec C 의 버퍼의 내용만 변할 뿐 크기가 변동되는 것은 아니기 때문에 공유할 수 있다. 마지막으로 Source A 의 경우는 CopyDec C 필터의 버퍼를 소스 내용으로 그대로 쓰면 되기 때문에 결과적으로 총 2개의 버퍼를 사용하며 복사도 1번 밖에 발생하지 않는다. &lt;br /&gt; &lt;br /&gt;이런 구조적인 부분만 보더라도 DirectShow가 이전의 다른 방식들 보다 훨씬 더 멀티미디어 데이터 처리에 적합하다는 것을 알 수 있다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;DirectShow 를 이용한 어플리케이션 제작&lt;/strong&gt; &lt;br /&gt; &lt;br /&gt;1. 환경설정&amp;#160; &lt;br /&gt;DiirectShow 기술을 사용하기 위해 Platform SDK 를 설치하셔야 됩니다. 저는 6.1 버전을 설치하였습니다. &lt;br /&gt;2. GraphEdit 사용법 숙지 &lt;br /&gt;이전 버전에는 Platform SDK 또는 DirectX SDK 를 설치하면 기본적으로 내장되어 있던 Tool 인데 최신 버전에는 포함되어 있지 않습니다. 따라서 직접 구하시거나 K-Lite codec pack 을 설치하시면 GraphEdit 툴을 사용하실 수 있습니다. &lt;br /&gt; &lt;br /&gt;&amp;#160;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image55.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb35&quot; border=&quot;0&quot; alt=&quot;image_thumb35&quot; src=&quot;http://tt_attach_path/1109003495.png&quot; width=&quot;587&quot; height=&quot;468&quot; /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;lt;그림 5. GraphEdit 실행화면 &amp;gt; &lt;br /&gt; &lt;br /&gt;가장 첫 번째로 필터를 추가하고 연결하는 방법을 설명 드리겠습니다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image59.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb37&quot; border=&quot;0&quot; alt=&quot;image_thumb37&quot; src=&quot;http://tt_attach_path/1367124697.png&quot; width=&quot;581&quot; height=&quot;410&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt; &lt;br /&gt;Graph –&amp;gt; Insert Filters 를 클릭하시면 현재 자신의 컴퓨터에 설치되어 있는 필터들의 목록이 뜹니다. &lt;br /&gt; &lt;br /&gt;&amp;#160;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image69.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb43&quot; border=&quot;0&quot; alt=&quot;image_thumb43&quot; src=&quot;http://tt_attach_path/1213691984.png&quot; width=&quot;570&quot; height=&quot;537&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;원하는 필터를 목록에서 선택한 후 “Insert Filter” 버튼을 클릭하면 필터가 추가됩니다. &lt;br /&gt; &lt;br /&gt;그럼 저희 팀에 필요한 윈도우 녹화 + 실시간 압축 + Flash Video 변환 + 파일저장 기능을 수행하는 필터 그래프를 구성해 보겠습니다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image83.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb51&quot; border=&quot;0&quot; alt=&quot;image_thumb51&quot; src=&quot;http://tt_attach_path/1125453034.png&quot; width=&quot;323&quot; height=&quot;457&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&amp;#160; &lt;br /&gt;위의 그림을 보시면 사각형 모양의 필터가 4개 있고 각 필터마다 서로를 연결해 줄 수 있는 Pin을 가지고 있음을 알 수 있습니다. &lt;br /&gt; &lt;br /&gt;오른쪽만 Pin 이 있는 필터를 Source Filter 라고 합니다.&amp;#160; 즉 입력은 받지 못하고 출력만 가능한 필터입니다. &lt;br /&gt;왼쪽, 오른쪽 둘 다 Pin 이 있는 필터는 Transform Filter 입니다. &lt;br /&gt;마지막으로 왼쪽에만 Pin 이 있는 필터가 Rendering Filter 입니다. &lt;br /&gt; &lt;br /&gt;이들의 핀을 연결하는 것은 마우스로 Pin 과 Pin을 드래그 하여 연결시켜주기만 하면 됩니다. &lt;br /&gt; &lt;br /&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image87.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb53&quot; border=&quot;0&quot; alt=&quot;image_thumb53&quot; src=&quot;http://tt_attach_path/1319887224.png&quot; width=&quot;604&quot; height=&quot;84&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt; &lt;br /&gt;생성된 그래프는 필터그래프매니저라고 부르며 동작과정은 다음과 같습니다. &lt;br /&gt;# Capture 필터를 통해 윈도우의 화면을 캡쳐합니다. &lt;br /&gt; &lt;br /&gt;# 정지된 영상을 움직이는 영상으로 변환시켜주기 위해 Transform Filter 인 video encoder 필터로 캡쳐한 데이터를 넘겨줍니다. (곧바로 FLV Mux 필터로 연결해도 상관없지만 용량을 줄이기 위해 encoder 필터로 한번 압축을 시켜줍니다.) &lt;br /&gt; &lt;br /&gt;# 압축된 영상을 FLV Mux 필터로 넘겨줌으로써 플래쉬에서 재생 가능한 FLV 파일로 변환시켜줍니다. (서버 쪽 모니터링 프로그램이 FLEX 이므로 … swfloader에서 바로 재생 가능한 flv로 변환시켜주었습니다.) &lt;br /&gt; &lt;br /&gt;# 마지막으로 FLV로 변환된 영상을 파일에 기록하여 저장하기 위해 file write 필터를 사용하였습니다. &lt;br /&gt; &lt;br /&gt;이렇게 그래프를 구성함으로써 실시간으로 윈도우 화면을 녹화하는 동시에 flv 파일로 저장하는 것이 가능해졌습니다.&amp;#160; 그럼 일단 테스트를 해볼까요? &lt;br /&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image91.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb55&quot; border=&quot;0&quot; alt=&quot;image_thumb55&quot; src=&quot;http://tt_attach_path/1340440155.png&quot; width=&quot;567&quot; height=&quot;452&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt; &lt;br /&gt;GraphEdit에서 툴바에 있는 재생버튼을 클릭하시면 현재 윈도우의 화면이 실시간으로 flv 포멧으로 변환되면서 kk.flv 라는 FLV 파일에 기록되어집니다. 그리고 멈춤 버튼을 클릭하시면 파일기록이 모두 완료되며 Flash Player 또는 곰 플레이어 등에서 결과물을 바로 확인하실 수 있습니다. &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;5분 5초 녹화했을 경우 파일의 크기 비교 &lt;br /&gt; &lt;br /&gt;Dual Monitor&amp;#160; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image114.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb66&quot; border=&quot;0&quot; alt=&quot;image_thumb66&quot; src=&quot;http://tt_attach_path/1194819161.png&quot; width=&quot;413&quot; height=&quot;456&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;Single Monitor &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&amp;#160;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image107.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px&quot; title=&quot;image_thumb63&quot; border=&quot;0&quot; alt=&quot;image_thumb63&quot; src=&quot;http://tt_attach_path/1398287289.png&quot; width=&quot;409&quot; height=&quot;454&quot; /&gt;&lt;/a&gt; &lt;br /&gt; &lt;br /&gt;왜 Dual Monitor가 용량이 더 적게 나오는 것일까요? –_-; 아무튼…이상으로 첫 번째 포스팅을 마치겠습니다. &lt;br /&gt; &lt;br /&gt;아 한가지 알아두셔야 할 점! GraphEdit 는 DirectShow에 대한 이해 및 디버깅 툴 정도일 뿐, 이 것만으로 어플리케이션을 구현할 수 없습니다. 어플리케이션 구현은 직접 소스코드를 작성하셔서 구현하셔야 합니다. 다음 장에서는 다음과 같은 내용으로 포스팅 할 예정이며 이번 장에서 구성한 그래프를 어떻게 소스코드로 구현할 것인지에 대해서 설명 드리겠습니다. &lt;br /&gt; &lt;br /&gt;&lt;/p&gt; &lt;p&gt; &lt;br /&gt;DirectShow를 이용한 화면녹화 모듈 [화면녹화 -&amp;gt; flv 저장] - 두 번째 이야기- &lt;br /&gt;3. COM 에 대한 이해 &lt;br /&gt;4. Visual Studio 2008에서 DirectShow를 이용한 어플리케이션 제작 방법 &lt;br /&gt;5. Kerberos Capture 프로그램 &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;file:///C:/Users/yoshiboarder/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles1695D9/image79.png&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;right&quot;&gt;&lt;/p&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Music is Life-- MP3 포맷 분석 (19-1기 박자람) </title>
            <link>http://www.swssm.org/index.php?idx=320</link>
            <description>안녕하세요^^ 19기 박자람입니다.&lt;br /&gt;&lt;br /&gt;재밌었던 엠티를 다녀와서~ 이렇게 글을 올립니다^^&lt;br /&gt;&lt;br /&gt;먼저 저희 프로젝트는 모바일에서 돌아가는 벨소리 제작 프로그램입니다.&lt;br /&gt;MP3를 이용해 원하는 구간을 선택해 벨소리를 만드는 것이기 때문에 본격적인 프로젝트 수행전에,&lt;br /&gt;어떻게 보면 저희 프로젝트의 핵심이라고도 볼수 있는 MP3 파일을 분석해야했습니다.&lt;br /&gt;&lt;br /&gt;지금부터 MP3 파일 포맷 구조에 대해서 설명드리겠습니다.&lt;br /&gt;&lt;br /&gt;그럼! &amp;nbsp;먼저 우리가 늘 듣고 있는 MP3! 이놈의 정체는 과연 무엇일까요+_+?&lt;br /&gt;&lt;br /&gt;MP3에 대해 간단한 소개를 먼저 하겠습니다.&lt;br /&gt;&lt;br /&gt;MP3는 MPEG Audio Layer 3의 준말입니다. 여기서 MPEG은 Motion Pictures Expert Group을 뜻하는 말로 동영상과 관련된 표준규격을 협의하는 국제협의의 이름인 동시에! 그들이 만들어낸 표준 규격을 뜻합니다.&lt;br /&gt;MPEG1은 비디오 CD를 제작할 때 사용하는 규격인데 이 MPEG1에서 오디오 압축 기술만 분리한 것이&lt;br /&gt;MPEG Audio Layer 입니다. 이것은 압축률과 데이터 구조에 따라 3가지로 나뉩니다. 레이어 1이 1:4 정도의 압축률을 갖고 레이어 2는 1:6에서 1:8 정도, 레이어 3은 1:10 에서 1: 12의 가장 높은 압축률을 갖습니다. 따라서 가능한한 파일의 용량을 줄이기 위해 레이어 3가 가장 많이 사용되는데 이 파일 포멧이 &lt;FONT color=#ff0000&gt;MP3 &lt;/FONT&gt;입니다^^&lt;br /&gt;&lt;br /&gt;MP3가 뛰어난 압축률을 기록하는 만큼 음질면에선 오디오 CD와 비교한다면 음질이 좀 떨어지지만, 그 차이를 사람의 귀로 구분할 수 없어 CD 음질 처럼 들리는 것입니다^^&lt;br /&gt;&lt;br /&gt;MP3가 CD 수준의 음질을 제공할 수 있는 것은 바로 마스킹(Masking)기법 이란 음원제어기술 덕분입니다. 마스킹 기법이란 다양한 소리가 복합된 음원에서 음질이 떨어지는 미세한 소리를 강한 소리로 상쇄하는 것으로 여기에는 주파수 마스킹과 시간적 마스킹 기법이 있습니다.&lt;br /&gt;&lt;br /&gt;자세한 마스킹 기법은 생략하도록 하고,&lt;br /&gt;&lt;br /&gt;지금부터 본!격!적!으로 &lt;STRONG&gt;&lt;FONT color=#ff3399&gt;mp3 파일 구조에 대한 설명을 시작하겠습니다^^&lt;br /&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;mp3 파일은 여러개의 AAU(Audio Access Unit)들과 1개의 Audio Tag로 이루어져 있습니다.&lt;br /&gt;[##_1C|1191939104.jpg|width=&quot;600&quot; height=&quot;177&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;그리고 그 각각의 AAU 들은 위의 그림과 같은 구조를 가지게 됩니다.&lt;br /&gt;&lt;br /&gt;각각의 AAU의 사이즈는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;STRONG&gt;&lt;FONT color=#ff7635&gt;144* BitRate /&amp;nbsp; 샘플링 주파수 + padding&lt;/FONT&gt;&lt;/STRONG&gt;&lt;br /&gt;&lt;br /&gt;MP3 는 프레임당 1152비트가 할당되기 때문에 바이트 계산하면 144바이트가 됩니다.&lt;br /&gt;Bitrate와 샘플링 주파수는 헤더정보에서 얻을 수 있습니다.&lt;br /&gt;&lt;br /&gt;예를 들어,&lt;br /&gt;파일 Size가 3985814 바이트 이고, 샘플링 주파수가 44.1khz, Bitrate가 128 kbit인 mp3 파일의 프레임 사이즈는,&lt;br /&gt;&lt;br /&gt;144* 128000 / 441000로 약 417 바이트가 되며 프레임당 약 9558 바이트의 사이즈가 되는 것입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이제 각각의 AAU에 대해 말씀드리겠습니다.&lt;br /&gt;&lt;br /&gt;1. Header&lt;br /&gt;&lt;br /&gt;mp3 파일에는 각각의 AAU마다 헤더가 따로 존재합니다. 그러므로 각 AAU들은 독립적으로 decode 될 수 있습니다. 그러나 대부분의 mp3에서 모든 헤더들은 동일하므로, 전체를 디코딩 할 때는 첫번 째 AAU 헤더만을 읽습니다.&lt;br /&gt;&lt;br /&gt;Header는 32비트의 길이를 갖고 13개의 항목으로 구성되어 있습니다.&lt;br /&gt;&lt;br /&gt;2. CRC&lt;br /&gt;CRC Check는 프레임의 오류를 검사하기 위한 정보를 가집니다.&lt;br /&gt;&lt;br /&gt;3. Side Info&lt;br /&gt;mp3에서 주요하게 사용되는 압축 알고리즘에는 Scalefactor, Huffman 부호화, 양자화 등이 있습니다. &lt;br /&gt;Side info에는 실제 각 프레임의 메인데이터를 decoding하는 데 필요한 정보들을 담고 있습니다.&lt;br /&gt;side info의 크기는 채널에 따라 그 크기가 달라지는데, Mono일 경우 136bits, stereo일 경우 256bit 입니다.&lt;br /&gt;&lt;br /&gt;4. Main data&lt;br /&gt;메인 데이터는 실질적인 오디오 데이터가 실려있는 영역을 말합니다. mp3의 메인데이터는 한 프레임이 1152개의 Sample 데이터를 갖습니다. &lt;br /&gt;granule은 메인데이터가 처리되는 기본단위입니다. MP3 부호화 방법중 주파수 등분할 방식인 32서브밴드 방법이 잇습니다. 각 서브밴드는 18개의 sample 데이터를 갖기 때문에 32* 18 = 576이라는 크기값이 나오며 이것을 한개의 granule 단위로 처리하게 됩니다.&lt;br /&gt;&lt;br /&gt;mp3는 2개의 granule로 구성되어 1152개의 Sample 데이터를 갖게 됩니다. 각&amp;nbsp; granule 안에서는 채널별로 decoding 됩니다.&lt;br /&gt;&lt;br /&gt;5. Audio tag&lt;br /&gt;&lt;br /&gt;오디오 태그는 AAU의 집합 끝 부분 즉 MP3 파일의 마지막 부분 128 바이트를 말합니다. Artist정보, 곡의 제목, 앨범 Title, 출판년도 등의 mp3 전체의 부가정보를 담고 있습니다.&lt;br /&gt;장르에 대한 인덱스는 생략합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;여기까지가 mp3 파일 구조에 대한 설명입니다.&lt;br /&gt;&lt;br /&gt;이렇게 mp3 파일구조를 이용해 프로젝트에 적용해 보면,&lt;br /&gt;&lt;br /&gt;먼저 mp3 파일을 선택한 후 사용자가 원하는 구간을 선택을 하면,&lt;br /&gt;그 mp3의 헤더와 side info를 읽어 &amp;nbsp;어떻게 디코딩할 지 정보를 뽑아냅니다.&lt;br /&gt;이러한 정보를 이용해 디코딩을 하면 mp3-&amp;gt; pcm 데이터가 되는 것입니다.&lt;br /&gt;&lt;br /&gt;이상 여기까지가 mp3 파일 디코딩까지 진행된 내용입니다^^&lt;br /&gt;&lt;br /&gt;다음 블로깅에선 실제 구현 내용과ㅡ encoding에 대해서 설명드리겠습니다.&lt;br /&gt;&lt;br /&gt;::: 참고자료 :::&lt;br /&gt; &lt;LI&gt;&lt;A class=con_link href=&quot;http://drogo.cselt.it/mpeg&quot; target=_blank&gt;&lt;U&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;http://drogo.cselt.it/mpeg&lt;/SPAN&gt;&lt;/U&gt;&lt;/A&gt; &lt;LI&gt;&lt;A class=con_link href=&quot;http://www.iis.fhg.de/&quot; target=_blank&gt;&lt;U&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;http://www.iis.fhg.de/&lt;/SPAN&gt;&lt;/U&gt;&lt;/A&gt; &lt;LI&gt;&lt;A class=con_link href=&quot;http://www.mp3-tech.org/&quot; target=_blank&gt;&lt;U&gt;&lt;SPAN style=&quot;COLOR: #0000ff&quot;&gt;http://www.mp3-tech.org/&lt;/SPAN&gt;&lt;/U&gt;&lt;/A&gt; &lt;br /&gt;&lt;/LI&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>지능형 모형차의 심장을 만들어 보자(FET와 FAST RECOVERY DIODE를 사용한 MOTOR ...</title>
            <link>http://www.swssm.org/index.php?idx=322</link>
            <description>안녕하세요. 18기 김학수 입니다.&lt;br /&gt;&lt;br /&gt;이번 글에서는 지능형 모형차의 심장이라 할 수 있는 모터 드라이버를 만들어 보겠습니다.&lt;br /&gt;보통 DC Motor의 구동을 위해서 많이 사용하는 회로는 H-Bridge 회로 입니다.&lt;br /&gt;정, 역 회전을 모두 가능하게 하는 간단하면서도 중요한 회로입니다.&lt;br /&gt;H 브리지는 아래의 그림과 같이 4개의 트랜지스터를 이용해서 스위칭을 통해 전류의 흐름을 만들어 내고 그 흐름으로 모터의 회전 방향을 정할 수 있게 합니다.&lt;br /&gt;&amp;nbsp; [##_1C|1391234452.jpg|width=&quot;224&quot; height=&quot;216&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;&amp;nbsp;예를 들어 Q1과 Q4 TR을 On, Q2, Q3 TR을 OFF로 신호를 입력할 경우, 모터는 파란색 화살표의 방향으로 흐르는 전류의 영향을 받아 정회전을 합니다. 반대로 역회전의 경우는 Q2, Q3 TR이 ON되어 빨간색 화살표의 방향으로 전류가 흐르며 모터가 회전을 합니다.&lt;br /&gt;&lt;br /&gt;위와 같은 기본적인 모터 제어를 위한 H-Bridge회로를 가지고 지능형 자동차에 사용할 540급 DC Motor를 제어해 보도록 하겠습니다.&lt;br /&gt;540급 DC Motor는 Maximum Current 13A, Peak Voltage 24V, Operating Voltage 7.2V, Stall(구속/정지) Current 70A의 동작 특성을 갖습니다.(하지만 Ni-MH 전지의 특성상 70A 출력은 나오지 않는다.) 따라서 대용량의 전류를 허용하는 TR이 필요합니다.&lt;br /&gt;&lt;br /&gt;일단 적당한 전류를 통과시킬 수 있는 TR을 선택하겠습니다.&lt;br /&gt;어디서 배운건 있어서 P-MOS는 GOOD '1', N-MOS는 GOOD '0'을 출력한다는걸 알고 있으니 P-MOSFET과 N-MOSFET을 조합해서 H-Bridge를 설계합니다.( 굳이 FET를 P형을 선택할 필요는 없습니다. 오히려 N형 FET 네개로 H-Bridge를 만드는게 제어도 쉽고 설계도 간단합니다. Gate 입력에서 헷갈릴 일이 없으니까요. 출력도 좋습니다.)&lt;br /&gt;사용한 FET는 POWER FET중에 IR사의 IRF-540N(N형)과 IRF-4905(P형)을 사용했습니다. 가격이 개당 1000원정도 하는데다 성능도 어느정도 나오기 때문에 가난한 학생으로써는 거부할 수 없는 괜찮은 선택이죠.(물론 이 선택으로나중에 피눈물을 흘리게 됩니다.)&lt;br /&gt;&lt;IMG style=&quot;MARGIN-TOP: 0px; WIDTH: 554px; HEIGHT: 488px&quot; alt=&quot;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot; src=&quot;../../attach/1/1035493052.jpg?randseed=0.19271567360775888&quot;&gt;&lt;br /&gt;&lt;br /&gt;자~ 간단하게 회로를 구성해 보았습니다. 하지만 겁이 많은 저로써는 쉽게 모터에 연결할 수 없습니다. 얘가 신호를 잘못 줘서 언제 터질지 모르기 때문입니다. ECU에서 직접 스위칭 신호 나가면 왠지 보드 그냥 죽어버릴것 같습니다. 그래서 2N2222A (N형) BJT를 FET의 Gate에 달아주겠습니다. 최소한 죽어도 BJT나 FET만 죽겠죠.&lt;br /&gt;&lt;br /&gt;&lt;IMG style=&quot;MARGIN-TOP: 3px; WIDTH: 594px; HEIGHT: 410px&quot; alt=&quot;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot; src=&quot;../../attach/1/1381913684.jpg?randseed=0.4381774308915535&quot;&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;그런데도 여전히 걱정이 많습니다. PID제어 한다고 정/역 회전 막 하면 FET 터져나갈것 같습니다. 역기전력이라는 무시무시한 Energy가 Motor에서 방출되기 때문이죠. (네, 저 겁 많습니다.) 역기전력을 막기 위해서 왠지 무엇인가를 달아줘야 맘이 편해지겠습니다. 그래서 Fast Recovery Diode를 달아줘서 역기전력을 막아보겠습니다.&lt;br /&gt;최대 10배 이상의 전류가 거꾸로 흐른답니다. 제대로 흐르면 그냥 막 다 터지는거죠. 전 이꼴 못보겠습니다. 대회 준비한다고 1달째 잠도 제대로 못잤습니다. 터지면 억울하죠.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;IMG style=&quot;MARGIN-TOP: 2px; WIDTH: 602px; HEIGHT: 426px&quot; alt=&quot;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot; src=&quot;../../attach/1/1022994368.jpg?randseed=0.4255716536277978&quot;&gt;&lt;br /&gt;&lt;br /&gt;구로에 가서 발품을 팔아 구한 FR DIODE(SR3040PT)입니다. 30A/40V-&amp;gt;Peak 300A를 견디는 옹골찬 녀석입니다. 이거 좋습니다. TR처럼 생겼습니다. DUAL DIODE라는 건데, 2개의 DIODE가 병렬로 연결되었습니다. 덕분에 4개 필요할 FR DIODE가 3개로 줄었습니다. 환율 때문에 요즘에 구하려면 개당 2500원은 줘야 하거든요.(전 옛날에 들어온 샘플을 개당 1000원에 샀습니다 +_+)&lt;br /&gt;&lt;br /&gt;이제 모든 부품을 연결했습니다. 이젠 어떤 전류가 흘러도 두렵지 않습니다.(전압만 제대로 걸어준다면 말이죠 ㅋㅋㅋ) 전류가 많이 흐르면 열이 많이 발생하니 서멀 구리스를 바른 방열판을 부착하고 냉각팬도 달아줬습니다. 이젠 어지간해선 죽지 않습니다. &lt;br /&gt;&lt;br /&gt;근데 죽었습니다...(억지도 모터를 정지시키지 마세요. 죽습니다... IRF-540N 2번 죽었습니다. )&lt;br /&gt;정지시키고 싶으시면 반드시 P-FET 끄고 N-FET도 끄세요. 안그러면 터집니다. 속도 터지구요.&lt;br /&gt;&lt;br /&gt;마지막!&lt;br /&gt;1. LOGIC GATE로 한개의 PWM과 DIR 신호만으로 제어할 수 있는 회로는 다음 기회에 올리도록 하겠습니다. 솔직히 그거 만드는게 더 귀찮아요. 제어야 쉽겠지만 말이죠.&lt;br /&gt;&lt;br /&gt;2. 제어의 순서입니다.&lt;br /&gt;2N2222A는 N형 BJT입니다. 따라서 BASE 신호를 1을 줄 경우, Ice가 흐르고, 0을 줄 경우 흐르지 않습니다. &lt;br /&gt;그런데 P형은 Gate입력이 1이면 꺼지고, 0이면 켜지므로 2N2222A의 Base에 0을 입력해야 Gate 입력이 1이 되어 꺼지고, Base에 1을 입력해야 Gate입력이 0이 되어 켜지게 됩니다. N형은 그 반대로 동작합니다.&lt;br /&gt;&lt;br /&gt;3. TR의 스위칭 신호의 역할 부여입니다. &lt;br /&gt;P형을 DIR 신호로, N형을 PWM 신호로 사용하는게 유리합니다. 왜냐하면 VCC에 연결되어 있는 P형에 Pulse를 입력할 경우 쇼트가 날 수 있기 때문이죠. 쇼트나지 않게 만드는게 중요합니다.&lt;br /&gt;&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>VDC (Vehicle Dynamic System)기술 18기 박진영 </title>
            <link>http://www.swssm.org/index.php?idx=321</link>
            <description>&lt;P&gt;안녕하세요 . 18기 박진영 입니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;이번 글에서는 현재 ABS(Auto Breaking System) 와 함께 자동차에서 많이 쓰이는 기술&lt;/P&gt; &lt;P&gt;VDC(Vehicle Dynamic Control)에 대해서 알아보겠습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;여기서 언급되는 VDC의 기술은 제가 출전하는 자동차 대회에서 사용할 기술로,&lt;/P&gt; &lt;P&gt;실제적으로 100% VDC를 구현하지는 않더라도, 일부의 구현으로&lt;/P&gt; &lt;P&gt;보다 안정적인 자세 제어를 하도록 사용하고 있습니다.&lt;/P&gt; &lt;P&gt;그리고 실제 고급 차종에서는 옵션으로 장착할 수 있는 기술중에 하나입니다.&lt;/P&gt; &lt;P&gt;또한 미국내에서는 대부분의 차체에서 옵션으로 선택할 수 있는 안전옵션 중에 하나입니다.&lt;/P&gt; &lt;P&gt;아직 확정은 되지 않았지만 , 미국에서는 의무 장착화 하려고 합니다.&lt;/P&gt; &lt;P&gt;또한 유럽 일부국가에서는 의무 장착이 이미 시행되고 있습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;현재 ABS는 대부분의 자동차에서 지원하는 기능입니다.&lt;/P&gt; &lt;P&gt;예전에는 고급 승용차에만 적용되는 기술이 &lt;/P&gt; &lt;P&gt;최근에는 제작 단가의 낮아짐과,&lt;/P&gt; &lt;P&gt;보다 좋은 안정성을 갖고 있는 차를 타고 싶어하는 소비자의 욕구가 맞아 떨어져서&lt;/P&gt; &lt;P&gt;이제는 소형 자동차 또는 심지어 오토바이나 버스에서도 마주칠 수 있는 기술이 되었습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;자동차를 연구하고 개발하는 연구원들은 더욱 더 안정적이고 멋진 주행시스템을 만들기위해서&lt;/P&gt; &lt;P&gt;ABS라는 멋진 기술을 만들고도 그 너머 더 좋은 기술을 위해서 쉬지 않고 노력했습니다.&lt;/P&gt; &lt;P&gt;그리고 그 결과 VDC라는 기술이 탄생하게 되었습니다. &lt;/P&gt; &lt;P&gt;실제로 이 기술이 탄생한지는 꽤나 많은 시간이 지났지만, 실제 상용차에 적용된지는 그리 오래 되지 않았습니다. 국내에서도 고급차종에 한해 적용할 수 있는 기술이었습니다.&lt;/P&gt; &lt;P&gt;최근에는 중형차에도 적용할 수 있는 옵션으로 알고 있습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;자동차 기술의 최선봉에 있는 기업은 BOSCH 입니다.&lt;/P&gt; &lt;P&gt;보쉬라는 기업은 세계 자동차 부품 시장에서 가장 큰 대기업으로 ,&lt;/P&gt; &lt;P&gt;현재 사용되는 자동차 기술의 대부분의 특허권을 보유하고 있습니다.&lt;/P&gt; &lt;P&gt;VDC라는 기술 또한 보쉬의 멋진 걸작품 중에 하나입니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;쉽게 VDC라는 기술을 설명 드리지면,&lt;/P&gt; &lt;P&gt;리프트위에 자동차를 올려놓고 엑셀을 밟게 되면 미친듯이 RPM이 올라가게 됩니다.&lt;/P&gt; &lt;P&gt;이 이야기는 자동차에 실제로 힘이 실리는 것이 아니라, 단순히 회전운동의 속도만 증가하는 것이므로&lt;/P&gt; &lt;P&gt;RPM이 올라갈 수 밖에 없습니다. 하지만 이 때 VDC의 기술이 적용된 차라면 상황이 달라집니다.&lt;/P&gt; &lt;P&gt;VDC가 장착된 차의 경우에는 자동차에서 이 상황이 어떤상황인지를 측정하고 제어하기 때문입니다.&lt;/P&gt; &lt;P&gt;따라서 공허하게 RPM만 올라가는 동작을 제어하여 구동이 걸리는 바퀴의 속도를 줄이게 됩니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;이 상황이 실제 도로에서는 어떤 식으로 적용이 될까요?&lt;/P&gt; &lt;P&gt;&lt;IMG style=&quot;CURSOR: pointer&quot; onclick=popview(this) height=410 src=&quot;http://blogfiles1.naver.net/data42/2009/6/30/16/vdc-beatman1942_ironyart.jpg&quot; width=499&gt;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;그림을 살펴보시기 바랍니다.&lt;/P&gt; &lt;P&gt;좌측 상황의 경우나, 우측 상황의 경우, 둘 다 한 바퀴가 자동차의 제어 상황에서 벗어나서&lt;/P&gt; &lt;P&gt;오버/언더 스티어 현상이 벌어졌습니다. 이 때 그 상황에 대해서 대처를 올바르게 하지 못한다면&lt;/P&gt; &lt;P&gt;운전자가 원하는 방향으로 운전을 할 수 없을 것입니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;이 때 VDC 기술을 사용하면 오버, 언더스티어 현상에 맞게 나머지 바퀴를 제어하여&lt;/P&gt; &lt;P&gt;현재 진행하고 있는 방향으로 안정적으로 움직일 수 있도록 도와주게 됩니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;&lt;A class=con_link href=&quot;http://tvpot.daum.net/clip/ClipViewByVid.do?vid=DHZj-Ldw5KY$&quot; target=_blank&gt;http://tvpot.daum.net/clip/ClipViewByVid.do?vid=DHZj-Ldw5KY$&lt;/A&gt;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;위 링크의 동영상을 보시기 바랍니다.&lt;/P&gt; &lt;P&gt;이 상황이 발생했을 때 VDC의 기능이 있었더라면 이렇게까지 위험한 상황은 모면할 수 있었을 것입니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;자 그럼 이제 VDC의 깊은 기술의 내막으로 안내해 드리겠습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;VDC의 핵심 부분은 4가지로 볼 수 있습니다.&lt;/P&gt; &lt;P&gt;운전자가 핸들을 꺽는 것을 기억하는 조향각 센서&lt;/P&gt; &lt;P&gt;실제 바퀴가 움직이는 것을 측정하는 휠 스피트 센서&lt;/P&gt; &lt;P&gt;그리고 실제로 어느 방향으로 가고 있는지 측정하는 회전률 감지센서&lt;/P&gt; &lt;P&gt;마지막으로 이것들을 제어하는 ECU가 있습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;ECU 앞의 3가지 센서의 입력된 값을 잘 조합하여,&lt;/P&gt; &lt;P&gt;현재 상태를 계속해서 기억하고 있습니다.&lt;/P&gt; &lt;P&gt;&lt;IMG style=&quot;CURSOR: pointer&quot; onclick=popview(this) height=377 src=&quot;http://blogfiles8.naver.net/data43/2009/6/30/55/2009-06-29_21%3B54%3B53_ironyart.jpg&quot; width=502&gt;&lt;/P&gt; &lt;br /&gt; &lt;P&gt;위 상황은 운전자가 앞의 장애물을 인식하고, &lt;/P&gt; &lt;P&gt;그것을 피하려고 좌측으로 핸들을 꺽은 상황입니다. &lt;/P&gt; &lt;P&gt;하지만 현재 언더스티어 상황(실제 꺾여야 할 방향보다 덜 꺽인 상태)이 벌어져서&lt;/P&gt; &lt;P&gt;이 상태로 가다간 장애물을 부딪히고 말 것입니다.&lt;/P&gt; &lt;P&gt;이 상황에서 VDC는 운전자가 꺽은 방향과 현재의 회전률을 계산해서 실제로 얼마나 회전이 부족한지를 계산하게 됩니다. 또한 어떤 바퀴에서 언더스티어 현상이 일어났는지를 계산을 하고,&lt;/P&gt; &lt;P&gt;나머지 바퀴를 이용해서 (브레이크 또는 조향변경) 운전자가 원하는 방향으로&lt;/P&gt; &lt;P&gt;방향제어를 할 수 있도록 도와주게 되는 것입니다.&lt;/P&gt; &lt;P&gt;이 때 핵심 기술은 각 바퀴의 상태를 피드백하여 원하는 방향으로 움직일 수 있도록&lt;/P&gt; &lt;P&gt;바퀴를 제어하는 것입니다. 이 때에는 좌우 앞뒤 바퀴가 따로따로 놀아야 스티어링이 발생한 바퀴를 보완해 줄 수 있기 때문에, 각 각의 바퀴를 독립적으로 제어하게 됩니다.&lt;/P&gt; &lt;P&gt;결국 자신이 원하는 방향으로 안정적으로 주행을 할 수 있게 되는 것입니다.&lt;/P&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;P&gt;&lt;IMG style=&quot;CURSOR: pointer&quot; onclick=popview(this) height=342 src=&quot;http://blogfiles6.naver.net/data44/2009/6/30/101/%C4%DA%B3%CA%B8%B5_ironyart.jpg&quot; width=550&gt;&lt;/P&gt; &lt;br /&gt; &lt;br /&gt; &lt;P&gt;위 그림은 보쉬자동차부품UK 사이트에서 갖고온 사진입니다. &lt;/P&gt; &lt;P&gt;연구발표자료로 사용된 것으로 , &lt;/P&gt; &lt;P&gt;테스트 도로에서 벤츠를 이용하여 95Km/h 상태에서 측정한 결과 입니다.&lt;/P&gt; &lt;br /&gt; &lt;br /&gt; &lt;P&gt;최근 많은 분들이 VDC의 제어 덕분에 위험한 상황에서 잘 대처할 수 있었다고 합니다.&lt;/P&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;P&gt;저희 팀은 이 기술을 이용해서 열악한 환경을 갖고있는 대회장에서,(익히 소문이 자자합니다.)&lt;/P&gt; &lt;P&gt;오버/언더 스티어링을 방지하고, 보다 나은 결과를 보여드리려고 VDC의 기술을 적용하기 위해&lt;/P&gt; &lt;P&gt;꾸준히 노력하고 있습니다. 아직은 테스트 단계로, 저희 자동차를 보여드릴 수는 없지만,&lt;/P&gt; &lt;P&gt;대회 당일 멋진 결과를 찍어서 다시 블로그에 업데이트 하도록 하겠습니다.&lt;/P&gt; &lt;br /&gt; &lt;P&gt;읽어주셔서 감사합니다.&lt;/P&gt; &lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>PID 계수 구하기 </title>
            <link>http://www.swssm.org/index.php?idx=319</link>
            <description>&lt;SPAN class=Apple-style-span style=&quot;WORD-SPACING: 0px; FONT: 16px Gulim; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 10px; FONT-FAMILY: -webkit-monospace&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot; size=2&gt;U.A.V 기체의 자세제어를 위한 IMU 장치는 개발이 완료 되었다. &lt;br /&gt;하지만.... 기체의 자세 를 유지하는 작업이 만만치 않다. &lt;br /&gt;일단 기체의 균형이 완벽하지 않다. &lt;br /&gt;중국산 블레이드는 똑같은 모터의 출력에서 양력이 제각각이다 ㅡㅡ;;(제일 큰 문제)&lt;br /&gt;&amp;nbsp;하루 빨리 정품 블레이드로 바꿔야되는데... &lt;br /&gt;일단 모터마다 출력의 가중치를 두고 PID 제어기를 이용하여 균형을 잡는 실험을 해 보았다. &lt;br /&gt;&lt;br /&gt;&lt;SPAN class=Apple-style-span style=&quot;WORD-SPACING: 0px; FONT: 16px Gulim; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 10px; FONT-FAMILY: -webkit-monospace&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot; size=2&gt;&lt;object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' id='NFPlayer59694' width=&quot;500&quot; height=&quot;408&quot;&gt;&lt;param name='movie' value='http://serviceapi.nmv.naver.com/flash/NFPlayer.swf?vid=0C6BEC1308C29EA3C4ACDA2DC85E428045BE&amp;amp;outKey=V1275c7bbd02dd597db90e2fc9a7451634606bcd6c087272053aee2fc9a7451634606' /&gt;&lt;param name='wmode' value='transparent' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;embed src='http://serviceapi.nmv.naver.com/flash/NFPlayer.swf?vid=0C6BEC1308C29EA3C4ACDA2DC85E428045BE&amp;amp;outKey=V1275c7bbd02dd597db90e2fc9a7451634606bcd6c087272053aee2fc9a7451634606' wmode='transparent' width=&quot;500&quot; height=&quot;408&quot; allowScriptAccess='always' name='NFPlayer59694' id='NFPlayer59694' allowFullScreen='true' type='application/x-shockwave-flash' /&gt;&lt;/object&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;br /&gt; &lt;DIV&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;lt;PID 계수가 적절하지 않은 경우&amp;gt;&lt;/DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;WORD-SPACING: 0px; FONT: 16px Gulim; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 10px; FONT-FAMILY: -webkit-monospace&quot;&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot; size=2&gt;&lt;object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' id='NFPlayer10088' width=&quot;500&quot; height=&quot;408&quot;&gt;&lt;param name='movie' value='http://serviceapi.nmv.naver.com/flash/NFPlayer.swf?vid=4D4034BD2722E8F68F90920412E003F1F0E2&amp;amp;outKey=V1238809de526a07240414a84307f91d291ac437b9a77582bc4d04a84307f91d291ac' /&gt;&lt;param name='wmode' value='transparent' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;embed src='http://serviceapi.nmv.naver.com/flash/NFPlayer.swf?vid=4D4034BD2722E8F68F90920412E003F1F0E2&amp;amp;outKey=V1238809de526a07240414a84307f91d291ac437b9a77582bc4d04a84307f91d291ac' wmode='transparent' width=&quot;500&quot; height=&quot;408&quot; allowScriptAccess='always' name='NFPlayer10088' id='NFPlayer10088' allowFullScreen='true' type='application/x-shockwave-flash' /&gt;&lt;/object&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;lt;어느정도 안정된 PID 계수를 적용한 경우&amp;gt;&lt;br /&gt;&lt;br /&gt; &lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;처음에는 막무가내로 움직이던 기체가, 계수를 설정해주니 어느정도 자세를 유지하는 비행하는 하고 있는 동영상 이다.&lt;br /&gt;&lt;br /&gt;블레이드의 양력 차이를 가중치를 두어서 하고 있지만, 출력이 약한 모터만 뜨끈뜨끈하게 계속 돌고 있다. 하루빨리 블레이드를 구해야 하겠다...&lt;/DIV&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>마우스 포인터는 어떻게 캡처할까??? </title>
            <link>http://www.swssm.org/index.php?idx=285</link>
            <description>&lt;P&gt;자동 동영상 편집 기능을 갖춘 강의녹화 프로그램 개발 프로젝트 진행중에&lt;br /&gt;윈도우 데스크탑 녹화 모듈에서 마우스 포인터를 비트멥에 추가할 수 없는 문제를 처음에 봉착했었습니다.&lt;br /&gt;&lt;br /&gt;기억하시죠? 아래아래(...계속 아래...)글 보시면~(참고하시고...^^;)&lt;br /&gt;&lt;br /&gt;벌써 한두달 전의 일이라 가물거리는 기억을 꺼내 이렇게 또 기록해 두려 합니다.&lt;br /&gt;&lt;br /&gt;자 그럼 간단명료하게 가볼까요? 그럼 소스 먼저 보겠습니다.&lt;br /&gt;&lt;br /&gt;[##_1C|1198908948.jpg|width=&quot;494&quot; height=&quot;341&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/P&gt;&lt;br /&gt;이 코드만 생성해 놓은 비트맵에 추가 해주신다면 마우스 포인터까지 녹화가 가능합니다. 간단하죠?&lt;br /&gt;&lt;br /&gt;그럼 간단히 소스를 설명하자면....CURSORINFO를 GetCursorInfo() 를 통해 받아와서 커서가 존재하면 커서 좌표를 계산해서&amp;nbsp; DC에 커서를 그려 넣으면 되겠습니다.&lt;br /&gt;&lt;br /&gt;여기서 중요한거 딱 두가지~!&lt;br /&gt;&lt;br /&gt;첫 번째! CURSORINFO 의 cbSize를 CURSORINFO의 size로 설정해야한다는 것! 이 코드만 없어도 제대로 동작 하지 않더군요 ^^;&lt;br /&gt;&lt;br /&gt;두 번째! 커서도 아이콘 이라는 것~! CopyIcon(), DrawIcon()을 사용 한다는 것 잊지 마세요~~!&lt;br /&gt;&lt;br /&gt;정말정말 간단하죠? 너무 짧게 블로깅을 하는 것 같아서.........손이 부끄럽지만... 아마도 스크린 녹화 모듈 개발 작업에서 빼놓을 수 없는 아주 중요한 코드라 생각되어 공개 합니다...! 유용하게 쓰세요~~ㅇ&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Remote Desktop Protocol for Win32 </title>
            <link>http://www.swssm.org/index.php?idx=286</link>
            <description>&lt;P&gt;App-Hand(Application In My Hands)&lt;br /&gt;&lt;br /&gt;App-Hand Project에서 가장 중요한 부분중에 하나인, Remote Desktop Protocol에 대한 이야기 입니다.&lt;br /&gt;&lt;br /&gt;먼저, 사용자는 자신의 컴퓨터에 별도의 애플리케이션을 설치하고 않고서, 서버(Windows Server 2003)에 애플리케이션을 설치해둔 뒤, 사용자는 서버에게 서비스를 받는데 이를 위해 Remote Desktop Protocol을 사용하여야 합니다. Microsoft에서 Remote Desktop Protocol(이하 RDP)을 제공하기는 하지만, 우리 프로젝트의 특성상 소스코드가 필요하였고, MS에서는 이에 대한 소스코드를 공개하지 않았기 때문에 우리는 이에 따른 RDP가 필요하게 되었습니다.&lt;br /&gt;&lt;br /&gt;따라서 RDP에 대한 정보를 단 한곳에서만 제공하는데 이는 &lt;A href=&quot;http://www.rdesktop.org&quot;&gt;www.rdesktop.org&lt;/A&gt;에서 제공합니다.&lt;br /&gt;예전 MS에서 터미널 서비스 개발자였던 사람이 만든 Org라고 하더군요.&lt;br /&gt;따라서 우리는 이 프로토콜을 분석 및 포팅하여 Windows Version으로 재구축 하기로 하였습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;RDP / SECURE / MSC / ISO / TCP&lt;br /&gt;이렇게 다섯 계층으로 RDP는 이루어져 있습니다.&lt;br /&gt;터미널 서비스 역시 3389 포트로, TCP Connection으로 이루어져 있습니다.&lt;br /&gt;&lt;br /&gt;그리하여 RDP는 마우스 및 키보드 메시지가 발생되면 그에 따른 정보를 Server에게 보내줍니다.&lt;br /&gt;소스로는 아래와 같습니다.&lt;br /&gt;static LRESULT CALLBACK WndProc(&lt;br /&gt;&amp;nbsp; &amp;nbsp; HWND hwnd, &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // handle to window&lt;br /&gt;&amp;nbsp; &amp;nbsp; UINT uMsg, &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // message identifier&lt;br /&gt;&amp;nbsp; &amp;nbsp; WPARAM wParam, &amp;nbsp;&amp;nbsp; // first message parameter&lt;br /&gt;&amp;nbsp; &amp;nbsp; LPARAM lParam) &amp;nbsp;&amp;nbsp; // second message parameter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PAINTSTRUCT ps;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HDC hdcPaint;&lt;br /&gt;&amp;nbsp; &amp;nbsp; switch (uMsg)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case WM_PAINT:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hdcPaint = BeginPaint(hwnd, &amp;amp;ps);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!BitBlt (hdcPaint,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ps.rcPaint.left,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ps.rcPaint.top,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ps.rcPaint.right - ps.rcPaint.left,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ps.rcPaint.bottom - ps.rcPaint.top,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hdc,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ps.rcPaint.left,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ps.rcPaint.top,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SRCCOPY))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error (&quot;bitblt failed\n&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EndPaint(hwnd, &amp;amp;ps);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; case WM_KEYDOWN:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rdp_send_input(time (NULL), RDP_INPUT_SCANCODE, RDP_KEYPRESS, (lParam &amp;amp; 0x00FF0000) &amp;gt;&amp;gt; 16, 0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; case WM_KEYUP:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rdp_send_input(time (NULL), RDP_INPUT_SCANCODE, RDP_KEYRELEASE, (lParam &amp;amp; 0x00FF0000) &amp;gt;&amp;gt; 16, 0);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; case WM_LBUTTONDOWN:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rdp_send_input(time(NULL), RDP_INPUT_MOUSE,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; MOUSE_FLAG_BUTTON1 | MOUSE_FLAG_DOWN, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));&lt;br /&gt;&lt;br /&gt;이렇게 사용자의 메시지를 서버에게 보내게 되는 방식으로 진행되게 됩니다.&lt;br /&gt;&lt;br /&gt;이렇게 보낸 메시지 기반으로 서버는 사용자 단위로 가상채널(Virtual Channel)이 생성되는데, 해당 채널에게 메시지를 보내게 됩니다. 그럼 사용자의 핸들링에 따라 해당 서버측에 띄워져 있는 프로세스들이 이벤트를 발생시키게 되며 이에 대한 무효화 영역이 발생되면 클라이언트에게 해당 좌표 및 비트맵을 사용자에게 보냅니다.&lt;br /&gt;사용자는 이를 Parsing하여 모니터에 뿌려주게 되는 방식입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;switch (os-&amp;gt;order_type)&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; case RDP_ORDER_DESTBLT:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;process_destblt(s, &amp;amp;os-&amp;gt;destblt, present, delta);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; case RDP_ORDER_PATBLT:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;process_patblt(s, &amp;amp;os-&amp;gt;patblt, present, delta);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; case RDP_ORDER_SCREENBLT:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;process_screenblt(s, &amp;amp;os-&amp;gt;screenblt, present, delta);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; case RDP_ORDER_LINE:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;process_line(s, &amp;amp;os-&amp;gt;line, present, delta);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/P&gt; &lt;P&gt;&amp;nbsp; &amp;nbsp; case RDP_ORDER_RECT:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;process_rect(s, &amp;amp;os-&amp;gt;rect, present, delta);&lt;br /&gt;&lt;br /&gt;위 소스와 같이 서버로부터 무효화 영역에 따른 메시지를 수신하게 되면 클라이언트를 이를 파싱하여&lt;br /&gt;해당 작업 프로시저로 향하게 되는데, 이때 파라미터로 넘기는게 바로 &quot;s&quot;라는 파라미터!&lt;br /&gt;&quot;s&quot; 파라미터에는 클라이언트 모니터에 뿌려주게 될 X, Y 좌표 등 필요한 좌표정보들이 들어있습니다.&lt;br /&gt;이를 근거로 모니터로 뿌려주게 되는 형식입니다.&lt;/P&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>지자기 센서값을 이용한 Heading측정 </title>
            <link>http://www.swssm.org/index.php?idx=318</link>
            <description>&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: '맑은 고딕'; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA&quot;&gt;기체의 &lt;SPAN lang=EN-US&gt;Z&lt;/SPAN&gt;축 방향&lt;SPAN lang=EN-US&gt;(heading or Yaw)&lt;/SPAN&gt;을 절대값으로 구하기 위해 지자기센서와 가속도센서 성분을 이용하여 구했다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;지자기센서의 &lt;SPAN lang=EN-US&gt;Magnetic Field(&lt;/SPAN&gt;지구 자장&lt;SPAN lang=EN-US&gt;)&lt;/SPAN&gt;를 이용하여&lt;SPAN lang=EN-US&gt; Z&lt;/SPAN&gt;축의 회전방향을 값을 구하는데 이때 지구의 수평방향과 기울어질 경우 자기장의 값이 달라지기 때문에 가속도 센서를 이용하여 구해진 &lt;SPAN lang=EN-US&gt;X&lt;/SPAN&gt;축&lt;SPAN lang=EN-US&gt;(Roll), Y&lt;/SPAN&gt;축&lt;SPAN lang=EN-US&gt;(Pitch)&lt;/SPAN&gt;의 회전각을 이용하여 기울어진 자장의 값을 보정하였다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;br /&gt; [##_1C|1326827994.jpg|width=&quot;513&quot; height=&quot;387&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;SPAN lang=EN-US&gt;1 &lt;/SPAN&gt;차적으로 &lt;SPAN lang=EN-US&gt;Roll angle&lt;/SPAN&gt;값과 &lt;SPAN lang=EN-US&gt;Pitch angle&lt;/SPAN&gt;값은 &lt;SPAN lang=EN-US&gt;Rotation Matrix&lt;/SPAN&gt;를 이용하여 구해지고 그결과는 &lt;SPAN lang=EN-US&gt;Roll(&lt;/SPAN&gt;&lt;SPAN lang=EN-US style=&quot;mso-fareast-theme-font: minor-latin; mso-fareast-font-family: '맑은 고딕'&quot;&gt;ф), Pitch(θ)&lt;/SPAN&gt;&lt;SPAN style=&quot;mso-fareast-theme-font: minor-latin; mso-fareast-font-family: '맑은 고딕'&quot;&gt;로 구해진다&lt;SPAN lang=EN-US&gt;.&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: '맑은 고딕'; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA&quot;&gt;이 각도값을 가지고 보드의 기울어진 정도의 벡터를 구한다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;br /&gt; [##_1C|1151959322.jpg|width=&quot;183&quot; height=&quot;91&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;P class=MsoNormal style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;이 벡터 성분에 지자기 센서에서 측정&lt;SPAN lang=EN-US&gt; 3&lt;/SPAN&gt;방향의 지구 자장값을 사용하여&lt;SPAN lang=EN-US&gt; Heading &lt;/SPAN&gt;성분을 구한다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN lang=EN-US style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: '맑은 고딕'; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA&quot;&gt;x’,y’,z’ &lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: '맑은 고딕'; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: KO; mso-bidi-language: AR-SA&quot;&gt;는 지자기 센서에서 측정된&lt;SPAN lang=EN-US&gt; 3&lt;/SPAN&gt;방향의 자기값이다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt; [##_1C|1003955361.jpg|width=&quot;439&quot; height=&quot;57&quot; alt=&quot;사용자 삽입 이미지&quot;|_##][##_1C|1053315774.jpg|width=&quot;275&quot; height=&quot;57&quot; alt=&quot;사용자 삽입 이미지&quot;|_##][##_1C|1133089680.jpg|width=&quot;207&quot; height=&quot;73&quot; alt=&quot;사용자 삽입 이미지&quot;|_##][##_1C|1154637676.jpg|width=&quot;459&quot; height=&quot;192&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] 구해진 Heading은 Z축의 절대방향으로서 기체의 비행방향을 나타낸다.
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>Matlab을 이용한 버터워스 필터의 계수 구하는 방법 </title>
            <link>http://www.swssm.org/index.php?idx=289</link>
            <description>&lt;P&gt;Butterworth Filter Design by Matlab&lt;/P&gt; &lt;P&gt;“UAV“ 센서부에서 나오는 신호의 잡음을 제거하기 위한 디지털 필터의 계수를 Matlab을 통해 구하는 방법을 구성해 보았습니다. 결과 값이 다시 입력의 성분으로 들어가는 IIR 필터 이며, 특성은 평탄한 주파수 응답을 가지는 Butterworth입니다. &lt;/P&gt; &lt;P&gt;&amp;gt;&amp;gt; fs=320; &amp;nbsp; &amp;nbsp;Sampling frequency of signal [Hz=1/sec}&lt;br /&gt;&amp;gt;&amp;gt; fn=fs/2; &amp;nbsp; &amp;nbsp;Nyquist frequency&lt;br /&gt;&amp;gt;&amp;gt; Ts=1/fs; &amp;nbsp; &amp;nbsp;Sampling period [sec]&lt;/P&gt; &lt;P&gt;Filter Order Calculation&lt;/P&gt; &lt;P&gt;&amp;gt;&amp;gt; [n, Wn]=buttord(30/fn, 45/fn, 1, 12) 30/fn: passband cutoff frequency (30Hz)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;45/fn: stopband corner frequency (45Hz)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1:&amp;nbsp; passband ripple in decibels&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;12: stopband attenuation in decibels&lt;br /&gt;&amp;gt;&amp;gt; n&lt;br /&gt;&amp;nbsp;n= 6&lt;br /&gt;&amp;gt;&amp;gt; Wn&lt;br /&gt;&amp;nbsp;Wn=0. &amp;nbsp; &amp;nbsp; 3dB frequency &amp;nbsp;&amp;nbsp; 0. …X&amp;nbsp; fn= &amp;nbsp; &amp;nbsp;&amp;nbsp; Hz&lt;/P&gt; &lt;P&gt;Filter Coefficient Calculation &lt;/P&gt; &lt;P&gt;&amp;gt;&amp;gt; [b, a]=butter(n, Wn) &amp;nbsp; Filter coefficient calculation&lt;/P&gt; &lt;P&gt;&lt;br /&gt;아래는 실제 Matlab 에서 구해 보았습니다.&lt;/P&gt; &lt;P&gt;fs = 320&lt;br /&gt;fn = fs/2&lt;br /&gt;ts = 1/fs&lt;br /&gt;ts = 0.0031&lt;/P&gt; &lt;P&gt;[n,wn]=buttord(30/fn,45/fn,1,12)&lt;br /&gt;n = 6&lt;br /&gt;wn = 0.2206&lt;br /&gt;[b,a]=butter(n,wn)&lt;/P&gt; &lt;P&gt;얻어진 디지털 필터의 계수입니다.&lt;br /&gt;a는 출력된 값에 곱해지는 계수이며, b는 입력신호에 곱해지는 계수입니다.&lt;/P&gt; &lt;P&gt;b =&amp;nbsp; 0.0019 &amp;nbsp;&amp;nbsp; 0.0097 &amp;nbsp;&amp;nbsp; 0.0194 &amp;nbsp;&amp;nbsp; 0.0194 &amp;nbsp;&amp;nbsp; 0.0097 &amp;nbsp;&amp;nbsp; 0.0019&lt;br /&gt;a =&amp;nbsp; 1.0000 &amp;nbsp; -2.7685 &amp;nbsp;&amp;nbsp; 3.3710 &amp;nbsp; -2.1647 &amp;nbsp;&amp;nbsp; 0.7246 &amp;nbsp; -0.1002&lt;br /&gt;&amp;nbsp;&lt;/P&gt; &lt;P style=&quot;FONT-SIZE: 10pt; MARGIN: 0px; COLOR: #000000; TEXT-INDENT: 0px; LINE-HEIGHT: 160%; FONT-FAMILY: '바탕'; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&amp;nbsp;&lt;/P&gt; &lt;P style=&quot;FONT-SIZE: 10pt; MARGIN: 0px; COLOR: #000000; TEXT-INDENT: 0px; LINE-HEIGHT: 160%; FONT-FAMILY: '바탕'; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&lt;IMG height=171 src=&quot;file:///C:/DOCUME~1/JUNGHY~1/LOCALS~1/Temp/UNI000012a4604f.gif&quot; width=268 border=0&gt;&lt;IMG height=171 src=&quot;file:///C:/DOCUME~1/JUNGHY~1/LOCALS~1/Temp/UNI000012a46051.gif&quot; width=277 border=0&gt;&lt;/SPAN&gt; &lt;/P&gt; &lt;P style=&quot;FONT-SIZE: 10pt; MARGIN: 0px; COLOR: #000000; TEXT-INDENT: 0px; LINE-HEIGHT: 160%; FONT-FAMILY: '바탕'; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&amp;lt;위상 응답&amp;gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&amp;lt;진폭 특성&amp;gt;&lt;/SPAN&gt; &lt;/P&gt; &lt;P style=&quot;FONT-SIZE: 10pt; MARGIN: 0px; COLOR: #000000; TEXT-INDENT: 0px; LINE-HEIGHT: 160%; FONT-FAMILY: '바탕'; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&lt;IMG height=186 src=&quot;file:///C:/DOCUME~1/JUNGHY~1/LOCALS~1/Temp/UNI000012a46053.gif&quot; width=269 border=0&gt;&lt;IMG height=183 src=&quot;file:///C:/DOCUME~1/JUNGHY~1/LOCALS~1/Temp/UNI000012a46055.gif&quot; width=288 border=0&gt;&lt;/SPAN&gt; &lt;/P&gt; &lt;P style=&quot;FONT-SIZE: 10pt; MARGIN: 0px; COLOR: #000000; TEXT-INDENT: 0px; LINE-HEIGHT: 160%; FONT-FAMILY: '바탕'; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-WEIGHT: bold; FONT-SIZE: 10pt; COLOR: #000000; LINE-HEIGHT: 21px; FONT-FAMILY: '바탕'; LETTER-SPACING: 0px; TEXT-ALIGN: justify&quot;&gt;&amp;lt;임펄스 응답&amp;gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style=&quot;HWP-TAB: 1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&amp;lt;극점과 영점&amp;gt;&lt;/SPAN&gt; &lt;/P&gt;&lt;/SPAN&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>DirectShow Editing Service 에 대해서 </title>
            <link>http://www.swssm.org/index.php?idx=290</link>
            <description>&lt;!--StartFragment--&gt; &lt;P class=바탕글&gt;동영상 편집을 하기위해서 Microsoft에서 제공하는 최고의 Tool은 바로 DirectShow에서 큰 부분을 차지하고 있는 DirectShow Editing Service(DES)이다.&lt;/P&gt; &lt;P class=바탕글&gt;Microsoft® DirectShow® 편집 서비스 (DES)는, 비디오 편집에 포함되는 태스크를 큰폭으로 간략화하는 애플리케이션 프로그래밍 인터페이스 (API)이다. DES 는, 코어 DirectShow 아키텍처의 최상부에 구축되고 있다. DES 는, DirectShow 의 대부분을 추상화 해, 비디오 편집 프로젝트의 조작 전용에 설계된 일련의 인터페이스를 제공한다. 애플리케이션 개발자는, 비디오 편집 애플리케이션의 생성에 최적인 프레임워크(framework) 중에서 DirectShow 의 이점을 활용할 수 있다. &lt;/P&gt; &lt;P class=바탕글&gt;DirectShow 의 코어가 되는 것은, 스트림 미디어를 처리하기 위한 강력한 아키텍처이다. 개발자가 파일 압축 등의 귀찮은 문제를 고려하지 않아도, 애플리케이션은 DirectShow 를 사용해, 다양한 포맷의 멀티미디어 컨텐츠를 재생할 수 있다. 그러나, DES 가 없으면, DirectShow는 편집에 필요한 유연성을 갖추지 못한다. &lt;/P&gt; &lt;P class=바탕글&gt;예를 들어, 어느 비디오 순서를 생성 하는데, 소스 A 로부터 4 초, 다음에 소스 B 로부터 10 초, 마지막에 소스 C 로부터 5 초를 잇고 싶다고 한다. 이것은, DirectShow API 만을 사용해, 꽤 용이하게 실시할 수가 있다. &lt;/P&gt; &lt;P class=바탕글&gt;그러나, 소스 C 를 소스 B를 가져오기 전에 있고 B를 연결하는 경우나, 소스 A 로부터 4 초는 아니고 8 초 사용하고 싶은 경우, 또 프로덕션 전체로 백그라운드에 다른 오디오 트랙 재생이 필요하게 되었을 경우 등의 작은 변경을 처리 하는 것이 어려운 일이 있다. 그러나, 이러한 작업은 DES 에서는 매우 간단한 편집 프로젝트이며, 메서드 몇 개를 호출하는 것만으로 실시할 수가 있다. &lt;/P&gt; &lt;P class=바탕글&gt;DirectShow 편집 서비스의 아키텍처&lt;/P&gt; &lt;P class=바탕글&gt;다음 그림은 Microsoft® DirectShow® 편집 서비스 (DES)의 아키텍처를 나타내고 있다. &lt;br /&gt;[##_1C|1373343408.jpg|width=&quot;399&quot; height=&quot;257&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/P&gt;&lt;!--StartFragment--&gt; &lt;P class=바탕글&gt;타임 라인 : 비디오 프로덕션을, 소스 클립, 트랜지션, 이펙트의 콜렉션으로서 표현한다. 이러한 콜렉션은, 상자 구조의 일련의 트랙으로서 구성된다. &lt;/P&gt; &lt;P class=바탕글&gt;XML 파서 : 타임 라인을 해석해 출력 파일을 생성한다. 또는, 입력 파일을 읽어들여 타임 라인을 생성한다. DES 는, XML 베이스의 영속성 포맷을 지원 하고 있다. &lt;/P&gt; &lt;P class=바탕글&gt;렌더링 엔진 : 타임 라인을, 스트림 미디어로서 렌더링 할 수 있는 포맷으로 변환한다. 디폴트에서는, 렌더링 엔진은 DirectShow 필터 그래프를 생성한다 &lt;/P&gt; &lt;P class=바탕글&gt;미디어 locator : 미디어 요소의 위치의 캐쉬를 보수한다. 미디어 요소를 열려고 실패했을 경우, DES 는 이 캐쉬를 사용해, 성공한 오픈의 History에 근거해 요소를 검색한다. &lt;/P&gt; &lt;P class=바탕글&gt;타임 라인은, 비디오 편집 프로젝트의 추상 표현이다. 이것은, 프로젝트로 사용되는 소스 클립, 그 시작 타임과 종료 타임, 이펙트와 트랜지션등을 지정한다. 그러나, 타임 라인은 비디오 스트림이나 오디오 스트림은 렌더링 하지 않는다. 대신에, 렌더링 엔진은, 프리뷰 또는 파일 출력용으로 타임 라인을 필터 그래프로 변환한다. 애플리케이션에서는, 취급하기 어렵게 에러의 나오기 쉬운 필터 그래프를 직접 조작하는 것이 아니라, 타임 라인을 조작한다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;타임 라인 모델&lt;/P&gt; &lt;P class=바탕글&gt;&quot;타임 라인&quot; 은, Microsof® DirectShow® 편집 서비스 (DES)가 비디오 편집 프로젝트를 표현하기 위해서 사용하는 개체이다. 비디오 프로젝트는, 비디오 파일, 사운드 파일, 정지화면 등의 소스 파일의 콜렉션으로부터 시작된다. 클립의 선형적인 순서가 &quot;트랙&quot; 이 된다. DirectShow 편집 서비스 (DES)에서는, 오디오와 비디오는 다른 트랙에 배치된다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;트랙은, 계층화도 할 수 있다. 복수의 오디오 트랙이 믹싱 되어 페이드나 잔향등의 오디오 이펙트를 포함하는 일도 있다. 복수의 비디오 트랙을 사용해, 트랜지션을 생성 한다. 예를 들어, 어느 클립으로부터 다른 클립에의 와이프를 생성 할 수 있다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;DES 는, 다음과 같이 트리 구조를 사용해 편집을 표현한다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;오디오 클립과 비디오 클립이 리프 노드, 즉 &quot;소스&quot; 개체가 된다. 동일한 미디어 타입 (오디오 또는 비디오)의 소스의 콜렉션이 &quot;트랙&quot; 이다. 트랙의 콜렉션이 &quot;콤포지션&quot; 이다. 콤포지션은, 포함되는 모든 트랙의 콤포지션으로서 렌더링 된다. 콤포지션에는 다른 콤포지션을 넣을 수도 있어 트랙의 복잡한 배치가 가능하다. 콤포지션과 트랙의 최상정도 레벨의 콜렉션이 그룹&quot; 이다. 1 개 또는 복수의 일련의 그룹이 &quot;타임 라인&quot; 이 된다. 타임 라인은, 트리의 루트 노드이다. 타임 라인에는, 적어도 1 개의 그룹이 포함되지 않으면 안 된다. 각 그룹은, 최종 프로덕션에 있어서의 단일의 스트림을 나타낸다. 대표적인 프로젝트에는, 비디오 그룹과 오디오 그룹이 1 개씩 포함된다. 콤포지션은 옵션이며, 필요한 경우에 한층 더 구조를 제공하는 것이다. &lt;/P&gt; &lt;P class=바탕글&gt; &lt;P class=바탕글&gt;다음 그림은 타임 라인을 구성하는 부모와 자식 관계를 나타낸 것이다. &lt;/P&gt;[##_1C|1051853261.jpg|width=&quot;567&quot; height=&quot;214&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;!--StartFragment--&gt; &lt;P class=바탕글&gt;이와 같은 구조를 우리 프로젝트에 투영했을 때의 구조는 다음과 같다. &lt;/P&gt;[##_1C|1250534587.jpg|width=&quot;567&quot; height=&quot;441&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;br /&gt;위의 그림과 같이 각각의 트랙에 해당하는 동영상에서 삽입할 부분을 각각의 소스로 변환 시킨 뒤, 하나의 타임라인을 구성하면 우리 프로젝트에서 하고자 하였던 하나의 완성된 동영상 강의를 만들 수 있게 된다.
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>[GSS System] SNMP Message Packet Format 분석 </title>
            <link>http://www.swssm.org/index.php?idx=313</link>
            <description>&lt;SPAN class=Apple-style-span style=&quot;WORD-SPACING: 0px; FONT: 16px Gulim; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 10px; FONT-FAMILY: -webkit-monospace&quot;&gt;&lt;br /&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot; size=2&gt;&amp;nbsp;지난 블로깅에서는 SNMP의 기본적인 이해에 대해서 알아보았습니다.&lt;br /&gt;이번에는 SNMP를 실제로 이용하기 위해서 SNMP Message Packet Format에 대해서 알아보도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;모든 SNMP를 이용하는 장치들은 SNMP Message Format을 이해하고 있어야 합니다. 그 이유 중의 하나가 바로 각기 다른 소프트웨어 개발 Language가 약간씩 다른 data type(Integer, strings, bytes, characters, etc)을 가지고 있기 때문입니다. 예를 들어 SNMP Manager가 Java data type의 message를 보낸다면 C로 작성된 SNMP Agent는 그 message의 내용을 이해하지 못합니다. 이 문제점을 해결하기 위해서 SNMP는 message를 구성하는데 사용하는 data type을 정의한 ASN.1(Abstract Syntax Notation One)을 이용합니다.&lt;br /&gt;&amp;nbsp;ASN.1은 프로그래밍 언어에 독립적이기 때문에, SNMP Agent와 Manager가 어떤 프로그래밍 언어를 이용하더라도 상관이 없습니다. 그러나 이러한 장점에도 불구하고 단점이 한 가지 존재하는데요. 그것은 바로 어떤 특정 data type이 전송될 때 message가 어떻게 encoding되어야 하는가... 하는 것입니다. 예를 들어 Strings type이 C언어로 coding 되어 전송될 경우에는 Null로 끝나고, 다른 언어로 coding되어 전송될 경우에는 다른 형식으로 보내야 할 것입니다. 다른 예로 Boolean value는 C++에서는 8bit, Visual Basic 6에서는 16bit로 구성되는 등 프로그래밍 언어 문법에 따라 달라지는 경우가 있습니다.그래서 ASN.1은 위와 같은 문제점을 해결하기 위해 BER(Basic Encoding Rules)을 포함하고 있습니다. 따라서 모든 data type은 BER에 의해서 선로를 타고 전송되기 전에, 프로그래밍 언어에 상관 없이 동일한 방법으로 encoding 되어집니다.&lt;br /&gt;&amp;nbsp;다시 말해서 SNMP Message의 모든 data field는 ASN.1 data type을 따르고 BER에 의해서 Encoding 됩니다. 그래서 올바른 format의 message를 전송하기 위해서는 ASN.1과 BER(Basic Encoding Rules)을 잘 이해하고 따라야 하는 것입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;ASN.1(Abstract Syntax Notation One)&lt;br /&gt;&lt;br /&gt;&lt;/STRONG&gt;&amp;nbsp;Message를 구성하는데 있어서 ASN.1에 의해 특징지어지는 data type의 몇가지 정보에 대해서 알필요가 있습니다. 그것은 두 가지 category로 나누어지는데, 바로 Primitive 와 Complex 형식 입니다. ASN.1 Primitive data type은 Integer, Octet(byte, characters), String, Null, Boolean, Object Identifier 등을 포함합니다. Object Identifier type의 한 field가 SNMP agent의 parameter를 지시하는데 사용되는 OID를 가지기 때문에 Object Identifier type은 SNMP message의 중요 type이 됩니다. 또한 data를 구성하는 프로그래머의 능력 확장을 위해 여러 primitive data type들을 Groupping 하여 Complex data type을 만들 수 있습니다.&lt;br /&gt;[##_1C|1105707283.jpg|width=&quot;485&quot; height=&quot;119&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;br /&gt;[##_1C|1242948247.jpg|width=&quot;592&quot; height=&quot;127&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;br /&gt;&amp;nbsp;ASN.1은 SNMP Message를 만드는데 필수적인 몇몇 Complex data type을 제공합니다. 첫 번째 complex data type은 Sequence 입니다. Sequence type은 단순히 data field의 list 입니다. Sequence의 field들은 각기 다른 data type을 가질 수도 있습니다. 두 번째 complex data type은 SNMP PDU(Protocol Data Unit) data type 입니다. PDU type은 특히 SNMP에 특화된 complex data type 입니다. 이용가능한 PDU data type은 GetRequest와 SetRequest 인데, 이 놈들은 각각 parameter를 얻어오고, 설정하는데 필수적인 data type이라 할 수 있습니다.&lt;br /&gt;&amp;nbsp;결론적으로 SNMP message는 전체적으로 ASN.1 data type의 field로부터 만들어진 구조입니다. 그러나 정확한 data type의 결정만으로는 부족합니다. 만약 SNMP message가 가변 data type의 Sequence라 한다면, 수신측에서는 어디가 field의 시작이고 어디가 field의 끝인지 어떻게 알 수 있을까요? 또 각 filed의 data type은 무엇인지 어떻게 알 수 있을까요? 이러한 문제점을 회피하기 위해서 BER(Basic Encoding Rules)이 존재하는 것입니다.&lt;br /&gt;[##_1C|1343523091.jpg|width=&quot;598&quot; height=&quot;195&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;BER(Basic Encoding Rules)&lt;br /&gt;&lt;br /&gt;&lt;/STRONG&gt;&amp;nbsp;SNMP message의 각 field의 byte수를 Layout 할 때에는 Basic Encoding Rules를 따라야 합니다. 가장 기본적인 규칙은 각 field가 세 부분으로 나뉘어서 encoding 된다는 것이다. 세 부분은 바로 Type, Length 그리고 Data 입니다. Type은 한 byte의 식별자를 이용하는 field의 data type을 나타냅니다. Length는 그 뒤에 따라오는 data 부분의 길이를 byte수로 표현한 것입니다. 마지막으로 Data는 실제 Communication하는 값(number, string, OID, etc)이 되겠습니다. Sequences와 PDU 같은 data type들은 몇몇 그보다 작은 field들에 의해서 만들어집니다.&lt;br /&gt;&amp;nbsp;SNMP message를 encoding 하는데는 두 가지 필수적인 Basic Encoding Rules이 있는데, 두 가지 모두 OID encoding에 이용됩니다. 첫 번째 규칙은 OID의 첫 두개 숫자를 encoding 하는데 적용됩니다. BER에 따르면 OID의 첫 두 숫자(16진수 x, y)는 다음과 같은 공식을 따릅니다.&lt;br /&gt;&lt;br /&gt;&lt;FONT size=5&gt;&lt;STRONG&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;FONT face=arial,helvetica,sans-serif size=4&gt;&lt;STRONG&gt;&amp;nbsp;(40 * x) + y&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;br /&gt;&amp;nbsp;SNMP OID의 첫 두 숫자는 항상 1.3 이므로 SNMP OID의 첫 두 숫자는 항상 43 또는 0x2B로 encoding 됩니다.( because (40 * 1) + y )&lt;br /&gt;&amp;nbsp;첫 두 숫자가 encoding 되고 나서, OID의 연속된 숫자들은 byte 단위로 encoding 됩니다. 여기서 매우 큰 숫자에 대해서 특별한 규칙이 하나 더 있는데요. 1 byte(8 bit)는 0~255까지 밖에 표현 못하기 때문이죠~. 예를 들어서 생각해 볼까요? Rane NM1 microphoneMute OID는 1.3.6.1.4.1.2680.1.2.7.3.2.0 입니다. 여기에서 2680은 1 byte를 이용해서 표현이 불가능 합니다. 이런 경우에는 7 bit 씩 나누어서 표현하는 것이 바로 BER 규칙 중의 하나 입니다. 즉, 1 byte 중 7 bit를 이용해서 값을 표현하고 최상위 bit(MSB)는 flag bit로 이용 합니다. 다음 1 byte를 더 이용하게 되면 flag bit를 1로 둠으로써 다음 byte는 reserved 되었다는 것을 표현하는 것입니다. 위의 경우 2680은 128로 나누면 몫은 20, 나머지는 120이 됩니다. 다시 말해 첫 번째 1 byte는 0x14, 두 번째 1 byte는 0x78가 됩니다. 앞서 말한대로 최상위 bit(flag bit)를 set 시켜줘야하므로 첫 번째 byte는 0x94, 두 번째 byte는 0x78이 되는 것입니다. 검산해보면 (0x14 * 128) + 0x78 = 2680 이 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=&quot;'Dotum', 'Sans-serif'&quot;&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;SNMP Message Format&lt;br /&gt;&lt;br /&gt;&lt;/STRONG&gt;&amp;nbsp;SNMP message format은 message 안에 어떤 field가 포함되어 있는지, 어떤 순서로 배치되어 있는지 나타냅니다. 궁극적으로 message는 이웃한 field의 몇몇 layer들에 의해서 만들어집니다. 가장 바깥쪽 layer에서 SNMP message는 Sequence type의 single field 입니다. 전체 message는 세 개의 작은 field(SNMP Version, SNMP Community String, SNMP PDU) 들로 구성됩니다. &lt;br /&gt;[##_1C|1226122256.jpg|width=&quot;600&quot; height=&quot;132&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &amp;nbsp;SNMP Version과 SNMP Community String은 primitive data type 이기 때문에 더 작은 field로 만들어지지는 않습니다. 하지만 PDU는 몇몇 더 작은 field로 구성된 complex data type 입니다. 즉, Request ID(Integer), Error(Integer), Error Index(Integer), 그리고 Variable Binding List 등으로 구성되어 있습니다. 그 중에서 Variable Binding은 두 가지 특정 field의 Sequence 입니다. 첫 번째 field는 특정 parameter를 가리키는 OID이고, 두 번째 field는 특정 parameter의 값이 되겠습니다. SetRequest PDU에서의 그 값은 set 된 parameter에 대한 MIB에서의 data type과 동일해야 합니다. GetRequest PDU에서의 그 값은 0x00 길이의 Null 값 입니다.&lt;br /&gt;[##_1C|1183339681.jpg|width=&quot;600&quot; height=&quot;172&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] - SNMP message : 전체 SNMP message를 나타내는 Sequence는 SNMP Version, Community String,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SNMP PDU로 구성된다.&lt;br /&gt;&lt;br /&gt;- SNMP Version : SNMP의 Version을 나타내는 Integer 값. SNMPv1 = 0&lt;br /&gt;&lt;br /&gt;- SNMP Community String : SNMP 장치에 보안성을 더해주기 위해 이용되는 문자열을 포함하는&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Octet String.&lt;br /&gt;&lt;br /&gt;- SNMP PDU : SNMP PDU는 message의 body를 포함한다. PDU는 몇개의 type을 가지는데,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 보통 GetRequest, GetResponse, SetRequest로 분류된다.&lt;br /&gt;&lt;br /&gt;- Request ID : 특별한 SNMP 요구사항을 식별하는 integer 값.&lt;br /&gt;&lt;br /&gt;- Error : 0x00으로 set 된 값이 SNMP manager에 의해서 전송된다. error code는 아래와 같다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;0x00 - 오류 발생 없음.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x01 - 전송되기에 너무 큰 응답 message.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x02 - requested object 이름을 찾을 수 없음.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x03 - 요청된 data type과 SNMP agent의 data type이 다를 때.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x04 - SNMP manager가 read-only parameter로 설정되었을 때.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x05 - 일반적인 오류&lt;br /&gt;&lt;br /&gt;- Error Index : Error가 발생했을 때, Error Index는 오류를 발생시킨 object를 가리키는 pointer를 가진다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 그렇지 않은 경우에 Error Index는 0x00을 가진다.&lt;br /&gt;&lt;br /&gt;- Varbind List : Sequence of Varbinds.&lt;br /&gt;&lt;br /&gt;- Varbind : OID &amp;amp; OID's Value.&lt;br /&gt;&lt;br /&gt;- Object Identifier : SNMP agent의 특정 parameter를 가리키는 식별자.&lt;br /&gt;&lt;br /&gt;- Value : SetRequest PDU - SNMP agent의 특정 OID에 적용된 값.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; GetRequest PDU - return data에 대한 유효하지 않은 숫자 Null로서 작용하는 값.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GetResponse PDU - SNMP agent의 특정 OID로부터 return 된 값.&lt;br /&gt;[##_1C|1179380113.jpg|width=&quot;600&quot; height=&quot;129&quot; alt=&quot;사용자 삽입 이미지&quot;|_##] &lt;br /&gt;다음 블로깅에서는 실제로 위의 ASN.1 및 BER을 적용하여 팀에서 구현한 Protocol에 대해서&lt;br /&gt;알아보도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;감사합니다.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>[ 대발이의 그까이꺼~! ] Intelligent Army Robot System 기체 제작 과정 ^^* </title>
            <link>http://www.swssm.org/index.php?idx=312</link>
            <description>우리 107팀(25살+26살+28살+28살)의 기체 제작 현황입니다.&lt;br /&gt;이번에 이런저런 이유로 기체제작이 좀 늦어진 감이 있긴 하지만 아주 예쁘게 잘 나왔습니다.^^&lt;br /&gt;기분이 좋군요 ㅋ&lt;br /&gt;&lt;br /&gt;일단 시작하기 전에 설계를 맡아주신 민호형님께 감사드립니다 ㅠㅠ&lt;br /&gt;설계하시느라 고생하셨어요~ 형ㅠㅠ&lt;br /&gt;&lt;br /&gt;저희 로봇은 말 그대로 지능형 로봇입니다. 스스로 움직이면서 영상인식을 통해 사격을 하는게 궁국적인 목표인 것입니다. 따라서 일단 튼튼하고 정교한, 험한 지형을 주행할 수 있는 기체를 제작해야 했습니다.&lt;br /&gt;&lt;br /&gt;일단 제작에 들어가기 전에 설계를 해야겠죠? 당연 설계도 없는 기체란 있을 수 없으니까요.&lt;br /&gt;설계는 Inventor2008을 사용하였습니다. 3차원 설계를 하기위해 사용하는 편리한 Tool이죠^^&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;../../attach/1/1026645581.jpg?randseed=0.6666892088519905&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 262px; height: 228px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt; 본 그림의 경우 원래 부품을 제외한 추가 가공품들 입니다.&lt;br /&gt;&lt;img src=&quot;../../../../attach/1/1379291980.jpg?randseed=0.9341541526856015&quot; alt=&quot;&quot; style=&quot;margin-top: 19.4783px; width: 236px; height: 97px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;img src=&quot;../../../../attach/1/1175642838.jpg?randseed=0.827609411225668&quot; alt=&quot;&quot; style=&quot;margin-top: 19.0488px; width: 233px; height: 99px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [그림 1]&lt;br /&gt;&lt;br /&gt;뭔 가공해야 할 부품이 왜 이렇게 많은지.... ㅠ.ㅠ &lt;br /&gt;&lt;br /&gt;설계 및 가공시에 가중 중요한 것은 감히 '결합'이라 말할 수 있겠습니다.&lt;br /&gt;물리적인 '힘'을 고려한 설계도 물론 중요하지만 결정적으로 돌아가느냐, 안돌아가느냐는 바로 결합에서 결정나기 때문입니다. 가공 후 조립이 안되면 말짱 꽝이겠죠?&lt;br /&gt;&lt;br /&gt;그 외에도 여러가지를 고려해야 했습니다. &lt;br /&gt;4개의 모터를 이용하여 좌측주행, 우측주행, 앞팔, 뒷팔 네군데를 제어하기 위해서 내부 구조가 좀 까다롭게 되어있습니다. 사진으로 찍어놓은게 없어서 아쉽네요 ㅡ; 쩝;;;;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;../../attach/1/1372946771.jpg?randseed=0.6635004714464386&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 223px; height: 167px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt; 본 사진은 구동부가 모터+벨트+풀리의 결합으로 되어있음을 보입니다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [사진 2]&lt;br /&gt;&lt;br /&gt;위에 '타이밍벨트' 보이시죠? 이 '타이밍벨트'는 제품출하시에 이미 규격이 정해져서 나오므로 규격집에 맞추어 설계를 해주어야 합니다. 물론 '풀리'도 마찬가지 입니다. ('풀리'는 '타이밍벨트'가 끼워지는 바퀴를 의미하죠^^)&lt;br /&gt;&lt;br /&gt;아! 그리고 축으로 사용되는 '연마봉'과 앞,뒤팔과의 결합부분 또한 눈여겨 봐야합니다. 연마봉 끝이 그냥 원 모양이면 팔을 들어올릴 수 없겠죠? 측면과 걸리는 부분이 있어야 되잖아요? 그래서 연마봉의 양 끝은 모양이 '반원'입니다. 모든 축과 측면의 결합은 이렇게 구성되어 있습니다. 이것도 사진이 없어서 아쉽네요 ㅡ;;;&lt;br /&gt;&lt;br /&gt;이렇게 기본적인 기체의 밑부분에 대한 설명을 마치고 제작과정을 살펴봅시다^^&lt;br /&gt;&lt;img src=&quot;../../attach/1/1232214915.jpg?randseed=0.9064368677177147&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 223px; height: 167px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;img src=&quot;../../attach/1/1250433846.jpg?randseed=0.22288524217328076&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 223px; height: 167px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [사진 3] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [사진 4]&lt;br /&gt;&lt;br /&gt;아직 다 가공한 건 아니지만 무지막지 하네요 ㅠ.ㅜ.&lt;br /&gt;[사진 4]는 '타이밍벨트'가 밑 바닥으로 부터 눌리는 것을 막기위한 일종의 '텐션'이죠. 스프링기능은 없지만 굽이진 곳이나, 계단같이 평탄치 못한 언덕이나 지형을 이동할때 필수 입니다. 탱크아시죠? 탱크 바퀴를 생각하시면 되요. 실제 구동바퀴는 앞,뒤에 있고 가운데는 받침역할인 거죠^^&lt;br /&gt;&lt;br /&gt;로봇이 하중이 꾀 나가다 보니, 축과 바퀴사이는 베이링이 필수 입니다^^&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;../../attach/1/1107592509.jpg?randseed=0.2861897049698512&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 223px; height: 167px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;img src=&quot;../../attach/1/1241152173.jpg?randseed=0.6925523613642597&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 223px; height: 167px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [사진 5] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [사진 6]&amp;nbsp; &lt;br /&gt;&lt;br /&gt;점점 틀이 갖춰져 가는 모습에 눈물이 앞을 가립니다 ㅠ.ㅠ 작업할때면 항상 거지꼴이 됩니다. 기름과 알루미늄가루 범벅이죠^^;&lt;br /&gt;[사진 6]은 기념샷!!!&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;../../attach/1/1113308769.jpg?randseed=0.7133336375227181&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 222px; height: 166px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;img src=&quot;../../attach/1/1183785867.jpg?randseed=0.5830492746465179&quot; alt=&quot;&quot; style=&quot;margin-top: 0px; width: 178px; height: 239px;&quot; onerror=&quot;this.src='/style/admin/default/image/spacer.gif'&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; [사진 7] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [사진 8]&lt;br /&gt;&lt;br /&gt;완성입니다! ㅜ.ㅠ 또 한번 눈물이 앞을 가리네요 ㅋㅋ 적이 나타나면 바로 쏴버릴듯 합니다^^;; 기세가 하늘을 찌를듯 하군요! 위풍당당 합니다^^ ㅋ&lt;br /&gt;사진[8]은 3축으로 이루어져 있습니다. 총기를 자유자제로 조준할 수 있는 메카니즘을 가지고 있죠 ㅋ&lt;br /&gt;제어는 토크30kg의 서보모터3개로 이루어져 있습니다. &lt;br /&gt;&lt;br /&gt;음~ 정말 험난한 길이였습니다 ㅠ.ㅠ 그래도 개운하군요, 친자식 같습니다 ㅋ&lt;br /&gt;&lt;br /&gt;제작 후 아쉽게도 단점이 발견되었습니다. 로봇 무게가 상당합니다^^; 28kg.... 허허~ 거의 배틀로봇 수준이죠.&lt;br /&gt;하지만 이것은 후에 20kg까지 줄일 생각입니다. 기체 가운데 큰 풀리8개의 옆구리를 사정없이 깍아낼 생각입니다^^;;; 완전 심각한 노가다가 되겠지만 무게를 줄일 수 있다면 빳데리가 좀더 오래 갈 수 있다는 장점이 있죠 ㅋㅋ&lt;br /&gt;그리고 또 한가지 문제는 가운데에서 좌,우로 기울어짐을 맡고있는 두번째 서보가... 토크가 딸린다는 겁니다.&lt;br /&gt;작동은 잘 되는데 좀 동작하는게 불안합니다. 계속 test하다가는 망가질지도 모릅니다^^;;&lt;br /&gt;토크가 30kg이라는 말은 1cm당 30kg까지 이론상 모터가 망가지지 않고 버틴다는 얘기죠, 그런데 막상 만들고 보니 로봇의 윗판에서 총까지 20cm가 넘는다는 겁니다^^;;; 아~~~~ 참~~~~~ 한탄이 나오네요 ^^&lt;br /&gt;그래도 웃어야죠~! &lt;br /&gt;방안을 모색해 봐야 겠습니다. &lt;br /&gt;사람이 맘만 먹으면 안되는게 없는 법이죠!&lt;br /&gt;&lt;br /&gt;다음 이 시간에는 칼만필터(Kalman Filter)에 대해서 알아보겠습니다.&lt;br /&gt;자이로센서는 각도를 산출하면 값이 시간이 지남에 따라 누적이 되는 단점이 있죠.&lt;br /&gt;가속도센서는 각도를 산출하면 정지상태 외에는 정확한 값이 안들어 온다는 단점이 있죠.&lt;br /&gt;따라서 두 센서를 퓨젼하여 미래에 들어올 각도값을 미리 추정하여 오차를 최소화하는 방법을 알아보겠습니다.&lt;br /&gt;짐 한참 공부중입니다^^;;;;&lt;br /&gt;&lt;br /&gt;'실제 수학적 이론을 분석하여 코드로 접근'하는 방식으로 진행하도록 하겠습니다. &lt;br /&gt;&lt;br /&gt;- &amp;nbsp; [ 대발이의 그까이꺼~! ]&amp;nbsp; Kalman Filter게 섯거라~! &amp;nbsp; -기대해 주세요ㅋ&lt;br /&gt;&lt;br /&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>SNMP Library of GSS System </title>
            <link>http://www.swssm.org/index.php?idx=310</link>
            <description>&lt;P style=&quot;MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal&gt;&lt;FONT size=2 face=&quot;맑은 고딕&quot;&gt;현재 구현하고 있는&lt;SPAN lang=EN-US&gt; SNMP Library&lt;/SPAN&gt;의&lt;SPAN lang=EN-US&gt; Class Diagram&lt;/SPAN&gt;을 살펴 봄으로써&lt;SPAN lang=EN-US&gt; SNMP &lt;/SPAN&gt;프로토콜이 어떤 식으로 되어 있으며&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;어떤 방식으로 클래스를 설계하고 사용할 수 있는 지를 살펴 보겠습니다&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;FONT size=2 face=&quot;맑은 고딕&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;현재&lt;SPAN lang=EN-US&gt; SNMP&lt;/SPAN&gt;는&lt;SPAN lang=EN-US&gt; Version 1, Version 2(&lt;/SPAN&gt;두 가지 버전&lt;SPAN lang=EN-US&gt;), Version 3&lt;/SPAN&gt;를 지원합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;그러나 현재 대부분의&lt;SPAN lang=EN-US&gt; SNMP&lt;/SPAN&gt;를 지원하는 장비들은&lt;SPAN lang=EN-US&gt; Version 1&lt;/SPAN&gt;을 기본적으로 지원하기 때문의 구현 하려고 하는&lt;SPAN lang=EN-US&gt; SNMP Protocol&lt;/SPAN&gt;은 &lt;SPAN lang=EN-US&gt;Version 1&lt;/SPAN&gt;을 기준으로 하겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT size=2 face=&quot;맑은 고딕&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;P style=&quot;MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;아래는 설계된&lt;SPAN lang=EN-US&gt; Class Diagram&lt;/SPAN&gt;이 되겠습니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;[##_1C|1376869021.png|width=&quot;600&quot; height=&quot;358&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;STRONG&gt;&lt;STRONG&gt;&amp;lt;SNMP Library Class Diagram&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt; &lt;P style=&quot;TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal align=left&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SNMP Library&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;에 대한 이해를 돕기 위해서 중요한 클래스에 대해서 간단히 살펴 보겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;P style=&quot;TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal align=left&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;ISnmpApp&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;Snmp PDU&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;를 생성해서 이를&lt;SPAN lang=EN-US&gt; Agent&lt;/SPAN&gt;에 전송하고 응답을 처리하기 위한&lt;SPAN lang=EN-US&gt; Applicatin &lt;/SPAN&gt;부분의 프로그램을 추상화한 추상 클래스이다&lt;SPAN lang=EN-US&gt;. _responses&lt;/SPAN&gt;는&lt;SPAN lang=EN-US&gt; List&amp;lt;string&amp;gt; &lt;/SPAN&gt;형의 데이터 타입으로서&lt;SPAN lang=EN-US&gt; Agent&lt;/SPAN&gt;에 요청한 결과 값들을 저장하고 있는 변수 입니다&lt;SPAN lang=EN-US&gt;. _snmpPDU&lt;/SPAN&gt;를&lt;SPAN lang=EN-US&gt; SNMP &lt;/SPAN&gt;프로토콜&lt;SPAN lang=EN-US&gt; Version 1&lt;/SPAN&gt;의&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성하는 역할을 합니다&lt;SPAN lang=EN-US&gt;. _snmpPDUProperty&lt;/SPAN&gt;는&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성하기 위한 여러가지 정보&lt;SPAN lang=EN-US&gt;, &lt;/SPAN&gt;예를 들어&lt;SPAN lang=EN-US&gt; IP, community, version, object ID &lt;/SPAN&gt;등이 되겠습니다&lt;SPAN lang=EN-US&gt;. CreatePDU()&lt;/SPAN&gt;를 통해서&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성하고&lt;SPAN lang=EN-US&gt; Run() &lt;/SPAN&gt;함수를 추상 함수로 선언만 해놓고 구현은&lt;SPAN lang=EN-US&gt; SnmpGet, SnmpWalk&lt;/SPAN&gt;에 위임합니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpGet&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpGet&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;은&lt;SPAN lang=EN-US&gt; ISnmpApp&lt;/SPAN&gt;를 상속 받아서&lt;SPAN lang=EN-US&gt; Run()&lt;/SPAN&gt;을 구현 합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;단 한 개의 &lt;SPAN lang=EN-US&gt;object ID&lt;/SPAN&gt;를 입력 받아서&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성해서 그에 대한 결과 값을 얻을 수 있는 클래스입니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;오직 단 한 개의&lt;SPAN lang=EN-US&gt; object&lt;/SPAN&gt;의 정보를 얻을 수 있습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpWalk&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpWalk&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;는&lt;SPAN lang=EN-US&gt; ISnmpApp&lt;/SPAN&gt;를 상속 받아서&lt;SPAN lang=EN-US&gt; Run()&lt;/SPAN&gt;을 구현 합니다&lt;SPAN lang=EN-US&gt;. SnmpGet&lt;/SPAN&gt;가 오직 단 한 개의&lt;SPAN lang=EN-US&gt; object&lt;/SPAN&gt;의 정보만 얻을 수 있는 거와 달리&lt;SPAN lang=EN-US&gt;, SnmpWalk&lt;/SPAN&gt;는 요청된&lt;SPAN lang=EN-US&gt; object ID&lt;/SPAN&gt;의 하위&lt;SPAN lang=EN-US&gt; object&lt;/SPAN&gt;의 모든 정보를 얻어서 반환하게 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;결론적으로&lt;SPAN lang=EN-US&gt; SnmpWalk&lt;/SPAN&gt;는&lt;SPAN lang=EN-US&gt; SnmpGet&lt;/SPAN&gt;의 연속적인 요청이라 봐도 무방합니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpPDU&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SNMP PDU&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;를 생성하는 부분으로&lt;SPAN lang=EN-US&gt; SnmpPDUProperty &lt;/SPAN&gt;클래스와&lt;SPAN lang=EN-US&gt; SnmpPDUMaker &lt;/SPAN&gt;클래스를 이용해서&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성하는 클래스입니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpPDUMaker&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;실제&lt;SPAN lang=EN-US&gt; SNMP PDU&lt;/SPAN&gt;를 생성하는 클래스입니다&lt;SPAN lang=EN-US&gt;. SnmpPDUProperty &lt;/SPAN&gt;클래스의 정보를 이용해서&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성합니다&lt;SPAN lang=EN-US&gt;. RFC 1157&lt;/SPAN&gt;에 정의된&lt;SPAN lang=EN-US&gt; Version 1&lt;/SPAN&gt;의 형식에 맞게&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;가 생성됩니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpPDUProperty&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SNMP PDU&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;를 생성하기 위한 정보들이 들어갑니다&lt;SPAN lang=EN-US&gt;. PDU Type, Version, Community, Object ID, Request ID &lt;/SPAN&gt;등이 되겠습니다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SnmpPDUParser&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;Agent&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;로부터 수신 받은&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를&lt;SPAN lang=EN-US&gt; Parsing &lt;/SPAN&gt;하는 클래스이다&lt;SPAN lang=EN-US&gt;.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;UDPClient&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt; &lt;UL&gt; &lt;UL&gt; &lt;LI&gt;&lt;SPAN style=&quot;FONT-FAMILY: Wingdings&quot; lang=EN-US&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;SPAN style=&quot;FONT: 7pt 'Times New Roman'; -x-system-font: none; font-size-adjust: none; font-stretch: normal&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;SNMP Protocol&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;은 &lt;SPAN lang=EN-US&gt;UDP/IP&lt;/SPAN&gt;를 통해서 효율적으로 데이터를 보내게 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;만들어진&lt;SPAN lang=EN-US&gt; SNMP PDU&lt;/SPAN&gt;를 전송하기 위해서 이&lt;SPAN lang=EN-US&gt; UDPClient &lt;/SPAN&gt;클래스를 구현하였습니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;타겟의&lt;SPAN lang=EN-US&gt; IP&lt;/SPAN&gt;와&lt;SPAN lang=EN-US&gt; Port &lt;/SPAN&gt;번호를 지정해서 만들어진&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 전송하고 동기적으로 데이터를 수신하게 됩니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;&lt;br /&gt; &lt;P style=&quot;TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal align=left&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;간단하게&lt;SPAN lang=EN-US&gt; SNMP Library&lt;/SPAN&gt;에 대해서 살펴 보았으니 이를 사용해야 할 것입니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;만들어진&lt;SPAN lang=EN-US&gt; Library&lt;/SPAN&gt;를 사용하는 샘플 코드와 실제 만들어진&lt;SPAN lang=EN-US&gt; SNMP PDU&lt;/SPAN&gt;가 정확한지를 테스트 하기 위해서 테스트 케이스를 통해서 확인을 해보았습니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;&lt;br /&gt;[##_1C|1384430639.png|width=&quot;534&quot; height=&quot;720&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;STRONG&gt;&lt;STRONG&gt;&lt;br /&gt;[##_1C|1374325349.png|width=&quot;507&quot; height=&quot;659&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&amp;lt;SNMP PDU 테스트 케이스&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;STRONG&gt;&lt;br /&gt;&lt;/STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: '맑은 고딕'; FONT-SIZE: 10pt&quot;&gt;아래는&lt;SPAN lang=EN-US&gt; SNMP Library&lt;/SPAN&gt;를 가지고 실제&lt;SPAN lang=EN-US&gt; Agent&lt;/SPAN&gt;에 접속해서 데이터를 가져오는&lt;SPAN lang=EN-US&gt; SnmpTester&lt;/SPAN&gt;의&lt;SPAN lang=EN-US&gt; Application &lt;/SPAN&gt;모습입니다&lt;SPAN lang=EN-US&gt;. &lt;/SPAN&gt;접속하려는&lt;SPAN lang=EN-US&gt; Agent&lt;/SPAN&gt;의 정보를 입력하고&lt;SPAN lang=EN-US&gt; PDU &lt;/SPAN&gt;정보를 입력하면&lt;SPAN lang=EN-US&gt; PDU&lt;/SPAN&gt;를 생성해서&lt;SPAN lang=EN-US&gt; Agent&lt;/SPAN&gt;에 전송하고 응답 받은 결과를 파싱하여 텍스트 박스에 출력하는 테스트 프로그램입니다&lt;SPAN lang=EN-US&gt;.&lt;br /&gt;[##_1C|1122234174.png|width=&quot;600&quot; height=&quot;414&quot; alt=&quot;사용자 삽입 이미지&quot;|_##]&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt; &lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&amp;nbsp; &lt;STRONG&gt;&amp;lt;SnmpTester Application&amp;gt;&lt;/STRONG&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/FONT&gt; &lt;P style=&quot;MARGIN: 0cm 0cm 0pt&quot; class=MsoNormal&gt;&lt;FONT size=2&gt;&lt;FONT face=&quot;맑은 고딕&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;SPAN style=&quot;Z-INDEX: 10000; POSITION: absolute; PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; COLOR: infotext; TOP: 1629px; CURSOR: pointer; PADDING-TOP: 1px; LEFT: 579px; -moz-appearance: tooltip&quot;&gt;save&lt;/SPAN&gt;
</description>
            <author>Samsung Software Membership</author>
            <pubDate>Thu, 01 Jan 1970 00:00:00 +0900</pubDate>
        </item>
        <item>
            <title>초간단 마우스 및 키보드 전역 후킹 방법 </title>
            <link>http://www.swssm.org/index.php?idx=311</link>
            <description>&lt;P&gt;보통 마우스 및 키보드의 메시지를 후킹하는 방법은 WH_KEYBOARD 나 WH_MOUSE를 후킹하는 코드를 &lt;br /&gt;DLL 파일로 만들어서 다이나믹 로딩하는 기법을 많이 사용한다. &lt;br /&gt;하지만 WH_KEYBOARD_LL 과 WH_MOUSE_LL 이 지원되는 NT 4.0 이상 윈도우 에서는 &lt;br /&gt;DLL을 이용하지않고 프로그램 소스에서 바로 후킹이 가능하다.&lt;/P&gt; &lt;P&gt;후킹 방법은 다음과 같다.&lt;br /&gt;먼저 후킹해서 후킹된 메시지를 받을 함수와 훅 핸들러를 적절한 위치에 선언한다. &lt;br /&gt;LRESULT CALLBACK KeboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) ;&lt;br /&gt;HHOOK m_hook_keboard