<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.11" -->
<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/"
	>

<channel>
	<title>Kyle Cordes</title>
	<link>http://kylecordes.com</link>
	<description>Kyle Cordes's Software Site</description>
	<pubDate>Mon, 12 May 2008 01:38:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.11</generator>
	<language>en</language>
			<item>
		<title>Please, Use a Web Application Framework</title>
		<link>http://kylecordes.com/2008/05/11/please-web-framework/</link>
		<comments>http://kylecordes.com/2008/05/11/please-web-framework/#comments</comments>
		<pubDate>Sun, 11 May 2008 20:37:37 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>java</category>

		<category>programming</category>

		<category>ruby</category>

		<category>business</category>

		<category>python</category>

		<category>commentary</category>

		<category>rails</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/05/11/please-web-framework/</guid>
		<description><![CDATA[Historically I have not been a fan of “frameworks”, and I have often repeated the following joke:
What’s the difference between an application and a framework?
An application is something a customer actually wants!
However, for some applications, I recommend use of an application framework. For some Oasis Digital projects, I require it:
Please, Use a Web Application Framework
My [...]]]></description>
			<content:encoded><![CDATA[<p>Historically I have not been a fan of “frameworks”, and I have often repeated the following joke:</p>
<p style="margin-left: 0.5in">What’s the difference between an application and a framework?</p>
<p style="margin-left: 0.5in"><em>An application is something a customer actually wants!</em></p>
<p>However, for some applications, I recommend use of an application framework. For some Oasis Digital projects, I require it:</p>
<h3>Please, Use a Web Application Framework</h3>
<p>My reasoning here applies specifically to web applications with many CRUD (create-read-update-delete) features, and an underlying database. The advice applies much more widely, and with many nuances and caveats, but this article I am discussing only CRUD-ish web applications. Even within this niche, my reasoning does not apply to web applications which “push the envelope” of what is possible or which attempt to advance the state of the art.</p>
<p>Regardless of the programming language, the application should be built on a framework. More specifically, the framework should popular and mainstream, with a community of developers, and the appearance of momentum for the future. Likewise, the client-side JavaScript used in these applications, should also be based on such a framework. Here are some examples:</p>
<blockquote><p>Ruby: Ruby on Rails, IOWA</p>
<p>Python: Django, TurboGears, Pylons, TwistedWeb</p>
<p>PHP: Akelos, CakePHP, CodeIgnitor, Symfony, Zend</p>
<p>Java: Struts, Seam, Rife, Tapestry, Stripes, Wicket Spring MVC</p>
<p>JavaScript: Scriptaculous, Prototype,  JQuery</p></blockquote>
<p>This is just a list of some frameworks that I am aware of; I have not evaluated all of these in detail, and I do not endorse them; nor is this an exhaustive list. For Oasis Digital projects, we help evaluate proposed frameworks, then I personally give the go-ahead to use a particular framework for a particular project.</p>
<p>An in-house web application framework does not meet the &#8220;community of developers&#8221; criteria, except at the very largest firms. Everywhere else, you are better off with an off-the-shelf, popular framework than with an inhouse framework, even if the latter is brilliantly designed.</p>
<h3>Justification</h3>
<p>My recommendation (and requirement, for some projects) for using an application framework for this kind of application is not based on a fad. Rather it is based on my years of experience as a developer, a team leader, a maintainer, and most importantly, a <span style="font-weight: bold">customer </span>of software development.</p>
<p>The wild success of some frameworks (such as Ruby on Rails) has shown that they can reduce the amount of code and time needed to develop an application. That second factor, the amount of code specific to the application, is at least as important as the development time. Lines of code are not an asset; they are a liability. Only the features that the code provides are an asset. <strong>The most valuable software provides a lot of features using the smallest possible amount of application-specific code</strong>.</p>
<p>Therefore, even if a developer is so extraordinarily fast that they can create a system very quickly without using an off-the-shelf framework, they still have provided <strong>less value</strong> by doing so, compared to creating that same system quickly with fewer lines of code.</p>
<p>Another benefit of using a common framework (not a custom, in-house framework) is that this makes an application much easier and faster for other developers are work on in the future. A more maintainable system is more valuable.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/05/11/please-web-framework/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Getting Started with Git and GitHub on Windows</title>
		<link>http://kylecordes.com/2008/04/30/git-windows-go/</link>
		<comments>http://kylecordes.com/2008/04/30/git-windows-go/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 16:51:17 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>source-control</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/04/30/git-windows-go/</guid>
		<description><![CDATA[I’ve been attracted to, and trying out, various distributed source control tools for the last two years, and have come to the conclusion that the most likely “winner” is Git. Git does a great many things right, good progress is being made in the few areas it is weak, and it has rapidly growing popularity. [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been attracted to, and trying out, various distributed source control tools for the last two years, and have come to the conclusion that the most likely “winner” is Git. Git does a great many things right, good progress is being made in the few areas it is weak, and it has rapidly growing popularity. There are many web sites with extensive information about using Git, learning Git, Git integration, and more.</p>
<p>For new Oasis Digital projects, we will be using Git rather than SVN for source control. Here are instructions I wrote to help our teams get started. The contents here are 95% generic, only the references to me are Oasis-Digital-specific.</p>
<h2>GitHub</h2>
<p>Although Git is a fully distributed source control system, it is very convenient to have a set of robust, central repositories. Oasis Digital’s repositories are hosted by GitHub:</p>
<p><a href="http://github.com/">http://github.com/</a></p>
<p>Github offers a useful set of online features to supplement what Git has built in and available locally. As of the spring of 2008, GitHub is certainly a work-in-progress, I’d characterize is as a “beta” level service. Nonetheless it is worthwhile and recommended. There is a lot to learn from the “guides” published here also:</p>
<p><a href="http://github.com/guides">http://github.com/guides</a></p>
<h2>Install and Configure msysGit on Windows</h2>
<p>I assume here that you are using Windows, although Git works very well (better, actually) on Linux or Mac. As I write this, the best Windows Git package is msysgit, available here:</p>
<p><a href="http://code.google.com/p/msysgit/">http://code.google.com/p/msysgit/</a></p>
<p>Make sure to follow the download instructions labeled “If you only want to use Git”. As I write this the download is Git-1.5.5-preview20080413.exe, but <strong>get the current version available as you read this instead</strong>, not that specific version.</p>
<p>Install by running the EXE installer. Accept the default install directory. When you get to the PATH setting screen, I recommend the “Use Git Bash only” setting, because it avoid any risk of PATH conflicts.</p>
<p>By default, Git will be configured to translate text files between Windows CRLFs (in your working copy) and Unix LFs (in repositories). This setting is fine if you like to use an editor on Windows that insists on Windows CRLFs. I generally use an editor that is equally happy to use Unix LFs, so I sometimes use Git in the other (non-translating) mode.</p>
<p>msysgit includes both the git command line, and a usable GUI. The GUI is not on par with more mature products, but it is helpful and good enough for users who are allergic to the command line.</p>
<h2>Creating your SSH Key</h2>
<p>The first step in using Git is to create your SSH Key. This will be used to secure communications between your machine and other machines, and to identify your source code changes.</p>
<p>In Windows Explorer, pick any convenient directory, right-click, and choose “Git Bash Here”.</p>
<p><img src="http://kylecordes.com/images/git-screens/Capture-04-30-00002.png" /></p>
<p><img src="http://kylecordes.com/images/git-screens/Capture-04-30-00003.png" /></p>
<p>Then type this command:</p>
<pre>&lt;code&gt;ssh-keygen -C &amp;quot;username@email.com&amp;quot; -t rsa&lt;/code&gt;</pre>
<p>(with your own email address, of course)</p>
<p>Accept the default key file location. When prompted for a passphrase, make one up and enter it. If you feel confident that your own machine is secure, you can use a blank passphrase, for more convenience and less security. Note where it told you it stored the file. On the machine I tested with, it was stored in “C:\Documents and Settings\Kyle\.ssh\”</p>
<p>Open the file id_rsa.pub with a text editor. The text in there is your “public SSH key”. You will need it to set up your GitHub account, in the next section.</p>
<p>More details on the key process are available here:</p>
<p><a href="http://github.com/guides/providing-your-ssh-key">http://github.com/guides/providing-your-ssh-key</a></p>
<h2>Set up your GitHub account</h2>
<p>Go to <a href="http://github.com/">http://github.com/</a> and sign up for a free account. In the sample here I signed up with a made-up alter-ego, harry@kylecordes.com. Use your own, real email address of course.<br />
<img src="http://kylecordes.com/images/git-screens/Capture-04-30-00004.png" /></p>
<p>Don’t worry that the free account says it is for “open source” work; I will later add you as a collaborator to my paid (and therefore private, non-open-source) projects. Make sure to copy-paste in your SSH public key that you created earlier.</p>
<p>Once you have set up your github account, email your <strong>github username</strong> (not your password) to me, so I can add you to the relevant project. Once Kyle has added you as a collaborator to the relevant project and send back its URL, you can navigate to the URL, which will look like this:</p>
<p>https://github.com/kylecordes/PROJECTNAME/tree/master</p>
<p>On that page, click the “fork” button to create your own workspace for the project. This will take you to your own page for the project, something like this:</p>
<p>https://github.com/YOURNAME/PROJECTNAME/tree/master</p>
<p><img src="http://kylecordes.com/images/git-screens/Capture-04-30-00005.png" /></p>
<p>Now you can clone this project to your own machine, as discussed below.</p>
<h2>Getting Started Locally</h2>
<p>First, use the &#8220;Git Bash Here&#8221; feature described above, to get a command prompt. Tell Git about your name and email address:</p>
<p>git config &#8211;global user.email Your.Email@domain.com<br />
git config &#8211;global user.name &#8220;Your Real Name&#8221;</p>
<p>Then you are ready to proceed with getting into a project.</p>
<p>Copy the “Clone URL” from your github project page (your fork, not my repo you forked from). Make a new directory on your machine, to become your working directory. You can then get your local clone by clicking, or by typing:</p>
<h3>Approach 1: GUI</h3>
<p>In Windows Explorer, Right click the working directory and choose “Git GUI Here”.</p>
<p>Choose “Clone Existing Repository” in the dialog that comes up:</p>
<p><img src="http://kylecordes.com/images/git-screens/Capture-04-30-00007.png" /></p>
<p>Paste the URL that you copied above from GitHub; note that your browser might add an erroneous <a href="mailto:">mailto:</a> to the URL, which you must remove – Git URLs do not start with “mailto”.  Enter the directory where you want your working copy:</p>
<p><img src="http://kylecordes.com/images/git-screens/Capture-04-30-00009.png" /></p>
<p>Make sure to use real, reasonable values. For example, you are not working “sample1” and you probably don’t keep your working projects in a directory named “GitStuff”, so put in a directory that makes sense for the project you are working on.</p>
<p>Click Clone. You will be prompted for your passphrase if you used one. In a few minutes the Clone will finish, and you have the project available on your machine. I&#8217;ve had sporadic problems with this process hanging (growing pains at GitHub are the likely cause), so if you don&#8217;t see progress for a few minutes, stop it and start over.</p>
<h2>Approach 2: Command Line</h2>
<p>I find this easier. In Windows Explorer, right-click on the working directory you want and choose “Gui Bash Here”. Then enter a command like this:</p>
<p><strong>git clone repoURL</strong></p>
<p>Git might prompt you about an SSH key, the first time you do this with github (or any other new server). Answer “yes”.</p>
<p>It’s worth pointing out here, if you didn’t already understand from the various Git web sites, that Git is a distributed source control system. It will pull down the whole project history, so you can browse history and even commit changes without online access. Thus Git works very well if you have an intermittent or poor network connection.</p>
<h2>Work Flow</h2>
<p>As with all source control, work in the directory where you use source control. Do <strong>not</strong> copy files back and forth between here and some other working directory, that is a path to endless merge and update problems.</p>
<p>Once you have checked out the software, here is a summary of your work flow. For more details, please read the copies Git documentation online. I suggest reading both the official Git material, as well as other sites and articles about Git.</p>
<p>Get changes from others with “git pull” (or using the GUI)</p>
<p>Commit your changes locally with “git commit” (or using the GUI)</p>
<p>Push your changes up to your GitHub repository with “git push”. <strong>This step will make it so others on your project can see your changes</strong>. Do this at least once per day, and ideally more often as you collaborate.</p>
<p>Once you have a set of changes (one or more commit) that you think are ready to go in to the main-line of the project, use Github to issue a “pull request”. Your project lead (me, typically, at Oasis Digital) will review your commits and either pull them in to the main-line, or send feedback about changes needed before they can be pulled in.</p>
<p>A key thing to understand about Git is that it makes branching extremely easy and fast, so that very convenient to use branches. If you are accustomed to other source control systems where branching is a big, painful thing, it will be very different for you in Git.</p>
<p>I&#8217;ve only scratched the surface in this introduction. You now have Git up and running with project code in it, so pick up a Git tutorial and start learning.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/04/30/git-windows-go/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RocketModem Driver Source Package for Debian / Ubuntu</title>
		<link>http://kylecordes.com/2008/04/18/debian-rocketmodem-package/</link>
		<comments>http://kylecordes.com/2008/04/18/debian-rocketmodem-package/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 17:47:41 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>programming</category>

		<category>linux</category>

		<category>hardware</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/04/18/debian-rocketmodem-package/</guid>
		<description><![CDATA[A couple of months ago I posted about using the current model Comtrol RocketModem IV with Debian / Ubuntu Linux. Ubuntu/Debian includes an older “rocket” module driver in-the-box, which works well for older RocketModem IV cards. But for the newest cards, it does not work at all. The current RocketModem IV is not recognized by [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of months ago I <a href="http://kylecordes.com/2008/02/18/rocketmodem-iv-linux/">posted about using the current model Comtrol RocketModem IV</a> with Debian / Ubuntu Linux. Ubuntu/Debian includes an older “rocket” module driver in-the-box, which works well for older RocketModem IV cards. But for the newest cards, it does not work at all. The current RocketModem IV is not recognized by the rocket module in-the-box in Linux, it requires an updated driver from Comtrol.</p>
<p>With some work (mostly outsourced to a Linux guru) I now present a source driver package for the 3.08 “beta” driver version:</p>
<p><a href="/files/comtrol-source_3.08_all.deb">comtrol-source_3.08_all.deb</a></p>
<p>Comtrol ships the driver source code under a GPL license, so unless I badly misunderstand, it’s totally OK for me to redistribute it here.</p>
<p>To install this, you follow the usual Debian driver-build-install process. The most obvious place to do so is on the hardware where you want to install it, but you can also use another machine the same distro version and Linux kernel version as your production hardware. Some of these commands must be run as root.</p>
<p>dpkg -i comtrol-source_3.08_all.deb</p>
<p>module-assistant build comtrol</p>
<p>This builds a .deb specific to the running kernel kernel. When I ran it, the binary .deb landed here:</p>
<p>/usr/src/comtrol-module-2.6.22-14-server_3.08+2.6.22-14.52_amd64.deb</p>
<p>Copy to production hardware (if you are not already on it), then install:</p>
<p>dpkg -i /usr/src/comtrol-module-2.6.22-14-server_3.08+2.6.22-14.52_amd64.deb</p>
<p>and verify the module loads:</p>
<p>modprobe rocket</p>
<p>and finds the hardware:</p>
<p>ls /dev/ttyR*</p>
<p>To verify those devices really work (that they talk to the modems on your RocketModem card), Minicom is a conveinet tool:</p>
<p>apt-get install minicom</p>
<p>minicom -s</p>
<p><strong>Rebuilding the source .deb</strong></p>
<p>Lastly, if you care to recreate the source .deb, you can do so by downloading the “source” for the source deb: <a href="/files/comtrol-source_3.08.tar.gz">comtrol-source_3.08.tar.gz</a>  then following a process roughly like so:</p>
<p>apt-get install module-assistant debhelper fakeroot</p>
<p>m-a prepare</p>
<p>tar xvf comtrol-source_3.08.tar.gz</p>
<p>cd comtrol-source</p>
<p>dpkg-buildpackage –rfakeroot</p>
<p>The comtrol subdirectory therein contains simply the content of Comtrol’s source driver download, and this is likely to work trivially with newer driver versions (3.09, etc.) when they appear.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/04/18/debian-rocketmodem-package/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Git on Windows, it actually works now</title>
		<link>http://kylecordes.com/2008/03/22/git-windows-works/</link>
		<comments>http://kylecordes.com/2008/03/22/git-windows-works/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 16:10:15 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>delphi</category>

		<category>source-control</category>

		<category>code</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/03/22/git-windows-works/</guid>
		<description><![CDATA[I’ve been trying out various distributed source control tools, and used several of them for various very small projects. I’ve most mostly settled on git as the one I prefer, but I haven’t yet published any code with it. Also, I’ve been frustrated that git support for Windows has been very weak.
Msysgit appears to have [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been trying out various distributed source control tools, and used several of them for various very small projects. I’ve most mostly settled on git as the one I prefer, but I haven’t yet published any code with it. Also, I’ve been frustrated that git support for Windows has been very weak.</p>
<p><a href="http://code.google.com/p/msysgit/">Msysgit</a> appears to have solved the git-windows problem, at least well enough for small scale work. If you’ve been holding back on trying git because you use Windows, now is the time to jump in.</p>
<blockquote><p><em><strong>Update: I&#8217;ve posted <a href="http://kylecordes.com/2008/04/30/git-windows-go/">details on how to get started with msysgit and GitHub</a>.</strong></em></p></blockquote>
<p>About a year ago I <a href="http://kylecordes.com/2007/01/05/math-drill/">posted a simple math drill program</a>, suitable for grade school students to practice basic math facts. I don’t know if anyone else has used it, but my own kids have enjoyed it. Today I published the (very small amount of) code for the math-drill software on <a href="http://gitorious.org">gitorious</a>:</p>
<p><a href="http://gitorious.org/projects/math-drill/repos/mainline">http://gitorious.org/projects/math-drill/repos/mainline</a></p>
<p>This software is written in Delphi, and though there is some chance that I am the only developer anywhere using both Delphi and git, hopefully this will be wrong, and someone will fork and offer their improvements.</p>
<blockquote><p><strong>Update</strong>: I also pushed it over to <a href="http://github.com/">github</a>: <a href="http://github.com/kylecordes/mathdrill/tree/master">http://github.com/kylecordes/mathdrill/tree/master </a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/03/22/git-windows-works/feed/</wfw:commentRss>
		</item>
		<item>
		<title>So, you want to use your new RocketModem IV on Linux</title>
		<link>http://kylecordes.com/2008/02/18/rocketmodem-iv-linux/</link>
		<comments>http://kylecordes.com/2008/02/18/rocketmodem-iv-linux/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 01:53:35 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>linux</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/02/18/rocketmodem-iv-linux/</guid>
		<description><![CDATA[On one of our projects, we’ve been using the Comtrol RocketModem IV for several years, for both modem communications and FAXing (with Hylafax). All of our RMIVs have been completely reliable and very easy to get working under Linux, particular Ubuntu/Debian which includes the rocket driver in-the-box.
Then we got a new card; it looks like [...]]]></description>
			<content:encoded><![CDATA[<p>On one of our projects, we’ve been using the <a href="http://www.comtrol.com/products/family/rm4">Comtrol RocketModem IV</a> for several years, for both modem communications and FAXing (with Hylafax). All of our RMIVs have been completely reliable and very easy to get working under Linux, particular Ubuntu/Debian which includes the rocket driver in-the-box.</p>
<p>Then we got a new card; it looks like the old cards; but according to the rocket driver it does not exist.</p>
<p>We initially suspected a bad card. We were unable to test with the floppy-image diagnostics on the Comtrol web site, because like most of the rest of the world we stopped ordering floppy drives in new machines several years ago. Comtrol support helpfully pointed us at a CD .ISO for the diagnostics, in here:</p>
<p><a href="ftp://ftp.comtrol.com/contribs/rocketport/diagnostics/rocketmodem/">ftp://ftp.comtrol.com/contribs/rocketport/diagnostics/rocketmodem/</a></p>
<p>…without mentioning any reason why this information would not be on their support web site <strong>in 2008</strong>.</p>
<p>The diagnostics showed a 100% functional card. It finally dawned on me that I might need an updated driver for the current card; and this turned out to be true. The current RocketModem IV is not recognized at all by the rocket module in-the-box in Linux.</p>
<p>Getting it going was an adventure; the short version is that to get the current RocketModem IV to work on any vaguely current Linux kernel, you need to poke around the Comtrol web site and find the beta 3.08 driver, in here:</p>
<p><a href="ftp://ftp.comtrol.com/beta/rmodem/drivers/u_pci/linux/">ftp://ftp.comtrol.com/beta/rmodem/drivers/u_pci/linux/</a></p>
<p>then do the usual apt-get of a build environment, make, sudo make install, /etc/init.d/rocket start.</p>
<p><strong>Production Deployment</strong></p>
<p>Of course the instructions above are for development / test usage; it is a very poor practice to do the above installation on production hardware, because it makes no accommodation for the inevitable stream of upgrades coming through the packaging mechanism, and because in most cases sysadmins prefer to not have a build environment on production hardware at all (ever).</p>
<p>I am no packaging / Debian expert, but I can see two workable paths to good production deployment for kernel modules like this:</p>
<p>1) Use checkinstall or similar mechanism to create a package which installs the binary modules; set things up so that the resulting package depends on the proper kernel package version. As new kernel packages appear, make new package versions to accommodate them, and likewise for each architecture (i386, amd64).</p>
<p>2) recast the raw source .tar file, as a source-deb package suitable for use with the Debian module-assistant mechanism.</p>
<p>I&#8217;d love to hear from any Debian/Ubuntu experts on the relative merits of these approaches.</p>
<p>Perhaps in a few years, things will settle back to the previous bliss of a working driver in the Linux “box”.</p>
<p><strong>Update</strong>: I&#8217;ve posted a .deb for this <a href="http://kylecordes.com/2008/04/18/debian-rocketmodem-package/">here</a>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/02/18/rocketmodem-iv-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Is Delphi Dead? No.</title>
		<link>http://kylecordes.com/2008/01/14/delphi-dead/</link>
		<comments>http://kylecordes.com/2008/01/14/delphi-dead/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 04:41:10 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>java</category>

		<category>delphi</category>

		<category>dot-net</category>

		<category>business</category>

		<category>commentary</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/01/14/delphi-dead/</guid>
		<description><![CDATA[A few months ago Alex Miller pointed me to this Delphi doom article (the site appears to be down at the moment), which reminded me to post about the same topic. Here goes.
Delphi shipped in 1995, and its demise has been declared frequently since 1997 or so. In a sense this demise is true, yet [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago <a href="http://tech.puredanger.com/">Alex Miller</a> pointed me to <a href="http://www.hans-eric.com/2007/09/02/rest-in-peace-delphi/">this Delphi doom article</a> (the site appears to be down at the moment), which reminded me to post about the same topic. Here goes.</p>
<p>Delphi shipped in 1995, and its demise has been declared frequently since 1997 or so. In a sense this demise is true, yet also false. Delphi&#8217;s current popularity is very different in form (not only in magnitude) from that of Java, C#, etc. Delphi is used substantially by commercial software vendors, and only rarely by enterprises. An ugly reality of the software industry is that the bulk of software developers nationwide work inside large non-software companies, so this usage pattern most likely does not produce the level of unit sales that Codegear (Borland’s dev-tools subsidiary) would like to see. It does, however, produce an enormous number of Delphi application instances running &#8220;in the field&#8221;, used by real paying end users, who don&#8217;t care (or know) what development tools were used to build the software they buy. Many commercial software products, both those in shrinkwrap at retail stores and those for vertical markets, are written in Delphi and will continue to be, because there are very few other good choices for high quality (polished) native Win32 GUI software. In these markets, shipping a Java or .NET app can be a competitive disadvantage (though to a lesser extent over time), and old-style VB is a sad joke.</p>
<p>I don&#8217;t think Delphi is eligible for demise until the dominant desktop operating system ships with a dominant runtime platform &#8220;in the box&#8221;. For example, if all of this happens at the same time:</p>
<ul>
<li>Microsoft ships Windows with the .NET runtime already installed</li>
<li>That version Windows is the commonly deployed version</li>
<li>That version of the .NET runtime is the commonly targeted version</li>
</ul>
<p>At that time, the .NET platform (with the language of your choice) could be a compelling replacement for Delphi in its niche. There is a lot to like about .NET (and Java, and I use them both), but I’m not holding my breath for the above conjunction.</p>
<p>Over at <a href="http://oasisdigital.com/">Oasis Digital</a> we have several ongoing Delphi projects in which we develop and extend in-house, enterprise applications. These projects feel notably lonely (very few developers here in the midwest use Delphi), and the Delphi language leaves a lot to be desired (such as garbage collection) - but the resulting software works very well for our customers, especially when we <a href="http://kylecordes.com/2006/05/09/code-camp-lua/">add in a bit of Lua</a> or Prolog (story coming someday&#8230;).</p>
<p>Delphi is not dead. It’s not at the top of the popularity charts, and won&#8217;t be. It probably shouldn’t be your first choice for a new in-house enterprise application starting today, because of the network effects of Java and .NET popularity. But Delphi is not going away anytime soon, and is a great choice for certain classes of projects.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/01/14/delphi-dead/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Optimize Hierarchy Queries with a Transitive Closure Table</title>
		<link>http://kylecordes.com/2008/01/13/transitive-closure/</link>
		<comments>http://kylecordes.com/2008/01/13/transitive-closure/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 02:21:33 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>java</category>

		<category>programming</category>

		<category>sql</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/01/13/transitive-closure/</guid>
		<description><![CDATA[Last year I posted about the use of a Joe Celko-style nested set hierarchy representation, for fast hierarchy queries. Here I will describe another approach which is simpler to query, but more wasteful of space.  I did not invent this transitive closure approach, I learned of it from several directions:

Celko wrote about it as [...]]]></description>
			<content:encoded><![CDATA[<p>Last year I <a href="http://kylecordes.com/2007/08/03/nested-sets/">posted about the use of a Joe Celko-style nested set hierarchy representation</a>, for fast hierarchy queries. Here I will describe another approach which is simpler to query, but more wasteful of space.  I did not invent this <a href="http://en.wikipedia.org/wiki/Transitive_closure">transitive closure</a> approach, I learned of it from several directions:</p>
<ul>
<li>Celko wrote about it as &#8220;Path Enumeration&#8221; his 1995 book &#8220;SQL for Smarties: Advanced SQL Programming&#8221; (now in its <a href="http://www.amazon.com/Joe-Celkos-SQL-Smarties-Programming/dp/0123693799/">third edition</a>)</li>
<li>I&#8217;ve seen it listed in various articles and web sites</li>
<li>The <a href="http://mondrian.pentaho.org/documentation/schema.php#Parent_child_hierarchies">relevant page of documentation</a> for the Mondrian OLAP server calls it a &#8220;transitive closure table&#8221;. There is a <a href="http://wiki.pentaho.org/display/EAI/Closure+Generator">page on their wiki with a tool to create them</a>, and a <a href="http://forums.pentaho.org/showthread.php?t=54019">forum post with Java code for this purpose</a>.</li>
<li>Steven Lott&#8217;s &#8220;<a href="http://www.mindspring.com/~slott1/steve/python/transclose.html">Creating a Transitive Closure to Optimize Rollups</a>&#8221; article</li>
<li>Most recently, I saw this <a href="http://evolt.org/working_with_hierarchical_data_in_sql_using_ancestor_tables">called an &#8216;ancestor table&#8217; at evolt.com</a>.</li>
</ul>
<p>There are two (main) places to put the code for building a closure tables: in your application code, or in your database. The application approach is nice if you are aiming to avoid vendor-specific SQL code, but it is quite simple in SQL, and therefore not a big problem to recode for another RDBMS if the need arises. The SQL approach also avoids round-tripping the relevant data in and out of the database. Therefore, the approach I generally recommend for this is an SQL stored procedure / function.</p>
<p>Here is a simplified PostgreSQL stored procedure to do the job; note that his assumes a &#8220;widget&#8221; table with a widget_id and parent_id (the &#8220;adjacency&#8221; representation of a hierarchy), and a widget_closure table with fields (ancestor_id, widget_id, depth). Wordpress has unhelpfully discarded my indentation:</p>
<p>CREATE OR REPLACE FUNCTION populate_widget_closure()<br />
RETURNS integer AS &#8216;<br />
DECLARE<br />
distance int;<br />
BEGIN<br />
delete from widget_closure;</p>
<p>insert into widget_closure<br />
select widget_id, widget_id, 0 from widget;</p>
<p>FOR distance in 1..20 LOOP<br />
insert into widget_closure<br />
select uc.parent_id, u.widget_id, distance<br />
from widget_closure uc, widget u<br />
where uc.child_id=u.reports_to_id<br />
and uc.distance = distance-1;<br />
END LOOP;<br />
RETURN 1;<br />
END;<br />
&#8216; LANGUAGE plpgsql;</p>
<p>This sample code  assumes a maximum depth of 20, and has no error checking. It will blindly miss greater depths and produce garbage if there is a &#8220;loop&#8221; in the ancestry. I recommend both arbitrary depth handling and error checking for production use.</p>
<p>Once your transitive closure table is populated, querying it is extremely fast and simple.  You can get all the descendants of widget 12345 with the query &#8220;select widget_id from widget_closure where ancestor_id=12345&#8243;. Of course, this hierarchy representation, while simple to generate, is not simple to incrementally update as the hierarchy changes. The most straightforward way to use it is as a cache, regenerated as needed.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/01/13/transitive-closure/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Shoes, a new Ruby GUI toolkit</title>
		<link>http://kylecordes.com/2008/01/10/shoes-ruby-gui/</link>
		<comments>http://kylecordes.com/2008/01/10/shoes-ruby-gui/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 18:02:43 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>programming</category>

		<category>ruby</category>

		<guid isPermaLink="false">http://kylecordes.com/2008/01/10/shoes-ruby-gui/</guid>
		<description><![CDATA[Last year I gave a talk on Ruby GUI toolkits, and concluded that none of those I looked at were compellingly slick or mature. There is a new player on the field now (thus certainly not mature, but interesting nonetheless): Shoes, from why the lucky stiff.
Shoes creates native applications with a Web feel. It is [...]]]></description>
			<content:encoded><![CDATA[<p>Last year I <a href="http://kylecordes.com/2007/03/31/ruby-gui-toolkits/">gave a talk on Ruby GUI toolkits</a>, and concluded that none of those I looked at were compellingly slick or mature. There is a new player on the field now (thus certainly not mature, but interesting nonetheless): <a href="http://code.whytheluckystiff.net/shoes/">Shoes</a>, from <a href="http://whytheluckystiff.net/">why the lucky stiff</a>.</p>
<p>Shoes creates native applications with a Web feel. It is not built atop GTK, Qt, etc., but rather directly on the relevant native API (Win32 on Windows, for example). Shoes has a lot of potential, which it can realize only if a community accrues around it, leading to lots of polish and a rich widget set.</p>
<p>One thing that surprised me about the Shoes install it that, as far as I can tell, it includes its own Ruby install; I installed Shoes on a machine with no (obvious) Ruby installation and it worked.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/01/10/shoes-ruby-gui/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Become a Better Speaker for $100</title>
		<link>http://kylecordes.com/2007/11/03/better-speaker-100-dollars/</link>
		<comments>http://kylecordes.com/2007/11/03/better-speaker-100-dollars/#comments</comments>
		<pubDate>Sat, 03 Nov 2007 16:50:21 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>talks</category>

		<category>audio</category>

		<category>hardware</category>

		<guid isPermaLink="false">http://kylecordes.com/2007/11/03/better-speaker-100-dollars/</guid>
		<description><![CDATA[The title of this post is a lie. It costs $70 or less, but takes a lot of work. I&#8217;ve offered this advice person-to-person many times, and finally got around to posting it.
How well you speak can have a great impact on  your ability to get customers, to attract employees, to persuade others to adopt [...]]]></description>
			<content:encoded><![CDATA[<p>The title of this post is a lie. It costs $70 or less, but takes a lot of work. I&#8217;ve offered this advice person-to-person many times, and finally got around to posting it.</p>
<p>How well you speak can have a great impact on  your ability to get customers, to attract employees, to persuade others to adopt your ideas, and much more. But how do you know how well you speak? You can&#8217;t tell as you are speaking; and if you&#8217;ve never heard yourself speak but simply assume you do well, there is a great risk that you are very, very wrong.</p>
<p>To become a better speaker, you need to review your own &#8220;performances&#8221;. For the last few years I&#8217;ve been recording my talks (at user groups etc.) with a hand-held voice recorder. I use an Olympus WS-100 (probably obsolete by now) and you can readily find an adequate device for $70 or less.</p>
<p><strong>Make the Recording</strong></p>
<p>Don&#8217;t actually hold the recorder on your hand. Sit it on the podium if you use one (I don&#8217;t care for podiums, I use one only if I am presenting with my computer and the podium is the only place to put the computer); but not to close to your noisy computer. Put it on a table or unused chair in the first row, but not too close to any noisy people or equipment.</p>
<p>Start it at the very beginning, and stop it at the very end. It is easy to edit out extra recording later.</p>
<p>Put in a fresh battery, so it doesn&#8217;t run out partway through.</p>
<p><strong>Listen to the Recording</strong></p>
<p>Take the recorder/player in your car, copy it to  your iPod, burn to CD, whatever&#8230; but listen to it, end to end. Experience your talk as a member of the audience. Make notes about any bad habits you exhibit, such as &#8220;umm&#8221;, &#8220;ahh&#8221;, &#8220;like&#8221;, &#8220;ya-know&#8221;, long (unintentional) pauses, pointless extra words, etc. This is your first opportunity to become a better speaker by means of the recording. WARNING! The first few times this might be very, very painful.</p>
<p><strong>Edit the Recording</strong></p>
<p>If you plan to post this audio online (as I usually do),  clean up the recording to trim off any extra starting and ending time; the audio you post should start immediately with your talk content and end crisply. Download Audacity (or another audio editing) and use it for this initial trim.</p>
<p>If you can spare the time (approximately 2x the length of the talk), listen through the whole recording in Audacity, trimming out the &#8220;umms&#8221;, &#8220;ahs&#8221;, overly long pauses, etc. This is your second opportunity to become a better speaker&#8230; but only for the offline listeners, and in an artificial, one-off way. Still, for an occasional important talk it is worthwhile.</p>
<p><strong>Get a Transcript</strong></p>
<p>Finally, be aware that your (now-pristine) audio is completely unsearchable and invisible to Google. To make it findable, have a transcript made and post that also. You can pay <a href="http://castingwords.com/">CastingWords</a> or other similar service to create a transcript for around a dollar per minute, or perhaps much more cheaply with some searching. The resulting text can be readily posted online, making your talk both more findable, and more accessible.</p>
<p>An example of a recorded, lightly edited, and posted talk (with transcript) is my <a href="http://kylecordes.com/2007/03/31/ruby-gui-toolkits/">Ruby GUI talk</a> earlier this year.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/11/03/better-speaker-100-dollars/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Great Developers, Projects That Sound Boring</title>
		<link>http://kylecordes.com/2007/10/31/great-developers/</link>
		<comments>http://kylecordes.com/2007/10/31/great-developers/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 14:51:26 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
		
		<category>programming</category>

		<category>business</category>

		<category>conferences</category>

		<category>commentary</category>

		<guid isPermaLink="false">http://kylecordes.com/2007/10/31/great-developers/</guid>
		<description><![CDATA[I’ve been a fan of Joel Spolsky for years, though I haven’t agreed with everything he’s written, and even mocked him a bit. Joel has written at length on his web site and in print about attracting the best developers, and one aspect of that has bothered me:
How do you attract top developers to work [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been a fan of <a href="http://www.joelonsoftware.com/">Joel Spolsky</a> for years, though I haven’t agreed with everything he’s written, and even <a href="http://kylecordes.com/2006/09/01/joel-irony/">mocked him a bit</a>. Joel has written at length on his web site and in print about attracting the best developers, and one aspect of that has bothered me:</p>
<p><strong>How do you attract top developers to work on something that sounds rather dull, like a bug tracking application? It mostly shuffles data back and forth between screens and reports and database tables – far too boring for top developers.</strong></p>
<p>Of course that’s an exaggeration, but a relevant one: at Oasis Digital much of our work is on enterprise business process automation, database-centric applications, and could likewise be described casually (though not accurately) as “just” shuffling data between screens and tables. I worry that our work will not sound interesting to prospective hires.</p>
<p>This week at the <a href="http://www.businessofsoftware.org/">Business of Software conference</a> I got a chance to ask (confront?) Joel about this. He offered a great, four-part answer, which I present here with my own additions mixed in. I don’t have careful notes about which bits came from Joel, so you are welcome to give him all the credit and me all the blame.</p>
<p><strong>1) There is Interesting Technology Inside</strong></p>
<p>Even in an application which, at first glance, just shuffles data around, there can turn out to be a lot of very interesting work inside. This is true of FogBugz and it is true of our work at Oasis Digital as well. Here are some examples of interesting work here, all of it inside dull-sounding applications:</p>
<ul>
<li>Process metadata and generate code and GUI elements. Top developers certainly are those who solve a family of problems with generic code and metadata, rather than tediously one at a time.</li>
<li>Process large hierarchies efficiently using Celko’s nested sets representation technique. Top developers are all about using better data structures.</li>
<li>Custom GUI components to provide a drag-drop, direct manipulation approach to visualize and modifying data. The results has both a high “wow” factor, and is genuinely useful – a willing combination for top developers.</li>
<li>Integrate a Prolog-based rules mechanism to provide a vital algorithm in one page of code, that would have required countless pages of code and hundreds-to-thousands of hours of work to do otherwise. Using a radically different language to solve a problem with a small fraction of the effort… exactly the sort of thing a top developer wants to do.</li>
<li>Generic data replication mechanism: building our own was certainly more interesting work than adoptions one off the shelf.</li>
<li>Learn how OLAP works, implement an OLAP ETL process.</li>
<li>… I could list many more examples</li>
</ul>
<p><strong>2) One Level Down the Stack</strong></p>
<p>Fog Creek aims to make compellingly good software because that is how you outcompete established competitors in a commercial shrinkwrap market. Oasis Digital likewise has this aim for a different reason: it is our intended niche. We aim to differentiate ourselves from “yet another outsourced dev company” by building unexpectedly good software. We don’t want customers who will be happy with the results available from the typical development firm; we want customers who are<em> playing to win</em>.</p>
<p>To meet either goal, it is sometimes necessary to work at one level of abstraction lower than would otherwise be necessarily. Joel’s examples were their own data grid and their own AJAX library. Some of our examples are listed above.</p>
<p>This kind of work, further in to the details, is generally more compelling to top developers.</p>
<p>Caveat: Don’t do this very often. If you want to ship software anytime soon, you need to mostly use off the shelf libraries that already work. Don’t build a data-grid, for example, unless you really need something that you can’t find in any off the shelf products. We don’t have our own data-grid; we use (among other things) the excellent grid products from <a href="http://www.devexpress.com/">Developer Express</a>.</p>
<p><strong>3) Problem Domain is less important than other factors</strong></p>
<p>Joel has observed that developers aren’t as picky about the problem domain of their project as one might think; rather, other factors are more important: great co-workers, nice working environment, working for a boss who is a developers, etc. Top developers want to work on a high quality end product worthy of taking pride in.</p>
<p><strong>4) All Projects need a lot of Grunt Work</strong></p>
<p>To build a high quality product, in any problem domain, will require spending a great amount of your time on grunt work: tracking down bugs and fixing them, filling in feature “holes”, cleaning up design problems, improving GUI layouts, and the like. This is true for any problem domain. Top developers know this, and just get on with doing that work when needed.</p>
<p><strong>Conclusion</strong></p>
<p>My worry was unjustified. Our work at Oasis Digital is interesting and worthwhile, both for our customers and for our developers. To grow our team, we must focus on making it an increasingly good place to work.</p>
<p>A final anecdote: Joel mentioned that FogBugz 6 was feature-complete in the summer of 2006 – that means they spent around a year polishing it, fixing bugs, filling in holes, etc. That shows a phenomenal amount of dedication and discipline to create quality software.
</p>
]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/10/31/great-developers/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
