<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>EMSTONE Bebop &#187; Coding</title>
	<atom:link href="http://bebop.emstone.com/tags/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://bebop.emstone.com</link>
	<description>엠스톤 개발팀 블로그</description>
	<lastBuildDate>Sun, 29 Jan 2012 05:25:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
		<item>
		<title>ClutterGst 메모리 누수 디버깅</title>
		<link>http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=clutter-gst-memory-leak-debugging&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cluttergst-%25eb%25a9%2594%25eb%25aa%25a8%25eb%25a6%25ac-%25eb%2588%2584%25ec%2588%2598-%25eb%2594%2594%25eb%25b2%2584%25ea%25b9%2585</link>
		<comments>http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=clutter-gst-memory-leak-debugging#comments</comments>
		<pubDate>Wed, 28 Sep 2011 10:20:29 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1809</guid>
		<description><![CDATA[최근 클러터를 이용한 프로그램을 개발하면서 메모리 누수 현상을 발견했습니다. 코드를 하나 하나 막아가면서 테스트를 한 결과 ClutterGstVideoSink 객체를 사용하지 않으면 메모리 누수가 발생하지 않았습니다. 하지만, 아무리 소스를 분석해도 원인을 찾아낼 수 없었고, 잘못된 부분도 없는 것 같았습니다. 물론 구글링을 해도, &#8230; <a href="http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/">Continue reading <span>&#8594;</span></a> <a href="http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=clutter-gst-memory-leak-debugging">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>최근 <a href="http://lethean.pe.kr/2011/09/15/note-about-using-clutter/">클러터를 이용한 프로그램을 개발</a>하면서 메모리 누수 현상을 발견했습니다. 코드를 하나 하나 막아가면서 테스트를 한 결과 <a href="http://developer.gnome.org/clutter-gst/1.3/ClutterGstVideoSink.html"><code>ClutterGstVideoSink</code></a> 객체를 사용하지 않으면 메모리 누수가 발생하지 않았습니다. 하지만, 아무리 소스를 분석해도 원인을 찾아낼 수 없었고, 잘못된 부분도 없는 것 같았습니다. 물론 구글링을 해도, 검색 실력이 미천한지, 답을 찾을 수 없었습니다.</p>
<p>그래서 결국 예전에 소개한 적 있는 <a href="http://lethean.pe.kr/2009/06/18/debugging-memory-leaks-with-tcmalloc-google-perftools/">구글 성능 도구(google-perftools)를 이용해 디버깅</a>을 했습니다. 그런데 문제는, <a href="http://www.archlinux.org/">아치 리눅스(Arch Linux)</a> x86_64 환경으로 개발 환경을 바꾸면서 메모리 프로파일 기능이 제대로 동작하지 않는다는 사실인데, 특히 메모리 누수 발생 지점을 정확하게 알기 위해서 필요한 함수 호출 백트레이스(backtrace) 정보가 추출되지 않는 게 가장 큰 문제였습니다. 이 문제를 해결하기 위한 과정을 기록으로 남겨봅니다.</p>
<p><strong>구글 성능 도구 설치</strong></p>
<p>아치 리눅스(Arch Linux) x86_64 환경에서 구글 성능 도구(google-perftools)가 정확한 메모리 프로파일 결과를 얻으려면 <a href="http://www.nongnu.org/libunwind/">libunwind</a> 라이브러리를 설치해야 하는데, 아치리눅스 <a href="https://wiki.archlinux.org/index.php/AUR">AUR</a> 패키지를 <a href="https://wiki.archlinux.org/index.php/Yaourt">yaourt</a>를 이용해 다음과 같이 쉽게 설치했습니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ yaourt <span style="color: #660033;">-S</span> libunwind</pre></div></div>

<p>그리고 다음과 같이 구글 성능 도구를 빌드하고 설치합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> google-perftools
$ .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr <span style="color: #660033;">--enable-frame-pointers</span>
$ <span style="color: #c20cb9; font-weight: bold;">make</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p><strong>라이브러리 패키지 재생성 및 재설치</strong></p>
<p>정확한 함수 호출 백트레이스(backtrace) 정보를 얻기 위해 프로그램에 사용되는 모든 라이브러리를 다시 컴파일해 패키지를 다시 설치해야 하는데, 그 과정은 다음과 같습니다. (<a href="https://wiki.archlinux.org/index.php/Debug_-_Getting_Traces">관련 위키 페이지</a> 참고)</p>
<p>먼저 아치 리눅스 빌드 시스템(ABS) 정보를 동기화합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> abs</pre></div></div>

<p>그러면 <code>/var/abs</code> 디렉토리 밑에 모든 공식 패키지의 빌드 정보가 다운로드됩니다.</p>
<p>라이브러리의 패키지 빌드 옵션을 수정하기 위해, <code>/etc/makepkg.conf</code> 파일에서 아래 부분을 찾아 디버그 심볼(<code>-g</code>)과 프레임 포인터 포함(<code>-fno-omit-frame-pointer</code>) 컴파일 옵션을 추가하고 빌드 옵션에서 <code>strip</code>을 제외합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;-g -fno-omit-frame-pointer -march=x86-64 -mtune=generic -O2 -pipe&quot;</span>
<span style="color: #007800;">CXXFLAGS</span>=<span style="color: #ff0000;">&quot;-g -fno-omit-frame-pointer -march=x86-64 -mtune=generic -O2 -pipe&quot;</span>
<span style="color: #007800;">OPTIONS</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span><span style="color: #c20cb9; font-weight: bold;">strip</span> docs libtool emptydirs zipman purge<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p><code>/var/abs/local</code> 디렉토리로 이동해서(없으면 새로 생성) 다음과 같이 사용되는 프로그램에 사용되는 모든 라이브러리 패키지를 다시 생성하고 설치합니다. 예를 들어 클러터 라이브러리는 다음과 같습니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">src</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs <span style="color: #660033;">-name</span> clutter <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-r</span> <span style="color: #007800;">$src</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span>
$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>clutter
$ makepkg <span style="color: #660033;">-f</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pacman <span style="color: #660033;">-U</span> <span style="color: #000000; font-weight: bold;">*</span>.pkg.tar.xz</pre></div></div>

<p>위와 같은 방식으로 clutter, cogl, glib2, glibc 패키지를 다시 만들고 설치합니다.</p>
<p><strong>메모리 프로파일링</strong></p>
<p>이제 다음 명령으로 디버깅할 프로그램(<code>eview-demo</code>)을 실행합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">G_SLICE</span>=always-malloc \
  <span style="color: #007800;">HEAPPROFILE</span>=<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile \
  <span style="color: #007800;">HEAP_PROFILE_ALLOCATION_INTERVAL</span>=<span style="color: #000000;">10737418240</span> \
  <span style="color: #007800;">LD_PRELOAD</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libtcmalloc.so \
  .<span style="color: #000000; font-weight: bold;">/</span>eview-demo
Starting tracking the heap
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0001.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0002.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0003.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0004.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>정상적으로 구글 성능 도구의 메모리 프로파일러가 동작하면 위와 같은 메시지가 출력됩니다. 이제 적당한 시점에서 프로그램을 멈추고, 다음과 같이 프로파일링 데이터를 분석합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pprof \
    <span style="color: #660033;">--pdf</span> \
    <span style="color: #660033;">--lines</span> \
    <span style="color: #660033;">--base</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0001.heap \
    .<span style="color: #000000; font-weight: bold;">/</span>eview-demo \
    <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0004.heap \
    <span style="color: #000000; font-weight: bold;">&gt;</span> profile-<span style="color: #000000;">1</span>.pdf</pre></div></div>

<p>이렇게 생성된 그래프는 다음과 같습니다. (<a href="http://lethean.pe.kr/wp-content/uploads/2011/09/clutter-1.6-memory-leak-profile.pdf">PDF </a>형식도 있습니다)</p>
<p><a href="http://lethean.pe.kr/wp-content/uploads/2011/09/clutter-1.6-memory-leak-profile.jpg" rel="lightbox[1809]"><img class="aligncenter size-large wp-image-1810" title="clutter-1.6-memory-leak-profile" src="http://lethean.pe.kr/wp-content/uploads/2011/09/clutter-1.6-memory-leak-profile-1024x884.jpg" alt="" width="584" height="504" /></a></p>
<p>이 그래프를 분석해서 관련 코드를 분석해 보니, 결정적으로 두 군데에 문제가 있습니다. 첫번째는 <code>cogl_pipeline_fragend_arbfp_start()</code> 함수 내부에서 생성한 <code>arbfp_program_state</code> 객체를 해제하는 곳이 없다는 점이고, 두번째는 <code>cogl_pipeline_get_layers()</code> 함수에서 생성한 <code>deprecated_get_layers_list</code> 리스트를 해제하는 곳이 없다는 점입니다. 그런데 최근 클러터 1.8 버전 소스를 보면 두번째 문제는 해결이 된 것 같은데, 첫번째 문제가 있는 곳은 코드 수정이 많이 되어 해결 여부를 알 수가 없습니다.</p>
<p>그래서 결론은, 며칠 전에 릴리스된 클러터 1.8 안정 버전이 아치 리눅스 패키지로 올라오면 다시 메모리 누수 여부를 확인해볼 예정입니다. (GNOME 3 핵심 라이브러리를 직접 컴파일해서 사용하는게 귀찮기도 하고 두렵기도 해서입니다&#8230; :)</p>
<p><strong>[UPDATE 2011-10-04]</strong> 클러터 1.8 버전에서 확인해 보니 메모리 누수 문제가 해결된 것 같습니다. 역시, 미루기를 잘 했습니다. ;)</p>
<p><strong>[UPDATE 2011-10-05]</strong> 다시 확인해 보니, 이제는 다른 부분에서 메모리 누수가 발생합니다. 그래서 이번에는 당당히(?) 버그 리포팅(<a href="https://bugzilla.gnome.org/show_bug.cgi?id=660985">Bug 660985</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660986">Bug 660986</a>) 했습니다.</p>
<p><strong>[UPDATE 2011-10-10]</strong> CPU 사용량이 가장 많은 함수를 프로파일링하려면 다음과 같이 실행하면 됩니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">CPUPROFILE</span>=.<span style="color: #000000; font-weight: bold;">/</span>cpu.prof \
  <span style="color: #007800;">LD_PRELOAD</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libtcmalloc_and_profiler.so \
  .<span style="color: #000000; font-weight: bold;">/</span>eview-demo</pre></div></div>

<p>정상적으로 종료한뒤 다음과 같이 CPU 사용량을 함수별로 프로파일한 그래프를 얻을 수 있습니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pprof \
    <span style="color: #660033;">--pdf</span> \
    <span style="color: #660033;">--lines</span> \
    .<span style="color: #000000; font-weight: bold;">/</span>eview-demo \
    .<span style="color: #000000; font-weight: bold;">/</span>cpu.prof
    <span style="color: #000000; font-weight: bold;">&gt;</span> profile-<span style="color: #000000;">1</span>.pdf</pre></div></div>

<p><strong>[UPDATE 2012-02-04]</strong> 최신 아치 리눅스에 포함되어 있는 <a href="http://code.google.com/p/gperftools/issues/detail?id=396">glibc 2.15 버전의 버그</a> 때문에 프로파일링이 제대로 동작하지 않을 경우 <del datetime="2012-02-05T23:55:49+00:00"><a href="http://permalink.gmane.org/gmane.comp.lib.glibc.alpha/17093">sscanf 관련 패치</a>를 적용해 glibc 패키지를 다시 빌드하고 설치해야 합니다.</del> glibc 2.15-5 버전으로 업그레이드하면 됩니다. <a href="https://bugs.archlinux.org/task/28246">버그 리포팅</a>이 바로 반영되어 버렸습니다. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>코딩하던 노인</title>
		<link>http://lethean.pe.kr/2010/07/10/old-man-who-was-coding/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=old-man-who-was-coding&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ec%25bd%2594%25eb%2594%25a9%25ed%2595%2598%25eb%258d%2598-%25eb%2585%25b8%25ec%259d%25b8</link>
		<comments>http://lethean.pe.kr/2010/07/10/old-man-who-was-coding/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=old-man-who-was-coding#comments</comments>
		<pubDate>Sat, 10 Jul 2010 06:47:23 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1343</guid>
		<description><![CDATA[한 10년만에 가져보는 방학(?)을 만끽하느라, 오랜만에 올리는 글입니다. 다른게 아니라, Xper 메일링 리스트에 어느 분이 재미있는 글을 올리셨는데, 글에도 언급된 것처럼 예전에 비슷한 내용... <a href="http://lethean.pe.kr/2010/07/10/old-man-who-was-coding/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=old-man-who-was-coding">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[한 10년만에 가져보는 방학(?)을 만끽하느라, 오랜만에 올리는 글입니다. 다른게 아니라, Xper 메일링 리스트에 어느 분이 재미있는 글을 올리셨는데, 글에도 언급된 것처럼 예전에 비슷한 내용이 있었지만, 개인적으로는, 이 버전이 더 나은 것 같습니다. 특히 구로 디지털단지 역 앞 건물들 이름이 너무 &#8230; <a href="http://lethean.pe.kr/2010/07/10/old-man-who-was-coding/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2010/07/10/old-man-who-was-coding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>구글 프로토콜 버퍼(Protocol Buffers)</title>
		<link>http://lethean.pe.kr/2010/02/12/google-protocol-buffers/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-protocol-buffers&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ea%25b5%25ac%25ea%25b8%2580-%25ed%2594%2584%25eb%25a1%259c%25ed%2586%25a0%25ec%25bd%259c-%25eb%25b2%2584%25ed%258d%25bcprotocol-buffers</link>
		<comments>http://lethean.pe.kr/2010/02/12/google-protocol-buffers/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-protocol-buffers#comments</comments>
		<pubDate>Fri, 12 Feb 2010 00:42:42 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Wireshark]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1261</guid>
		<description><![CDATA[구글 프로토콜 버퍼 라이브러리에 대해서는 몇 번 언급을 한 적이 있는데, 관심만 있고 아직 프로젝트에 사용은 못해보고 있었습니다. 그 이유는 프로젝트 대부분이 C 언어를 사용하는데, 공 <a href="http://lethean.pe.kr/2010/02/12/google-protocol-buffers/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=google-protocol-buffers">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[구글 프로토콜 버퍼 라이브러리에 대해서는 몇 번 언급을 한 적이 있는데, 관심만 있고 아직 프로젝트에 사용은 못해보고 있었습니다. 그 이유는 프로젝트 대부분이 C 언어를 사용하는데, 공식적으로 지원하는 언어에는 없었기 때문입니다. 그런데 오늘 우분투 패키지를 업데이트하다가 protobuf-c 우분투 패키지가 있어서 확인해보니, 프로토콜 &#8230; <a href="http://lethean.pe.kr/2010/02/12/google-protocol-buffers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2010/02/12/google-protocol-buffers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GLib 테스트 프레임워크 사용하기</title>
		<link>http://lethean.pe.kr/2010/02/12/using-glib-test-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-glib-test-framework&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=glib-%25ed%2585%258c%25ec%258a%25a4%25ed%258a%25b8-%25ed%2594%2584%25eb%25a0%2588%25ec%259e%2584%25ec%259b%258c%25ed%2581%25ac-%25ec%2582%25ac%25ec%259a%25a9%25ed%2595%2598%25ea%25b8%25b0</link>
		<comments>http://lethean.pe.kr/2010/02/12/using-glib-test-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-glib-test-framework#comments</comments>
		<pubDate>Thu, 11 Feb 2010 18:33:45 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[GTK+]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1236</guid>
		<description><![CDATA[GLib 라이브러리 2.16 버전부터 지원하는 테스트 프레임워크는 C 언어용 유닛테스트 도구입니다. 물론 많은 유닛 테스트 도구가 이미 존재하지만, GLib 라이브러리 기반 C 언어 프로그램이라면  <a href="http://lethean.pe.kr/2010/02/12/using-glib-test-framework/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=using-glib-test-framework">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[GLib 라이브러리 2.16 버전부터 지원하는 테스트 프레임워크는 C 언어용 유닛테스트 도구입니다. 물론 많은 유닛 테스트 도구가 이미 존재하지만, GLib 라이브러리 기반 C 언어 프로그램이라면 굳이 다른 라이브러리를 사용하는 것보다는 이미 지원하는 훌륭한 도구를 사용하는게 더 좋겠지요. 참고로, GTK+, Clutter 등 &#8230; <a href="http://lethean.pe.kr/2010/02/12/using-glib-test-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2010/02/12/using-glib-test-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>Power of 10: 안전성이 중요한 코드 개발을 위한 규칙</title>
		<link>http://lethean.pe.kr/2010/01/25/power-of-10-rules-for-developing-safety-critical-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=power-of-10-%25ec%2595%2588%25ec%25a0%2584%25ec%2584%25b1%25ec%259d%25b4-%25ec%25a4%2591%25ec%259a%2594%25ed%2595%259c-%25ec%25bd%2594%25eb%2593%259c-%25ea%25b0%259c%25eb%25b0%259c%25ec%259d%2584-%25ec%259c%2584%25ed%2595%259c-%25ea%25b7%259c%25ec%25b9%2599</link>
		<comments>http://lethean.pe.kr/2010/01/25/power-of-10-rules-for-developing-safety-critical-code/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 03:59:39 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Embedded]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1197</guid>
		<description><![CDATA[`정적 분석과 코딩 규칙을 이용한 임베디드 소프트웨어 버그 줄이기&#8216;라는 제목의 기사를 읽다가 `Power of 10&#8216; 규칙이 언급되었길래 다시 읽어볼 기회가 생겼습니다. 기사 내용은 필자가 개발한 정적 분석 도구 제품을 홍보하는 느낌을 받았지만, 어느 정도의 가이드라인을 지킨 코드는 정적 분석 도구의 도움을 받아 미리 오류를 발견하고 수정하기가 더 쉽기 때문에 상호 보완하는 것이 좋다는 점에는 동의합니다. [...] <a href="http://lethean.pe.kr/2010/01/25/power-of-10-rules-for-developing-safety-critical-code/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[`정적 분석과 코딩 규칙을 이용한 임베디드 소프트웨어 버그 줄이기&#8216;라는 제목의 기사를 읽다가 `Power of 10&#8216; 규칙이 언급되었길래 다시 읽어볼 기회가 생겼습니다. 기사 내용은 필자가 개발한 정적 분석 도구 제품을 홍보하는 느낌을 받았지만, 어느 정도의 가이드라인을 지킨 코드는 정적 분석 도구의 도움을 받아 미리 오류를 발견하고 수정하기가 더 쉽기 때문에 상호 보완하는 것이 좋다는 점에는 동의합니다. [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2010/01/25/power-of-10-rules-for-developing-safety-critical-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GLib 메인루프 이용하기</title>
		<link>http://lethean.pe.kr/2009/09/21/using-glib-mainloop/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=glib-%25eb%25a9%2594%25ec%259d%25b8%25eb%25a3%25a8%25ed%2594%2584-%25ec%259d%25b4%25ec%259a%25a9%25ed%2595%2598%25ea%25b8%25b0</link>
		<comments>http://lethean.pe.kr/2009/09/21/using-glib-mainloop/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 09:32:05 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[GTK+]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1082</guid>
		<description><![CDATA[GLib API를 이용한 멀티쓰레드 프로그래밍에서 비동기 메시지 큐를 이용하는 방법은 지난 포스트에서 설명한 적이 있는데, 이번에는 애플 GCD의 libdispatch와 비교되는 GLib의 메인루프를 이용하는 방법을 정리해 보았습니다. 이 방법은 어떤 관점에서 보면 더 쉽고, 이미 많은 기능이 기본적으로 지원되기 때문에 몇몇 경우를 제외하면 더 좋은 방법입니다. 다만 API 사용법을 이해하기가 처음에 조금 까다롭다는 점이 걸림돌입니다.
일반적으로 GLib [...] <a href="http://lethean.pe.kr/2009/09/21/using-glib-mainloop/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[GLib API를 이용한 멀티쓰레드 프로그래밍에서 비동기 메시지 큐를 이용하는 방법은 지난 포스트에서 설명한 적이 있는데, 이번에는 애플 GCD의 libdispatch와 비교되는 GLib의 메인루프를 이용하는 방법을 정리해 보았습니다. 이 방법은 어떤 관점에서 보면 더 쉽고, 이미 많은 기능이 기본적으로 지원되기 때문에 몇몇 경우를 제외하면 더 좋은 방법입니다. 다만 API 사용법을 이해하기가 처음에 조금 까다롭다는 점이 걸림돌입니다.
일반적으로 GLib [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2009/09/21/using-glib-mainloop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GObject 객체 지향 프로그래밍 (4)</title>
		<link>http://lethean.pe.kr/2009/08/24/oop-with-gobject-4/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gobject-%25ea%25b0%259d%25ec%25b2%25b4-%25ec%25a7%2580%25ed%2596%25a5-%25ed%2594%2584%25eb%25a1%259c%25ea%25b7%25b8%25eb%259e%2598%25eb%25b0%258d-4</link>
		<comments>http://lethean.pe.kr/2009/08/24/oop-with-gobject-4/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 05:07:11 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[GTK+]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1018</guid>
		<description><![CDATA[이전 글에 계속 이어집니다.
객체 속성 정보 얻기
EdcHost 객체의 속성 정보를 실행 중에 얻어볼까 합니다.
왜 또 갑자기 불필요한 예제를 꺼내냐고 물어보실 분이 있을 것 같아 말하자면, 가끔 요긴한 경우가 있기 때문입니다. 예를 들어 EdcHost 객체를 상속받은 EdcHostDoosan, EdcHostKia, EdcHostLitte 객체가 여러 개 존재할 경우, 이 객체들은 EdcHost의 공통 속성 뿐 아니라 본인의 속성도 따로 가집니다. 이러한 [...] <a href="http://lethean.pe.kr/2009/08/24/oop-with-gobject-4/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[이전 글에 계속 이어집니다.
객체 속성 정보 얻기
EdcHost 객체의 속성 정보를 실행 중에 얻어볼까 합니다.
왜 또 갑자기 불필요한 예제를 꺼내냐고 물어보실 분이 있을 것 같아 말하자면, 가끔 요긴한 경우가 있기 때문입니다. 예를 들어 EdcHost 객체를 상속받은 EdcHostDoosan, EdcHostKia, EdcHostLitte 객체가 여러 개 존재할 경우, 이 객체들은 EdcHost의 공통 속성 뿐 아니라 본인의 속성도 따로 가집니다. 이러한 [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2009/08/24/oop-with-gobject-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GObject 객체 지향 프로그래밍 (3)</title>
		<link>http://lethean.pe.kr/2009/08/18/oop-with-gobject-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gobject-%25ea%25b0%259d%25ec%25b2%25b4-%25ec%25a7%2580%25ed%2596%25a5-%25ed%2594%2584%25eb%25a1%259c%25ea%25b7%25b8%25eb%259e%2598%25eb%25b0%258d-3</link>
		<comments>http://lethean.pe.kr/2009/08/18/oop-with-gobject-3/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 01:33:43 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[GTK+]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=980</guid>
		<description><![CDATA[이 글은 회사 개발팀 내부 세미나를 위해 작성중인 글입니다. 하지만, 블로그란 매체의 특성상 외부에도 공개되고 있는데, 댓글은 달지 않아도 접속하는 사람들 대부분이 제가 아는 분일 거라 생각하고 한마디 하자면, 세상에 공짜가 어디 있는가, 주저하지 말고 내게 연락해서 술 한 잔 사게! (언젠가부터 술 강요 청탁 협박 블로그가 되어 가고 있군&#8230;)
속성 (Properties) 추가하기
이제, GObject 속성(properties) 기능을 [...] <a href="http://lethean.pe.kr/2009/08/18/oop-with-gobject-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[이 글은 회사 개발팀 내부 세미나를 위해 작성중인 글입니다. 하지만, 블로그란 매체의 특성상 외부에도 공개되고 있는데, 댓글은 달지 않아도 접속하는 사람들 대부분이 제가 아는 분일 거라 생각하고 한마디 하자면, 세상에 공짜가 어디 있는가, 주저하지 말고 내게 연락해서 술 한 잔 사게! (언젠가부터 술 강요 청탁 협박 블로그가 되어 가고 있군&#8230;)
속성 (Properties) 추가하기
이제, GObject 속성(properties) 기능을 [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2009/08/18/oop-with-gobject-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
	</channel>
</rss>

