<?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>Kyle Cordes &#187; programming</title>
	<atom:link href="http://kylecordes.com/tag/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://kylecordes.com</link>
	<description>Software, Business, and Life</description>
	<lastBuildDate>Fri, 18 Nov 2011 13:01:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Upcoming Talk: Lua on iPhone and Android (using Corona)</title>
		<link>http://kylecordes.com/2011/upcoming-lua-mobile</link>
		<comments>http://kylecordes.com/2011/upcoming-lua-mobile#comments</comments>
		<pubDate>Tue, 24 May 2011 03:32:52 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=892</guid>
		<description><![CDATA[This Thursday (May 26, 2011), I will give a talk at the St. Louis Mobile Dev group on cross-mobile-platform development with Lua. There are various ways to do this (including rolling your own), but for simplicity I&#8217;m using Ansca&#8217;s Corona product. As usual, I&#8217;ll zoom through some slides, and concentrate instead on the code. For some [...]]]></description>
			<content:encoded><![CDATA[<p>This Thursday (May 26, 2011), I will give a <a href="https://sites.google.com/site/stlmobiledev/meetings/meeting-15">talk</a> at the <a href="https://sites.google.com/site/stlmobiledev/home">St. Louis Mobile Dev group</a> on cross-mobile-platform development with Lua. There are various ways to do this (including rolling your own), but for simplicity I&#8217;m using <a href="http://www.anscamobile.com/">Ansca&#8217;s Corona</a> product.</p>
<p>As usual, I&#8217;ll zoom through some slides, and concentrate instead on the code. For some background on Lua, you may want to watch the <a href="http://kylecordes.com/2010/lua-strange-loop">video of my 20-minute Lua talk</a> from last year&#8217;s Strange Loop.</p>
<p>Update: slides are available <a href="http://kylecordes.com/2011/ios-android-lua-corona">here</a>.</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/upcoming-lua-mobile/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Write your whole stack in JavaScript with Node.JS</title>
		<link>http://kylecordes.com/2010/node-whole-stack</link>
		<comments>http://kylecordes.com/2010/node-whole-stack#comments</comments>
		<pubDate>Thu, 24 Jun 2010 01:09:18 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[contest]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=679</guid>
		<description><![CDATA[Node is a combination of Google&#8217;s V8 JavaScript implementation, and various plumbing and libraries. The result is an unusual and clever server programming platform. Node is in a fairly early development phase, and already has a remarkably active community: ~9000 mailing list messages (as of June 2010) and many dozens of projects and libraries. I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nodejs.org/">Node</a> is a combination of Google&#8217;s V8 JavaScript implementation, and various plumbing and libraries. The result is an unusual and clever server programming platform. Node is in a fairly early development phase, and already has a remarkably active community: <a href="http://groups.google.com/group/nodejs">~9000 mailing list messages</a> (as of June 2010) and <a href="http://wiki.github.com/ry/node/">many dozens of projects and libraries</a>. I&#8217;ve spent some time digging through Node code and writing small bits of it, and was pleased with what I found.</p>
<h2>Why is Node worthy of attention?</h2>
<ul>
<li>JavaScript is a <a href="http://kylecordes.com/2007/javascript-nbl">Next Big Language</a>, it is everywhere. It is probably the most widely used programming language ever.</li>
<li>I know a few things about asyncronous server programming, having done a lot of it in 1990s IVR software; it is very well suited to serving a large user population.</li>
<li>Node is accumulating libraries at an impressive rate, indicating momentum.</li>
<li>There are significant advantages in developing a whole application stack (server and client code) in a single language. For example, this makes code and business logic sharing works across tiers. Using Node, a JavaScript-HTML tool, a JavaScript-CSS tool, JSON, etc., it is possible to develop a complex web application using only JavaScript.</li>
</ul>
<p>Node is not all unicorns and roses though.; my most serious misgiving about it is that it does not (yet) have a great strategy to make straightforward use of many-core servers. We&#8217;ll have to see how that develops over time.</p>
<h2>Node Knockout</h2>
<p>The team at <a href="http://www.fortnightlabs.com/">Fortnight Labs</a> is putting together <a href="http://nodeknockout.com/">Node Knockout</a>, a 48-hour Node programming contest. I am a fan of such contests. I&#8217;ve offered to help out by being a judge, and I&#8217;ve also signed up Oasis Digital as a sponsor.</p>
<p>As a judge, I can&#8217;t be on a team; I&#8217;ve like to see a team or two form here in St. Louis, though.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/node-whole-stack/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The Prolog Story</title>
		<link>http://kylecordes.com/2010/the-prolog-story</link>
		<comments>http://kylecordes.com/2010/the-prolog-story#comments</comments>
		<pubDate>Thu, 20 May 2010 03:10:37 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[prolog]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=582</guid>
		<description><![CDATA[I&#8217;ve told this story in person dozens of times, it&#8217;s time to write it down and share it here. I&#8217;ve again experimentally recorded a video version (below), which you can view on a non-Flash device here. I know a little Prolog, which I learned in college &#8211; just enough to be dangerous. Armed with that, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve told this story in person dozens of times, it&#8217;s time to write it down and share it here. I&#8217;ve again experimentally recorded a video version (below), which you can view on a non-Flash device <a href="http://vimeo.com/11994794">here</a>.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11994794&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=11994794&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>I know a little <a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a>, which I learned in college &#8211; just enough to be dangerous. Armed with that, and some vigorous just-in-time online learning, I used Prolog in a production system a few years ago, with great results. There are two stories about that woven together here; one about the technical reasons for choosing this particular tool, and the other about the business payoff for taking a road less travelled.</p>
<p>In 2004 (or so) I was working on a project for an Oasis Digital customer on a client/server application with SQL Server behind it. This application worked (and still works) very well for the customer, who remains quite happy with it. This is the kind of project where there is an endless series of enhancement and additions, some of them to attack a problem-of-the-moment and some of them to enrich and strengthen the overall application capabilities.</p>
<p>The customer approached us with a very unusual feature request &#8211; pardon my generic description here; I don’t want to accidentally reveal any of their business secrets. The feature was described to us declaratively, in terms of a few rules and a bunch of examples of those rules. The wrinkle is that these were not “forward” rules (if X, do Y). Rather, these rules describe scenarios, such that if those scenarios happen, then something else should happen. Moreover, the rules were are on complex transitive/recursive relationships, the sort of thing that SQL is not well suited for.</p>
<p>An initial analysis found that we would need to implement a complex depth/breadth search algorithm either in the client application or in SQL. This wasn’t a straightforward graph search, though, rather that part was just the tip of the iceberg. I’m not afraid of algorithmic programming, Oasis Digital is emphatically not an “OnClick-only” programming shop, so I dug in. After spending a couple of days attacking the problem this way, I concluded that this would be a substantial block of work, at least several person-months to get it working correctly and efficiently. That’s not a lot in the grand scheme of things, but for this particular customer, this would use up their reasonable-but-not-lavish budget for months, even ignoring their other feature needs.</p>
<p>We set this problem aside for a few days, and upon more though I realized that:</p>
<ul>
<li>this would be a simple problem to <strong>describe</strong> in Prolog</li>
<li>the Prolog runtime would then <strong>solve</strong> the problem</li>
<li>the Prolog runtime would be responsible for doing it correctly and efficiently, i.e. our <strong>customer would not foot the bill</strong> to achieve those things.</li>
</ul>
<p>We proceeded with the Prolog approach.</p>
<p>&#8230;.</p>
<p>It actually took <strong>one day of work</strong> to get it working, integrated, and into testing, then a few hours a few weeks later to deploy it.</p>
<p>The implementation mechanism is pretty rough:</p>
<ul>
<li>The rules (the fixed portions of the Prolog solution) are expressed in a prolog source file, a page or two in length.</li>
<li>A batch process runs every N minutes, on a server with spare capacity for this purpose.</li>
<li>The batch process executes a set of SQL queries (in stored procs), returning a total of tens or hundreds of thousands of rows of data. SQL is used to format that query output as Prolog terms. These stored procs are executed using SQL Server BCP, making it trivial to save the results in files.</li>
<li>The batch process run a Prolog interpreter, passing the data and rules (both are code, both are data) as input. This takes up to a few minutes.</li>
<li>The Prolog rules are set up, with considerable hackery, to emit the output data we needed in the form of CSV data. This output is directed to a file.</li>
<li>SQL Server BCP imports this output data back in to the production SQL Server database.</li>
<li>The result of the computation is thus available in SQL tables for the application to use.</li>
</ul>
<p>This batch process is not an optimal design, but it has the advantage of being quick to implement, and robust in operation. The cycle time is very small compared to the business processes being controlled, so practically speaking it is 95% as good as a continuous calculation mechanism, at much less cost.</p>
<p>There are some great lessons here:</p>
<ul>
<li><strong>Declarative &gt;&gt;&gt; Imperative</strong>. This is among the most important and broad guidelines to follow in system design.</li>
<li><strong>Thinking Matters</strong>. We cut the cost/time of this implementation by 90% or more, not by coding more quickly, but by thinking more clearly. I am a fan of TDD and incremental design, but you’re quite unlikely to ever make it from a handcoded solution to this simply-add-Prolog solution that way.</li>
<li><strong>The Right Tool for the Job</strong>. Learn a lot of them, don’t be the person who only has a hammer.</li>
<li><strong>A big problem is a big opportunity</strong>. It is quite possible that another firm would not have been able to deliver the functionality our customer needed at a cost they could afford. This problem was an opportunity to win, both for us and for our customer.</li>
</ul>
<p>That’s all for now; it&#8217;s time for <a href="http://lessconf.lesseverything.com/">LessConf</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/the-prolog-story/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>When Will It Ship? Estimates and Promises</title>
		<link>http://kylecordes.com/2010/estimates-and-promises</link>
		<comments>http://kylecordes.com/2010/estimates-and-promises#comments</comments>
		<pubDate>Fri, 07 May 2010 21:26:44 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[estimates]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=573</guid>
		<description><![CDATA[I&#8217;m trying something new with this post: a short video presentation of approximately the same content. This is a Vimeo video, embedded as Flash. You can go over to Vimeo to watch it with HTML5-video devices like an iPad. I expect to offer better quality and more options as I learn more. Here is an [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m trying something new with this post: a short video presentation of approximately the same content.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11563705&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=11563705&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>This is a Vimeo video, embedded as Flash. You can <a href="http://vimeo.com/11563705">go over to Vimeo</a> to watch it with HTML5-video devices like an iPad. I expect to offer better quality and more options as I learn more.</p>
<hr />Here is an area of confusion that has come up both at Oasis Digital, and at every other firm I’ve worked:</p>
<p style="text-align: center;"><strong>estimate ≠ promise</strong></p>
<h2>Background: Unpredictability</h2>
<p>Around half of my software development and leadership experience has been in enterprise/internal software development, and that is the world I am thinking of as I write this.</p>
<p>Software development, like other endeavors with a significant creative component, is inherently unpredictable. With a good, deep understanding of the development process, you can build a model of the probability distribution of the cost, effort, and elapsed time for software development work. In the large, on average this can be made to work: small and large projects can succeed, within some broad range of predictability.</p>
<p>But notice also how common it is for large complex projects (in software and elsewhere) to be farcically over budget and late. This is not (usually) due to incompetence or fraud. It is because of the inherent unpredictability of the work.</p>
<p>If someone claims that they (or you) can exactly predict software development work, they are:</p>
<ul>
<li>mistaken, or</li>
<li>lying, or</li>
<li>padding their estimates very substantially, stating a date or cost much later/higher than a neutral median estimate would suggest</li>
</ul>
<p>As a customer of software development services, and as a provider of such services, I don’t want any of those things.</p>
<h2>Blame the Service Trades</h2>
<p>I place some of the blame for the confusion of these two wildly different things, on the service trades: it is common for auto repair shops, roof installers, landscapers, and the like to offer something they call an estimate, but which is actually a fixed price quote (a promise).</p>
<p>Sadly, while there are plenty of common good synonyms for promise, there aren’t many for estimate. We’re stuck with using the word estimate, and explaining that we really mean it as defined. Perhaps in a few more decades we will lose the word entirely, much like the word “literally” has come to mean its antonym, “figuratively”, which renders it mostly useless.</p>
<h2>Estimates</h2>
<p>An estimate is an approximation of an unknown quantity. Typically in the world of software development, it is a prediction of the cost, working hours, or delivery date of a project or milestone. It is not in any sense a commitment, any more than estimating the temperature outside this afternoon is a commitment.</p>
<p>As the word implies, a customer reasonably expects the actual value to vary somewhat, in either direction, from the estimate. In fact, if an estimate turns out exactly match the actual result, there is a good chance the books have been cooked. Moreover, if the work is completed at-or-before the estimate most of the time, this means the estimates (on average) are too high.</p>
<p>An estimate “costs” nothing, other than the time/effort required to create it, which consists of analyzing the work at hand, decomposing it in to parts, and comparing those parts to past work.</p>
<h2>Promises</h2>
<p>A promise, also called a commitment, deadline, quote, fixed price, etc. is a different beast entirely.</p>
<p>With a promise in hand, a customer should expect with high confidence that the actual value (for cost, hours of work, delivery date) will be less than (before), or equal to, the promised value/date.</p>
<p>Be wary of a promise easily made and freely given: it probably doesn’t mean anything at all. A wise customer (and I aim to count myself in this category) should expect that a casually made commitment will probably be broken; not because the maker is morally defective, but simply because meeting a commitment for complex work requires considerable effort and thought. Without evidence that happens, it would be mere wishful thinking to expect the results delivered as promised.</p>
<p>Likewise, keeping promises often has a cost. If the work underway gets behind the schedule needed to meet the promise, something will have to give:</p>
<ul>
<li>Other work may fall behind, as time and effort are diverted to meet the promise.</li>
<li>Weekends, evenings, and overtime work may be needed. These might appear free, but are not.</li>
<li>Staff may need to be reassigned, or added</li>
<li>Additional hardware and software may be needed.</li>
</ul>
<p>These risks cost real money; thus a wise promise-maker will find that, on average, it costs more to promise feature X by date D, than to delivery feature X by date D without such a promise.</p>
<h2>Estimates are Cheaper, so Prefer Estimates</h2>
<p>At Oasis Digital, we provide many estimates, but few promises. Most of the time, an estimate is what our customers need; and we can provide at estimate with very little cost. Typically we estimate reasonably well:</p>
<ul>
<li>small features usually arrive with a day or two (plus or minus) of the estimated delivery date (and likewise for cost)</li>
<li>medium items within a week or two of the estimate, likewise</li>
<li>large items (major new features or subsystems with complex interdependencoes) within a month or so, likewise</li>
</ul>
<p>The key here is is that with good estimate, commitments (promises) aren’t needed very often, and therefore the <strong>cost</strong> of promises can be avoided.</p>
<h2>But Learn How to Promise Well, Also</h2>
<p>Yet occasionally, a customer needs a commitment, most often because a software version needs to be available to match an important business event with a fixed date, such as a presentation, a legal filing, etc. I&#8217;ll follow up later (no promise or estimate, as to when) with thoughts on:</p>
<ul>
<li>how to credibly <strong>make</strong> promises (as a service provider)</li>
<li>how to <strong>evaluate</strong> promises (as a customer)</li>
</ul>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/estimates-and-promises/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My First Emacs (plus Slime, Swank, Clojure) on Mac OSX</title>
		<link>http://kylecordes.com/2010/emacs-osx</link>
		<comments>http://kylecordes.com/2010/emacs-osx#comments</comments>
		<pubDate>Sun, 14 Mar 2010 01:07:45 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=474</guid>
		<description><![CDATA[Emboldened a talk that Ryan Senior gave at the St. Louis Lambda Lounge (now available as a video), I grabbed the most popular two Emacs versions for Mac OSX: Aquamacs GNU Emacs 23.1 and set up each on my Macbook Pro (10.6.2). For each Emacs, I also set up SLIME, Swank, and Clojure. If that [...]]]></description>
			<content:encoded><![CDATA[<p>Emboldened a talk that <a href="http://www.objectcommando.com/">Ryan Senior</a> gave at the <a href="http://lambdalounge.org/">St. Louis Lambda Lounge</a> (now <a href="http://blip.tv/file/3308042">available as a video</a>), I grabbed the most popular two Emacs versions for Mac OSX:</p>
<ul>
<li><a href="http://aquamacs.org/">Aquamacs</a></li>
<li><a href="http://emacsformacosx.com/">GNU Emacs 23.1</a></li>
</ul>
<p>and set up each on my Macbook Pro (10.6.2). For each Emacs, I also set up SLIME, Swank, and Clojure.</p>
<p><strong>If that sounds like a bunch of garbled nonsense, don&#8217;t worry, it is simply a sign that you are a normal, well adjusted person, rather than a Lisp person.</strong></p>
<p>It was a bit irritating to get these tools up and running the first time; there are countless web pages with the details (I won&#8217;t make that worse by adding my own here). The challenge is figuring out which instructions to follow,<strong> while ignoring the rest</strong>. The most tractable approach for me, for a quickly-installed, easily-updating, fewest-steps process, was to install the needed packages from <a href="http://tromey.com/elpa/">ELPA</a>, without any manual downloading/configuration of SLIME, Swank, etc. at all. I have no command line operations to share with you, because in the process I recommend, there aren&#8217;t any.</p>
<p>I used Emacs in school, but not at all in the last 10 years. Since then, my expectations for developer tools have grown &#8211; I think it is reasonable for a modern development environment to simultaneously:</p>
<ol>
<li>be easily discoverable, for a fast start</li>
<li>cooperate with its environment well</li>
<li>make good use of the large high-res display on most PCs, to expose expected status and control surfaces</li>
<li>be deeply configurable and highly powerful</li>
</ol>
<p>My experience, coming in from that point of view, differs from what Ryan and a couple other people suggested: I suggest Aquamacs. It is much more of a good citizen on the Mac platform. Its menus are much more approachable. Printing works in a Mac way. You get tabs showing your buffers, by default. You get menu options to gather them up in to one window(frame) or split them apart, all by default.</p>
<p>It may indeed by worth switching to the non-Aqua version later, if/when you get so deeply in the toolset that the pure emacs experience is preferable&#8230; but I estimate you&#8217;d need to be pretty far down the path (much further than I).</p>
<p>Something I should try out eventually is the <a href="http://github.com/technomancy/emacs-starter-kit/">Emacs Starter Kit</a>. Perhaps it would have given a sufficiently &#8220;saner set of defaults&#8221; to make the non-Aqua version a more reasonable choice. Emacs gurus seem to lean that direction, overall.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/emacs-osx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>.NET Compact Framework</title>
		<link>http://kylecordes.com/2009/net-compact-framework</link>
		<comments>http://kylecordes.com/2009/net-compact-framework#comments</comments>
		<pubDate>Fri, 31 Jul 2009 15:19:00 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[dot-net]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=296</guid>
		<description><![CDATA[Ever since I posted my experiences creating software for the .NET Compact Framework back in 2006, I&#8217;ve received a steady trickle of thank-you emails. Apparently there are bits of information in there that are (or at least were, at the time) somewhat hard to find. Sadly the information there has fallen somewhat out of date [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since I posted my <a href="http://kylecordes.com/net-compact-framework-development/">experiences creating software for the .NET Compact Framework</a> back in 2006, I&#8217;ve received a steady trickle of thank-you emails. Apparently there are bits of information in there that are (or at least were, at the time) somewhat hard to find.</p>
<p>Sadly the information there has fallen somewhat out of date due to new CF and VS.NET releases, and I&#8217;ve been busy on other platforms and projects (Java and much more) since then. If anyone out there can suggest a handful of the best places to learn now about CF development, please do so in the comments below, for the benefit of others reading this page.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/net-compact-framework/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex version of my overworn &#8220;flying boxes&#8221; GUI demo</title>
		<link>http://kylecordes.com/2009/flex-flying-boxes</link>
		<comments>http://kylecordes.com/2009/flex-flying-boxes#comments</comments>
		<pubDate>Sun, 05 Jul 2009 21:12:46 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=287</guid>
		<description><![CDATA[Long-time fans may remember my &#8220;flying boxes&#8221; demo at the St. Louis Java user group in 2005, or my followup work in 2008, in which I translated that demo to JavaScript (Rhino). I picked that demo project up again last year and recreated it with Flex 3; you can now try it out online, download the code, [...]]]></description>
			<content:encoded><![CDATA[<p>Long-time fans may remember my <a href="http://kylecordes.com/2005/09/09/direct-swing/">&#8220;flying boxes&#8221; demo at the St. Louis Java user group in 2005</a>, or my followup work in 2008, in which I <a href="http://kylecordes.com/2008/10/20/rhino-js-swing/">translated that demo to JavaScript (Rhino)</a>.</p>
<p>I picked that demo project up again last year and recreated it with Flex 3; you can now <a href="http://kylecordes.com/demo/boxes/">try it out online</a>, <a href="http://kylecordes.com/files/flying-boxes-flex-code.zip">download the code</a>, or <a href="http://github.com/kylecordes/flying-boxes-flex">browse it on github</a>. It looks like this:</p>
<p><a href="http://kylecordes.com/demo/boxes/"><img class="alignnone" src="http://kylecordes.com/files/flying-boxes-flex-screen.png" alt="" width="659" height="502" /></a></p>
<p>Click on it to try it &#8220;live&#8221; in as Flash/Flex.</p>
<p>The interesting part is the drag-drop movement &#8211; not my less-then-stellar color and design choices.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/flex-flying-boxes/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Factor Talk at the Lambda Lounge</title>
		<link>http://kylecordes.com/2009/factor-ll-talk</link>
		<comments>http://kylecordes.com/2009/factor-ll-talk#comments</comments>
		<pubDate>Fri, 03 Apr 2009 14:39:29 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[factor]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=255</guid>
		<description><![CDATA[Last night (April 2, 2009) at the St. Louis Lambda Lounge I gave a 45-minute talk on the Factor programming language. I&#8217;ve uploaded the handout and example code here. I apologize in advance to anyone in the Factor community who reads it and laughs at my &#8220;newbie&#8221; mistakes and misstatements. Appistry again provided space and pizza [...]]]></description>
			<content:encoded><![CDATA[<p>Last night (April 2, 2009) at the St. Louis <a href="http://lambdalounge.org/">Lambda Lounge</a> I gave a 45-minute talk on the <a href="http://factorcode.org/">Factor programming language</a>. I&#8217;ve uploaded the <a href="http://kylecordes.com/files/FactorHandout.pdf">handout and example code here</a>. I apologize in advance to anyone in the Factor community who reads it and laughs at my &#8220;newbie&#8221; mistakes and misstatements.</p>
<p><a href="http://www.appistry.com/">Appistry</a> again provided space and pizza &#8211; thanks guys! (Appistry is our locally-grown but widely-known cloud infrastructure software maker &#8211; they&#8217;d been cloudy for years before the term entered wide use.)</p>
<p>The talk appeared to go over well. There were many important things about factor that I&#8217;d love to talk about but didn&#8217;t have time. Nonetheless, I think 45 minutes is a good talk length, and I think the format (short talks) is a key part to the Lambda Lounge&#8217;s success so far.</p>
<p>Speaking of the Lambda Lounge,  next month there is a &#8220;language shootout&#8221; &#8211; if you want to participate, be sure to join the <a href="http://groups.google.com/group/lambda-lounge/">mailing list</a> and <a href="http://groups.google.com/group/lambda-lounge/web/language-shootout">look over the participants</a>. (You need to join the list, to be able to get to the wiki with that page.) I might submit an entry myself, using Factor or another language.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/factor-ll-talk/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Incompetence -&gt; Progress</title>
		<link>http://kylecordes.com/2009/incompetence-progress</link>
		<comments>http://kylecordes.com/2009/incompetence-progress#comments</comments>
		<pubDate>Tue, 17 Feb 2009 19:15:51 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=240</guid>
		<description><![CDATA[From http://www.theodoregray.com/BrainRot/index.html &#8220;The most profound engine of civilization is the inability of a larger and larger fraction of the population to do the basic things needed to survive.  Many people fail to realize this.&#8221; &#8220;Technology&#8217;s greatest contribution is to permit people to be incompetent at a larger and larger range of things.  Only by embracing [...]]]></description>
			<content:encoded><![CDATA[<p>From <a href="http://www.theodoregray.com/BrainRot/index.html">http://www.theodoregray.com/BrainRot/index.html</a></p>
<p>&#8220;The most profound engine of civilization is the inability of a larger and larger fraction of the population to do the basic things needed to survive.  Many people fail to realize this.&#8221;</p>
<p>&#8220;Technology&#8217;s greatest contribution is to permit people to be incompetent at a larger and larger range of things.  Only by embracing such incompetence is the human race able to progress.&#8221;</p>
<p>It&#8217;s a good read, with important thoughts on civilization and education.  It is part of the introduction to a book about Mathematica, a truly amazing piece of software. (Mathematica, was amazing when I used it in the 1990s, I can scarcely imagine what it does now.)</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2009/incompetence-progress/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Move files into an existing directory structure, on Linux</title>
		<link>http://kylecordes.com/2008/move-files</link>
		<comments>http://kylecordes.com/2008/move-files#comments</comments>
		<pubDate>Fri, 05 Dec 2008 21:50:33 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=228</guid>
		<description><![CDATA[I recently needed to move a large number of files (millions) in a deep directory structure, into another similar directory structure, &#8220;merging&#8221; the contents of each directory and creating any missing directories. This task is easily (though slowly) performed on Windows with Control-C Control-V in Explorer, but I could find no obvious way to do [...]]]></description>
			<content:encoded><![CDATA[<p>I recently needed to move a large number of files (millions) in a deep directory structure, into another similar directory structure, &#8220;merging&#8221; the contents of each directory and creating any missing directories. This task is easily (though slowly) performed on Windows with Control-C Control-V in Explorer, but I could find no obvious way to do it on Linux.</p>
<p>There is quite a bit of discussion about this on the web, including:</p>
<ul>
<li>Suggestions to do with with tar; this is a poor idea because it copies all the file data, taking an enormously long time.</li>
<li>Suggestions to do it with &#8220;mv -r&#8221;&#8230; but as far as I can tell, mv does not have a -r option.</li>
</ul>
<p>After a little thought I came up with the script below. I&#8217;d love to have a Linux/Bash guru out there point out how awful it and and send me something better!</p>
<p>A critical feature for me is that it does not overwrite files; if a source file name/path overlaps a destinate file, the source file is left alone, untouched. This can be changed easily to overwrite instead: remove the [[-f]] test.</p>
<pre>$ cat ~/bin/move_files_merge.sh
#!/bin/bash

# Move files from dir $1 to dir $2,
# merging in to existing dirs
# Call it like so:
# move_files_merge.sh /FROM/directory /TO/directory

# Lousy error handling:
# Exit if called with missing params.
[ "A" == "A${1}" ] &amp;&amp; exit 1
[ "A" == "A${2}" ] &amp;&amp; exit 1

echo finding all the source directories
cd $1
find . -type d -not -empty | sort | uniq &gt;$2/dirlist.txt

echo making all the destination directories
cd $2
wc -l dirlist.txt
xargs --no-run-if-empty -a dirlist.txt mkdir -p
rm dirlist.txt

echo Moving the files
cd $1
# There is surely a better way to do this:
find . -type f -printf "[[ -f '$2/%p' ]] || mv '%p' '$2/%h'\n" | bash

echo removing empty source dirs
find $1 -depth -type d -empty -delete

echo done.</pre>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/move-files/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Factor</title>
		<link>http://kylecordes.com/2008/factor</link>
		<comments>http://kylecordes.com/2008/factor#comments</comments>
		<pubDate>Fri, 28 Nov 2008 19:28:41 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[factor]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=219</guid>
		<description><![CDATA[Over the holiday I looked at the Factor programming language, and was very impressed. It has a Lisp-like metacircular quality, and a remarkably wide set of features/libraries in spite of a very small development team and community. Unlike many other small language projects, Factor is fast, rich, and can produce shippable binaries. Its team cares [...]]]></description>
			<content:encoded><![CDATA[<p>Over the holiday I looked at the <a href="http://factorcode.org/">Factor programming language</a>, and was very impressed. It has a Lisp-like metacircular quality, and a remarkably wide set of features/libraries in spite of a very small development team and community. Unlike many other small language projects, Factor is fast, rich, and can produce shippable binaries. Its team cares about robustness, and operates a build farm for multiple platforms. If you can spare a few hours, first watch <a href="http://www.youtube.com/watch?v=f_0QlhYlS8g">Slava&#8217;s Google Tech Talk</a>, then download Factor and work through some tutorials.</p>
<p>Will Factor become popular? With a FORTH-like syntax, I suspect the answer is a firm No, the syntax is too foreign (even compared to Ruby, for example) for mainstream devleopers. But I find it fascinating nonetheless, and I will keep my eyes open for an opporunity to use it on a small, real project.</p>
<p>It would also make a great topic for the <a href="http://lambdalounge.org/">Lambda Lounge</a>, a new St. Louis area user group about which I am quite excited.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/factor/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rhino + JavaScript + Swing, Look Ma No Java</title>
		<link>http://kylecordes.com/2008/rhino-js-swing</link>
		<comments>http://kylecordes.com/2008/rhino-js-swing#comments</comments>
		<pubDate>Mon, 20 Oct 2008 14:50:45 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2008/10/20/rhino-js-swing/</guid>
		<description><![CDATA[A while back I was discussing the future of programming languages with a colleague, and we agreed that for all its foibles, JavaScript will continue to enjoy very wide and increasing use in the coming years. I wrote last year about Steve Yegge’s hints that JavaScript is the “next big languages”, see that post for [...]]]></description>
			<content:encoded><![CDATA[<p>A while back I was discussing the future of programming languages with a colleague, and we agreed that for all its foibles, JavaScript will continue to enjoy very wide and increasing use in the coming years. I <a href="http://kylecordes.com/2007/06/27/javascript-nbl/">wrote last year about Steve Yegge’s hints</a> that JavaScript is the “next big languages”, see that post for the reasoning.</p>
<p>Based on all that, I set about writing a small test app to see what it’s like to program a Swing app with JS.  After a day or so of work (spread over a few months), I offer my Rhino Swing Test App:</p>
<p><a href="http://kylecordes.com/rsta/">Run RSTA now via Java Web Start</a></p>
<p><a href="http://github.com/kylecordes/rsta">Get the RSTA code (git, on GitHub)</a></p>
<p>It implements the same “flying boxes” animation demo that I presented a few years ago at the St. Louis JUG, but aside from a generic launcher class, the GUI is implemented entirely in JavaScript. To clarify, this is not web browser JavaScript; it is running in Rhino, in the JVM, using Swing classes.</p>
<p><img src="/images/RSTA-screen.png" /></p>
<p>The <a href="http://www.mozilla.org/rhino/ScriptingJava.html">documentation for interaction between Java and JS</a> is limited, but sufficient. For simplicity, I used Rhino as an interpreter, I did not compile to java bytecode. Nonetheless, the animation runs about as smoothly in JS as it does in Java, because the heavy lifting is done by the JDK classes.<br />
I used Eclipse (with JavaScript support) to write this code, but of course JS makes much less code completion possible than Java, and I missed that. Typically I mildly prefer IDEs, but am also productive with a text editor. For working with a large API like Swing though, IDE support helps greatly.</p>
<p>Still, I recommend a look at this approach if you are fond of dynamic languages but need to build on the Java platform, and I intend to investigate server-side JS development also.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/rhino-js-swing/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ease of Installation: DokuWiki, PHP, files</title>
		<link>http://kylecordes.com/2008/easy-install-php-files</link>
		<comments>http://kylecordes.com/2008/easy-install-php-files#comments</comments>
		<pubDate>Sun, 19 Oct 2008 14:11:07 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2008/10/19/easy-install-php-files/</guid>
		<description><![CDATA[In the past I’ve installed MediaWiki, ruwiki, git-wiki, and several other Wiki implementations (Perl, and Java implementations), with varying degrees of effort. For example, ruwiki required considerable gymnastics to get the right Ruby libraries in place on the machine I hosted it on, MediaWiki required a database, etc. Ruby libraries, databases, JVMs, and the like [...]]]></description>
			<content:encoded><![CDATA[<p>In the past I’ve installed <a href="http://www.mediawiki.org/wiki/MediaWiki">MediaWiki</a>, <a href="http://ruwiki.rubyforge.org/ruwiki.cgi">ruwiki</a>, <a href="http://atonie.org/2008/02/git-wiki">git-wiki</a>, and several other Wiki implementations (Perl, and Java implementations), with varying degrees of effort. For example, ruwiki required considerable gymnastics to get the right Ruby libraries in place on the machine I hosted it on, MediaWiki required a database, etc. Ruby libraries, databases, JVMs, and the like are all at the top of my toolbox so in most cases it&#8217;s just a few minutes and a few commands, which seems amply easy until compared wtih&#8230;</p>
<p>Yesterday I set up a <a href="http://www.dokuwiki.org/dokuwiki">DokuWiki</a> instance (which stlruby.org might migrate to), and found that its underpinnings (PHP, plain text files) make for ridiculously easy installation:</p>
<ul>
<li>wget</li>
<li>tar xzf</li>
<li>browse to install page, set a few settings</li>
<li>delete install page</li>
</ul>
<p>Yet those underpinnings are very well suited to the task at hand. A typical Wiki does not need a database underneath it. As with many things, this reminded me of a general principle: <strong>use the least complex, most readily and commonly available, easiest to administrate technology appropriate for the task at hand.</strong></p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/easy-install-php-files/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Webby &#8211; Client-side, static content management system</title>
		<link>http://kylecordes.com/2008/webby</link>
		<comments>http://kylecordes.com/2008/webby#comments</comments>
		<pubDate>Sun, 12 Oct 2008 19:12:53 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[source-control]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2008/10/12/webby/</guid>
		<description><![CDATA[This afternoon I rebuilt OasisDigital.com using Webby, stripping out hand-coded HTML and replacing it with much more maintainable Markdown. The site looks about the same as before (which is to say, mediocre), but under the hood it is much easier to update. We intend to use this new ease, to move forward in improving it. [...]]]></description>
			<content:encoded><![CDATA[<p>This afternoon I rebuilt <a href="http://oasisdigital.com">OasisDigital.com</a> using Webby, stripping out hand-coded HTML and replacing it with much more maintainable Markdown. The site looks about the same as before (which is to say, mediocre), but under the hood it is much easier to update. We intend to use this new ease, to move forward in improving it. There is a general principle here, which applies broading in software development also:</p>
<p><strong>If you need to make a change, but that change is difficult / tedious / risky to make, first improve the underlying system that makes it so.</strong><br />
(OasisDigital.com is a static web site; we have dynamic contact (issue trackers, etc.) to automate our work together and with our customer, but that content is on another domain.)</p>
<p><a href="http://webby.rubyforge.org/">Webby</a> is a client-side, simple <a href="http://www.google.com/search?q=static+cms">CMS for generating static web sites</a>, written in Ruby. Why serve a static site (plain old files on a web server) in 2008?</p>
<ul>
<li>It minimizes the moving parts, there is almost nothing to break or maintain.</li>
<li>It is very unlikely that any hosting issue will break a static site.</li>
<li>It is easy to serve a static site fast (though our current host, TextDrive, sometimes is not all that fast).</li>
<li>Security vulnerabilities are very unlikely, in the absence of any executable content.</li>
<li>The canonical content (in this case, mostly Markdown) is stored in plain text files, which we track, diff, and merge in git.</li>
</ul>
<p>In an earlier foray in to Drupal, we found that Drupal has extensive and useful capabilities, as well as a vibrant community, but it also has many moving parts; too many, in my judgment, to make it a good solution for building an essentially static web site.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/webby/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TDD, Still in Style?</title>
		<link>http://kylecordes.com/2008/tdd-style</link>
		<comments>http://kylecordes.com/2008/tdd-style#comments</comments>
		<pubDate>Tue, 26 Aug 2008 19:32:55 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2008/08/26/tdd-style/</guid>
		<description><![CDATA[Test Driven Development doesn’t seem to be in style today to the extent it was a few years ago. I think that’s a shame, because TDD is among the most powerful ideas I’ve come across to boost the quality of the software we deliver. At Oasis Digital we even use it in unusual places, like [...]]]></description>
			<content:encoded><![CDATA[<p>Test Driven Development doesn’t seem to be in style today to the extent it was a few years ago. I think that’s a shame, because TDD is among the most powerful ideas I’ve come across to boost the quality of the software we deliver. At Oasis Digital we even use it in unusual places, like this Palm application we develop for a customer:</p>
<p><img src="/images/palm-test-results.png" /></p>
<p>This application forms the core of our customer’s business; they sell it at a commercial product to their customers, who use it in high-pressure situations. Over 4 major versions and 4+ years, there been remarkably few bugs or other issues found “in the field”, which I credit to:</p>
<ul>
<li>Use of automated testing</li>
<li>An overall level of care and attention to quality</li>
</ul>
<p>The second item alone is not enough. To achieve quality you need to do more than have the right intentions and work hard. You need to do the right things.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/tdd-style/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

