<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="wordpress/2.0.4" --><rss 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">

<channel>
	<title>hackinghat.com</title>
	<link>http://www.hackinghat.com</link>
	<description>adventures in technology</description>
	<pubDate>Tue, 16 Jun 2009 21:30:01 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.4</generator>
	<language>en</language>
			<geo:lat>+35.1</geo:lat><geo:long>+33.25</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Hackinghat" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">Hackinghat</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>The First Casualty</title>
		<link>http://www.hackinghat.com/index.php/internet/the-first-casualty</link>
		<comments>http://www.hackinghat.com/index.php/internet/the-first-casualty#comments</comments>
		<pubDate>Tue, 16 Jun 2009 21:30:01 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>internet</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/internet/the-first-casualty</guid>
		<description><![CDATA[I had to read this paragraph from the BBC about the recent Iranian elections twice to make sure I understood it correctly:
The official said the state department contacted Twitter over the weekend to urge it to delay a planned upgrade that could have cut daytime service to Iranians.
So, let me get this straight.   [...]]]></description>
			<content:encoded><![CDATA[<p>I had to read this paragraph from the BBC about the <a href="http://news.bbc.co.uk/2/hi/middle_east/8103577.stm">recent Iranian elections</a> twice to make sure I understood it correctly:</p>
<blockquote><p>The official said the state department contacted Twitter over the weekend to urge it to delay a planned upgrade that could have cut daytime service to Iranians.</p></blockquote>
<p>So, let me get this straight.   The US state department monitors Twitter traffic and is reviewing what Iranians are commenting on the topic of their government.    The department wanted to prevent an upgrade to Twitter that might stop the flow of revolutionist propaganda getting back out on the street and starting a larger movement.    </p>
<p>Don&#8217;t get me wrong, it&#8217;s a good call.   It just caught me a little by surprise.</p>
<p>I guess I shouldn&#8217;t actually be surprised by this but it marks a very definite transition (to me at least) for Twitter.   Folks at Twitter have probably been feeling it for years though.   The point is though that it&#8217;s no longer a fun toy.    </p>
<p>Twitter is now, amongst other things, a marketing place for the public, politicians, and companies.   But for government departments it&#8217;s also a socio-political barometer.  </p>
<p>Innocence lost.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AIRiQ1_BjHQ:EiKn3Zi2_Fo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AIRiQ1_BjHQ:EiKn3Zi2_Fo:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AIRiQ1_BjHQ:EiKn3Zi2_Fo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=AIRiQ1_BjHQ:EiKn3Zi2_Fo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AIRiQ1_BjHQ:EiKn3Zi2_Fo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AIRiQ1_BjHQ:EiKn3Zi2_Fo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=AIRiQ1_BjHQ:EiKn3Zi2_Fo:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/internet/the-first-casualty/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>MonoDevelop 2.0 makes me ashamed</title>
		<link>http://www.hackinghat.com/index.php/windows/net/monodevelop-20-makes-me-ashamed</link>
		<comments>http://www.hackinghat.com/index.php/windows/net/monodevelop-20-makes-me-ashamed#comments</comments>
		<pubDate>Mon, 18 May 2009 09:30:18 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>.NET</category>
	<category>unix</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/windows/net/monodevelop-20-makes-me-ashamed</guid>
		<description><![CDATA[I am ashamed to say that I wasn&#8217;t really sure if the Mono project would ever succeed.   It seemed like such an enormous task, and one that would forever be playing catch-up with M$, that it just didn&#8217;t make sense.

Even so, I&#8217;ve sort of been following it from the sidelines for a while [...]]]></description>
			<content:encoded><![CDATA[<p>I am ashamed to say that I wasn&#8217;t really sure if the Mono project would ever succeed.   It seemed like such an enormous task, and one that would forever be playing catch-up with M$, that it just didn&#8217;t make sense.</p>
<p><a style="float:right" href="http://www.hackinghat.com/wp-content/uploads/2009/05/screenshot-coretest-monodevelop-1.png"><img id="image138" src="http://www.hackinghat.com/wp-content/uploads/2009/05/screenshot-coretest-monodevelop-1.thumbnail.png" alt="MonoDevelop 2.0" /></a></p>
<p>Even so, I&#8217;ve sort of been following it from the sidelines for a while and I&#8217;m excited to say that Mono 2.4 seems to be a drop-in replacement for the bits of the .NET SDK I was actually using.   Now with the release of MonoDevelop 2.0 it seems that I&#8217;m also able to get a functioning alternative to the Visual Studio GUI I&#8217;ve been using.   It&#8217;s a colossal achievement and one that makes me even more ashamed.    Ashamed that I didn&#8217;t think it was possible, and ashamed that I didn&#8217;t help out.   </p>
<p>To get it working was a bit of a trial though.   It turns out that because I already had the default MonoDevelop 1.0 installed that when I started trying to build a new version things got very confused.    Not only that it turns out that the <a href="http://monodevelop.com/Download">build instructions for MonoDevelop 2.0</a> aren&#8217;t exactly correct.   After a lot of messing around I think I managed to damage the default installation and cross-link a few libraries here and there.    I think if I was doing it again I should probably have followed these instructions <a href="http://www.mono-project.com/Parallel_Mono_Environments">Parallel Mono Environments</a> before doing anything.   Too late now though.    After much building and swearing I ended up uninstalling all Mono environments and then rebuilding everything for Mono 2.4.   I didn&#8217;t put the Hardy version back yet, I&#8217;ll do that if I need to.</p>
<p>Here&#8217;s what I did, in case it helps anyone.</p>
<hr/>
<p>First of all I decided that this is a temporary solution and that eventually I would be able to get MonoDevelop 2.0 running from APT, therefore I decided to install everything in /usr/local.  </p>
<h2>Ubuntu Development Packages</h2>
<p>As ever with Ubuntu you will quite probably need to install a bunch of development libraries to make it work.   I probably had a lot of the dependencies I needed installed before I began but here are the ones that I didn&#8217;t have that I needed.   Your mileage might vary.</p>
<pre><code>sudo apt-get install bison  gnunet-gtk-dev libpango1.0-dev libgtk2.0-dev
libglade2-dev libgnome-dev libart-dev libgnome2-dev libgnome-dev libgnomeui-dev
libgnomeprint2.2-dev libgnomeprintui2.2-dev libgnomecanvas2-dev
libpanel-applet2-dev
</code></pre>
<h2>Mono</h2>
<p>As per the parallel environments guide I set up this environment in a script and executed it.</p>
<pre><code>#!/bin/bash
MONO_PREFIX=/usr/local
GNOME_PREFIX=/usr
export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include
export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal
export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig
PATH=$MONO_PREFIX/bin:$PATH
MONO_GAC_PREFIX=/usr/local
PS1="[mono] w @ "</code></pre>
<p>I then downloaded the following libraries from the <a href="http://ftp.novell.com/pub/mono/sources-stable/">Mono 2.4 sources page</a>.</p>
<pre><code>wget http://ftp.novell.com/pub/mono/sources/libgdiplus/libgdiplus-2.4.tar.bz2
http://ftp.novell.com/pub/mono/sources/mono/mono-2.4.tar.bz2
http://ftp.novell.com/pub/mono/sources/gtk-sharp212/gtk-sharp-2.12.8.tar.bz2
http://ftp.novell.com/pub/mono/sources/gnome-sharp220/gnome-sharp-2.20.1.tar.bz2
http://ftp.novell.com/pub/mono/sources/mono-addins/mono-addins-0.4.zip
http://ftp.novell.com/pub/mono/sources/mono-tools/mono-tools-2.4.tar.bz2
http://ftp.novell.com/pub/mono/sources/mono-debugger/mono-debugger-2.4.tar.bz2
http://ftp.novell.com/pub/mono/sources/monodevelop/monodevelop-2.0.tar.bz2
http://ftp.novell.com/pub/mono/sources/monodevelop-debugger-mdb/monodevelop-debugger-mdb-2.0.tar.bz2
http://ftp.novell.com/pub/mono/sources/monodevelop-database/monodevelop-database-2.0.tar.bz2</pre>
<p></code></p>
<p>Extract all these and then run the below command in each.   Because this is a dependency stack you will need to do them roughly in the order they&#8217;re listed above.</p>
<pre><code>./configure --prefix=/usr/local
make &#038;&#038; sudo make install</code></pre>
<p>After that you should be left with a working MonoDevelop 2.0!   </p>
<h2>Troubles</h2>
<p>I encountered a few problems on the way, mostly there were problems relating to not having the correct Ubuntu development libraries and headers installed when the parts of the stack were configured.   </p>
<p>I also ran into some problems with the GAC having pre-installed versions of conflicting libraries installed.   Eventually though this problem was resolved by uninstalling the default Hardy version of Mono and starting again.   Hopefully you won&#8217;t have this problem because you will have setup a parallel environment in the first place &#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=t6V_KAlj1LE:VHeKKGXGrjU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=t6V_KAlj1LE:VHeKKGXGrjU:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=t6V_KAlj1LE:VHeKKGXGrjU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=t6V_KAlj1LE:VHeKKGXGrjU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=t6V_KAlj1LE:VHeKKGXGrjU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=t6V_KAlj1LE:VHeKKGXGrjU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=t6V_KAlj1LE:VHeKKGXGrjU:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/windows/net/monodevelop-20-makes-me-ashamed/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>cl-mysql on github</title>
		<link>http://www.hackinghat.com/index.php/lisp/cl-mysql-on-github</link>
		<comments>http://www.hackinghat.com/index.php/lisp/cl-mysql-on-github#comments</comments>
		<pubDate>Fri, 15 May 2009 13:11:01 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>lisp</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/lisp/cl-mysql-on-github</guid>
		<description><![CDATA[I&#8217;ve seen the future and it is git.   Some believe Mercurial is the way because it is more accessible, but I&#8217;m not so sure.   
We&#8217;re programmers, we love this esoteric shit.  The more hardcore the better.    IMHO, the force of numbers, and its pedigree, will probably make [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve seen the future and it is <a href="http://git-scm.com/">git</a>.   Some believe <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a> is the way because it is more accessible, but I&#8217;m not so sure.   </p>
<p>We&#8217;re programmers, we love this esoteric shit.  The more hardcore the better.    IMHO, the force of numbers, and its <a href="http://en.wikipedia.org/wiki/Git_(software)">pedigree</a>, will probably make the big fat git wade through the opposition like the monster it is.</p>
<p>Anyway, for a few months now I&#8217;ve been seeing this <a href="http://github.com">github</a> thing linked here and there,  I figured it was about time I checked it out.   </p>
<p>I went, I saw, and it was good.   Fast, easy-to-use and beautifully in the spirit of free-software (you only have to pay to use it for private repositories).</p>
<p>So in the spirit of free <strike>love</strike>code I&#8217;ve added <a href="http://github.com/hackinghat/cl-mysql/tree/master">cl-mysql</a>.   </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=Da2aMu5b9Qw:5nKZKlylIYw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=Da2aMu5b9Qw:5nKZKlylIYw:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=Da2aMu5b9Qw:5nKZKlylIYw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=Da2aMu5b9Qw:5nKZKlylIYw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=Da2aMu5b9Qw:5nKZKlylIYw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=Da2aMu5b9Qw:5nKZKlylIYw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=Da2aMu5b9Qw:5nKZKlylIYw:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/lisp/cl-mysql-on-github/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Embedding Lisp in Mono</title>
		<link>http://www.hackinghat.com/index.php/lisp/embedding-lisp-in-mono</link>
		<comments>http://www.hackinghat.com/index.php/lisp/embedding-lisp-in-mono#comments</comments>
		<pubDate>Fri, 08 May 2009 08:37:59 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>lisp</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/windows/net/embedding-lisp-in-mono</guid>
		<description><![CDATA[I have been thinking about a new project that I wanted to write with Mono.  One of the things that I realised I would need is the ability to execute arbitrary code (user or wizard generated) that might be stored in a database.   
Code &#8230; data &#8230; code.   
A very [...]]]></description>
			<content:encoded><![CDATA[<p>I have been thinking about a new project that I wanted to write with Mono.  One of the things that I realised I would need is the ability to execute arbitrary code (user or wizard generated) that might be stored in a database.   </p>
<p>Code &#8230; data &#8230; code.   </p>
<p>A very dim light went on in my head telling me that that sounded very much like a Lispy problem.</p>
<p>However, I particularly wanted to use Mono (and not Java, say) for the solution and so I started writing my own interpreter.   After about 4 hours of toil I realised that maybe I should finish reading <a href="http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521545668/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1241771447&#038;sr=8-1">Lisp in Small Pieces</a> before getting carried away.   But the urge to create was large, so I went looking for a Scheme interpreter written in .NET and found <a href="http://sharpscheme.berlios.de/index.html">S#</a>.</p>
<p>10 minutes of fiddling in <a href="http://monodevelop.com/">MonoDevelop</a> later and I had an <a href="http://community.schemewiki.org/?R4RS">R4RS</a> interpreter running in .NET on Linux.   I heart open source  &#8230;</p>
<pre><code>stkni@ubuntu:~/source/SSharp-Mono-0.38a/SSharp.Console/bin/Debug$ ./SSharp.Console.exe 

 This is: SharpScheme v0.38 - R4RS compatible Scheme interpreter.
 A pure C# port of Peter Norvig's Scheme for the .NET Framework.
 License here: http://www.norvig.com/license.html 

 Running on: Unix <clr 2.0.50727.42> 

>>> (+ 1 2)
3</code></pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=CpXVIYSrkGg:mzE9DSwjDHU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=CpXVIYSrkGg:mzE9DSwjDHU:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=CpXVIYSrkGg:mzE9DSwjDHU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=CpXVIYSrkGg:mzE9DSwjDHU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=CpXVIYSrkGg:mzE9DSwjDHU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=CpXVIYSrkGg:mzE9DSwjDHU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=CpXVIYSrkGg:mzE9DSwjDHU:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/lisp/embedding-lisp-in-mono/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>cl-mysql v0.2</title>
		<link>http://www.hackinghat.com/index.php/database/cl-mysql-v02</link>
		<comments>http://www.hackinghat.com/index.php/database/cl-mysql-v02#comments</comments>
		<pubDate>Mon, 27 Apr 2009 06:35:11 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>database</category>
	<category>lisp</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/uncategorized/cl-mysql-v02</guid>
		<description><![CDATA[I am pleased to announce that cl-mysql 0.2 is ready for use!
Here are some of the highlights of v0.2

Connection pooling - Thread safe allocation and release of connections from a central pool.
Use result/Store result - Ability to use mysql_use_result as well as mysql_store_result.   This means that CL-MYSQL should be able to handle the [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce that cl-mysql 0.2 is ready for use!</p>
<p>Here are some of the highlights of v0.2</p>
<ul>
<li><strong>Connection pooling</strong> - Thread safe allocation and release of connections from a central pool.</li>
<li><strong>Use result/Store result</strong> - Ability to use mysql_use_result as well as mysql_store_result.   This means that CL-MYSQL should be able to handle the processing of very large datasets without running out of memory.</li>
<li><strong>Convenience functions/macros</strong> - with-rows / nth-row</li>
</ul>
<p>The main difference between v0.1 and v0.2 is that version 0.1 didn&#8217;t really manage its connections.   I decided that allowing the user to choose between pooled and non-pooled connections is a hassle.   Much better then to allow the user to create as many connection pools as they want and allow them to specify the maximum and minimum number of connections that the pool can hold.  After all, a single connection is simply a special case of a pool with only one connection.    </p>
<p>However, in theory this could hurt performance when attempting to do large number of INSERT/UPDATE&#8217;s because every call would require the connection pool to be locked and a connection to be aquired.   This could be overcome though by making use of the fact that CL-MYSQL will correctly pass multiple statements to the server so you could concatenate a large string of updates and execute them all at once.</p>
<p>The good news though is that the API has changed only very slightly in the optional arguments it accepts.  However I have changed the way the result data comes back from <strong>query</strong>.   Because CL-MSQL returns multiple result sets it&#8217;s necessary to place all of them into a sequence.   Additionally, I did not like the way I was placing the column headers into the first item of the result data.  It means you always have to allow for it.   I considered doing it the way that CLSQL does it by returning the column data in a value struct but I find this awkward to manage. This is because every layer of the API (and client code) must multiple-value-bind the columns out and either repackage them as a sequence or create a new value structure to pass them up the call-chain.</p>
<p>Therefore I have changed the result sequence structure to be as follows:</p>
<pre>
query-result ::= (&lt;result-set&gt;*)
result-set ::= (&lt;result-data> &lt;column-data&gt;)
result-data ::= (&lt;row&gt;*) | &lt;rows-affected&gt;
row ::= (&lt;column&gt;*)
column-data ::= ((&lt;column-name&gt; &lt;column-type&gt; &lt;column-flags&gt;)*)
</pre>
<p>I appreciate that this is a little complex, I did consider turning the result data into a struct but this complicates how the user processes the data.   For this reason I have added: <strong>with-rows</strong> and <strong>nth-row</strong> to simplify the processing of this result data. </p>
<p>Finally, the whole thing is still only SBCL/x86 Linux compatible, that <em>might</em> change <img src='http://www.hackinghat.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>More information is available <a href="/index.php/cl-mysql">here</a>.  As always, any feedback is appreciated.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=2iGjYWD3wNw:EZO_bW8fWKs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=2iGjYWD3wNw:EZO_bW8fWKs:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=2iGjYWD3wNw:EZO_bW8fWKs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=2iGjYWD3wNw:EZO_bW8fWKs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=2iGjYWD3wNw:EZO_bW8fWKs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=2iGjYWD3wNw:EZO_bW8fWKs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=2iGjYWD3wNw:EZO_bW8fWKs:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/database/cl-mysql-v02/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Announce: cl-mysql</title>
		<link>http://www.hackinghat.com/index.php/lisp/announce-cl-mysql</link>
		<comments>http://www.hackinghat.com/index.php/lisp/announce-cl-mysql#comments</comments>
		<pubDate>Wed, 01 Apr 2009 10:17:31 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>lisp</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/uncategorized/announce-cl-mysql</guid>
		<description><![CDATA[After some deliberation I decided to try out what I was talking about in The Not So Super Super API.   The idea of being able to hook a low-level API, so that it&#8217;s functionality could be tweaked later seemed quite appealing to me.   In reality, whilst what I had intended was [...]]]></description>
			<content:encoded><![CDATA[<p>After some deliberation I decided to try out what I was talking about in <a href="http://www.hackinghat.com/index.php/programming/the-not-so-super-super-api">The Not So Super Super API</a>.   The idea of being able to hook a low-level API, so that it&#8217;s functionality could be tweaked later seemed quite appealing to me.   In reality, whilst what I had intended was indeed achievable the performance sucked so hard as to make me rethink what I had done.   </p>
<p>I did though, in the process, create an alternate library to using <a href="http://clsql.b9.com">CLSQL</a> which has support for stored procedures that return result sets, better (IMHO) type inference and is far simpler to deploy.   So it wasn&#8217;t totally in vain.   I intend to extend the library a little to work on the performance and provide a more faithful Common Lisp implementation in the near-future.</p>
<p>Full details of the cl-mysql library are available on this <a href="http://www.hackinghat.com/index.php/cl-mysql">page</a>.</p>
<p>Thanks to the power of Lisp&#8217;s macros I am able to make the low-level API hooking dependent upon a compile-time special variable.  That way I can generate the additional code for the API hooking, if I want to, or leave it out whilst I&#8217;m working on other aspects of the library.   Don&#8217;t you just love Lisp?!   Hopefully we&#8217;ll revisit this topic some time later too.</p>
<p>Finally, I realise now that announcing anything on April Fool&#8217;s day is possibly a mistake.   It seems that the signal-to-noise ratio in the world has gone down quite significantly in the last-few-hours <img src='http://www.hackinghat.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .   I guess that makes me the fool then.
</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=xCJluZob4p8:27jXpfpaNx0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=xCJluZob4p8:27jXpfpaNx0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=xCJluZob4p8:27jXpfpaNx0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=xCJluZob4p8:27jXpfpaNx0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=xCJluZob4p8:27jXpfpaNx0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=xCJluZob4p8:27jXpfpaNx0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=xCJluZob4p8:27jXpfpaNx0:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/lisp/announce-cl-mysql/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The Not So Super, Super API</title>
		<link>http://www.hackinghat.com/index.php/programming/the-not-so-super-super-api</link>
		<comments>http://www.hackinghat.com/index.php/programming/the-not-so-super-super-api#comments</comments>
		<pubDate>Thu, 12 Mar 2009 09:04:47 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>programming</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/uncategorized/the-not-so-super-super-api</guid>
		<description><![CDATA[Now and again you come across the &#8216;one size fits all&#8217; of computer programming the &#8216;Super API&#8217;.   It derives its name from the fact that it tries to act as a superset of a bunch of other platform-specific APIs.   One good example of this is JDBC/ODBC, but there are many others. [...]]]></description>
			<content:encoded><![CDATA[<p>Now and again you come across the &#8216;one size fits all&#8217; of computer programming the &#8216;Super API&#8217;.   It derives its name from the fact that it tries to act as a <a href="http://en.wikipedia.org/wiki/Superset">superset</a> of a bunch of other platform-specific APIs.   One good example of this is JDBC/ODBC, but there are many others.   JDBC/ODBC allow access to many many database servers because they&#8217;ve normalised the API so that you can write code that doesn&#8217;t care which database it is connected to.</p>
<p>Now and again, though, I find myself requiring features that are not exposed in a Super API.   They&#8217;re not exposed because the feature is either too niche or because it is not standard across implementations.   Creating a <strong>Super API</strong> is in some ways like plastering.    Once you&#8217;ve created that nice even finish across an entire wall you might find that you&#8217;re missing a few light switches.</p>
<p>I was reminded of this the other day when one particular super SQL API: <a href="http://clsql.b9.com/">CLSQL</a> uses another super API: <a href="http://uffi.b9.com/">UFFI</a>, what they do and how they do it is largely irrelevant.   The important point is that I&#8217;m only going to be concerned about the operation of one of the combination of technologies (MySQL with SBCL:SB-ALIEN).    I&#8217;m concerned because there is a particular SBCL feature that I want CLSQL to make use of when it calls SBCL:LOAD-SHARED-OBJECT from via UFFI.   Confused?   Don&#8217;t worry, it&#8217;s not that important.</p>
<p>In the end I found a (most heinous) way to do what I want but it occurred to me that there has to be a better way.  I appreciate that there is no way that the library writer could know what I want before I want it and neither could they potentially anticipate future underlying API changes to provide for them.   However, what if the library writer gave me the option of <strong>registering a per-API first-chance callback function</strong>?   This function could then perform custom processing for my platform combination and then yield control back to the library when it was completed.   That way I could inject any code I wanted at potentially any supported depth.   </p>
<p>I don&#8217;t doubt that it would be difficult to produce an API like this.   Certain classes of API (non reentrant APIs being one that jumps to mind) could potentially break in new and unforseen ways and library maintainers would have to be creative about how they detect and cope with errors happening in and around user injected code.  </p>
<p>But if the injected code was simply a one-line replacement for the one-line that would otherwise have be called then it might work.   Perhaps it might even be fun to try it.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=hv-Sdppu3mU:M-nb07BrxP4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=hv-Sdppu3mU:M-nb07BrxP4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=hv-Sdppu3mU:M-nb07BrxP4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=hv-Sdppu3mU:M-nb07BrxP4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=hv-Sdppu3mU:M-nb07BrxP4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=hv-Sdppu3mU:M-nb07BrxP4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=hv-Sdppu3mU:M-nb07BrxP4:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/programming/the-not-so-super-super-api/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Look Ma! No F9!</title>
		<link>http://www.hackinghat.com/index.php/programming/look-ma-no-f9</link>
		<comments>http://www.hackinghat.com/index.php/programming/look-ma-no-f9#comments</comments>
		<pubDate>Wed, 18 Feb 2009 21:54:11 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>programming</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/programming/look-ma-no-f9</guid>
		<description><![CDATA[More people should read the Design of Everyday Things.     I couldn&#8217;t do the book justice but it did explain something to me that I&#8217;d never seen written down anywhere else before and was sorely reminded of today.
It seems that everyday things have something called &#8216;affordances&#8217; which should give us mental clues [...]]]></description>
			<content:encoded><![CDATA[<p>More people should read the <a href="http://www.amazon.co.uk/Design-Everyday-Things-Don-Norman/dp/0465067107/ref=pd_bxgy_b_img_a">Design of Everyday Things</a>.   <img style="float:right; padding: 10px;" src="http://www.jnd.org/images/DOET-2002cover.jpg" />  I couldn&#8217;t do the book justice but it did explain something to me that I&#8217;d never seen written down anywhere else before and was sorely reminded of today.</p>
<p>It seems that everyday things have something called &#8216;affordances&#8217; which should give us mental clues about how they work.    The design of everyday things attempts to teach us that poorly designed things lead us down wrong mental-paths and make mistakes when using those things.   Mistakes that at best might get our fingers burnt or at worst cost lives.</p>
<p>So far so good.   What do you do then when the mental-paths that people are sent down get so worn that they can&#8217;t think straight anymore?   Of course, I&#8217;m <a href="http://www.hackinghat.com/index.php/article/the-spread-able-system">talking about spreadsheets again</a>.    It seems spreadsheets are so ubiquitous and are so well understood by so many people that some people when faced with technology view it as one enormous spreadsheet.    Which is ironic because we know by now that spreadsheets simply can&#8217;t be enormous because they don&#8217;t scale.</p>
<p>I really don&#8217;t think technologists should beat non-technologists up about their lack of technical expertise.   That&#8217;s just counter-productive and plain wrong.   But what do you do when you are faced with someone who has convinced themselves that it&#8217;s all one big spreadsheet?   How do you explain to them that in my world there is no F9?   Where&#8217;s that pencil &#8230;
</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AdmOawZAYUg:ZTut1tqK_XA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AdmOawZAYUg:ZTut1tqK_XA:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AdmOawZAYUg:ZTut1tqK_XA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=AdmOawZAYUg:ZTut1tqK_XA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AdmOawZAYUg:ZTut1tqK_XA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=AdmOawZAYUg:ZTut1tqK_XA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=AdmOawZAYUg:ZTut1tqK_XA:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/programming/look-ma-no-f9/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The Spread-able System</title>
		<link>http://www.hackinghat.com/index.php/article/the-spread-able-system</link>
		<comments>http://www.hackinghat.com/index.php/article/the-spread-able-system#comments</comments>
		<pubDate>Tue, 06 Jan 2009 08:23:02 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>article</category>
	<category>programming</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/article/the-spread-able-system</guid>
		<description><![CDATA[Spreadsheets are everywhere.   They are simple to create and are an immensely powerful tool.  Unsurprisingly then this means that a lot of areas of business rely on spreadsheets to function correctly.   But spreadsheets are dangerous too.    They suffer from, well-known, fundamental flaws.
The problem is that spreadsheets are [...]]]></description>
			<content:encoded><![CDATA[<p>Spreadsheets are everywhere.   They are simple to create and are an immensely powerful tool.  Unsurprisingly then this means that a lot of areas of business rely on spreadsheets to function correctly.   But spreadsheets are dangerous too.    They suffer from, well-known, fundamental flaws.</p>
<p>The problem is that spreadsheets are a special type of code, and I&#8217;m not talking about the Excel &#8216;macros&#8217; I&#8217;m talking about the formulas.   As such they probably need to be treated the same way as other types of code, but their very nature makes this difficult.   But I&#8217;m getting ahead of myself, let&#8217;s first look at some of what is good and bad about spreadsheets.</p>
<h2>Pros</h2>
<p>Spreadsheets are remarkable for their: </p>
<ul>
<li><strong>Utility</strong> - we can bend them into almost any shape we want because they give one way to represent almost any business process;</li>
<li><strong>Portability</strong> - we can pick up our little gobbets of data and logic and relocate them to almost anywhere inside or outside the company, in file-systems, mail servers and web-sites;</li>
<li><strong>Simplicity</strong> - you don&#8217;t have to explain a spreadsheet to anyone.   They might have to be a proto-genius to figure out how it works but the working knowledge they would need to get started is pre-loaded in their heads and ready-to-run.</li>
</ul>
<h2>Cons</h2>
<p>So they sound pretty useful, and I like to think that I&#8217;m a pragmatic guy, so why do I hate them so much?   Many have noted about the shortcomings of spreadsheets.   The page on spreadsheets at <a href="http://en.wikipedia.org/Spreadsheet">Wikipedia</a> spells it out clearly enough so I&#8217;ll paraphrase:</p>
<ol>
<li><strong>Productivity</strong>  - Working with spreadsheets requires a lot of &#8220;sheet-shuffling&#8221; to reach the required goal.   The bigger the sheet, the more time is spent copying, cutting and pasting cells around.</li>
<li><strong>Reliability</strong> - Although what consitutes an error in a spreadsheet is subjective, the paper <a href="http://mba.tuck.dartmouth.edu/spreadsheet/product_pubs_files/Literature.pdf">A Critical Review of the Literature on Spreadsheet Errors&#8221; (pdf)</a> reveals a series of studies (some more recent than others) that have shown that approximately 5% of cells contain errors.</li>
<li><strong>Collaboration</strong> - Sharing a spreadsheet is difficult.   Having two independent people working on the same sheet and merging their results is as far as I know impossible.</li>
</ol>
<p>The first two items don&#8217;t bother me overly.   Yes, it&#8217;s a problem but then the alternatives aren&#8217;t that great either.   Consider what you would do if you didn&#8217;t have a spreadsheet to fulfill the task.   You&#8217;d either do it with a bit of paper and a calculator (i.e. simulate a spreadsheet) or get a programmer to do the task for you.   Either way the amount of productivity loss/gain and the amount of errors aren&#8217;t going to be that significantly different from using a spreadsheet.   Don&#8217;t get me wrong, I love my fellow programmer, but we make a LOT of mistakes too.   The difference perhaps is that bespoke systems usually end up getting audited (and hence fixed) and spreadsheets often don&#8217;t.   Although this point is probably moot.</p>
<h2>Good + Bad = Too Bad</h2>
<p>My real beef is with what happens when you have the &#8216;pro&#8217; of high portability with the &#8216;con&#8217; of low collaborative power.   <strong>You have no way of knowing which version of the spreadsheet you have is the &#8220;true&#8221; one, and which version is duff</strong>.   Every copy, whether it be inadvertently through forwarding a sheet by email to someone else or explicitly by taking a &#8216;backup&#8217; is a 12 foot tall baby-eating, business-crushing monster waiting to rip you and everyone you love apart.   </p>
<h2>Hug the Monster, Then Run</h2>
<p>The thing is we kind of have to embrace the baby-business-beating monster because it&#8217;s about all we&#8217;ve got.  There are some tasks, as a programmer, that I&#8217;m really happy that you as the non-programmer don&#8217;t bother me with and solve yourself in sheets.    Want to set-up an intra-company phone-book as a spreadsheet so you don&#8217;t have to bother will all that &#8220;Access&#8221; voodoo?  Be my guest, but I&#8217;m watching you.   Want to set-up a spreadsheet to run your fantasy football so you don&#8217;t have to add two numbers together?  Go right ahead, I&#8217;ll even drive you to the game so you don&#8217;t miss the turn.   Want to set up a spreadsheet to calculate payments and and do a mail-merge with the results &#8230; STOP.  RIGHT. NOW.</p>
<p>The truth is though that you might not know that you&#8217;re creating the mother-of-all spreadsheets when you start.   I might not know it either but there will probably come a time when a line is crossed and then I will want to know what you&#8217;ve been doing and who you&#8217;ve been doing it with.   I&#8217;m just like that.</p>
<p>Unless you are small company (and hence don&#8217;t have a lot of choice) you have to be very afraid of trusting anything that might lose you money to a spreadsheet.  You need to be very aware of the risks and the potential-costs you are letting yourself in for.   Here in Europe there is even a <a href="http://www.eusprig.org/index.htm">special interest group</a> dedicated to highlighting the risks of spreadsheets.   Those guys must throw wild parties &#8230;</p>
<h2>The Missing Links</h2>
<p>In my opinion there is something missing,  something that can fill the gap between spreadsheet and system.  </p>
<p>I think we need something that can:</p>
<ol>
<li><strong>Track spreadsheet changes</strong> - Not knowing which spreadsheet is &#8220;true&#8221; and which lies (by being able to identify revisions of the sheet that have happened after yours was &#8216;branched&#8217;), and not being able to merge sheets is a problem.   Perhaps someone solved it already, if they had that would be great.</li>
<li><strong>Track spreadsheets themselves</strong> - Having some more information about what sort of corporate-data was being accessed, who was using it and how frequently they ran it might alert us to potential spreadsheet monsters being born.</li>
<li><strong>Narrow the gap</strong> - Making spreadsheets more like traditional software systems, without significantly castrating the usefulness of the spreadsheet, would be great too.  This is a little like asking for the <a href="http://www.urbandictionary.com/define.php?term=moon%20on%20a%20stick">moon on a stick</a> though.</li>
</ol>
<p>Perhaps I&#8217;ll make something like this one day.   I have to admit it&#8217;s not a terribly exciting project but it has some potential I think.   Perhaps I could spice it up by throwing a party and invite the guys from the &#8220;European Spreadsheet Risks Interest Group&#8221;.   <strong>Now</strong> we&#8217;re talking.    How will I budget for the 7-up, party hats and streamers?    In a spreadsheet of course.
</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=af3B5qJLpoE:MOQwrI6uWyA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=af3B5qJLpoE:MOQwrI6uWyA:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=af3B5qJLpoE:MOQwrI6uWyA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=af3B5qJLpoE:MOQwrI6uWyA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=af3B5qJLpoE:MOQwrI6uWyA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=af3B5qJLpoE:MOQwrI6uWyA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=af3B5qJLpoE:MOQwrI6uWyA:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/article/the-spread-able-system/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The Ever Diminishing Deliverable</title>
		<link>http://www.hackinghat.com/index.php/programming/the-ever-diminishing-deliverable</link>
		<comments>http://www.hackinghat.com/index.php/programming/the-ever-diminishing-deliverable#comments</comments>
		<pubDate>Fri, 05 Dec 2008 09:12:34 +0000</pubDate>
		<dc:creator>Steve Knight</dc:creator>
		
	<category>programming</category>
		<guid isPermaLink="false">http://www.hackinghat.com/index.php/programming/the-ever-diminishing-deliverable</guid>
		<description><![CDATA[When you&#8217;re making software in-house you can largely ship what you want, within reason.  Conversely, when you&#8217;re making software for customers or clients I&#8217;m guessing you owe it to your customer, and perhaps your bottom-line, that what you produce is of the very best quality.    If you don&#8217;t your customer goes [...]]]></description>
			<content:encoded><![CDATA[<p>When you&#8217;re making software in-house you can largely ship what you want, within reason.  Conversely, when you&#8217;re making software for customers or clients I&#8217;m guessing you owe it to your customer, and perhaps your bottom-line, that what you produce is of the very best quality.    If you don&#8217;t your customer goes somewhere else.    However, the additional effort required in producing the quality software for customers can be substantial.   Since you want to keep your customer, and attract new ones, you must expend the effort at a potentially large personal cost.   </p>
<p>When you&#8217;re making software in-house there is a well-known danger of <a href="http://www.urbandictionary.com/define.php?term=Gilding%20the%20Lilly">gilding the lilly</a>.  Indeed, in-house the law of diminishing returns comes into force if you spend too much time making your in-house project of the very highest quality.   The law of <a href="http://en.wikipedia.org/wiki/Diminishing_returns">diminishing returns</a> can best be described as:</p>
<blockquote><p>&#8230; in a production system with fixed and variable inputs (say factory size and labor), beyond some point, each additional unit of variable input yields less and less output. Conversely, producing one more unit of output costs more and more in variable inputs.</p></blockquote>
<p>Since I don&#8217;t work for a software house, if I can release my code in-house when it is only partially complete, then I should be able to get a lot more stuff done for less cost.   </p>
<p>So far so good.    A problem arises, though, because I have observed that different programmers place different levels of importance on software quality.   This is as probably as you&#8217;d expect, one thing we have in common is that <a href="http://www.youtube.com/watch?v=2T1LIrzsgqA">we&#8217;re all individuals</a>.</p>
<p>The sad truth is that, based on someone&#8217;s own personal standards, the bare minimum of what is required to get a job done is usually <strong>all that is done</strong>.    This probably goes someway to explaining the appalling state of some of the in-house software I&#8217;ve seen, and written myself.  It&#8217;s understandable because often, once the main problem has been solved the other issues like usability, maintainability, extensibility and support can be overlooked without any immediately dire consequences.   </p>
<p>But here&#8217;s the sting, once you release something you usually have to support it too.   That&#8217;s just the way in-house software works (sucks?), I guess.    If you made a poor job of it then you&#8217;ll probably pay for it many many times over in support queries.  In the end it seems to me that unless you quit (or are fired!) the diminishing deliverable cost turns into a potentially huge support cost.    Especially if you end up layering new solutions on to an originally broken solution.</p>
<p>All, in all, you might as well have tried to make something a little more durable and complete at the outset.   Sure you can re-factor your mistakes later, but even refactoring costs a lot more to do later than it does to get it &#8216;right&#8217; at the beginning.</p>
<p>It seems to me that it is essentially a problem of planning.   In-house software projects, big and small, aren&#8217;t usually planned properly.   As a result secondary factors that would improve the overall quality are not included in any estimates.   As a result of this bad planning those in-house projects are often late and buggy.   </p>
<p>This problem is not getting any better.   Years of software-development in an in-house setting have shown me that where in-house plans &#038; design meetings exist issues of usability, maintainability and support are very minor concerns if they are concerns at all.   Perhaps that should change.    Just a little &#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Hackinghat?a=uXmChu-9imY:8OBt-ulIols:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=uXmChu-9imY:8OBt-ulIols:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=uXmChu-9imY:8OBt-ulIols:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=uXmChu-9imY:8OBt-ulIols:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=uXmChu-9imY:8OBt-ulIols:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Hackinghat?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Hackinghat?a=uXmChu-9imY:8OBt-ulIols:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Hackinghat?i=uXmChu-9imY:8OBt-ulIols:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRSS>http://www.hackinghat.com/index.php/programming/the-ever-diminishing-deliverable/feed/</wfw:commentRSS>
		</item>
	</channel>
</rss>
