<?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/"
	>

<channel>
	<title>The Path to Zen &#187; misc</title>
	<atom:link href="http://www.digizenstudio.com/blog/categories/misc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.digizenstudio.com/blog</link>
	<description>Jing Xue's Weblog</description>
	<lastBuildDate>Tue, 01 Jun 2010 01:40:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Weird git gui startup problem</title>
		<link>http://www.digizenstudio.com/blog/2008/11/09/weird-git-gui-startup-problem/</link>
		<comments>http://www.digizenstudio.com/blog/2008/11/09/weird-git-gui-startup-problem/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 20:15:11 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/?p=190</guid>
		<description><![CDATA[This has happened to me for a while every time after I build and install the latest git, but I didn&#8217;t really get to the bottom of it until just now. My tinfoil hat umask setting, 0027, finally came around and bit me!
After a fresh rebuild and &#8216;make install&#8216;, git gui upon starting up would [...]]]></description>
			<content:encoded><![CDATA[<p>This has happened to me for a while every time after I build and install the latest git, but I didn&#8217;t really get to the bottom of it until just now. My tinfoil hat umask setting, 0027, finally came around and bit me!<span id="more-190"></span></p>
<p>After a fresh rebuild and &#8216;<code>make install</code>&#8216;, git gui upon starting up would insist on making me choose a repository, even when I start it from a perfectly valid git working directory.</p>
<p>So I found out that it was failing to execute &#8220;git rev-parse&#8221; during startup, which was due to /usr/local/libexec/git-core/git-rev-parse being installed with mode 750. And that was traced back to the fact that I have umask set to 0027, so the locally built git-add would have mode 750. Since git uses hardlinks to install all the built-in commands, everything hardlinked to git-add would have the same mode, and I end up with bunch of git built-ins owned by root and inaccessible to anybody else.</p>
<p>So the workaround is either &#8216;<code>chmod o+rx ${git-source-root}/git-add</code>&#8216; before &#8216;<code>make install</code>&#8216;, or &#8216;<code>sudo chmod o+rx ${prefix}/libexec/git-core/*</code>&#8216; after &#8216;<code>make install</code>&#8216;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2008/11/09/weird-git-gui-startup-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>But Then There Is Also Unnecessary Coupling</title>
		<link>http://www.digizenstudio.com/blog/2008/08/18/but-then-there-is-also-unnecessary-coupling/</link>
		<comments>http://www.digizenstudio.com/blog/2008/08/18/but-then-there-is-also-unnecessary-coupling/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 02:05:08 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/?p=164</guid>
		<description><![CDATA[Jeffrey Palermo writes an interesting post about Inversion of Control is NOT about testability. I guess this is one of the scenarios where I agree with the conclusion, but not necessarily how it is arrived at.  
Jeffrey drives to his point by giving an example:
PLAIN TEXT
C#:




public class MissileLauncher&#123;


&#160; &#160; private INavigator _navigator;


&#160; &#160; public [...]]]></description>
			<content:encoded><![CDATA[<p>Jeffrey Palermo writes an interesting post about <a href="http://jeffreypalermo.com/blog/inversion-of-control-is-not-about-testability/" rel="_blank">Inversion of Control is NOT about testability</a>. I guess this is one of the scenarios where I agree with the conclusion, but not necessarily how it is arrived at. <img src='http://www.digizenstudio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-164"></span></p>
<p>Jeffrey drives to his point by giving an example:</p>
<div class="igBar"><span id="lcsharp-2"><a href="#" onclick="javascript:showPlainTxt('csharp-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C#:</span>
<div id="csharp-2">
<div class="csharp">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> MissileLauncher<span style="color: #000000;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #0600FF;">private</span> INavigator _navigator;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #0600FF;">public</span> MissileLauncher<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; _navigator = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> MissileNavigator<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Launch<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//get direction guidance from _navigator and launch a missile</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
And then he states:</p>
<blockquote><p>
"This can be a good design or bad design depending on your needs.  We are coupling to an interface, INavigator, but we are also coupling to a specific implementation class, MissileNavigator.</p>
<p>"If MissileLauncher can't do its job without MissileNavigator, then this coupling makes sense, and the class should be tested together with MissileNavigator.
</p></blockquote>
<p>Well, I am not sure about that.  Looks to me, the commitment of coupling is already made right on the second line of the code above: where <code>_navigator</code> is declared <code>INavigator</code>. It essentially asserts that:</p>
<ol>
<li>The interface exposed via <code>INavigator</code> suffices for <code>MissleNavigator</code>.</li>
<li><code>MissileNavigator</code> makes no further assumptions on the class that actually implements <code>INavigator</code>.</li>
</ol>
<p>Once that commitment is made, specifically instantiating <code>_navigator</code> to an implementation class buys us absolutely nothing, and loses for us most of the flexibility associated from programing against <code>INavigator</code> the interface.  Think about it this way, if <code>MissileLauncher</code> <em>has to</em> use the specific implementation, <code>MissleNavigator</code>, meaning at some point it will have to explicitly cast <code>_navigator</code> to <code>MissleNavigator</code>, then that would be a very awkward OO design, and we might as well declare <code>_navigator</code> a <code>MissleNavigator</code>, and program against <em>that</em> interface to begin with.</p>
<p>So, depending on how people look at it, the hard-coded instantiation in the constructor can be considered part of the design or the implementation.  But either way IMHO it's a bad one, and makes some unnecessary coupling.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2008/08/18/but-then-there-is-also-unnecessary-coupling/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Manage Local Versions with Git</title>
		<link>http://www.digizenstudio.com/blog/2008/07/31/manage-local-versions-with-git/</link>
		<comments>http://www.digizenstudio.com/blog/2008/07/31/manage-local-versions-with-git/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 03:38:35 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/?p=161</guid>
		<description><![CDATA[In almost every project I have worked on, there were always a couple of files here and there that are checked into the version control, but have to be modified according to everyone's local environment. With conventional centralized version control, they can become quite a pain to manage -- we have to condition ourselves to [...]]]></description>
			<content:encoded><![CDATA[<p>In almost every project I have worked on, there were always a couple of files here and there that are checked into the version control, but have to be modified according to everyone's local environment. With conventional centralized version control, they can become quite a pain to manage -- we have to condition ourselves to remember to ignore them during diff'ing, always be careful not to check the local versions in, and deal with the mess when we have to actually check into those files changes which <em>do</em> need to be shared. This blog post tries to present a approach that makes it easier and less error prone, using <a title="git" rel="_blank" href="http://git.or.cz/">git</a>.<br />
<span id="more-161"></span></p>
<p>The general idea of this approach is to maintain two separate branches -- one for synchronizing with the rest of the world, and the other for managing the local changes -- and sync between the two using the powerful <code>git-rebase</code>.</p>
<ol>
<li>
Say we have just cloned the team repository:</p>
<pre>    master
    v
A-B-C</pre>
</li>
<li>
The next step is getting ready to start hacking locally:</p>
<pre>(Nadeem Bitar points out below that "checkout -b" is a better way. Thanks!)
<del datetime="2008-08-08T01:03:33+00:00">$git branch local &amp;&amp; git checkout local</del>
$git checkout -b local
$make whatever local changes
$git add &lt;the files changed&gt;
$git commit -m 'LOCAL_HACKS: my env'</pre>
<p>Now we have (* indicates we are currently on the local branch, and the L? commits are the ones containing local changes):</p>
<pre>    master
    v
A-B-C-L1-L2
         ^
         local*</pre>
</li>
<li>
So we stay on the local branch, continue to work on the real cool features that we are here to really implement, and keep committing just like usual.  After a while, we end up with:</p>
<pre>    master
    v
A-B-C-L1-L2-E-F
              ^
              local*</pre>
</li>
<li>This is where the interactive rebase comes in so we can move the local changes L1 and L2 to the tip of local:
<pre>$git rebase -i master
(use our favorite editor to rearrange the commit lines)</pre>
<p>Now we have:</p>
<pre>    master
    v
A-B-C-E'-F'-L1'-L2'
                ^
                local*</pre>
</li>
<li>The last step is to bring master up to speed with only the commits we intend to publish:
<pre>$git rebase local~2 master  # local~2 is F' in this scenario.</pre>
<p>So the end state is:</p>
<pre>         master*
         v
A-B-C-E'-F'-L1'-L2'
                ^
                local</pre>
</li>
</ol>
<p>An alternative is use git-cherry-pick to move the non-local commits from local to master. Although it's easier than the approach above only when there is just one or two commits that need to be moved over.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2008/07/31/manage-local-versions-with-git/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ditz: Distributed Issue Tracking</title>
		<link>http://www.digizenstudio.com/blog/2008/07/28/ditz-distributed-issue-tracking/</link>
		<comments>http://www.digizenstudio.com/blog/2008/07/28/ditz-distributed-issue-tracking/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 04:19:50 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[ditz]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[issuetracking]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/?p=162</guid>
		<description><![CDATA[Ditz is a little (ruby) gem I ran into today. It allows every developer to maintain their own issue tracking database, saved in human readable YAML files, which can be easily exchanged along with the corresponding code changes through a distributed version control system, such as git.
As the latest version number, 0.4, implies, ditz is [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ditz.rubyforge.org/" rel="_blank">Ditz</a> is a little (ruby) gem I ran into today. It allows every developer to maintain their own issue tracking database, saved in human readable YAML files, which can be easily exchanged along with the corresponding code changes through a distributed version control system, such as git.</p>
<p>As the latest version number, 0.4, implies, ditz is still at an early stage, but the idea of distributed issue tracking and managing the issues themselves as part of the codebase sounds very interesting to me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2008/07/28/ditz-distributed-issue-tracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vmware to Virtualbox Migration Issues</title>
		<link>http://www.digizenstudio.com/blog/2008/05/20/vmware-to-virtualbox-migration-issues/</link>
		<comments>http://www.digizenstudio.com/blog/2008/05/20/vmware-to-virtualbox-migration-issues/#comments</comments>
		<pubDate>Wed, 21 May 2008 00:43:21 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/?p=159</guid>
		<description><![CDATA[In my Kubuntu, I have a Windows XP Professional virtual machine running in Vmware that I use from time to time.  Recently I decided to migrate it to VirtualBox. Eventually I got it working, after going through a number of issues.  Here goes a recount of them:
The Agp440.sys Hang
Since VirtualBox supports the VMDK [...]]]></description>
			<content:encoded><![CDATA[<p>In my Kubuntu, I have a Windows XP Professional virtual machine running in Vmware that I use from time to time.  Recently I decided to migrate it to VirtualBox. Eventually I got it working, after going through a number of issues.  Here goes a recount of them:<span id="more-159"></span></p>
<p><strong>The Agp440.sys Hang</strong><br />
Since VirtualBox supports the VMDK file format, it's fairly simple to get started: just create a new VirtualBox vm, make it as close to the Vmware one as possible configuration wise, attach the same VMDK files to the vm as harddrives, and that's it.</p>
<p>Although the first time when you try to boot it up in VirtualBox, Windows is very likely going to hang right away.  Trying to boot it into safe mode reveals that the sequence hangs at agp440.sys.</p>
<p>It is easily resolved by following <a href="http://www.virtualbox.org/wiki/Migrate_Windows" rel="_blank">this VirtualBox wiki article</a>. Basically boot into the Recovery Console, and disable the agp440 service.</p>
<p><strong>The Mup.sys Hang</strong><br />
Next Windows hangs at Mup.sys. The same trick from above doesn't help. After disabling Mup.sys, Windows hangs at the driver before it. So it's not Mup.sys itself, but something afterwards. Google finds me this <a href="http://www.virtualbox.org/ticket/995" rel="_blank">virtualbox ticket</a>. Following the tips, I switch to the PIIX4 setting for the IDE controller, experiment various combinations of APIC and IO ACPI, and am able to get past Mup.sys with both enabled.</p>
<p><strong>Reactivate Windows</strong><br />
Finally I'm able to boot into Windows, but with various new hardware found, the Reactivate Windows screen shows up. I called Microsoft to reactivate, but looking back, I would advise waiting until after you have successfully reconfigured windows, especially the network connection (see below).</p>
<p><strong>Hardware Configuration</strong><br />
Once booting into the desktop, Windows happily reports "new hardware" found and offer to install drivers for them. Always choosing the easiest option (i.e. the one with "automatic" in it) gets me through. If it does not for you, try selecting "Install Guest Addons" from the virtual machine menu first.</p>
<p>Naturally I decide to reboot at this point. Big surprise! Windows hangs up again as soon as the splash screen shows up. Booting into safe mode works, but not the normal mode.  After a few tries and some futile digging around, I decide to call it a day.</p>
<p>Well, the next day when I try it again, it just magically works!  I still don't know how exactly, except maybe a soft reset in VirtualBox is not such a "clean" restart compared to completely quit VirtualBox and restart from scratch.</p>
<p><strong>Network Configuration</strong><br />
The networking doesn't work after booting into Windows at this point. Try to manually add a network connection manually does not go anywhere.  Look through the Device Manager and find that the Vmware network card is still in there, with a big question mark. Uninstall that. Force the Device Manager to detect new hardware. Sure enough the VirtualBox one comes up and the driver gets installed smoothly. </p>
<p>Everything works great now. I'm for sure making a baseline copy of the virtual machine though.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2008/05/20/vmware-to-virtualbox-migration-issues/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>There Is A Geek In Every One Of Us</title>
		<link>http://www.digizenstudio.com/blog/2008/03/18/there-is-a-geek-in-every-one-of-us/</link>
		<comments>http://www.digizenstudio.com/blog/2008/03/18/there-is-a-geek-in-every-one-of-us/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 23:39:25 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/2008/03/18/there-is-a-geek-in-every-one-of-us/</guid>
		<description><![CDATA[Nick Tosches recounts his year-long quest to find out where the Windows wallpaper 'Autumn' was originally taken, and by who.
]]></description>
			<content:encoded><![CDATA[<p>Nick Tosches recounts <a href="http://www.vanityfair.com/ontheweb/features/2007/02/autumn200702" rel="_blank">his year-long quest</a> to find out where the Windows wallpaper 'Autumn' was originally taken, and by who.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2008/03/18/there-is-a-geek-in-every-one-of-us/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Odd Netflix Recommendation</title>
		<link>http://www.digizenstudio.com/blog/2007/08/09/an-odd-netflix-recommendation/</link>
		<comments>http://www.digizenstudio.com/blog/2007/08/09/an-odd-netflix-recommendation/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 01:24:05 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/2007/08/09/an-odd-netflix-recommendation/</guid>
		<description><![CDATA[Caught this "Movie you'll :heart" recommendation from Netflix today.  WWII submarine &#038;&#038; King Lear Japanese Edition &#038;&#038; modern American office parody => documentary on insects?

]]></description>
			<content:encoded><![CDATA[<p>Caught this "Movie you'll :heart" recommendation from Netflix today.  WWII submarine &#038;& King Lear Japanese Edition &#038;& modern American office parody => documentary on insects?<br />
<img src='http://www.digizenstudio.com/blog/wp-content/uploads/2007/08/snapshot1.png' alt='Thrown-off Netflix Recommendation' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2007/08/09/an-odd-netflix-recommendation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uncomment RewriteBase in Mambo</title>
		<link>http://www.digizenstudio.com/blog/2006/01/25/uncomment-rewritebase-in-mambo/</link>
		<comments>http://www.digizenstudio.com/blog/2006/01/25/uncomment-rewritebase-in-mambo/#comments</comments>
		<pubDate>Thu, 26 Jan 2006 02:43:16 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/2006/01/25/uncomment-rewritebase-in-mambo/</guid>
		<description><![CDATA[After fresh installing Mambo 4.5.3, I went ahead and switched on "Search Engine Friendly URLs". Mambo was user friendly enough to remind me twice that I needed to rename the included htaccess.txt to .htaccess in order to make the mod_rewrite kick in, which was nice and I heeded the advice.  Then I still started [...]]]></description>
			<content:encoded><![CDATA[<p>After fresh installing Mambo 4.5.3, I went ahead and switched on "Search Engine Friendly URLs". Mambo was user friendly enough to remind me twice that I needed to rename the included htaccess.txt to .htaccess in order to make the mod_rewrite kick in, which was nice and I heeded the advice.  Then I still started getting 500 Internal Server Errors when accessing some of the menu items.  Turned out that I also had to uncomment the RewriteBase line and change the URL to the actual path.  It would be even nicer if Mambo could go all the way and include that part in the reminder message.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2006/01/25/uncomment-rewritebase-in-mambo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>do {} while (false)</title>
		<link>http://www.digizenstudio.com/blog/2004/02/20/do-while-false/</link>
		<comments>http://www.digizenstudio.com/blog/2004/02/20/do-while-false/#comments</comments>
		<pubDate>Fri, 20 Feb 2004 15:25:31 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/2004/02/20/do-while-false/</guid>
		<description><![CDATA[This is not a useful trick (OK it may be useful for whoever still thinks C is the most beautiful language in the universe).
So here is the "fun" with do {} while(FALSE);
]]></description>
			<content:encoded><![CDATA[<p>This is not a useful trick (OK it may be useful for whoever still thinks C is the most beautiful language in the universe).</p>
<p>So here is <a href="http://www.noveltheory.com/TechPapers/while.htm">the "fun" with do {} while(FALSE)</a>;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2004/02/20/do-while-false/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yankee Clipper</title>
		<link>http://www.digizenstudio.com/blog/2004/01/06/20/</link>
		<comments>http://www.digizenstudio.com/blog/2004/01/06/20/#comments</comments>
		<pubDate>Tue, 06 Jan 2004 18:18:10 +0000</pubDate>
		<dc:creator>Jing Xue</dc:creator>
				<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://www.digizenstudio.com/blog/2005/04/30/20/</guid>
		<description><![CDATA[I have used many clipboard management tool, but this one is the look-further-no-more.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.yankee-clipper.net" rel="_blank">A nice free clipboard tool</a> I've been using for a couple of months. It sits on the tool tray quietly, capturing the clipboard content everytime you copy something to it.  The previous content is not overwritten, but rather is kept in a history list.  You can bring up the Yankee Clipper window at any time with a hotkey, pick an entry from the history, and double click to bring it to the clipboard.  As the cream on top, my favorite feature is "shoot".  It allows you to select an entry, press F8 (or click on a toolbar icon), switch to the application where you want the entry to go to, and just wait for a couple of more seconds -- ta-da! the text is "shot" over to the target application as if it is typed in.</p>
<p><strong>[edit - 04/30/2005]</strong> since my original post, the developer of Yankee Clipper has created a more powerful commercial version, <a href="http://www.intelexual.com/products/index.aspx" rel="_blank">YCX</a>, which charges a meager $14.95.  The freeware verion, YC3, is still accessible from the same web site.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digizenstudio.com/blog/2004/01/06/20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

