<?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</title>
	<atom:link href="http://kylecordes.com/feed" rel="self" type="application/rss+xml" />
	<link>http://kylecordes.com</link>
	<description>Software, Business, and Life</description>
	<lastBuildDate>Fri, 22 Mar 2013 12:24:22 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Clojure(Script) for Server and Client Development</title>
		<link>http://kylecordes.com/2013/clojure-script-server-client</link>
		<comments>http://kylecordes.com/2013/clojure-script-server-client#comments</comments>
		<pubDate>Mon, 11 Feb 2013 16:01:34 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[clojurescript]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1345</guid>
		<description><![CDATA[ClojureScript is a relatively recent addition to the list of languages which compile to JavaScript. Unlike some such languages, it does not only fix the minor difficulties with JavaScript (like syntax oddities), rather it is a wholly different language with a LISP-like syntax and very powerful semantics. Many words have been written on &#8220;why ClojureScript&#8221;, [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: 13px;">ClojureScript is a relatively recent addition to </span><a style="font-size: 13px;" href="http://altjs.org/">the list of languages which compile to JavaScript</a><span style="font-size: 13px;">. Unlike some such languages, it does not only fix the minor difficulties with JavaScript (like syntax oddities), rather it is a wholly different language with a LISP-like syntax and </span><a style="font-size: 13px;" href="http://www.infoq.com/presentations/ClojureScript-Optimizations">very powerful semantics</a><span style="font-size: 13px;">. Many words have been written on &#8220;why ClojureScript&#8221;, which I won&#8217;t attempt to restate here. Rather, these are the handful of reasons ClojureScript is worthy of a deep dive for projects like ours (at </span><a style="font-size: 13px;" href="http://oasisdigital.com/">work</a><span style="font-size: 13px;">).</span></p>
<h3>Strengths (for us)</h3>
<ul>
<li>It is a &#8220;programmable programming language&#8221;, especially good for building abstractions &#8211; the usual LISP strength.</li>
<li>It is biased toward immutability and functional style (though many things are mutable, because of JavaScript underneath); yet can easily escape when pragmatically needed.</li>
<li>Is it is possible to use the same(-ish) language on the client and server; our projects benefitted from this for years in the boring old days of desktop client-server development.</li>
<li>Client side ClojureScript is built on JavaScript runtimes and libraries: proven, strong, dominant, multiplatform.</li>
<li>Server side Clojure is built on Java runtimes and libraries: proven, strong, dominant, multiplatform.</li>
<li>Although there are not a great number of ClojureScript developers, they tend to be good developers.</li>
</ul>
<h3>Weaknesses</h3>
<ul>
<li>Although parentheses-first syntax does not bother me, it does bother some developers.</li>
<li>ClojureScript is different enough from JavaScript that knowledge of the latter doesn&#8217;t help much with the former;</li>
<li>Yet, it is still necessary to know JavaScript well.</li>
<li>There are at least 100x fewer ClojureScript developers than JavaScript developers; perhaps 1000x.</li>
<li>Fits well with some JS libraries, less well with others &#8211; sometimes that prevents the &#8220;shove in an hack&#8221; style of development which is JavaScript&#8217;s strength and weakness.</li>
</ul>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2013/clojure-script-server-client/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Development Internships, for high school students, Summer 2013</title>
		<link>http://kylecordes.com/2013/internships-summer-2013</link>
		<comments>http://kylecordes.com/2013/internships-summer-2013#comments</comments>
		<pubDate>Sun, 03 Feb 2013 19:40:24 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[internship]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1341</guid>
		<description><![CDATA[For the third year in a row, Oasis Digital will hire summer interns to build something interesting. Our program is for high school students (why? because I&#8217;m a high school student parent&#8230;). If anyone knows a St. Louis area high schooler who may be interested, please send them our way.]]></description>
				<content:encoded><![CDATA[<p>For the third year in a row, Oasis Digital will <a href="http://summer.oasisdigital.com/">hire summer interns to build something interesting</a>. Our program is for high school students (why? because I&#8217;m a high school student parent&#8230;). If anyone knows a St. Louis area high schooler who may be interested, please <a href="http://summer.oasisdigital.com/">send them our way</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2013/internships-summer-2013/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JIRA OnDemand CSV Import &#8211; Rough Edges</title>
		<link>http://kylecordes.com/2012/jira-csv-rough-edges</link>
		<comments>http://kylecordes.com/2012/jira-csv-rough-edges#comments</comments>
		<pubDate>Wed, 21 Nov 2012 03:12:53 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[JIRA]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1331</guid>
		<description><![CDATA[We just went through a surprising amount of effort to import projects in to Atlassian&#8217;s JIRA OnDemand, using their CSV importer. Here are some tricky bits we hit along the way; this is accurate as of November 2012. If you are reading this well after that date, hopefully JIRA&#8217;s newer JSON-based import option is supported and documented by now. [...]]]></description>
				<content:encoded><![CDATA[<p>We just went through a surprising amount of effort to import projects in to Atlassian&#8217;s JIRA OnDemand, using their CSV importer. Here are some tricky bits we hit along the way; this is accurate as of November 2012. If you are reading this well after that date, hopefully JIRA&#8217;s newer JSON-based import option is supported and documented by now.</p>
<ol>
<li>JIRA CSV import can import attachments. It fetches them from URLs. Beware though that it won&#8217;t accept alternate ports. http://host/whatever is OK, http://host:nnn/whatever is broken. Moreover, is broken with a completely incorrect (403) error. (Undocumented.)</li>
<li>CSV import can import comments. The format is documented on their site, and arcane, and permanently leaves a trail of extra data in the comment text(!). But it works.</li>
<li>CSV import will import events as of date-time as imported. Only one date format is supported for comments; though it date format can be changed for  issue-level fields. The date format does not include a time zone. By trial and error we learned that the datetime is interpreted as the time zone which the JIRA server (at the OS level) is set to. (Undocumented.)</li>
<li>JIRA OnDemand servers are set to the US Central time zone, or at least they pretend to be for us. YMMV. (Undocumented.)</li>
<li>JIRA CSV import will automatically create-as-needed users if they are mentioned at the issue level (as an issue creator etc.)&#8230; but will only generate an error about missing users at the comment level.</li>
<li>CSV import can import parent-child relationships, but not other kinds of relationships.</li>
<li>The JIRA REST API is tempting &#8211; but it can&#8217;t assign correct historical date-times to anything, so it&#8217;s generally not useful for importing data.</li>
</ol>
<p>In spite of those rough edges, we were able to get the job done, and are happy with JIRA.</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2012/jira-csv-rough-edges/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our Interns Built a Mobile Web App, Here is Their Story</title>
		<link>http://kylecordes.com/2012/intern-mobile-web-app-story</link>
		<comments>http://kylecordes.com/2012/intern-mobile-web-app-story#comments</comments>
		<pubDate>Tue, 02 Oct 2012 16:43:56 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[internship]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1319</guid>
		<description><![CDATA[This summer, we hired three interns to build a mobile web application and learn a bunch in the process. Here is their story, in video form: If you don&#8217;t have Flash installed (and thus don&#8217;t see the video above), you can try this direct link to the video. It plays well on most platforms (including [...]]]></description>
				<content:encoded><![CDATA[<p>This summer, we <a href="http://kylecordes.com/2012/2012-summer-intern">hired three interns to build a mobile web application and learn a bunch in the process</a>. Here is their story, in video form:</p>

<p>If you don&#8217;t have Flash installed (and thus don&#8217;t see the video above), you can try this <a title="Intern video direct link" href="http://d3v5zouumhlcyr.cloudfront.net/2012-Intern-950x534.m4v">direct link to the video</a>. It plays well on most platforms (including an iPad).</p>
<p>It is also <a href="http://www.youtube.com/watch?v=xDHq3IH3Q-M&amp;feature=youtu.be">available on YouTube</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2012/intern-mobile-web-app-story/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://d3v5zouumhlcyr.cloudfront.net/2012-Intern-540x304.m4v" length="14094930" type="video/mp4" />
<enclosure url="http://d3v5zouumhlcyr.cloudfront.net/2012-Intern-950x534.m4v" length="30795829" type="video/mp4" />
		</item>
		<item>
		<title>Yet Another Github Issues to JIRA Export Tool</title>
		<link>http://kylecordes.com/2012/github-issues-export-jira</link>
		<comments>http://kylecordes.com/2012/github-issues-export-jira#comments</comments>
		<pubDate>Tue, 12 Jun 2012 14:45:34 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[JIRA]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1311</guid>
		<description><![CDATA[A few weeks ago I posted about the various Github Issues export tools to prepare data for import to Atlassian JIRA. Unsurprisingly, none of them worked sufficiently well for my needs. I thought about adapting and improving one of them; I know Ruby, Python, and (barely) enough Perl. But none was all that appealing; some [...]]]></description>
				<content:encoded><![CDATA[<p>A few weeks ago I <a href="http://kylecordes.com/2012/github-issues-to-jira">posted about the various Github Issues export tools</a> to prepare data for import to Atlassian JIRA. Unsurprisingly, none of them worked sufficiently well for my needs. I thought about adapting and improving one of them; I know Ruby, Python, and (barely) enough Perl. But none was all that appealing; some used an obsolete Github API version, one didn&#8217;t handle comments at all (!), and so on.</p>
<p>Instead I wrote a new tool, in Clojure. The following tools and documentation moved things along quickly:</p>
<ul>
<li><a href="http://developer.github.com/v3/issues/comments/">Github v3 API</a></li>
<li><a href="http://clojure.org/">Clojure</a></li>
<li><a href="https://github.com/Raynes/tentacles">Clojure API wrapper for the Github v3 API</a>: (Thank you <a href="http://blog.raynes.me/">Anthony Grimes</a>)</li>
<li><a href="http://raynes.github.com/tentacles/#tentacles.issues">Doc for the above</a></li>
<li>Clojure <a href="https://github.com/clojure/data.csv">CSV library</a></li>
<li>Clojure <a href="https://github.com/seancorfield/clj-time">Date Time library</a></li>
<li><a href="https://confluence.atlassian.com/display/JIRA041/Importing+Data+From+CSV">Doc for the JIRA import format</a></li>
<li><a href="https://confluence.atlassian.com/display/JIRA/How+to+Import+CSV+Data+with+PVCS+Command">Doc for the JIRA comment import</a></li>
<li><a href="https://confluence.atlassian.com/display/JIRAKB/Unable+to+Import+Comment+Author+and+Entry+Date+and+Time+when+Importing+CSV+File+by+PvcsComment">KB article for comment importing</a>, in particular, &#8221;settings.advanced.mapper.comment&#8221; : &#8220;com.atlassian.jira.plugins.importer.imports.csv.mappers.PvcsComment&#8221;</li>
</ul>
<p>Download the GHI -&gt; JIRA CSV tool now:</p>
<p><a href="https://github.com/kylecordes/ghijira">https://github.com/kylecordes/ghijira</a></p>
<p>A very irritating caveat is that as of June 2012, the resulting file works great with the current downloadable JIRA, but fails with JIRA OnDemand (the SaaS version). JIRA support confirmed the import problem is due to a slightly older version of the import tool used in the SaaS offering &#8211; by the time you read this, it might already have been upgraded and fixed.</p>
<p><strong>Update</strong>: To help those who aren&#8217;t here for the Clojure but just to solve their GHI-&gt;JIRA problem, I added more instructions to the README file (see github project link above) explaining how to use the software.</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2012/github-issues-export-jira/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Github Issues to JIRA &#8211; What Works?</title>
		<link>http://kylecordes.com/2012/github-issues-to-jira</link>
		<comments>http://kylecordes.com/2012/github-issues-to-jira#comments</comments>
		<pubDate>Fri, 11 May 2012 03:02:35 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[JIRA]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1300</guid>
		<description><![CDATA[Today I looked for a way to import issues (including history) from Github Issues to JIRA. I was delighted and disappointed to find at least four different implementations of a Github Issues to JIRA-CSV exporter &#8211; all honestly described as rough one-off efforts. It seems likely that I&#8217;ll adapt (add minor improvements to) one of the [...]]]></description>
				<content:encoded><![CDATA[<p>Today I looked for a way to import issues (including history) from Github Issues to JIRA. I was delighted and disappointed to find at <a href="https://gist.github.com/2369729">least</a> <a href="https://gist.github.com/1106008">four</a> <a href="https://github.com/cnorthwood/github-to-jira/blob/master/github_to_jira.py">different</a> <a href="http://www.lornajane.net/posts/2011/github-to-jira-bug-migration-script">implementations</a> of a Github Issues to JIRA-CSV exporter &#8211; all honestly described as rough one-off efforts.</p>
<p>It seems likely that I&#8217;ll adapt (add minor improvements to) one of the above to yield <strong>yet another</strong> solution for this, and perhaps publish it here, so there will then be at least four choices for the next person to find.</p>
<p>A lot of small problems end up in this condition: many semi-solutions, no clarity on which to use. Is that what meet users&#8217; needs best? Certainly not. Perhaps <strong>Atlassian</strong> will step in eventually with a broad, well-tested set of issue importers for JIRA. JIRA appears to be a market leader, this is an opportunity to step up and earn that role.</p>
<p><strong>UPDATE</strong>: I made a <a href="http://kylecordes.com/2012/github-issues-export-jira">new export tool, available now</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2012/github-issues-to-jira/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Oasis Digital 2012 Summer Internships &#8211; Mobile, Tablet, Web</title>
		<link>http://kylecordes.com/2012/2012-summer-intern</link>
		<comments>http://kylecordes.com/2012/2012-summer-intern#comments</comments>
		<pubDate>Mon, 30 Apr 2012 02:16:02 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[internship]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=1286</guid>
		<description><![CDATA[Application Deadline: May 15, 2012. Applications are now closed. It’s almost time for our Summer 2012 internship program. You might want to look back to our 2011 program, or our inspiration, the Fog Creek program. Interns at Oasis Digital work on serious, complex projects, though the work is generally exploratory in nature (rather than part [...]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><span style="color: #000000;"><strong>Application Deadline: May 15, 2012.</strong></span></p>
<p style="text-align: center;"><span style="color: #ff0000;"><strong>Applications are now closed.</strong></span></p>
<p>It’s almost time for <a href="http://oasisdigital.com/">our</a> Summer 2012 internship program. You might want to look back to our <a href="http://kylecordes.com/2011/crafting-intern-program">2011 program</a>, or our inspiration, the <a href="http://www.fogcreek.com/jobs/summerintern.html">Fog Creek program</a>. Interns at Oasis Digital work on <strong>serious, complex projects</strong>, though the work is generally exploratory in nature (rather than part of our enterprise development work for customers). Interns write software, test software, write about software, etc. The purpose of the work is to educate and enlighten the interns, and also create something useful to Oasis Digital and its customers.</p>
<h3>Who?</h3>
<p>We plan to hire two or three student interns.</p>
<p>Unlike some programs, ours is for <strong>high school students</strong>, or recent graduates about to enter college.</p>
<h3>How Long?</h3>
<p>The work will last about 10 weeks, from the first week of June through early August. Interns should expect to work around 30 hrs per week, though only a small portion of that will be on-site in-person. Other than a few fixed meetings per week, your schedule will be flexible.</p>
<p>We can adjust the dates if needed, to accomodate college start dates, family vacations, and so on.</p>
<h3>Where?</h3>
<p>Interns will meet at the Oasis Digital office two or three times each week. <a href="http://oasisdigital.com/directions.html">Our office is in Chesterfield, MO</a>. Therefore, interns must live in the St. Louis metro area and have transportation available.</p>
<p>At these office sessions, we’ll all work together, and interns will learn from various Oasis Digital developers. Outside of that, interns will work alone, and meet to work together, for a total of around 30 hours per week.</p>
<h3>Does it Pay?</h3>
<p>Yes, these are paid internships. Each intern will earn about $2200 for a full summer of work.</p>
<p>In additional, our meetings will be scheduled to include a company-paid lunch a couple of times each week.</p>
<h3>What Will We Build?</h3>
<p>The project for this summer will be a workflow management system, with web and mobile-app (smartphone, tablet) interfaces.</p>
<p>Interns (with help from Oasis Digital staff) will create an end-to-end system:</p>
<ol>
<li>Database Schema</li>
<li>Server / backend services</li>
<li>Web client application</li>
<li>Mobile (native or HTML5) app</li>
<li>Tablet (native or HTML5) app</li>
<li>Document and deploy all of the above</li>
</ol>
<p>The schedule goal is to develop an extremely simple version of the above, and &#8220;ship&#8221; it in working condition, halfway through the summer. Then with the rest of the summer, add interesting features, platforms, polish, etc. GPS, mapping, photo support, multitouch clever interfaces, anything is possible.</p>
<p><span style="color: #ff0000;">More importantly than what we will build, is <strong>what everyone will learn</strong>. Expect to learn more in this summer than you would in <strong>many</strong> classes.</span></p>
<h3>What Language?</h3>
<p>The exact toolset will be worked out by the interns, and may include:</p>
<ul>
<li>JavaScript</li>
<li><a href="http://nodejs.org/">Node</a></li>
<li>JQuery and similar libraries</li>
<li>Java</li>
<li><a href="http://clojure.org/">Clojure</a></li>
<li><a href="http://git-scm.com/">Git</a> / <a href="https://github.com/">Github</a></li>
<li>HTML (including HTML5)</li>
<li><a href="http://www.postgresql.org/">PostgreSQL</a> or MySQL</li>
<li>Linux, Windows, OSX</li>
<li>iOS, Android</li>
<li>Various other open source tools and libraries</li>
</ul>
<h3>Requirements</h3>
<ul>
<li>Excellent command of written and spoken English</li>
<li>Currently enrolled in high school, or just graduated.</li>
<li>Top grades or a track record of success</li>
<li>Permanent legal right to work in the United States</li>
<li>Great (for your age) computer programming skills</li>
<li>Live in the St. Louis MO metro area</li>
<li>A computer available to work on, when you&#8217;re not at the office</li>
</ul>
<h3>How Do I Apply?</h3>
<p>Apply <a href="http://oasisdigital.theresumator.com/apply/bNgqpy/2012-Summer-Intern.html">via our job application page</a>, <strong>not</strong> by email or phone. This is the same mechanism we use for hiring non-interns, so it is perhaps overly complex; we expect intern applicants to have a short, one-page resume listing interests and personal projects, not professional work.</p>
<p>Please apply by <strong>May 15, 2012. </strong></p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2012/2012-summer-intern/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Basics: Formatting Numbers for Tabular Display</title>
		<link>http://kylecordes.com/2011/tabular-display</link>
		<comments>http://kylecordes.com/2011/tabular-display#comments</comments>
		<pubDate>Fri, 18 Nov 2011 12:59:30 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[basics]]></category>
		<category><![CDATA[commentary]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=937</guid>
		<description><![CDATA[Here is the first, in hopefully a series, of posts about basic software design. Though not nearly as sexy as a location-based mobile social network with behavioral profiling for ad optimization (probably a real thing), doing basic software design well is one of our &#8220;secrets&#8221; at Oasis Digital. So here goes. Today&#8217;s topic is how [...]]]></description>
				<content:encoded><![CDATA[<p>Here is the first, in hopefully a series, of posts about basic software design. Though not nearly as sexy as a location-based mobile social network with behavioral profiling for ad optimization (probably a real thing), doing basic software design well is one of our &#8220;secrets&#8221; at Oasis Digital. So here goes.</p>
<p>Today&#8217;s topic is how numbers should be formatted for tabular display. This comes up quite frequently in data-centric applications. For an example, consider this mockup of a working-hours-per-person display screen, example 1:</p>
<p><a href="http://kylecordes.com/2011/tabular-display/col1" rel="attachment wp-att-938"><img class="alignnone size-full wp-image-938" title="col1" src="http://kylecordes.com/blog/wp-content/uploads/2011/11/col1.png" alt="" width="165" height="114" /></a></p>
<p>It looks quite nice with the numbers formatted trivially as whole numbers. What if someone worked 4.56 hours, though? How would that appear? To accomodate that possibility, you might always show two digits to the right of the decimal point like so, example 2:</p>
<p><a href="http://kylecordes.com/2011/tabular-display/col2" rel="attachment wp-att-941"><img class="alignnone size-full wp-image-941" title="col2" src="http://kylecordes.com/blog/wp-content/uploads/2011/11/col2.png" alt="" width="161" height="112" /></a></p>
<p>&#8230; which is OK, but not great &#8211; all those extra zeros distract the viewer from the essence of the data. One thing you should never do, though, is something like this:</p>
<p><a href="http://kylecordes.com/2011/tabular-display/col3" rel="attachment wp-att-942"><img class="alignnone size-full wp-image-942" title="col3" src="http://kylecordes.com/blog/wp-content/uploads/2011/11/col3.png" alt="" width="161" height="111" /></a></p>
<p>This is horrible. If you feel tempted to write software that displays data like this intentionally, please step away from the computer now. This breaks the rules of writing numbers that we all learned in primary school, probably before the age of 10: <strong>always line up the decimal point</strong>. Instead, for that particular set of numbers, the is reasonable:</p>
<p><a href="http://kylecordes.com/2011/tabular-display/col4" rel="attachment wp-att-943"><img class="alignnone size-full wp-image-943" title="col4" src="http://kylecordes.com/blog/wp-content/uploads/2011/11/col4.png" alt="" width="158" height="110" /></a></p>
<p>So is the answer to always display as many decimal digits as the data could possibly have? Perhaps, but only if you are <strong>unable to dynamically change the format</strong> based on the contents of the data. Examples 2 and 4 show a safe but unimpressive approach.</p>
<p>If you have the <strong>tools and skills to create a high quality solution</strong>, aim higher: dynamically choose the right number of decimal digits, to fit the specific data in question, then apply that same format uniformly to all the numbers. The output will therefore look like #1 if the data permits, and like #4 if the data requires it, but will not needlessly fill a column with 0s as in #3. This is more work, but is a more polished, professional result.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/tabular-display/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Group Programming, Projectors, and Big Screen HDTV</title>
		<link>http://kylecordes.com/2011/group-programming-hdtv</link>
		<comments>http://kylecordes.com/2011/group-programming-hdtv#comments</comments>
		<pubDate>Thu, 03 Nov 2011 01:23:12 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[code-review]]></category>
		<category><![CDATA[pair-programming]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=928</guid>
		<description><![CDATA[I&#8217;ve done a fair amount of pair programming over the years. My &#8220;Ward Number&#8221; is 1, if anyone recognizes the reference. But we pair only occasionally at Oasis Digital. Like Jeff Atwood, we don&#8217;t live the pair programming lifestyle. For our particular mix of people and problem spaces, we&#8217;ve found the sufficient amount of pairing [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve done a fair amount of <a href="http://en.wikipedia.org/wiki/Pair_programming">pair programming</a> over the years. My &#8220;Ward Number&#8221; is 1, if anyone recognizes the reference. But we pair only occasionally at <a href="http://oasisdigital.com/">Oasis Digital</a>. Like Jeff Atwood, we <a href="http://www.codinghorror.com/blog/2007/11/pair-programming-vs-code-reviews.html">don&#8217;t live the pair programming lifestyle</a>. For our particular mix of people and problem spaces, we&#8217;ve found the sufficient amount of pairing is roughly a couple of times per week, a couple hours at a time. We&#8217;re a partially <a href="http://kylecordes.com/2007/distributed-team-tools">distributed team</a>, so this often occurs via screen-sharing tools instead of at the same desk.</p>
<p>However, we do something perhaps even more &#8220;extreme&#8221; than pair programming: we spend a few hours every week programming in larger groups, sometimes as many as three of us in person and a couple more remotely. Why would anyone do that?</p>
<ul>
<li>To attack particularly hard problems</li>
<li>To resolve important detailed design issues</li>
<li>To share our programming style and culture</li>
<li>To freshen old skills</li>
<li>To build new skills</li>
<li>To efficiently pass knowledge 1-&gt;N, rather than 1-&gt;1</li>
</ul>
<p>I don&#8217;t quite know what to call this. <strong>Group</strong> programming? <strong>Cluster</strong> programming? <strong>N-tuple</strong> programming?</p>
<p>Regardless, we encounter an unavoidable issue: it is not pleasant for several people to cram in front of a PC monitor, even a large one, closely enough to read it. We&#8217;d rather spread out, particularly for sessions lasting a couple of hours straight.</p>
<p>In the past at other firms I&#8217;ve solved this by working in a conference room with a projector. This doesn&#8217;t work very well. Most projectors have a maximum native resolution of 1024&#215;768, or occasionally a bit higher, and those with reasonably high resolution are quite expensive. The reward for spending that money is continuous fan noise and an exhaust heat plume blowing on someone sitting on the unlucky side of the table.</p>
<p>This time we went a different direction: our group programming lair features:</p>
<ul>
<li>40-inch LED-LCD HDTV, with a native resolution of 1920&#215;1080, which generates no noise or heat, at less cost than a mediocre projector</li>
<li>A dedicated computer, so noone&#8217;e development laptop is occupied</li>
<li>wireless keyboard and mouse can be easily passed around</li>
<li>Speakers and a standalone mic, for very clear Skype audio</li>
<li>Nearby tables to accomodate everyone&#8217;s laptops, with 22/23 inch extra displays available</li>
</ul>
<p>It isn&#8217;t pretty:</p>
<p><a href="http://kylecordes.com/2011/group-programming-hdtv/bigmon-2" rel="attachment wp-att-930"><img class="alignnone size-full wp-image-930" title="BigMon" src="http://kylecordes.com/blog/wp-content/uploads/2011/11/BigMon1.jpg" alt="" width="614" height="395" /></a></p>
<p>It is <strong>very effective</strong>. We can comfortably work together in this area for hours, easily reading the screen from 6-8 feet away. (As I write this, I note that the room needs better chairs, a less beige color scheme, a printer that isn&#8217;t older than my teenager, and more Apple hardware.)</p>
<p>This approach isn&#8217;t for everyone; it requires a willingness to move furniture and buy non-standard equipment. I&#8217;d love to hear from anyone else doing something similar. In particular, I wonder how it compares to <a href="http://pivotallabs.com/users/jsusser/blog/articles/1505-pairing-tete-a-tete">Pivotal&#8217;s setup</a>.</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/group-programming-hdtv/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Steve Jobs</title>
		<link>http://kylecordes.com/2011/steve-jobs</link>
		<comments>http://kylecordes.com/2011/steve-jobs#comments</comments>
		<pubDate>Thu, 06 Oct 2011 01:41:24 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=918</guid>
		<description><![CDATA[If you haven&#8217;t already done so, now would be a good time to watch Steve Jobs&#8217; 2005 Stanford commencement address.]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-919" title="apple-jobs" src="http://kylecordes.com/blog/wp-content/uploads/2011/10/apple-jobs.png" alt="" width="589" height="395" /></p>
<p style="text-align: center;">If you haven&#8217;t already done so, now would be a good time<br />
to watch <a href="http://www.youtube.com/watch?v=UF8uR6Z6KLc">Steve Jobs&#8217; 2005 Stanford commencement address</a>.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/steve-jobs/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobile Lua &#8211; iOS and Android apps with Corona</title>
		<link>http://kylecordes.com/2011/ios-android-lua-corona</link>
		<comments>http://kylecordes.com/2011/ios-android-lua-corona#comments</comments>
		<pubDate>Tue, 31 May 2011 01:21:42 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[lua]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=908</guid>
		<description><![CDATA[On Thursday (May 26, 2011), I presented 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 used Ansca&#8217;s Corona product. The talk was somewhat impromptu, so I didn&#8217;t record audio or video. The slides are available: &#160; [...]]]></description>
				<content:encoded><![CDATA[<p>On Thursday (May 26, 2011), I presented 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 used Ansca&#8217;s Corona product. The talk was somewhat impromptu, so I didn&#8217;t record audio or video. The slides are available:</p>
<div id="__ss_8155387" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><br />
</strong><object id="__sse8155387" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2011luacoronamobiledev-110530182157-phpapp01&amp;stripped_title=mobile-lua-for-ios-and-android-with-ansca-corona&amp;userName=kylecordes" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2011luacoronamobiledev-110530182157-phpapp01&amp;stripped_title=mobile-lua-for-ios-and-android-with-ansca-corona&amp;userName=kylecordes" allowfullscreen="true" allowscriptaccess="always" name="__sse8155387"></embed></object>&nbsp;</p>
<p>&#8230; or as a PDF: <a href="/files/2011-Lua-Corona-Mobile-Dev.pdf">2011-Lua-Corona-Mobile-Dev.pdf</a></p>
<p>From this blog, you might get the impression that I use Lua extensively. That is not true; 95% of my work does not involve Lua in any way.</p>
</div>
<p><script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;c2=7400849&amp;c3=1&amp;c4=&amp;c5=&amp;c6="></script></p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/ios-android-lua-corona/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Crafting a Summer Intern Program</title>
		<link>http://kylecordes.com/2011/crafting-intern-program</link>
		<comments>http://kylecordes.com/2011/crafting-intern-program#comments</comments>
		<pubDate>Sun, 29 May 2011 18:35:30 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=902</guid>
		<description><![CDATA[Inspired by Fog Creek&#8217;s summer intern program, for the last few years we&#8217;ve (occasionally) thought about a summer intern program at Oasis Digital. We&#8217;ll going to try it out this summer, with a single intern; a more substantial program is possible in the future. Serious Work When some people hear (or say) the word intern, [...]]]></description>
				<content:encoded><![CDATA[<p>Inspired by <a href="http://www.fogcreek.com/Jobs/SummerIntern.html">Fog Creek&#8217;s summer intern program</a>, for the last few years we&#8217;ve (occasionally) thought about a summer intern program at <a href="http://oasisdigital.com/">Oasis Digital</a>. We&#8217;ll going to try it out this summer, with a single intern; a more substantial program is possible in the future.</p>
<h3>Serious Work</h3>
<p>When some people hear (or say) the word intern, they imagine someone who makes copies and fetches lunch. Perhaps in some work cultures that is helpful, but here we have in mind serious work. Our interns will work on serious work:</p>
<ul>
<li>Projects that are helpful to our company operations</li>
<li>Exploratory programming, to try out ideas that don&#8217;t yet warrant commercial attention</li>
<li>Open Source programming, such as improvements to tools we use</li>
<li>Perhaps even a few bits of our real customer projects</li>
</ul>
<p>The kinds of work could include&#8230;</p>
<ul>
<li>writing software</li>
<li>testing software</li>
<li>reading and writing about software</li>
<li>marketing work around the software</li>
</ul>
<h3>Twofold Purpose</h3>
<p>The purpose and goal of our internships will be:</p>
<ol>
<li>Educate and enlighten the intern</li>
<li>Hopefully also create something useful to Oasis Digital and its customers</li>
</ol>
<h3>Paid vs Unpaid Internships</h3>
<p>Many companies are eager to get free help from interns. But it&#8217;s clear from a few minutes research that a for-profit company with an intern working on potentially valuable project, must pay. Therefore, we will only offer paid internships.</p>
<h3>Location</h3>
<p>The internship work will be conducted at our at Oasis Digital office; interns must live in the St. Louis metro area.</p>
<h3>Can I Apply?</h3>
<p>Sorry &#8211; No. We&#8217;ve already selected an intern for our trial-run 2011 program. If we decide to continue and expand it for 2012, it will be announces in the spring (of 2012).</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/crafting-intern-program/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloudy Data Storage, circa 2001</title>
		<link>http://kylecordes.com/2011/cloud-2001</link>
		<comments>http://kylecordes.com/2011/cloud-2001#comments</comments>
		<pubDate>Wed, 25 May 2011 02:46:29 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=896</guid>
		<description><![CDATA[Around 2000-2001, Oasis Digital built a system for a client which (in retrospect) took a &#8220;cloudy&#8221; approach to data storage. 2001 is a few years before that approach gained popularity, so it&#8217;s interesting to look back and see how our solution stacks up. The problem domain was the storage of check images for banks; the [...]]]></description>
				<content:encoded><![CDATA[<p>Around 2000-2001, Oasis Digital built a system for a client which (in retrospect) took a &#8220;cloudy&#8221; approach to data storage. 2001 is a few years before that approach gained popularity, so it&#8217;s interesting to look back and see how our solution stacks up.</p>
<p>The problem domain was the storage of check images for banks; the images came out of a check-imaging device, a very specialized camera/scanner capable of photographing many checks per second, front and back. For example, to scan 1000 checks (a smallish run), it generated 2000 images. All of the images from a run were stored in a single archive file, accompanied by index data. OCR/mag-type data was also stored.</p>
<p>I don&#8217;t recall the exact numbers (and probably wouldn&#8217;t be able to talk about them anyway), so the numbers here are estimates to convey a sense of the scale of the problem in its larger installations:</p>
<ul>
<li>Many thousands of images per day.</li>
<li>Archive files generally between 100 MB and 2 GB</li>
<li>Hundred, then thousands, of these archive files</li>
<li>In an era when hard drives were much smaller than they are today</li>
</ul>
<p>Our client considered various off-the-shelf high-capacity storage systems, but instead worked with us to contruct a solution roughly as follows.</p>
<h3>Hardware and Networking</h3>
<ul>
<li>Multiple servers were purchased and installed, over time.</li>
<li>Servers were distributed across sites, connected by a WAN.</li>
<li>Multiple hard drives (of capacity C) were installed in each server, without RAID.</li>
<li>Each storage drive on each server was made accessible remotely via Windows networking</li>
</ul>
<h3>Software</h3>
<ul>
<li>To keep the file count managable, the files were kept in the many-image archives.</li>
<li>A database stored metadata about each image, including what file to find it in.</li>
<li>The offset of the image data within its archive file was also stored, so that it could be read directly without processing the whole archive.</li>
<li>Each archive file was written to N different drives, all on different servers, and some at different physical sites.</li>
<li>To pick where to store a new file, the software could simply look through the list of possibility and check for sufficient free space.</li>
<li>A database kept track of where (all) each archive file was stored.</li>
<li>An archive file could be read from any of its locations. Client software would connect to the database, learn of all the locations for a file.</li>
</ul>
<p>This system was read-mostly, and writes were not urgent. For writes, if N storage drives weren&#8217;t available, the operator (of the check-scanning system) would try again later. CAP and other concerns weren&#8217;t important for this application.</p>
<h3>Helpful Properties</h3>
<ul>
<li>Even if some servers, sites, or links were down, files remained generally accessible.</li>
<li>Offline media storage could be added, though I don&#8217;t recall if we got very far down that path.</li>
<li>The system was very insensitive to details like OSs, OS versions, etc. New storage servers and drives could be added with newer OS versions and bigger drive sizes, without upgrading old storage.</li>
<li>Drives could be made read-only once full, to avoid whole classes of possible corruption.</li>
<li>By increasing the number of servers, and number of hard drives over time, this basic design could scale quite far (for the era, anyway).</li>
</ul>
<p>This approach delivered for our client a lot of the benefits of an expensive scalable storage system, at a fraction of the cost and using only commodity equipment.</p>
<p>Why do I describe this as cloud-like? Because from things I&#8217;ve read, this is similar (but much less sophisticated, of course) to the approach taken inside of Amazon S3 and other cloud data storage systems/services.</p>
<h3>Key Lesson</h3>
<p>Assume you are willing to pay to store each piece of data on N disks. You get much better overall uptime (given the right software) if those N disks are in <strong>N different machines spread across sites</strong>, than you do by putting those N disks in a RAID on the same machine. Likewise, you can read a file much faster from an old slow hard drive in the same building than you can from a RAID-6 SAN across an 2000-era WAN. The tradeoff is software complexity.</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/cloud-2001/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>Coming this fall: Strange Loop 2011</title>
		<link>http://kylecordes.com/2011/fall-strange-loop-2011</link>
		<comments>http://kylecordes.com/2011/fall-strange-loop-2011#comments</comments>
		<pubDate>Mon, 16 May 2011 22:30:59 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=887</guid>
		<description><![CDATA[Coming this fall, Alex Miller is putting on the third year of his Strange Loop conference, Strange Loop 2011. It&#8217;s not in &#8220;The Loop&#8221; this time, because The Loop isn&#8217;t big enough to hold it! I heartily recommend Strange Loop for any software developer interested in learning more about a wide variety of technical topics. [...]]]></description>
				<content:encoded><![CDATA[<p>Coming this fall, <a href="http://tech.puredanger.com/">Alex Miller</a> is putting on the third year of his Strange Loop conference, <a href="https://thestrangeloop.com/">Strange Loop 2011</a>. It&#8217;s not in &#8220;The Loop&#8221; this time, because The Loop isn&#8217;t big enough to hold it!</p>
<p>I heartily recommend Strange Loop for any software developer interested in learning more about a wide variety of technical topics. Unlike many other events, this one stays close to the technology all the way through &#8211; you might see a higher ratio of code-to-text on the slides here, than at any other conference.</p>
<p>(Again this year, my firm <a href="http://oasisdigital.com/news.html">Oasis Digital is a sponsor</a>, and I&#8217;ll probably submit a talk. I hesitate a bit though, because if I give a talk, I have to miss someone else&#8217;s talk in that timeslot.)</p>
<p>&nbsp;</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2011/fall-strange-loop-2011/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->