<?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>silvermace.com</title>
	<atom:link href="http://silvermace.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://silvermace.com</link>
	<description>Danushka &#34;silvermace&#34; Abeysuriya</description>
	<lastBuildDate>Wed, 10 Mar 2010 23:50:46 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Finding UID&#8217;s in MacOS X 10.5/10.6</title>
		<link>http://silvermace.com/2010/03/finiding-uids-in-macos-x-105106/</link>
		<comments>http://silvermace.com/2010/03/finiding-uids-in-macos-x-105106/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 23:50:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=86</guid>
		<description><![CDATA[Was helping setup a VM/NFS share on a friends OSX machine using all_squash to remap the UID and GID. Unfortunately OSX doesn&#8217;t like using the /etc/group file as traditional linux, doesn&#8217;t provide uid and gid commands or the Netinfo utility. So to cut to the chase, to list the UIDs of the local users:
dscl /Local/Default [...]]]></description>
			<content:encoded><![CDATA[<p>Was helping setup a VM/NFS share on a friends OSX machine using all_squash to remap the UID and GID. Unfortunately OSX doesn&#8217;t like using the /etc/group file as traditional linux, doesn&#8217;t provide uid and gid commands or the Netinfo utility. So to cut to the chase, to list the UIDs of the local users:</p>
<p><code>dscl /Local/Default -list /Users UniqueID</code></p>
<p>I&#8217;m sure altering the last &#8220;UniqueID&#8221; value (as it&#8217;s referred to as a &#8216;key&#8217;) will yeild more interesting info, this is left as an excercise to the reader <img src='http://silvermace.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2010/03/finiding-uids-in-macos-x-105106/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rush Digital&#8217;s iPhone/Mobile Game Engine</title>
		<link>http://silvermace.com/2010/02/rush-digitals-iphonemobile-game-engine/</link>
		<comments>http://silvermace.com/2010/02/rush-digitals-iphonemobile-game-engine/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 18:45:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=84</guid>
		<description><![CDATA[It&#8217;s what I&#8217;ve been working on all year, check it out, and flick me an email if you have any questions!
http://www.gamedev.net/community/forums/topic.asp?topic_id=562225
]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s what I&#8217;ve been working on all year, check it out, and flick me an email if you have any questions!</p>
<p><a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=562225">http://www.gamedev.net/community/forums/topic.asp?topic_id=562225</a></p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2010/02/rush-digitals-iphonemobile-game-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postfix SMTPD with SASL and AUTHMYSQL</title>
		<link>http://silvermace.com/2010/01/postfix-smtpd-with-sasl-and-authmysql/</link>
		<comments>http://silvermace.com/2010/01/postfix-smtpd-with-sasl-and-authmysql/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 07:17:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=81</guid>
		<description><![CDATA[Setting up Postfix can be a bit of a jungle of information, I was left scratching my head wondering why Postfix refused to relay an email to an external address even when provided valid user credentials. The issue seemed to be that Postfix SMTPD wasn&#8217;t paying any attention to the /etc/postfix/sasl/smtpd.conf file (which contained the [...]]]></description>
			<content:encoded><![CDATA[<p>Setting up Postfix can be a bit of a jungle of information, I was left scratching my head wondering why Postfix refused to relay an email to an external address even when provided valid user credentials. The issue seemed to be that Postfix SMTPD wasn&#8217;t paying any attention to the /etc/postfix/sasl/smtpd.conf file (which contained the auxprop mysql authentication plugin configuration) and hence was falling back to its default PAM based system.</p>
<p>The fix was the most paintfully simple addition to the Postfix main.cf, highlighted bold. This fix seems to only apply to Ubuntu based environments and means that the smtpd daemon will actually pay attention to the contents of /etc/postfix/sasl/smtpd.conf</p>
<p><code>smtpd_sasl_auth_enable = yes<br />
smtpd_sasl_security_options = noanonymous<br />
smtpd_sasl_local_domain = $myhostname<br />
<em><strong>smtpd_sasl_application_name = smtpd</strong></em><br />
broken_sasl_auth_clients = yes<br />
</code></p>
<p>more reading: <a href="http://ubuntuforums.org/showthread.php?t=297462">http://ubuntuforums.org/showthread.php?t=297462</a></p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2010/01/postfix-smtpd-with-sasl-and-authmysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Handy VC2008 Macro</title>
		<link>http://silvermace.com/2009/11/handy-vc2008-macro/</link>
		<comments>http://silvermace.com/2009/11/handy-vc2008-macro/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 23:34:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=79</guid>
		<description><![CDATA[So, if you&#8217;ve ever tried to drag a folder from the filesystem into VS Solution Explorerer, sure it&#8217;ll recursively add all the files, but it wont mirror the folders in the solution, so you end up with every file placed at the root level of whatever &#8220;filter-folder&#8221; you dragged it into. This is very annoying [...]]]></description>
			<content:encoded><![CDATA[<p>So, if you&#8217;ve ever tried to drag a folder from the filesystem into VS Solution Explorerer, sure it&#8217;ll recursively add all the files, but it wont mirror the folders in the solution, so you end up with every file placed at the root level of whatever &#8220;filter-folder&#8221; you dragged it into. This is very annoying when you have a project with say ~1,500 files.</p>
<p>I thought about how I could get around this and have the Solution Explorer folders mirror the filesystem, first obvious option was write a shell script or macro to do it. So I fired up VS macro explorer and lo-and-behold theres a Sample macro which ships with VS called &#8220;AddDirAsSlnFolder&#8221;.</p>
<p>Looking very promising I checked out the source code, and sure enough it does exactly what I needed. The only thing I had to do to get it working exactly right was add &#8220;.svn&#8221; to the exclusions list (this is down the bottom of the source file and should be clearly visible next to all the other exclusions in the list)</p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2009/11/handy-vc2008-macro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting FCollada to compile with VC++ 2008</title>
		<link>http://silvermace.com/2009/07/getting-fcollada-to-compile-with-vc-2008/</link>
		<comments>http://silvermace.com/2009/07/getting-fcollada-to-compile-with-vc-2008/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 00:41:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=73</guid>
		<description><![CDATA[When trying to build from the converted VC2005 solution file, you will encounter quite a few errors regarding mismatching declaration of _vsnprintf.
error C3163: '_vsnprintf': attributes inconsistent with previous declaration
the last post in this thread clarifies how this error arrises in common practice. To get it to compile I commented out these lines:

 FUtils\Platforms.h:145
LibXML\config.h:92
LibXML\include\win32config.h:90
DLLEntry:40 (this one [...]]]></description>
			<content:encoded><![CDATA[<p>When trying to build from the converted VC2005 solution file, you will encounter quite a few errors regarding mismatching declaration of _vsnprintf.</p>
<p><code>error C3163: '_vsnprintf': attributes inconsistent with previous declaration</code></p>
<p>the last post in <a href="http://social.msdn.microsoft.com/Forums/en-US/vsexpress2008installationandsetup/thread/24f0a7d9-d068-41f0-8827-fef35cd545de">this thread</a> clarifies how this error arrises in common practice. To get it to compile I commented out these lines:</p>
<ul>
<li> FUtils\Platforms.h:145</li>
<li>LibXML\config.h:92</li>
<li>LibXML\include\win32config.h:90</li>
<li>DLLEntry:40 (this one was just a missing symbol or something deprecated in new the PSDK shipping with VC9, the case statement is empty so commenting it out should have no effect)</li>
</ul>
<p>I should clearly note that I haven&#8217;t tested it (running etc.), I simply got it to build to help save our tools guy a bit of time. I should also note that the Unit Tests (FColladaTest) project builds but returns about 60 linker errors. I just thought I&#8217;d post here to save someone a bit of hassle if they should run into this error.</p>
<p>FCollada version was 3.05B Win32</p>
<p>-Danu</p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2009/07/getting-fcollada-to-compile-with-vc-2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>fun with numeric_limits min</title>
		<link>http://silvermace.com/2009/06/fun-with-numeric_limits-min/</link>
		<comments>http://silvermace.com/2009/06/fun-with-numeric_limits-min/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 01:17:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=66</guid>
		<description><![CDATA[Just a quick note, I thought others might find this helpful as well. In our level compiler, a bug which somehow went un-noticed for a little while was causing bounding boxes to not be calculated properly. This turned out to be a simple initialization oversight.
Vec3 maxValue, minValue;
ofcourse the default constructor would initialize both vectors to [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick note, I thought others might find this helpful as well. In our level compiler, a bug which somehow went un-noticed for a little while was causing bounding boxes to not be calculated properly. This turned out to be a simple initialization oversight.</p>
<p><code>Vec3 maxValue, minValue;</code></p>
<p>ofcourse the default constructor would initialize both vectors to [0,0,0]. This is useless when trying to determine a bounding box which lies entirely in the negative part of all axies (because no vertex in that area will ever excede maxValue, which has incorrectly been initalized to zero). The fix was simple, but it reminded me of another C/C++ quirk over numeric limits.</p>
<p>The fix, one would think, would be something like this:</p>
<p><code>const float FLOAT_HIGHEST = std::numeric_limits&lt;float&gt;::max();<br />
const float FLOAT_LOWEST = std::numeric_limits&lt;float&gt;::min();<br />
Vec3 maxValue(FLOAT_HIGHEST, FLOAT_HIGHEST, FLOAT_HIGHEST);<br />
Vec3 maxValue(FLOAT_LOWEST, FLOAT_LOWEST, FLOAT_LOWEST);</code></p>
<p>But, you&#8217;de be wrong. If you were using numeric_limits&lt;int&gt; that would work fine, but numeric_limits&lt;float&gt;::min acutally returns the lowest representable <em>positive</em> float (this is to help calculate another issue with IEEE floats see: <a href="http://en.wikipedia.org/wiki/Denormal">http://en.wikipedia.org/wiki/Denormal</a>).</p>
<p>Boost provides a clean solution for this in their <a href="http://www.boost.org/doc/libs/1_38_0/libs/numeric/conversion/doc/html/boost_numericconversion/bounds___traits_class.html">&#8220;bounds&#8221; package</a>.</p>
<p>I&#8217;m tempted to just go &#8220;-numeric_limits&lt;float&gt;::max()&#8221; (that is pretty much what the boost code will compile down to) but I like consistency, and I don&#8217;t want to worry about any (if any exist?) unmatched upper and lower values like 32 bit signed ints have, I&#8217;m no float expert&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2009/06/fun-with-numeric_limits-min/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>&#8220;V 48hour film contest&#8221;</title>
		<link>http://silvermace.com/2009/05/v-48hour-film-contest/</link>
		<comments>http://silvermace.com/2009/05/v-48hour-film-contest/#comments</comments>
		<pubDate>Mon, 11 May 2009 11:53:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=62</guid>
		<description><![CDATA[Myself and a few friends put together a team to write, direct, shoot &#38; produce a short film in 48 hours, May 8th-10th.
Our entry is in, it&#8217;s called &#8220;Six Minutes&#8221; it&#8217;s a &#8220;Real-time&#8221; action movie. We are in the Auckland Heats, and our team (Wise Guys) is &#8220;Heat 19&#8243; which will be screening on May [...]]]></description>
			<content:encoded><![CDATA[<p>Myself and a few friends put together a team to write, direct, shoot &amp; produce a short film in 48 hours, May 8th-10th.</p>
<p>Our entry is in, it&#8217;s called &#8220;Six Minutes&#8221; it&#8217;s a &#8220;Real-time&#8221; action movie. We are in the Auckland Heats, and our team (Wise Guys) is &#8220;Heat 19&#8243; which will be screening on May 23rd in Auckland, see <a href="http://www.48hours.co.nz/">http://www.48hours.co.nz/</a></p>
<p>We&#8217;re really happy with it, considering it&#8217;s all shot on handy-cam and no-one on the team has any professional film making experience what-so-ever haha. But please trust me when I say, it doesn&#8217;t really show..</p>
<p>Just thought I&#8217;d blog about it. Why? I don&#8217;t know, it seems like we achieved something, and I feel like letting people know.</p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2009/05/v-48hour-film-contest/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Multi-platform development</title>
		<link>http://silvermace.com/2009/04/multi-platform-development/</link>
		<comments>http://silvermace.com/2009/04/multi-platform-development/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 11:09:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=57</guid>
		<description><![CDATA[Just a short post. Today I took a quick tally of the technologies we&#8217;re using. 

OpenGL 3.0
OpenGL-ES CM 1.1
MSVC++ 8
GCC 4.0.1 (Apple) &#38; GCC 4.4 (Linux)
C# .NET 3.0 (or 2.0?)
XNA 3.0
XCode 3.1
Eclipse CDT 5.1
Visual Studio 2005
SVN

All of this is spread across 5 operating systems:


Apple MacOS 10.5
Apple iPhone OS 2.2.1
Microsoft Windows XP SP3
Microsoft Windows Vista SP1
Ubuntu Linux 8.10

On [...]]]></description>
			<content:encoded><![CDATA[<p>Just a short post. Today I took a quick tally of the technologies we&#8217;re using. </p>
<ul>
<li>OpenGL 3.0</li>
<li>OpenGL-ES CM 1.1</li>
<li>MSVC++ 8</li>
<li>GCC 4.0.1 (Apple) &amp; GCC 4.4 (Linux)</li>
<li>C# .NET 3.0 (or 2.0?)</li>
<li>XNA 3.0</li>
<li>XCode 3.1</li>
<li>Eclipse CDT 5.1</li>
<li>Visual Studio 2005</li>
<li>SVN</li>
</ul>
<div>All of this is spread across 5 operating systems:</div>
<div>
<ul>
<li>Apple MacOS 10.5</li>
<li>Apple iPhone OS 2.2.1</li>
<li>Microsoft Windows XP SP3</li>
<li>Microsoft Windows Vista SP1</li>
<li>Ubuntu Linux 8.10</li>
</ul>
<div>On 3 devices:</div>
<div>
<ul>
<li>XBox360</li>
<li>iPhone</li>
<li>PC (Windows and Linux)</li>
</ul>
</div>
<div>All for just this one project. We have a very talented and competent team, and we&#8217;re able to work across these platforms quite effectively which really amazes me at times.</div>
</div>
<div></div>
<div>If I had to provide a solitary tip, I would put forward that developing a good testing strategy and collaboration infrastructure (for us it&#8217;s VoIP/IM and a dedicated server for SVN) save time. alot of it. Oh, and some basic project management software is a must.</div>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2009/04/multi-platform-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You live and learn, C++</title>
		<link>http://silvermace.com/2009/04/you-live-and-learn-c/</link>
		<comments>http://silvermace.com/2009/04/you-live-and-learn-c/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 11:57:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=48</guid>
		<description><![CDATA[I&#8217;ve switch jobs and im working with C++, Objective-C++ and alot of cross platform stuff. Which is a nice change of pace from Java.  I&#8217;ve extracted out the C++ unit testing framework from one of our IP projects and am actively using it to write unit test for a data exporter im working with, which [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve switch jobs and im working with C++, Objective-C++ and alot of cross platform stuff. Which is a nice change of pace from Java.  I&#8217;ve extracted out the C++ unit testing framework from one of our IP projects and am actively using it to write unit test for a data exporter im working with, which brings me to my point for this post. And thanks to Kevin who helped me figure this out.</p>
<p>In C++, it turns out function-call arguments are not guaranteed by the standard to be evaluated in the traditional &#8220;left-to-right&#8221; order. Instead, it&#8217;s totaly implementation defined, and I&#8217;ve found that on VC++ (2k5) its as you would expect about 90% of the time, but there are certain situations where the compiler decides to mix things up.</p>
<p>the problem was noted in this piece of code:</p>
<p>Vec3 boundsMin( reader.readF32(), reader.readF32(), reader.readF32() )</p>
<p>the compiler translated it into something along these lines:</p>
<p>call readF32  /* stores the result in ecx */<br />
push ecx<br />
fstp dword ptr [esp]<br />
call readF32<br />
push ecx<br />
fstp dword ptr [esp]<br />
call readF32<br />
push ecx<br />
fstp dword ptr [esp]<br />
lea [boundsMin]<br />
call Vec3::Vec3</p>
<p>notice how the store instruction &#8220;fstp&#8221; always writes to the memory location specified by esp? now the assembly generated for Vec3 constructor&#8217;s uses the &#8220;rep stos&#8221; instruction to &#8220;block copy&#8221; the contents of the location esp refers to. Initially, all this code looks like it happens how you would expect: &#8220;left-to-right&#8221; but the reason it doesnt work as expected is because the &#8220;push&#8221; instruction is decrementing the value in esp by 4 and writing the value of the operand to the top of the stack every time its called.</p>
<p>What does this mean? in simple terms, yes, the reads happen in the order A,B,C but the resulting values are written into the stack-frame effectively backwards C,B,A (I say effectively because the &#8220;rep stos&#8221; instruction reads from lower memory to higher memory, but C was written to lower memory (because it was written last, hence esp would be at its lowest value), B in higher memory after C and A in even higher memory after B). This is where the non-guaratee by the standard comes into play, the only reason the compiler does this is because there is no requirement to do otherwise. hence all the values for this particular vector were having their x and z values swapped consistently in &#8220;Debug&#8221; generated code.</p>
<p>Fun times.</p>
<p>Oh and the lesson from all this: don&#8217;t inline function argument-expressions which have dependent reads. e.g. reading from streams.</p>
<p>For more reading: <a href="http://compilers.iecc.com/comparch/article/95-07-089">http://www.embedded.com/story/OEG20020429S0037</a><br />
and: <a href="http://compilers.iecc.com/comparch/article/95-07-089">http://compilers.iecc.com/comparch/article/95-07-089</a></p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2009/04/you-live-and-learn-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Relearning C++</title>
		<link>http://silvermace.com/2008/12/relearning-c/</link>
		<comments>http://silvermace.com/2008/12/relearning-c/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 21:52:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Business as usual]]></category>

		<guid isPermaLink="false">http://www.silvermace.com/?p=45</guid>
		<description><![CDATA[I haven&#8217;t blogged in a while now, so I thought I&#8217;d write something about a new personal project I&#8217;ve started. I entitled the post &#8220;relearning C++&#8221; because though I know lots of the language quirks and the nitty-gritty of C++, I have considered the past year or so a total re-introduction in the way I [...]]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t blogged in a while now, so I thought I&#8217;d write something about a new personal project I&#8217;ve started. I entitled the post &#8220;relearning C++&#8221; because though I know lots of the language quirks and the nitty-gritty of C++, I have considered the past year or so a total re-introduction in the way I <em>apply</em> C++ and in particular, go about developing software using C++. For 10 years now I have used C and C++ in my daily life, being self taught from an early age it has lead to lots of painful (to say the least) learning experiences and I would have to say that up until recently my C++ code has had that &#8220;self taught&#8221; feeling to it &#8211; Most of you know what I mean, mediocre variable names, slightly odd coding styles, choosing brevity over clarity and so forth.</p>
<p>The last few years working with Java in the industry has given me a little bit of insight on producing<em> quality</em> software over software that just does what it&#8217;s supposed to, this is the &#8220;relearning&#8221; I refer to.</p>
<p>The new project has been written in a unit-test centric manner, that&#8217;s not to say its TDD nor has it 99% code coverage, but unit-test are part of the center stage. Additionally, we are making good (not over-the-top) use of the collection of powerful Boost libraries, and using these meta-programming/template heavy libraries has definitely learned me a thing or two about C++ &#8211; I guess that&#8217;s the thing about C++, no matter how long you&#8217;ve been using it effectively, there&#8217;s just so much to know and there are always those &#8220;ahhh-haa [forgot about that!!!]&#8221; moments and I guess for me this makes things a bit more challenging, but a little bit more fun (but probably not as productive as it could be).</p>
<p>I wrote the unit testing framework for our project, quite a simple suite/runner system. The system has been valuable for us as a  2-man-decentralised-after-hours-team (2MDAHT) &#8211; basically self documentation for code and use-cases and full regression testability, which when communication is not as often as we&#8217;d like it, is a great way to make sure we&#8217;re always taking two steps forward and none back.</p>
<p>The system is also written thread-safe from the ground up, the unit tests and our design-test-implement-test  philosophy allow us to see deadlock situations during the design-test phase and then during implementation allow us to more easily replicate and fix deadlocks by drastically narrowing the window of code which could be causing the problem.</p>
<p>If you had asked me 2-3 years ago whether unit-testing C++ code was worth it, I would&#8217;ve almost certainly would have said &#8220;no&#8221; or at best &#8220;it depends&#8221;, today I would go so far as to say it would be a &#8220;must&#8221; (however I do appreciate the feeling of impending doom when faced with retro-fitting legacy C++ for unit testing).</p>
]]></content:encoded>
			<wfw:commentRss>http://silvermace.com/2008/12/relearning-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
