<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Coding</title>
	<atom:link href="http://slworkthings.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://slworkthings.wordpress.com</link>
	<description>Programming</description>
	<lastBuildDate>Mon, 07 Nov 2011 23:30:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='slworkthings.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/93bfd86fbad5b41a198969a5c249cf78?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Coding</title>
		<link>http://slworkthings.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://slworkthings.wordpress.com/osd.xml" title="Coding" />
	<atom:link rel='hub' href='http://slworkthings.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Make Android UI looks like iPhone UI</title>
		<link>http://slworkthings.wordpress.com/2011/08/11/make-android-ui-looks-like-iphone-ui/</link>
		<comments>http://slworkthings.wordpress.com/2011/08/11/make-android-ui-looks-like-iphone-ui/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 17:41:30 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=108</guid>
		<description><![CDATA[I made my Android app looks like iPhone app. See the image below.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=108&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I made my Android app looks like iPhone app. See the image below.</p>
<div id="attachment_109" class="wp-caption alignleft" style="width: 510px"><a href="http://slworkthings.files.wordpress.com/2011/08/qq.png"><img class="size-full wp-image-109" title="iPhone UI on Android" src="http://slworkthings.files.wordpress.com/2011/08/qq.png?w=500&#038;h=889" alt="iPhone UI on Android" width="500" height="889" /></a><p class="wp-caption-text">iPhone UI on Android</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=108&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2011/08/11/make-android-ui-looks-like-iphone-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>

		<media:content url="http://slworkthings.files.wordpress.com/2011/08/qq.png" medium="image">
			<media:title type="html">iPhone UI on Android</media:title>
		</media:content>
	</item>
		<item>
		<title>Make iOS UISwitch style in Qt4.</title>
		<link>http://slworkthings.wordpress.com/2011/07/13/make-ios-uiswitch-style-in-qt4/</link>
		<comments>http://slworkthings.wordpress.com/2011/07/13/make-ios-uiswitch-style-in-qt4/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 16:59:07 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[QSlider]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[stylesheet]]></category>
		<category><![CDATA[UISwitch]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=91</guid>
		<description><![CDATA[This is how to write Qt stylesheet code to make QSlider just like iPhone UISwitch on/off toggle button. 1. In QDesigner, drag QSlider into your form. 2. Modify properties. Make &#8220;minimum&#8221; to be &#8220;0&#8243;, &#8220;maximum&#8221; to be &#8220;1&#8243;, &#8220;orientation&#8221; to be &#8220;Horizontal&#8221;, etc. 3. Insert following code into the stylesheet field. QSlider { min-width:80px; min-height:27px; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=91&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 700px"><a href="http://slworkthings.files.wordpress.com/2011/07/designer_qslider.jpg"><img title="QSlider in QDesigner" src="http://slworkthings.files.wordpress.com/2011/07/designer_qslider.jpg?w=690&#038;h=577" alt="" width="690" height="577" /></a><p class="wp-caption-text">QSlider and UISwitch</p></div>
<p>This is how to write Qt stylesheet code to make QSlider just like iPhone UISwitch on/off toggle button.</p>
<p>1. In QDesigner, drag QSlider into your form.<br />
2. Modify properties. Make &#8220;minimum&#8221; to be &#8220;0&#8243;, &#8220;maximum&#8221; to be &#8220;1&#8243;, &#8220;orientation&#8221; to be &#8220;Horizontal&#8221;, etc.<br />
3. Insert following code into the stylesheet field.</p>
<p><code><br />
QSlider {<br />
min-width:80px;<br />
min-height:27px;<br />
max-width:80px;<br />
max-height:27px;<br />
}<br />
QSlider::groove:horizontal {<br />
background-image: url(:/images/slider_bg.png);<br />
background-repeat: no-repeat;<br />
background-position:center;<br />
margin:0px;<br />
border:0px;<br />
padding:0px;<br />
}</code></p>
<p>QSlider::sub-page:horizontal {<br />
background-image: url(:/images/slider_on.png);<br />
background-repeat: no-repeat;<br />
background-position:left;<br />
background-origin:content;<br />
margin:0px;<br />
border:0px;<br />
padding-left:0px;<br />
}</p>
<p>QSlider::add-page:horizontal {<br />
background-image: url(:/images/slider_off.png);<br />
background-repeat: no-repeat;<br />
background-position:right;<br />
background-origin:content;<br />
margin:0px;<br />
border:0px;<br />
padding-right:0px;<br />
}</p>
<p>QSlider::handle:horizontal {<br />
background-image: url(:/images/slider_handle.png);<br />
width:39px;<br />
height:27px;<br />
margin:0px;<br />
border:0px;<br />
padding:0px;<br />
}</p>
<p>QSlider::sub-page:horizontal:disabled {<br />
background-image: url(:/images/slider_on_disabled.png);<br />
background-repeat: no-repeat;<br />
background-position:left;<br />
background-origin:content;<br />
margin:0px;<br />
border:0px;<br />
padding-left:0px;<br />
}</p>
<p>QSlider::add-page:horizontal:disabled {<br />
background-image: url(:/images/slider_off_disabled.png);<br />
background-repeat: no-repeat;<br />
background-position:right;<br />
background-origin:content;<br />
margin:0px;<br />
border:0px;<br />
padding-right:0px;<br />
}</p>
<p>QSlider::handle:horizontal:disabled {<br />
background-image: url(:/images/slider_handle.png);<br />
width:39px;<br />
height:27px;<br />
margin:0px;<br />
border:0px;<br />
padding:0px;<br />
}</p>
<p>4. Create your own png files like following images.</p>
<div class="wp-caption alignnone" style="width: 90px"><a href="http://slworkthings.files.wordpress.com/2011/07/slider_bg.png"><img title="slider_bg.png" src="http://slworkthings.files.wordpress.com/2011/07/slider_bg.png?w=80&#038;h=27" alt="" width="80" height="27" /></a><p class="wp-caption-text">slider_bg.png</p></div>
<p>&nbsp;</p>
<div class="wp-caption alignnone" style="width: 55px"><a href="http://slworkthings.files.wordpress.com/2011/07/slider_on.png"><img title="slider_on.png" src="http://slworkthings.files.wordpress.com/2011/07/slider_on.png?w=45&#038;h=27" alt="" width="45" height="27" /></a><p class="wp-caption-text">slider_on.png</p></div>
<p>&nbsp;</p>
<div class="wp-caption alignnone" style="width: 55px"><a href="http://slworkthings.files.wordpress.com/2011/07/slider_off.png"><img title="slider_off.png" src="http://slworkthings.files.wordpress.com/2011/07/slider_off.png?w=45&#038;h=27" alt="" width="45" height="27" /></a><p class="wp-caption-text">slider_off.png</p></div>
<p>&nbsp;</p>
<div class="wp-caption alignnone" style="width: 49px"><a href="http://slworkthings.files.wordpress.com/2011/07/slider_handle.png"><img title="slider_handle.png" src="http://slworkthings.files.wordpress.com/2011/07/slider_handle.png?w=39&#038;h=27" alt="" width="39" height="27" /></a><p class="wp-caption-text">slider_handle.png</p></div>
<p>&nbsp;</p>
<p>5. Done.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=91&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2011/07/13/make-ios-uiswitch-style-in-qt4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>

		<media:content url="http://slworkthings.files.wordpress.com/2011/07/designer_qslider.jpg" medium="image">
			<media:title type="html">QSlider in QDesigner</media:title>
		</media:content>

		<media:content url="http://slworkthings.files.wordpress.com/2011/07/slider_bg.png" medium="image">
			<media:title type="html">slider_bg.png</media:title>
		</media:content>

		<media:content url="http://slworkthings.files.wordpress.com/2011/07/slider_on.png" medium="image">
			<media:title type="html">slider_on.png</media:title>
		</media:content>

		<media:content url="http://slworkthings.files.wordpress.com/2011/07/slider_off.png" medium="image">
			<media:title type="html">slider_off.png</media:title>
		</media:content>

		<media:content url="http://slworkthings.files.wordpress.com/2011/07/slider_handle.png" medium="image">
			<media:title type="html">slider_handle.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Recursively remove a directory in Qt4</title>
		<link>http://slworkthings.wordpress.com/2011/05/18/recursively-remove-a-directory-in-qt4/</link>
		<comments>http://slworkthings.wordpress.com/2011/05/18/recursively-remove-a-directory-in-qt4/#comments</comments>
		<pubDate>Wed, 18 May 2011 19:49:32 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt4]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=85</guid>
		<description><![CDATA[Today I wrote a code to remove a directory and all its sub-directories and files. bool MyUtil::removeDir(const QString&#38; dirName) {     bool result = true;     QDir dir(dirName);     if (dir.exists(dirName))     {         Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot&#124;QDir::AllDirs&#124;QDir::Files, QDir::DirsFirst))         {             if (info.isDir())                 result = removeDir(info.absoluteFilePath());             else                 result = QFile::remove(info.absoluteFilePath());             if [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=85&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today I wrote a code to remove a directory and all its sub-directories and files.</p>
<p><code><br />
<span style="color:#0000ff;">bool MyUtil::removeDir(const QString&amp; dirName)</span><br />
<span style="color:#0000ff;">{</span><br />
<span style="color:#0000ff;">    bool result = true;</span><br />
<span style="color:#0000ff;">    QDir dir(dirName);</span></code></p>
<p><span style="color:#0000ff;">    if (dir.exists(dirName)) </span><br />
<span style="color:#0000ff;">    {</span><br />
<span style="color:#0000ff;">        Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllDirs|QDir::Files, QDir::DirsFirst)) </span><br />
<span style="color:#0000ff;">        {</span><br />
<span style="color:#0000ff;">            if (info.isDir()) </span><br />
<span style="color:#0000ff;">                result = removeDir(info.absoluteFilePath());</span><br />
<span style="color:#0000ff;">            else </span><br />
<span style="color:#0000ff;">                result = QFile::remove(info.absoluteFilePath());</span></p>
<p><span style="color:#0000ff;">            if (!result) </span><br />
<span style="color:#0000ff;">                return result;</span><br />
<span style="color:#0000ff;">        }</span><br />
<span style="color:#0000ff;">        result = dir.rmdir(dirName);</span><br />
<span style="color:#0000ff;">    }</span><br />
<span style="color:#0000ff;">    else</span><br />
<span style="color:#0000ff;">    {</span><br />
<span style="color:#0000ff;">        QFile file(dirName);</span><br />
<span style="color:#0000ff;">        if (file.exists())</span><br />
<span style="color:#0000ff;">            result = file.remove();</span><br />
<span style="color:#0000ff;">    }</span></p>
<p><span style="color:#0000ff;">    return result;</span><br />
<span style="color:#0000ff;">}//removeDir()</span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=85&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2011/05/18/recursively-remove-a-directory-in-qt4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>How to compile ffmpeg/x264 for Windows</title>
		<link>http://slworkthings.wordpress.com/2011/04/04/how-to-compile-ffmpegx264-for-windows/</link>
		<comments>http://slworkthings.wordpress.com/2011/04/04/how-to-compile-ffmpegx264-for-windows/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 21:35:06 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[x264]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=77</guid>
		<description><![CDATA[Very good script that will checkout codes and compile libraries. Nice! http://csbarn.blogspot.com/2011/02/how-to-compile-ffmpegx264-for-windows.html<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=77&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Very good script that will checkout codes and compile libraries. Nice!</p>
<p>http://csbarn.blogspot.com/2011/02/how-to-compile-ffmpegx264-for-windows.html</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=77&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2011/04/04/how-to-compile-ffmpegx264-for-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>Android NDK with PThread</title>
		<link>http://slworkthings.wordpress.com/2011/03/21/android-ndk-with-pthread/</link>
		<comments>http://slworkthings.wordpress.com/2011/03/21/android-ndk-with-pthread/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 21:19:33 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[JNI]]></category>
		<category><![CDATA[NDK]]></category>
		<category><![CDATA[pthread]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=73</guid>
		<description><![CDATA[After spending several hours debugging, I finally figure out how to solve the crash in my native code while calling pthread_exit(). The log showed &#8220;thread exiting, not yet detached (count=0)&#8220;. Scenario: I have an Android java code which will call my JNI (NDK) native code. In my native code, I create a pthread and in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=73&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>After spending several hours debugging, I finally figure out how to solve the crash in my native code while calling <strong>pthread_exit()</strong>. The log showed &#8220;<span style="color:#ff0000;"><strong>thread exiting, not yet detached (count=0)</strong></span>&#8220;.</p>
<p><span style="color:#0000ff;">Scenario:</span></p>
<p>I have an <strong>Android</strong> java code which will call my JNI (<strong>NDK</strong>) native code. In my native code, I create a pthread and in my pthread loop, I called <strong>AttachCurrentThread() </strong>to the JVM in the beginning of the loop.</p>
<p>When my java code finish some jobs, I need to stop the pthread and it crashed at the end of pthread loop.</p>
<p><span style="color:#0000ff;">Solution:</span></p>
<p>So, before I exit my pthread loop (before calling pthread_exit), I need to make sure I do call <strong>DetachCurrentThread</strong> from JVM.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=73&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2011/03/21/android-ndk-with-pthread/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>libspeex and Android.mk</title>
		<link>http://slworkthings.wordpress.com/2011/02/14/libspeex-and-android-mk/</link>
		<comments>http://slworkthings.wordpress.com/2011/02/14/libspeex-and-android-mk/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:16:40 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Android.mk]]></category>
		<category><![CDATA[libspeex]]></category>
		<category><![CDATA[NDK]]></category>
		<category><![CDATA[speex]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=68</guid>
		<description><![CDATA[This is an update of how I build libspeex.a in Android NDK-r4b environment. create a speex jni android project with following command line &#62; android create project -n mySpeex -t android-3 -p mySpeex -k com.slworkthings.mySpeex -a mySpeex create a sub directory called &#8216;jni&#8217; under mySpeex; download libspeex tar file and extract under jni directory. &#62;mkdir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=68&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>This is an update of how I build libspeex.a in Android <strong>NDK-r4b</strong> environment.</h2>
<ul>
<li>create a speex jni android project with following command line</li>
</ul>
<table>
<tbody>
<tr>
<td bgcolor="#cccccc"><code> &gt; android create project -n mySpeex -t android-3 -p mySpeex -k com.slworkthings.mySpeex -a mySpeex</code></td>
</tr>
</tbody>
</table>
<ul>
<li>create a sub directory called &#8216;jni&#8217; under mySpeex; download libspeex tar file and extract under jni directory.</li>
</ul>
<table>
<tbody>
<tr>
<td bgcolor="#cccccc"><code> &gt;mkdir jni<br />
&gt;cd jni<br />
&gt;mv speex-2.1r speex<br />
&gt;cd speex/libspeex</code></td>
</tr>
</tbody>
</table>
<ul>
<li>create a Android.mk file with following content.</li>
</ul>
<table>
<tbody>
<tr>
<td bgcolor="#cccccc"><code> LOCAL_PATH := $(call my-dir)</code>&nbsp;</p>
<p>include $(CLEAR_VARS)</p>
<p>LOCAL_MODULE    := libspeex<br />
LOCAL_CFLAGS = -DFIXED_POINT -DEXPORT=&#8221;" -UHAVE_CONFIG_H -I$(LOCAL_PATH)/../include</p>
<p>LOCAL_SRC_FILES :=  \<br />
./bits.c \<br />
./buffer.c \<br />
./cb_search.c \<br />
./exc_10_16_table.c \<br />
./exc_10_32_table.c \<br />
./exc_20_32_table.c \<br />
./exc_5_256_table.c \<br />
./exc_5_64_table.c \<br />
./exc_8_128_table.c \<br />
./filterbank.c \<br />
./filters.c \<br />
./gain_table.c \<br />
./gain_table_lbr.c \<br />
./hexc_10_32_table.c \<br />
./hexc_table.c \<br />
./high_lsp_tables.c \<br />
./jitter.c \<br />
./kiss_fft.c \<br />
./kiss_fftr.c \<br />
./lpc.c \<br />
./lsp.c \<br />
./lsp_tables_nb.c \<br />
./ltp.c \<br />
./mdf.c \<br />
./modes.c \<br />
./modes_wb.c \<br />
./nb_celp.c \<br />
./preprocess.c \<br />
./quant_lsp.c \<br />
./resample.c \<br />
./sb_celp.c \<br />
./scal.c \<br />
./smallft.c \<br />
./speex.c \<br />
./speex_callbacks.c \<br />
./speex_header.c \<br />
./stereo.c \<br />
./testdenoise.c \<br />
./testecho.c \<br />
./testenc.c \<br />
./testenc_uwb.c \<br />
./testenc_wb.c \<br />
./testjitter.c \<br />
./vbr.c \<br />
./vq.c \<br />
./window.c</p>
<p>include $(BUILD_STATIC_LIBRARY)</td>
<p>&nbsp;</tr>
</tbody>
</table>
<p>&nbsp;</p>
<ul>
<li>build the native library.</li>
</ul>
<table>
<tbody>
<tr>
<td bgcolor="#cccccc"><code> &gt;cd to mySpeex directory<br />
&gt;$NDK_ROOT/ndk-build<br />
</code></td>
</tr>
</tbody>
</table>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/68/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=68&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2011/02/14/libspeex-and-android-mk/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>An interesting logic and memory programming question</title>
		<link>http://slworkthings.wordpress.com/2010/08/04/an-interesting-logic-and-memory-programming-question/</link>
		<comments>http://slworkthings.wordpress.com/2010/08/04/an-interesting-logic-and-memory-programming-question/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 06:28:48 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=62</guid>
		<description><![CDATA[Question: A matrix with R rows and C columns of cells. Each cell contains value 1 or 0 to represent its generation live or dead. To compute next generation of each cell, we will need to get the value of the sum of the cell&#8217;s neighbors. If value of sum is 2 or 3, then [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=62&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Question: A matrix with R rows and C columns of cells. Each cell contains value 1 or 0 to represent its generation live or dead. To compute next generation of each cell, we will need to get the value of the sum of the cell&#8217;s neighbors. If value of sum is 2 or 3, then its next generation value is 1; otherwise its next generation value is 0.</p>
<p>Think: We can use one RxC matrix a input data, then allocate another RxC matrix to store to output data. But, can you think of a smallest memory allocation to solve compute the next generation of the RxC input?</p>
<p>Solution: Following is my solution with source code and typescript. In RxC matrix, if (R &lt; C), then we create a 2xC matrix as a temporary matrix. Then store the next generation back to original RxC matrix. If (C &lt; R), then we create a Rx2 matrix as a temporary matrix.</p>
<div><code><br />
</code></div>
<pre>Script started on Fri 30 Jul 2010 10:27:48 AM PDT
slee@ubuntu:~/test$ cat Test.java
import java.lang.*;
import java.util.*;

public class Test
{
    private int W;
    private int H;
    private int[][] m_matrix;

    public Test(int row, int col)
    {
	H = row; W = col;
	m_matrix = new int[H][W];
	generateRandomInputMatrix();
    }

    private void generateRandomInputMatrix()
    {
	Random random = new Random();
	for (int y = 0; y &lt; H; y++)
	    for (int x = 0; x &lt; W; x++)
		m_matrix[y][x] = (random.nextBoolean() == true) ? 1 : 0;
	printMatrix("Init Matrix");
    }

    private int nextValue(int neighbor)
    {
	return (neighbor == 2 || neighbor == 3) ? 1 : 0;
    }

    public void computeNextGeneration()
    {
	boolean isWSmaller = (W &lt; H);
	int temp[][] = null;
	int x, y, neighbor, tmpCur, tmpPrev;
	if (isWSmaller)
	    temp = new int[2][W]; //tempRow0=temp[0][x], tempRow1=temp[1][x]
	else
	    temp = new int[H][2]; //tempCol0=temp[y][0], tempCol1=temp[y][1]

	if (isWSmaller)
	{
	    //1. copy row0/row1 to tempRow0/tempRow1
	    for (x = 0; x &lt; W; x++)
	    {
		temp[0][x] = m_matrix[0][x];
		temp[1][x] = m_matrix[1][x];
	    }

	    //2. compute row0 and replace matrix
	    //top-left corner &amp; top-right corner
	    neighbor = temp[1][0] + m_matrix[0][1] + m_matrix[1][1]; // top-left corner
	    m_matrix[0][0] = nextValue(neighbor);
	    neighbor = temp[0][W-2] + m_matrix[1][W-2] + m_matrix[1][W-1]; // top-right corner
	    m_matrix[0][W-1] = nextValue(neighbor);
	    //row0 except 2 corners
	    for (x = 1; x &lt; W-1; x++)
	    {
		neighbor = temp[0][x-1] + temp[0][x+1] + m_matrix[1][x-1] + m_matrix[1][x] + m_matrix[1][x+1];
		m_matrix[0][x] = nextValue(neighbor);
	    }

	    //2. for 2 ~ H-1
	    //	 if (even)
	    //	     copy rowN to tempRow0, compute generation rowN with tempRow1, and replace matrix
	    //	 if (odd)
	    //	     copy rowN to tempRow1, compute generation rowN with tempRow0, and replace matrix
	    //
	    for (y = 1; y &lt; H-1; y++)
	    {
		tmpCur = y%2;
		tmpPrev = (tmpCur == 0) ? 1 : 0;

		//copy rowY to tempRowOdd or tempRowEven
		for (x = 0; x &lt; W; x++)
		    temp[tmpCur][x] = m_matrix[y][x];

		//left-most &amp; right-most side cell
		neighbor = temp[tmpPrev][0] + temp[tmpPrev][1] + temp[tmpCur][1] + m_matrix[y+1][0] + m_matrix[y+1][1]; //left side
		m_matrix[y][0] = nextValue(neighbor);
		neighbor = temp[tmpPrev][W-1] + temp[tmpPrev][W-2] + temp[tmpCur][W-2] + m_matrix[y+1][W-1] + m_matrix[y+1][W-2]; //right side
		m_matrix[y][W-1] = nextValue(neighbor);

		for (x = 1; x &lt; W-1; x++)
		{
		    neighbor = temp[tmpPrev][x-1] + temp[tmpPrev][x] + temp[tmpPrev][x+1] +
			       temp[tmpCur][x-1] + temp[tmpCur][x+1] +
			       m_matrix[y+1][x-1] + m_matrix[y+1][x] + m_matrix[y+1][x+1];
		    m_matrix[y][x] = nextValue(neighbor);
		}//for(x)
	    }//for(y)

	    //3. last row; similar to row0
	    y = H-1;
	    tmpCur = y%2;
	    tmpPrev = (tmpCur == 0) ? 1 : 0;

	    //copy rowY to tempRowOdd or tempRowEven
	    for (x = 0; x &lt; W; x++)
		temp[tmpCur][x] = m_matrix[y][x];
	    //bottom-left corner &amp; bottom-right corner
	    neighbor = temp[tmpPrev][0] + temp[tmpPrev][1] + temp[tmpCur][1]; //bottom-left corner
	    m_matrix[y][0] = nextValue(neighbor);
	    neighbor = temp[tmpPrev][W-1] + temp[tmpPrev][W-2] + temp[tmpCur][W-2];//bottom-right corner
	    m_matrix[y][W-1] = nextValue(neighbor);
	    //rowN-1 except 2 corners
	    for (x = 1; x &lt; W-1; x++)
	    {
		neighbor = temp[tmpPrev][x-1] + temp[tmpPrev][x] + temp[tmpPrev][x+1] + temp[tmpCur][x-1] + temp[tmpCur][x+1];
		m_matrix[y][x] = nextValue(neighbor);
	    }

	}
	else
	{
	    //1. copy col0/col1 to tempCol0/tempCol1
	    for (y = 0; y &lt; H; y++)
	    {
		temp[y][0] = m_matrix[y][0];
		temp[y][1] = m_matrix[y][1];
	    }

	    //2. compute col0 and replace matrix
	    //top-left corner &amp; bottom-left corner
	    neighbor = temp[1][0] + m_matrix[0][1] + m_matrix[1][1]; // top-left corner
	    m_matrix[0][0] = nextValue(neighbor);
	    neighbor = temp[H-2][0] + m_matrix[H-2][1] + m_matrix[H-1][1]; // bottom-left corner
	    m_matrix[H-1][0] = nextValue(neighbor);
	    //col0 except 2 corners
	    for (y = 1; y &lt; H-1; y++)
	    {
		neighbor = temp[y-1][0] + temp[y+1][0] + m_matrix[y-1][1] + m_matrix[y][1] + m_matrix[y+1][1];
		m_matrix[y][0] = nextValue(neighbor);
	    }

	    //2. for 2 ~ W-1
	    //	 if (even)
	    //	     copy colN to tempCol0, compute generation colN with tempCol1, and replace matrix
	    //	 if (odd)
	    //	     copy colN to tempCol1, compute generation colN with tempCol0, and replace matrix
	    //
	    for (x = 1; x &lt; W-1; x++)
	    {
		tmpCur = x%2;
		tmpPrev = (tmpCur == 0) ? 1 : 0;

		//copy colX to tempColOdd or tempColEven
		for (y = 0; y &lt; H; y++)
		    temp[y][tmpCur] = m_matrix[y][x];

		//top-most &amp; bottom-most side cell
		neighbor = temp[0][tmpPrev] + temp[1][tmpPrev] + temp[1][tmpCur] + m_matrix[0][x+1] + m_matrix[1][x+1]; //top side
		m_matrix[0][x] = nextValue(neighbor);
		neighbor = temp[H-1][tmpPrev] + temp[H-2][tmpPrev] + temp[H-2][tmpCur] + m_matrix[H-2][x+1] + m_matrix[H-1][x+1];//bottom side
		m_matrix[H-1][x] = nextValue(neighbor);

		for (y = 1; y &lt; H-1; y++)
		{
		    neighbor = temp[y-1][tmpPrev] + temp[y][tmpPrev] + temp[y+1][tmpPrev] +
			       temp[y-1][tmpCur] + temp[y+1][tmpCur] +
			       m_matrix[y-1][x+1] + m_matrix[y][x+1] + m_matrix[y+1][x+1];
		    m_matrix[y][x] = nextValue(neighbor);
		}//for(y)
	    }//for(x)

	    //3. last col; similar col0
	    x = W-1;
	    tmpCur = x%2;
	    tmpPrev = (tmpCur == 0) ? 1 : 0;

	    //copy colX to tempColOdd or tempColEven
	    for (y = 0; y &lt; H; y++)
		temp[y][tmpCur] = m_matrix[y][x];
	    //top-right corner &amp; bottom-right corner
	    neighbor = temp[0][tmpPrev] + temp[1][tmpPrev] + temp[1][tmpCur];//top-right corner
	    m_matrix[0][x] = nextValue(neighbor);
	    neighbor = temp[H-2][tmpPrev] + temp[H-1][tmpPrev] + temp[H-2][tmpCur];//bottom-right corner
	    m_matrix[H-1][x] = nextValue(neighbor);
	    //colW-1 except 2 corners
	    for (y = 1; y &lt; H-1; y++)
	    {
		neighbor = temp[y-1][tmpPrev] + temp[y][tmpPrev] + temp[y+1][tmpPrev] + temp[y-1][tmpCur] + temp[y+1][tmpCur];
		m_matrix[y][x] = nextValue(neighbor);
	    }

	}
    }//computeNextGeneration()

    public void printMatrix(String prompt)
    {
	System.out.println();
	System.out.println("======= " + prompt + " ========");
	StringBuilder sb = new StringBuilder();
	for (int y = 0; y &lt; H; y++)
	{
	    sb.setLength(0);
	    for (int x = 0; x &lt; W; x++)
	    {
		if (m_matrix[y][x] == 1)
		    sb.append((int)1);
		else
		    sb.append((int)0);
		sb.append(" ");
	    }
	    System.out.println(sb.toString());
	}
    }//printMatrix()

    public static void main(String[] args)
    {
	if (args.length != 3)
	{
	    System.out.println("Usage: Test row col generation_times");
	    return;
	}

	int row, col, gen;
	try
	{
	    row = Integer.parseInt(args[0]);
	    col = Integer.parseInt(args[1]);
	    gen = Integer.parseInt(args[2]);
	} catch (Exception e)
	{
	    System.out.println("Usage: Test row col generation_times");
	    return;
	}

	Test t = new Test(row, col);

	for (int i=1; i&lt;=gen; i++)
	{
	    t.computeNextGeneration();
	    t.printMatrix("" + i + "th Generation");
	}

    }//main()
}//class - Test

slee@ubuntu:~/test$ javac Test.java
slee@ubuntu:~/test$ java Test 10 20 4

======= Init Matrix ========
1 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1
1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0
0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0
1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1
0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0
1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1
0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0
0 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1
1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1

======= 1th Generation ========
1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0
1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1
1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1
0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1
1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1
1 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1
1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 0
1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1
0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1

======= 2th Generation ========
1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1
0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1
1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1
1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1
1 0 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0
1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1

======= 3th Generation ========
0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1
1 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1
0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0
1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0
1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1
0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1
0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1
0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 1
1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0

======= 4th Generation ========
1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1
1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1
0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1
1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1
0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1
0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1
0 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1
0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1
1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 1 1 0 1
0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1
slee@ubuntu:~/test$ java Test 20 10 4

======= Init Matrix ========
0 1 1 1 1 0 0 0 0 1
1 0 1 0 0 0 0 1 0 1
1 1 1 1 0 1 0 1 1 1
0 1 0 0 1 1 0 0 1 1
1 0 1 0 1 0 0 0 1 1
0 0 1 0 0 0 1 1 0 1
0 1 0 1 0 0 1 0 1 1
1 0 1 1 0 0 1 0 1 0
0 0 0 1 0 0 0 1 0 0
0 1 0 1 1 1 1 1 1 1
1 1 0 0 1 0 0 1 1 0
1 0 0 1 1 1 1 1 0 1
1 1 0 1 0 0 1 1 1 0
0 1 0 0 0 0 0 0 0 1
0 1 1 0 0 1 0 1 0 0
0 1 0 0 0 0 0 1 1 0
1 0 1 1 0 1 0 1 1 0
0 0 0 1 0 1 1 0 0 0
1 0 0 0 0 0 1 0 0 1
1 1 1 1 0 0 1 0 0 1

======= 1th Generation ========
1 1 1 1 0 0 0 0 1 0
1 0 0 0 0 1 1 1 0 1
1 0 0 1 0 1 0 1 0 0
0 0 0 0 0 1 1 0 0 0
0 0 1 0 1 0 1 0 0 0
1 0 1 0 1 1 1 0 0 0
1 1 0 1 1 1 1 0 0 1
0 1 0 1 1 1 1 0 1 1
1 1 0 0 0 0 0 0 0 1
1 1 0 1 0 1 0 0 0 1
1 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 1
1 1 0 1 0 0 0 0 0 1
0 0 0 1 1 1 0 0 0 0
1 1 1 0 0 0 1 1 0 1
1 0 0 1 1 1 0 0 0 1
0 1 1 1 0 1 0 0 1 1
1 1 1 1 0 1 0 0 1 1
1 0 0 1 1 0 1 1 1 0
1 1 1 0 0 1 0 1 1 0

======= 2th Generation ========
1 1 1 0 1 1 1 1 1 1
1 0 0 1 0 1 0 1 0 0
0 1 0 0 0 0 0 1 1 0
0 1 1 1 0 0 0 1 0 0
0 1 0 0 1 0 0 1 0 0
1 0 1 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0 1 1
0 0 0 1 0 0 1 1 1 1
0 0 0 1 0 0 1 1 0 1
0 0 0 0 1 0 0 0 1 0
1 1 0 1 1 0 0 0 1 1
0 0 0 0 1 0 0 0 1 0
0 0 0 1 0 1 0 0 1 0
0 0 0 1 1 1 1 1 1 1
1 1 1 0 0 0 1 0 1 0
1 0 0 0 0 1 0 1 0 1
0 0 0 0 0 1 1 1 0 0
1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 0 0 1 1

======= 3th Generation ========
1 1 1 1 1 1 0 1 1 0
1 0 0 1 0 1 0 0 0 1
1 1 0 1 1 0 0 1 1 0
1 1 0 1 1 0 1 1 0 0
1 0 0 0 0 0 1 1 1 0
1 0 0 1 0 0 1 1 0 1
0 1 1 1 0 0 1 0 0 1
0 0 1 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0 1
1 1 1 0 1 1 1 0 0 0
0 0 1 1 1 1 0 1 1 1
1 1 1 0 0 1 0 1 1 0
0 0 1 1 0 0 0 0 0 0
1 1 0 1 0 0 0 0 0 1
1 1 1 1 0 0 0 0 0 0
1 0 1 0 1 1 0 0 0 0
1 1 0 0 1 1 0 1 1 0
0 0 0 0 1 1 0 1 0 0
1 0 1 1 0 1 1 0 1 1
0 1 1 1 1 0 0 0 0 0

======= 4th Generation ========
1 1 1 1 0 1 1 0 1 1
0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 1 1 1
0 0 0 1 1 0 0 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 1 1 1 0 0 0 1
1 1 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1 1 1
1 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 1 0 1
0 0 0 1 1 0 1 1 1 1
1 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 1 1 0
1 1 1 0 0 0 0 1 1 0
1 0 1 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1 1 0
1 1 0 0 1 1 1 1 1 1
slee@ubuntu:~/test$ exit
exit

Script done on Fri 30 Jul 2010 10:28:08 AM PDT</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=62&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2010/08/04/an-interesting-logic-and-memory-programming-question/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>A libcurl wrapper class</title>
		<link>http://slworkthings.wordpress.com/2010/08/04/a-libcurl-wrapper-class/</link>
		<comments>http://slworkthings.wordpress.com/2010/08/04/a-libcurl-wrapper-class/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 06:06:18 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[libcurl]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=21</guid>
		<description><![CDATA[Header File: #ifndef _MYCURL_H_ #define _MYCURL_H_ #ifndef CURL_STATICLIB #define CURL_STATICLIB #endif #include &#60;curl/curl.h&#62; //=========================================== typedef struct IOData {     char     *m_senddata;     int       m_sendlen;     char     *m_readdata;     int       m_readlen;       int       m_readAllocLen; } IOData;   typedef struct DebugData {     char      m_trace_ascii; //1 or 0 } DebugData; class MyCurl { public:     MyCurl(int [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=21&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Header File:<br />
#ifndef _MYCURL_H_<br />
#define _MYCURL_H_</p>
<p>#ifndef CURL_STATICLIB<br />
#define CURL_STATICLIB<br />
#endif<br />
#include &lt;curl/curl.h&gt;</p>
<p>//===========================================<br />
typedef struct IOData<br />
{<br />
    char     *m_senddata;<br />
    int       m_sendlen;<br />
    char     *m_readdata;<br />
    int       m_readlen;<br />
 <br />
    int       m_readAllocLen;<br />
} IOData;<br />
 <br />
typedef struct DebugData<br />
{<br />
    char      m_trace_ascii; //1 or 0<br />
} DebugData;<br />
class MyCurl<br />
{<br />
public:<br />
    MyCurl(int sNum, bool needCookieInfo, const char *url, const char *sslcert = 0, const char *sslkey = 0, const char *proxyHost = 0, long proxyPort = 0, const char *proxyUserPwd = 0);<br />
    virtual ~MyCurl();</p>
<p>    //caller will need to delete[] rturned buf<br />
    char *write(const char *senddata, int sendlen, int&amp; readlen, bool&amp; success);<br />
    void  setBandwidth(long sendKbPerSec, long recvKbPerSec);</p>
<p>    static void   s_initUnInitLibCurl(bool isInit);<br />
private:<br />
    static size_t s_writeFunc(void *ptr, size_t size, size_t nmemb, void *data);<br />
    static size_t s_headerFunc(void *ptr, size_t size, size_t nmemb, void *data);<br />
    static int    s_debugFunc(CURL *handle, curl_infotype type, unsigned char *data, size_t size, void *userp);<br />
    static bool   s_hasInitialized;<br />
private:<br />
    void          init();</p>
<p>    CURL                  *m_handle;<br />
    struct curl_slist     *m_header;</p>
<p>    char                   m_resCookie[512];<br />
    char                   m_url[512];<br />
    char                   m_sslcert[512];<br />
    char                   m_sslkey[512];<br />
    char                   m_proxyHost[512];<br />
    long                   m_proxyPort;<br />
    char                   m_proxyUserPwd[512];<br />
    bool                   m_needCookieInfo;<br />
    IOData                 m_ioData;<br />
    int                    m_staticNum;</p>
<p>};</p>
<p>#endif // _MYCURL_H_</p>
<p> Source File:<br />
#include &#8220;mycurl.h&#8221;<br />
#include &#8220;globals.h&#8221;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;strings.h&gt;<br />
#include &lt;string.h&gt;<br />
 <br />
//============ static1 =====================<br />
size_t MyCurl::s_writeFunc(void *ptr, size_t size, size_t nmemb, void *userp)<br />
{<br />
    //data is m_ioData<br />
    int readlen = size * nmemb;<br />
 <br />
    IOData *data = (IOData *)(userp);<br />
 <br />
    if (readlen &gt; 0 &amp;&amp; readlen &lt; 1024000)<br />
    {<br />
        if ((data-&gt;m_readlen + readlen) &gt;= data-&gt;m_readAllocLen)<br />
        {<br />
            fprintf(stderr, &#8220;====== realloc %d %d %d==\n&#8221;, data-&gt;m_readlen, data-&gt;m_readAllocLen, readlen);<br />
            char *savedBuf = 0;<br />
            if (data-&gt;m_readlen &gt; 0)<br />
            {<br />
                savedBuf = new char[data-&gt;m_readlen];<br />
                memcpy(savedBuf, data-&gt;m_readdata, data-&gt;m_readlen);<br />
            }<br />
            delete[] data-&gt;m_readdata;<br />
            data-&gt;m_readdata = 0;<br />
            do <br />
            {<br />
                data-&gt;m_readAllocLen = (data-&gt;m_readAllocLen * 2);<br />
                fprintf(stderr, &#8220;====loop = realloc %d %d %d==\n&#8221;, data-&gt;m_readlen, data-&gt;m_readAllocLen, readlen);<br />
            } while((data-&gt;m_readlen + readlen) &gt;= data-&gt;m_readAllocLen);<br />
            data-&gt;m_readdata = new char[data-&gt;m_readAllocLen];<br />
            if (savedBuf)<br />
            {<br />
                memcpy(data-&gt;m_readdata, savedBuf, data-&gt;m_readlen);<br />
                delete[] savedBuf;<br />
                savedBuf = 0;<br />
            }<br />
        }<br />
        memcpy(data-&gt;m_readdata + data-&gt;m_readlen, (char *)(ptr), readlen);<br />
        data-&gt;m_readlen += readlen;<br />
    }<br />
    else<br />
    {<br />
        if (gDebugLevel &gt; 0)<br />
        {<br />
            fprintf(stderr, &#8220;%s ===== Weird %d ======\n&#8221;, getTimeStamp(), readlen);<br />
            fflush(stderr);<br />
        }<br />
    }<br />
 <br />
    return readlen;<br />
}//s_writeFunc<br />
 <br />
size_t MyCurl::s_headerFunc(void *ptr, size_t size, size_t nmemb, void *data)<br />
{<br />
    int readlen = size * nmemb;<br />
    if (strncmp((char *)ptr, &#8220;Set-Cookie&#8221;, 10) == 0)<br />
    {<br />
        char *cookie = new char[readlen];<br />
        //strncpy((char *)data, (char *)ptr + 12, readlen);<br />
        strncpy(cookie, (char *)ptr + 12, readlen);<br />
        char *sep = strchr(cookie, &#8216;;&#8217;);<br />
        if (sep)<br />
            strncpy((char *)data, cookie, sep-cookie);<br />
        else<br />
            strcpy((char *)data, cookie);<br />
 <br />
        delete[] cookie;<br />
        cookie = 0;<br />
    }<br />
 <br />
    return readlen;<br />
}//s_headerFunc<br />
 <br />
int  MyCurl::s_debugFunc(CURL *handle, curl_infotype type, unsigned char *data, size_t size, void *userp)<br />
{<br />
    DebugData *dd = (DebugData *)(userp);<br />
 <br />
    char prompt[64];<br />
 <br />
    switch (type)<br />
    {<br />
    case CURLINFO_HEADER_OUT:<br />
        sprintf(prompt, &#8220;%s [CURL][H=&gt;] &#8220;, getTimeStamp());<br />
        break;<br />
    case CURLINFO_DATA_OUT:<br />
        sprintf(prompt, &#8220;%s [CURL][D=&gt;] &#8220;, getTimeStamp());<br />
        break;<br />
    case CURLINFO_SSL_DATA_OUT:<br />
        sprintf(prompt, &#8220;%s [CURL][S=&gt;] &#8220;, getTimeStamp());<br />
        break;<br />
    case CURLINFO_HEADER_IN:<br />
        sprintf(prompt, &#8220;%s [CURL][&lt;=H] &#8220;, getTimeStamp());<br />
        break;<br />
    case CURLINFO_DATA_IN:<br />
        sprintf(prompt, &#8220;%s [CURL][&lt;=D] &#8220;, getTimeStamp());<br />
        break;<br />
    case CURLINFO_SSL_DATA_IN:<br />
        sprintf(prompt, &#8220;%s [CURL][&lt;=S] &#8220;, getTimeStamp());<br />
        break;<br />
    case CURLINFO_TEXT:<br />
        fprintf(stderr, &#8220;%s [CURL][T] %s\n&#8221;, getTimeStamp(), data);<br />
        fflush(stderr);<br />
    default:<br />
        return 0;<br />
    }<br />
 <br />
    size_t i;<br />
    size_t c;<br />
    unsigned int w = 0&#215;10;<br />
 <br />
    if (dd-&gt;m_trace_ascii)<br />
        w = 0&#215;40;<br />
 <br />
    fprintf(stderr, &#8220;%s, %zd bytes (0x%zx)\n&#8221;, prompt, size, size);<br />
 <br />
    for (i=0; i&lt;size; i+=w)<br />
    {<br />
        fprintf(stderr, &#8220;%04zx: &#8220;, i);<br />
 <br />
        if (!dd-&gt;m_trace_ascii)<br />
        {<br />
            for (c=0; c&lt;w; c++)<br />
            {<br />
                if (i+c &lt; size)<br />
                    fprintf(stderr, &#8220;%02x &#8220;, data[i+c]);<br />
                else <br />
                    fprintf(stderr, &#8220;   &#8220;);<br />
            }<br />
        }<br />
 <br />
        for (c=0; (c&lt;w) &amp;&amp; (i+c &lt; size); c++)<br />
        {<br />
            //check for 0D0A; if found, skip past and start a new line<br />
            if (dd-&gt;m_trace_ascii &amp;&amp; (i+c+1 &lt; size) &amp;&amp; data[i+c] == 0x0D &amp;&amp; data[i+c+1] == 0x0A)<br />
            {<br />
                i += (c+2-w);<br />
                break;<br />
            }<br />
 <br />
            fprintf(stderr, &#8220;%c&#8221;, (data[i+c]&gt;=0&#215;20) &amp;&amp; (data[i+c]&lt;0&#215;80) ? data[i+c] : &#8216;.&#8217;);<br />
 <br />
            //check again for 0D0A, to avoid an extra \n if it&#8217;s at width<br />
            if (dd-&gt;m_trace_ascii &amp;&amp; (i+c+2&lt;size) &amp;&amp; data[i+c+1]==0x0D &amp;&amp; data[i+c+2]==0x0A)<br />
            {<br />
                i += (c+3-w);<br />
                break;<br />
            }<br />
        }//in for<br />
        fprintf(stderr, &#8220;\n&#8221;);<br />
    }//out for<br />
 <br />
    fflush(stderr);<br />
    return 0;<br />
}//s_debugFunc<br />
 <br />
 <br />
 <br />
void MyCurl::s_initUnInitLibCurl(bool isInit)<br />
{<br />
    if (isInit &amp;&amp; !s_hasInitialized)<br />
    {<br />
        curl_global_init(CURL_GLOBAL_ALL);<br />
        s_hasInitialized = true;<br />
    }<br />
 <br />
    if (!isInit)<br />
        curl_global_cleanup();<br />
}//s_initUnInitLibCurl</p>
<p> <br />
//=============================================================<br />
MyCurl::MyCurl(int sNum, bool needCookieInfo, const char *url, const char *sslcert, const char *sslkey, const char *proxyHost, long proxyPort, const char *proxyUserPwd)<br />
       :m_handle(0),<br />
        m_header(0),<br />
        m_needCookieInfo(needCookieInfo),<br />
        m_staticNum(sNum)<br />
{<br />
    s_initUnInitLibCurl(true);</p>
<p>    strcpy(m_url, url);   <br />
    if (sslcert)<br />
        strcpy(m_sslcert, sslcert);<br />
    else<br />
        m_sslcert[0] = 0;<br />
    if (sslkey)<br />
        strcpy(m_sslkey, sslkey);<br />
    else<br />
        m_sslkey[0] = 0;<br />
    if (proxyHost)<br />
        strcpy(m_proxyHost, proxyHost);<br />
    else<br />
        m_proxyHost[0] = 0;<br />
    m_proxyPort = proxyPort;<br />
    if (proxyUserPwd)<br />
        strcpy(m_proxyUserPwd, proxyUserPwd);<br />
    else<br />
        m_proxyUserPwd[0] = 0;<br />
    m_resCookie[0] = 0;</p>
<p>    m_ioData.m_senddata = 0;<br />
    m_ioData.m_sendlen = 0;<br />
    m_ioData.m_readlen = 0;<br />
    m_ioData.m_readAllocLen = /*20480*/65000;<br />
    m_ioData.m_readdata = new char[m_ioData.m_readAllocLen];</p>
<p>    init();<br />
}</p>
<p>MyCurl::~MyCurl()<br />
{<br />
    curl_slist_free_all(m_header);<br />
    curl_easy_cleanup(m_handle);<br />
 <br />
    delete[] m_ioData.m_readdata;<br />
}</p>
<p>void MyCurl::init()<br />
{<br />
    m_handle = curl_easy_init();</p>
<p>    //set url<br />
    curl_easy_setopt(m_handle, CURLOPT_URL, m_url);</p>
<p>    //set proxy<br />
    if (m_proxyHost &amp;&amp; m_proxyPort &gt; 0)<br />
    {<br />
        curl_easy_setopt(m_handle, CURLOPT_PROXY, m_proxyHost);<br />
        curl_easy_setopt(m_handle, CURLOPT_PROXYPORT, m_proxyPort);</p>
<p>        //set proxy auth<br />
        if (m_proxyUserPwd)<br />
        {<br />
            curl_easy_setopt(m_handle, CURLOPT_PROXYUSERPWD, m_proxyUserPwd);<br />
        }<br />
    }</p>
<p>    //ssl<br />
    if (m_sslcert[0] != 0 &amp;&amp; m_sslkey[0] != 0)<br />
    {<br />
        if (gDebugLevel &gt; 0)<br />
        {<br />
            fprintf(stderr, &#8220;%s MyCurl::init() sslcert=%s sslkey=%s\n&#8221;, getTimeStamp(), m_sslcert, m_sslkey);<br />
            fflush(stderr);<br />
        }<br />
        curl_easy_setopt(m_handle, CURLOPT_SSLCERT, m_sslcert);<br />
        curl_easy_setopt(m_handle, CURLOPT_SSLKEY,  m_sslkey);<br />
    }<br />
    curl_easy_setopt(m_handle, CURLOPT_SSL_VERIFYHOST, 1);<br />
    curl_easy_setopt(m_handle, CURLOPT_SSL_VERIFYPEER, false);</p>
<p>/*<br />
    long timeout = 30;<br />
    //set timeout 30(sec) for connection establishment phase<br />
    curl_easy_setopt(m_handle, CURLOPT_CONNECTTIMEOUT, timeout);</p>
<p>    //set timeout 60(sec) for overall transfer operation<br />
    timeout = 60;<br />
    curl_easy_setopt(m_handle, CURLOPT_TIMEOUT, timeout);</p>
<p>    //for unix-mult-threaded process, avoid using kernel signals to enable nonblocking system calls<br />
    curl_easy_setopt(m_handle, CURLOPT_NOSIGNAL, 1);<br />
*/</p>
<p>    m_header = curl_slist_append(m_header, &#8220;Accept:&#8221;);</p>
<p>    //callback<br />
    curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, MyCurl::s_writeFunc);<br />
    curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, (void *)&amp;m_ioData);</p>
<p>    if (m_needCookieInfo)<br />
    {<br />
        curl_easy_setopt(m_handle, CURLOPT_HEADERFUNCTION, MyCurl::s_headerFunc);<br />
        curl_easy_setopt(m_handle, CURLOPT_WRITEHEADER, (void *)m_resCookie);<br />
    }<br />
 <br />
if (0)<br />
{<br />
    //debug<br />
    if (gDebugLevel &gt; 0)<br />
    {<br />
        DebugData dd;<br />
        dd.m_trace_ascii = 1; <br />
        curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, MyCurl::s_debugFunc);<br />
        curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, &amp;dd);<br />
        curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1);<br />
    }<br />
}<br />
 <br />
    //set header request property<br />
    m_header = curl_slist_append(m_header, &#8220;Content-Type: application/octet-stream&#8221;);<br />
    m_header = curl_slist_append(m_header, &#8220;Pragma: no-cache&#8221;);<br />
    m_header = curl_slist_append(m_header, &#8220;Cache-Control: no-cache&#8221;);<br />
    m_header = curl_slist_append(m_header, &#8220;Connection: Keep-Alive&#8221;);<br />
    if (m_needCookieInfo &amp;&amp; m_resCookie[0] != 0)<br />
    {<br />
        //TODO : does it work??<br />
        char cookiestr[512];<br />
        strcpy(cookiestr, &#8220;Cookie: &#8220;);<br />
        strcat(cookiestr, m_resCookie);<br />
        m_header = curl_slist_append(m_header, cookiestr); <br />
        m_resCookie[0] = 0;<br />
    }</p>
<p>    curl_easy_setopt(m_handle, CURLOPT_HTTPHEADER, m_header);<br />
}//init()</p>
<p>char *MyCurl::write(const char *senddata, int sendlen, int&amp; readlen, bool&amp; success)<br />
{<br />
    m_ioData.m_senddata = (char *)senddata;<br />
    m_ioData.m_sendlen = sendlen;<br />
    m_ioData.m_readlen = 0;<br />
 <br />
    if (m_needCookieInfo &amp;&amp; m_resCookie[0] != 0)<br />
    {<br />
        //TODO : does it work??<br />
        char cookiestr[512];<br />
        strcpy(cookiestr, &#8220;Cookie: &#8220;);<br />
        strcat(cookiestr, m_resCookie);<br />
        m_header = curl_slist_append(m_header, cookiestr); <br />
        m_resCookie[0] = 0;<br />
        curl_easy_setopt(m_handle, CURLOPT_HTTPHEADER, m_header);<br />
    }<br />
 </p>
<p>    curl_easy_setopt(m_handle, CURLOPT_POSTFIELDS, m_ioData.m_senddata);<br />
    curl_easy_setopt(m_handle, CURLOPT_POSTFIELDSIZE, m_ioData.m_sendlen);</p>
<p>    int ret = curl_easy_perform(m_handle);</p>
<p>    if (ret == CURLE_OK)<br />
    {<br />
        long curlRetCode;<br />
        curl_easy_getinfo(m_handle, CURLINFO_RESPONSE_CODE, &amp;curlRetCode);<br />
        if (curlRetCode == 407)<br />
        {<br />
            fprintf(stderr, &#8220;proxy auth failure&#8221;);<br />
            fflush(stderr);<br />
        } <br />
        success = true;<br />
    }<br />
    else<br />
    {<br />
        fprintf(stderr, &#8220;%s &#8212;&gt; %d CURLE_NOT_OK ret = %d\n&#8221;, getTimeStamp(), m_staticNum, ret);<br />
        fflush(stderr);<br />
        success = false;<br />
    }<br />
 <br />
    //caller will need to delete[] retBuf<br />
    char *retBuf = 0;<br />
    if (success &amp;&amp; m_ioData.m_readlen &gt; 0 &amp;&amp; m_ioData.m_readlen &lt; 1024000) //Protection<br />
    {<br />
        retBuf = new char[m_ioData.m_readlen];<br />
        memcpy(retBuf, m_ioData.m_readdata, m_ioData.m_readlen);<br />
        readlen = m_ioData.m_readlen;<br />
    }<br />
 <br />
    return retBuf;<br />
}</p>
<p>void MyCurl::setBandwidth(long sendKbPerSec, long recvKbPerSec)<br />
{<br />
    //MUST: libcurl &gt; 7.15.5<br />
    curl_off_t  sendspeed = sendKbPerSec * 1024;<br />
    curl_off_t  recvspeed = recvKbPerSec * 1024;</p>
<p>    curl_easy_setopt(m_handle, CURLOPT_MAX_SEND_SPEED_LARGE, sendspeed);<br />
    curl_easy_setopt(m_handle, CURLOPT_MAX_RECV_SPEED_LARGE, recvspeed);<br />
}<br />
 </p>
<p>bool MyCurl::s_hasInitialized = false;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=21&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2010/08/04/a-libcurl-wrapper-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>Use IR remote to control logitech Orbit AF webcam</title>
		<link>http://slworkthings.wordpress.com/2010/04/22/use-ir-remote-to-control-logitech-orbit-af-webcam/</link>
		<comments>http://slworkthings.wordpress.com/2010/04/22/use-ir-remote-to-control-logitech-orbit-af-webcam/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 17:30:29 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[directshow]]></category>
		<category><![CDATA[logitech orbit]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=54</guid>
		<description><![CDATA[Someone sent me an email and ask me about if he can use an IR remote to control pan/tilt of logitech orbit AF. The IR remote control is this IR remote I don&#8217;t have the IR remote device, but, I believe it is doable. 1. You will need to write a win32 application that can [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=54&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Someone sent me an email and ask me about if he can use an IR remote  to control pan/tilt of logitech orbit AF. The IR remote control is this <a href="http://www.tripplite.com/en/products/model.cfm?txtSeriesID=517&amp;txtModelID=3910">IR remote</a></p>
<p>I don&#8217;t have the IR remote device, but, I believe it is doable.</p>
<p>1. You will need to write a win32 application that can control pan/tilt/zoom of orbit.<br />
2. And in that application, you will need to listen (catch) keyboard events; such as up/down/right/left arrow key events.<br />
3. For instance, in your app, once you catch UP key even, your app will call DirectShow functions to let orbit moving up.</p>
<p>It is not hard, but, you will have some knowledge of DirectShow programming.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=54&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2010/04/22/use-ir-remote-to-control-logitech-orbit-af-webcam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
		<item>
		<title>Android.mk and xvidcore</title>
		<link>http://slworkthings.wordpress.com/2010/02/23/android-mk-and-xvidcore/</link>
		<comments>http://slworkthings.wordpress.com/2010/02/23/android-mk-and-xvidcore/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 22:26:15 +0000</pubDate>
		<dc:creator>slworkthings</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Android.mk]]></category>
		<category><![CDATA[xvid]]></category>
		<category><![CDATA[xvidcore]]></category>

		<guid isPermaLink="false">http://slworkthings.wordpress.com/?p=51</guid>
		<description><![CDATA[Share my xvidcore on android-ndk1.5. LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE    := libxvidcore #LOCAL_CFLAGS = -DFIXED_POINT -DEXPORT=&#8221;" -UHAVE_CONFIG_H -I$(LOCAL_PATH)/include LOCAL_CFLAGS := -DARCH_IS_32BIT -DARCH_IS_GENERIC -I$(LOCAL_PATH)/src LOCAL_SRC_FILES :=  \ ./src/decoder.c \ ./src/encoder.c \ ./src/xvid.c \ ./src/bitstream/bitstream.c \ ./src/bitstream/cbp.c \ ./src/bitstream/mbcoding.c \ ./src/dct/fdct.c \ ./src/dct/idct.c \ ./src/dct/simple_idct.c \ ./src/image/colorspace.c \ ./src/image/image.c \ ./src/image/interpolate8x8.c \ ./src/image/font.c \ ./src/image/postprocessing.c [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=51&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Share my xvidcore on android-ndk1.5.</p>
<p>LOCAL_PATH := $(call my-dir)</p>
<p>include $(CLEAR_VARS)</p>
<p>LOCAL_MODULE    := libxvidcore<br />
#LOCAL_CFLAGS = -DFIXED_POINT -DEXPORT=&#8221;" -UHAVE_CONFIG_H -I$(LOCAL_PATH)/include<br />
LOCAL_CFLAGS := -DARCH_IS_32BIT -DARCH_IS_GENERIC -I$(LOCAL_PATH)/src</p>
<p>LOCAL_SRC_FILES :=  \<br />
./src/decoder.c \<br />
./src/encoder.c \<br />
./src/xvid.c \<br />
./src/bitstream/bitstream.c \<br />
./src/bitstream/cbp.c \<br />
./src/bitstream/mbcoding.c \<br />
./src/dct/fdct.c \<br />
./src/dct/idct.c \<br />
./src/dct/simple_idct.c \<br />
./src/image/colorspace.c \<br />
./src/image/image.c \<br />
./src/image/interpolate8x8.c \<br />
./src/image/font.c \<br />
./src/image/postprocessing.c \<br />
./src/image/qpel.c \<br />
./src/image/reduced.c \<br />
./src/motion/estimation_bvop.c \<br />
./src/motion/estimation_common.c \<br />
./src/motion/estimation_gmc.c \<br />
./src/motion/estimation_pvop.c \<br />
./src/motion/estimation_rd_based.c \<br />
./src/motion/estimation_rd_based_bvop.c \</p>
<p>./src/motion/gmc.c \</p>
<p>./src/motion/motion_comp.c \<br />
./src/motion/vop_type_decision.c \<br />
./src/motion/sad.c \<br />
./src/prediction/mbprediction.c \<br />
./src/plugins/plugin_single.c \<br />
./src/plugins/plugin_2pass1.c \<br />
./src/plugins/plugin_2pass2.c \<br />
./src/plugins/plugin_lumimasking.c \<br />
./src/plugins/plugin_dump.c \<br />
./src/plugins/plugin_psnr.c \<br />
./src/plugins/plugin_ssim.c \<br />
./src/quant/quant_h263.c \<br />
./src/quant/quant_matrix.c \<br />
./src/quant/quant_mpeg.c \<br />
./src/utils/emms.c \<br />
./src/utils/mbtransquant.c \<br />
./src/utils/mem_align.c \<br />
./src/utils/mem_transfer.c \<br />
./src/utils/timer.c</p>
<p>include $(BUILD_STATIC_LIBRARY)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/slworkthings.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/slworkthings.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/slworkthings.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/slworkthings.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/slworkthings.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/slworkthings.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/slworkthings.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/slworkthings.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=slworkthings.wordpress.com&amp;blog=10406408&amp;post=51&amp;subd=slworkthings&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://slworkthings.wordpress.com/2010/02/23/android-mk-and-xvidcore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a36061061e1808ac7e72802c08ac2590?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">slworkthings</media:title>
		</media:content>
	</item>
	</channel>
</rss>
