<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kyle Cordes &#187; ruby</title>
	<atom:link href="http://kylecordes.com/tag/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://kylecordes.com</link>
	<description>Software, Business, and Life</description>
	<lastBuildDate>Fri, 18 Nov 2011 13:01:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>I Admire the Ruby Community</title>
		<link>http://kylecordes.com/2010/admire-ruby-community</link>
		<comments>http://kylecordes.com/2010/admire-ruby-community#comments</comments>
		<pubDate>Fri, 20 Aug 2010 02:49:13 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/?p=708</guid>
		<description><![CDATA[Over the last year or so, I&#8217;ve spent perhaps 50 hours rethinking what kind of business Oasis Digital should be. I&#8217;ve studied business models. I&#8217;ve made spreadsheets. I&#8217;ve looked around that numerous other consulting firms. The results of all that&#8230; are slowly emerging. Stay tuned. In the meantime, though, I noticed something very interesting: the [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last year or so, I&#8217;ve spent perhaps 50 hours rethinking what kind of business Oasis Digital should be. I&#8217;ve studied business models. I&#8217;ve made spreadsheets. I&#8217;ve looked around that numerous other consulting firms. The results of all that&#8230; are slowly emerging. Stay tuned.</p>
<p>In the meantime, though, I noticed something very interesting: the firms that appeal to me most, in terms of web site content, community involvement, portfolios, marketing approach, etc., are disproportionately Ruby or Ruby-Rails shops. I admire the &#8220;vibe&#8221; of the Ruby community:</p>
<ul>
<li>Strong focus on design, to the extent that some Ruby-centric development firms have web sites which could pass for visual-design firms instead.</li>
<li>Ruby developers seem unusually aware of the extent to which syntax and conciseness matter.</li>
<li>There is much discussion of craftsmanship, though I&#8217;d need to survey a broader swath of production code to determine whether this discussion has a basis in reality.</li>
<li>Seemingly contrary to the above factors, Rubyists also appear to be unusually pragmatic.</li>
<li>This pragmatism translates to real-world financial impact: many developers make a good living with Ruby, and many firms are very happy with their Ruby projects.</li>
<li>Ruby events are numerous, nationwide.</li>
</ul>
<p>There are numerous Ruby- or Ruby-Rails-centric development firms, and Oasis Digital is not one of them (we are perhaps a <strong>5%-or-so Ruby shop</strong>, with Ruby expertise to effectively attack automated sysadmin, integration projects, and so on). We aren&#8217;t going to become a Ruby-centric-firm, either; and there are some technical aspects of Ruby that don&#8217;t impress me.</p>
<p>Rather, we want to bring some of the cultural qualities seen in the Ruby community, to other languages and tools. We care about design much more than most firms, and it shows in our GUIs. We care about user experience, and we are obsessed with quality, working results.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2010/admire-ruby-community/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ease of Installation: DokuWiki, PHP, files</title>
		<link>http://kylecordes.com/2008/easy-install-php-files</link>
		<comments>http://kylecordes.com/2008/easy-install-php-files#comments</comments>
		<pubDate>Sun, 19 Oct 2008 14:11:07 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

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

		<guid isPermaLink="false">http://kylecordes.com/2008/10/12/webby/</guid>
		<description><![CDATA[This afternoon I rebuilt OasisDigital.com using Webby, stripping out hand-coded HTML and replacing it with much more maintainable Markdown. The site looks about the same as before (which is to say, mediocre), but under the hood it is much easier to update. We intend to use this new ease, to move forward in improving it. [...]]]></description>
			<content:encoded><![CDATA[<p>This afternoon I rebuilt <a href="http://oasisdigital.com">OasisDigital.com</a> using Webby, stripping out hand-coded HTML and replacing it with much more maintainable Markdown. The site looks about the same as before (which is to say, mediocre), but under the hood it is much easier to update. We intend to use this new ease, to move forward in improving it. There is a general principle here, which applies broading in software development also:</p>
<p><strong>If you need to make a change, but that change is difficult / tedious / risky to make, first improve the underlying system that makes it so.</strong><br />
(OasisDigital.com is a static web site; we have dynamic contact (issue trackers, etc.) to automate our work together and with our customer, but that content is on another domain.)</p>
<p><a href="http://webby.rubyforge.org/">Webby</a> is a client-side, simple <a href="http://www.google.com/search?q=static+cms">CMS for generating static web sites</a>, written in Ruby. Why serve a static site (plain old files on a web server) in 2008?</p>
<ul>
<li>It minimizes the moving parts, there is almost nothing to break or maintain.</li>
<li>It is very unlikely that any hosting issue will break a static site.</li>
<li>It is easy to serve a static site fast (though our current host, TextDrive, sometimes is not all that fast).</li>
<li>Security vulnerabilities are very unlikely, in the absence of any executable content.</li>
<li>The canonical content (in this case, mostly Markdown) is stored in plain text files, which we track, diff, and merge in git.</li>
</ul>
<p>In an earlier foray in to Drupal, we found that Drupal has extensive and useful capabilities, as well as a vibrant community, but it also has many moving parts; too many, in my judgment, to make it a good solution for building an essentially static web site.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/webby/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please, Use a Web Application Framework</title>
		<link>http://kylecordes.com/2008/please-web-framework</link>
		<comments>http://kylecordes.com/2008/please-web-framework#comments</comments>
		<pubDate>Sun, 11 May 2008 20:37:37 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></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 [...]]]></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>
<h3>Framework Caveats</h3>
<p><a href="http://www.hokstad.com/">Vidar Hokstad</a> left a lengthy and excellent comment below, disagreeing with my thesis. It turns out that I mostly <strong>agree </strong>with Vidar, and it sounds like he and I have been through many of the same experiences with poor application frameworks. There are a lot of things an application framework can do wrong, and sadly, many of them take the opportunity to do so. In-house frameworks created by “<a href="http://www.joelonsoftware.com/articles/fog0000000018.html">architecture astronauts</a>” seems to be especially prone to these defects:</p>
<ul>
<li><strong>All-or-nothing</strong>: Some frameworks intentionally or accidentally make it hard to replace a section of the framework. Don’t use these. Use a framework instead that has a “library” philosophy, such that you are readily choose to use some parts but not others.</li>
</ul>
<ul>
<li><strong>Just Different</strong>: There are frameworks which offer an API wrapper around the underlying mechanisms, which isn’t really any better, just different. In this case, different is worse. Writing to (for example) the com.acme.inhouse.servlet API is, all else equal, much worse than writing to the standard Java Servlet API. To be worth its weight, a framework API must be demonstrably and obviously more concise.</li>
</ul>
<ul>
<li><strong>Lower Abstraction</strong>: There are frameworks which, ironically, lower the level of abstraction of the application code, because that code ends up working around the framework features to get the job done.</li>
</ul>
<ul>
<li><strong>Pile of Pieces</strong>: There are frameworks in which it is necessary to shred your application in to a pile of pieces, and then wire those pieces together with configuration files. This is sometimes useful, but often makes the application harder to understand, not easier, especially if there are extensive “XML pushups” involved. (I’m looking at YOU, Struts!)  Instead, choose a framework with convention-over-configuration, and one which <strong>offers </strong>but does not <strong>require </strong>manual wiring.</li>
</ul>
<ul>
<li><strong>Keyhole Database Access</strong>: If you find you mostly use a frameworks’ DB access features, and as a result you have short, easy to change code, then keep it. But if you find you use extensive SQL to work around lots of framework issues, throw it out. If a framework intentionally makes it hard to reach to the underlying SQL access, throw it out <strong>now</strong>.</li>
</ul>
<ul>
<li><strong>No Source</strong>: If someone proposes a framework for which you won&#8217;t have source code, laugh. Aloud. If this gets you fired, then it has set you on a path to find employment at a more enlightened organization.</li>
</ul>
<ul>
<li><strong>Exceptionally Bad Exception Handling</strong>: Java frameworks are especially prone to issues with exception handling, in which the framework code &#8220;eats&#8221; exception details.</li>
</ul>
<p>In summary, pick up a framework and use it to get your application up and running quickly, but don’t be stupid.  Do what makes sense locally for your project over time. It is a win to use an application framework to reach “1.0” functionality, even if you end up removing or swapping out parts of it later.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2008/please-web-framework/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Shoes, a new Ruby GUI toolkit</title>
		<link>http://kylecordes.com/2008/shoes-ruby-gui</link>
		<comments>http://kylecordes.com/2008/shoes-ruby-gui#comments</comments>
		<pubDate>Thu, 10 Jan 2008 18:02:43 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[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 [...]]]></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/shoes-ruby-gui/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Next Big Language = JavaScript</title>
		<link>http://kylecordes.com/2007/javascript-nbl</link>
		<comments>http://kylecordes.com/2007/javascript-nbl#comments</comments>
		<pubDate>Wed, 27 Jun 2007 13:48:00 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/06/27/javascript-nbl/</guid>
		<description><![CDATA[There’s a lot of buzz about Steve Yegge’s &#8220;port&#8221; of Rails to JavaScript, and Steve has now provided (in his funny, self-deprecating style) the background of how it came to be. He doesn’t quite say it explicitly in this post, but I think it reveals that the “Next Big Language” he has been hinting at [...]]]></description>
			<content:encoded><![CDATA[<p>There’s a lot of <a href="http://www.iunknown.com/2007/06/steve-yegge-por.html">buzz</a> about <a href="http://steve-yegge.blogspot.com/">Steve Yegge</a>’s <a href="http://code.google.com/p/trimpath/wiki/TrimJunction">&#8220;port&#8221; of Rails to JavaScript</a>, and Steve has now provided (in his funny, self-deprecating style) the <a href="http://steve-yegge.blogspot.com/2007/06/rhino-on-rails.html">background of how it came to be</a>.  He doesn’t quite say it explicitly in this post, but I think it reveals that the “<a href="http://steve-yegge.blogspot.com/2007/02/next-big-language.html">Next Big Language</a>” he has been hinting at is JavaScript.</p>
<p>I (mostly) agree:</p>
<p>JavaScript is in nearly every browser, including tiny ones (like the one in my BlackBerry Pearl). It may be the single most widely available language today.</p>
<p>Because of the above, an enormous population of JavaScript programmers (though sometimes of dubious skill) has emerged.</p>
<p>Starting with Java 6 it’s “in the box” there also. To me, this makes it the likely winner, by a wide margin, for a dynamic language to be used at Java shops or inside Java projects. Being “in the box” is a powerful advantage, one which the many other contenders will have a hard time overcoming.</p>
<p>Adobe’s new JavaScript virtual machine implementation, which they <a href="http://www.mozilla.org/projects/tamarin/">handed over to Mozilla as &#8220;Tamarin&#8221;</a>, sounds like it will boost JavaScript performance great, making it good enough for a very wide variety of projects.</p>
<p>JavasScript uses curly braces, like the last few Big Languages.</p>
<p>Like Java, C, C++, etc., JavaScript has specs and multiple competing, complete, current, high quality implementations. This, to me, is a big advantage over Ruby, Python, and other currently popular dynamic languages. Of course there is plenty of room in the industry for these language to thrive also, I am not saying any of them will go away; we use Python with great results and expect to keep doing so.<br />
<a href="http://ociweb.com/mark/">Mark Volkmann</a> initially thought I was nuts to predict JavaScript as a winner but came around a few month later (and said so in a user group talk).</p>
<p>In a project <a href="http://oasisdigital.com/">at work</a>, we’d adopted JavaScript as our plugin extension language for user-customizable rules (billing rules, etc.). I’d have <a href="http://kylecordes.com/2006/05/09/code-camp-lua/">chosen Lua (as I did for another project)</a>, but there are at least 1000x as many JavaScript programs out there. So far it has worked very well. If we had it to do over we might implement far more of the project in JavaScript.</p>
<p><strong>However</strong>, there are a few reasons why I only “mostly” agree:</p>
<p>First, with JavaScript there isn’t a good way to avoid shipping source code. Sure, you an <a href="http://www.google.com/search?q=obfuscate+Javascript">obfuscate JavaScript</a> with various tools, but the results remains far for amenable to readable-source recovery than in a more traditionally compiled language. For open source projects this is no big deal, but there are also many worthwhile businesses and projects which depend on proprietary, not open software (including most of our projects), and it’s not year clear that obfuscation is sufficient protection. (<strong>Update </strong>in reply to a comment below: This matters even for server-side software, because some of us create and sell software products for other people to run on their servers.)</p>
<p>Second, at the moment JavaScript appears to lack a module system, without which it&#8217;s painful to build large systems. I expect an upcoming language version will address this.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/javascript-nbl/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BaseJumpr: BaseCamp -&gt; ActiveCollab</title>
		<link>http://kylecordes.com/2007/basejumpr</link>
		<comments>http://kylecordes.com/2007/basejumpr#comments</comments>
		<pubDate>Sat, 26 May 2007 22:15:09 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/05/26/basejumpr/</guid>
		<description><![CDATA[BaseJumpr has a fascinating service offering: they export your data from your Basecamp account, producing a set of files ready to import in to ActiveCollab, the open source Basecamp-sorta-clone-like-program. They then, if you wish to buy their hosting service, create an instance of ActiveCollab for you and import your data there. (They host your file [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://basejumpr.com/">BaseJumpr</a> has a fascinating service offering: they export your data from your <a href="http://www.basecamphq.com/">Basecamp</a> account, producing a set of files ready to import in to <a href="http://activecollab.com/">ActiveCollab</a>, the open source Basecamp-sorta-clone-like-program.  They then, if you wish to buy their hosting service, create an instance of ActiveCollab for you and import your data there. (They host your file storage on <a href="http://aws.amazon.com/s3">Amazon S3</a>, so they can easily offer ample storage.)</p>
<p>I find this very appealing, yet also a bit impolite; 37Signals has built a good business on Basecamp, the ActiveCollab team has created (well, is creating) an open source clone, while BaseJumpr did neither of these things yet stands to gain (at 37s&#8217;s expense). However, I doubt BaseJumpr is a significant threat or bother to 37Signals because most users interested in the open source ActiveCollab would likely not be using the Basecamp service in the first place.</p>
<p>Speaking of Basecamp, I am fascinated by 37Signals&#8217; business success with such a simple (but well executed) application. I tried out Basecamp myself, and found it far too feature-anemic for my taste; but I could readily see its appeal and simplicity, and it has me thinking about the merit of building a business in a focussed niche, intentionally and happily excluding the potential customers outside it.</p>
<p><strong>Update </strong>in 2009: BaseJumpr doesn&#8217;t appear to exist any more. I am curious how it worked out.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/basejumpr/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby GUI Toolkit Talk: Notes and Audio</title>
		<link>http://kylecordes.com/2007/ruby-gui-toolkits</link>
		<comments>http://kylecordes.com/2007/ruby-gui-toolkits#comments</comments>
		<pubDate>Sat, 31 Mar 2007 19:53:14 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/03/31/ruby-gui-toolkits/</guid>
		<description><![CDATA[On March 27th I gave a talk at the St. Louis Ruby User Group about Ruby GUI Toolkits. As with my last few talks, there were no slides, but rather a handout. The original handout fit tightly on a single, two-sided printed page; I’ve expanded the materials slightly and pasted them here. I also recorded [...]]]></description>
			<content:encoded><![CDATA[<p>On March 27th I gave a talk at the <a href="http://stlruby.org/">St. Louis Ruby User Group</a> about Ruby GUI Toolkits. As with my last few talks, there were no slides, but rather a handout.  The original handout fit tightly on a single, two-sided printed page; I’ve expanded the materials slightly and pasted them here.</p>
<p>I also recorded audio of the talk with my <a href="http://www.olympusamerica.com/cpg_section/product.asp?product=1170">Olympus WS-100 digital voice recorder</a>, then used <a href="http://audacity.sourceforge.net/">Audacity</a> to clean it up; Audacity’s “Remove Noise” feature worked surprisingly well. The recording lasts 1 hour 23 minutes, is 49 MB in size: <a href="http://media.kylecordes.com/RubyGUIToolkitTalk.mp3">RubyGUIToolkitTalk.mp3</a></p>
<p>A <a href="http://kylecordes.com/files/RubyGUIToolkitTalk.html">transcript of the talk</a> is also available.</p>
<p>In the audio I mention screen shots and demos; you can find those at the respective toolkits’ web sites (linked below).  I also briefly discuss and demo some code from a <a href="http://kylecordes.com/2005/09/09/direct-swing/">2005 talk about Swing</a>.</p>
<p>The handout contents follow below.</p>
<p><span id="more-136"></span></p>
<h1 class="western">Ruby GUI Toolkits</h1>
<p style="margin-bottom: 0in;">St. Louis Ruby UG &#8211; http://stlruby.org &#8211; March 27, 2007</p>
<p style="margin-bottom: 0in;">Kyle Cordes &#8211; http://kylecordes.com &#8211; Contact me via my web site</p>
<p style="margin-bottom: 0in;">These notes will on my web site sometime this week.</p>
<h6 class="western">Agenda</h6>
<ol>
<li>
<p style="margin-bottom: 0in;">Review the myriad options</p>
</li>
<li>
<p style="margin-bottom: 0in;">Let&#8217;s see some code</p>
</li>
</ol>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Ruby is quite popular for web applications (mostly with Rails) and for utility scripting. But there is a world of GUIs beyond web applications, a world which is not going away. To build such applications in Ruby, we must choose a GUI toolkit and Ruby bindings. My criteria for a rich client application toolkit (or the resulting application) are perhaps harsh:</p>
<p style="margin-bottom: 0in;">
<ul>
<li>
<p style="margin-bottom: 0in;">Polished, rich set of widgets (Consider the vast array of widgets available for .NET, Java Swing, Delphi, etc.)</p>
</li>
<li>
<p style="margin-bottom: 0in;">Consistent, comprehensible API, with both API reference and &#8220;how-to-use-this&#8221; narrative</p>
</li>
<li>
<p style="margin-bottom: 0in;">Robust, production-grade: No beta, 	no pre-1.0.</p>
</li>
<li>
<p style="margin-bottom: 0in;">Features beyond what&#8217;s readily 	possible in a web application</p>
</li>
<li>
<p style="margin-bottom: 0in;">Look like 2007, not 1997</p>
</li>
<li>
<p style="margin-bottom: 0in;">Look and feel, if desired, like a 	mainstream GUI application</p>
</li>
<li>
<p style="margin-bottom: 0in;">Actively developed and updated</p>
</li>
<li>
<p style="margin-bottom: 0in;">Ideally cross-platform; at 	minimum, great results on Windows, where most of the customers are.</p>
</li>
<li>
<p style="margin-bottom: 0in;">Sufficiently popular that 	programmers and community resources are available</p>
</li>
</ul>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">In summary: it must be suitable for creating <strong>applications that people will pay for</strong>. Not merely pay for in a vacuum or an internal-project-single-bid situation, but pay for in a competitive environment where I am trying to outmatch others who are using Java Swing, Java SWT, MFC, Visual Basic, Delphi, etc.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">I investigated each option enough to form an opinion of its suitability according to the criteria above. With some of them this took only a short while. Here they are, alphabetically:</p>
<h6 class="western">Cocoa</h6>
<p style="margin-bottom: 0in;">Sadly, I don&#8217;t have a Mac. If I did (and was targeting that platform only), the Ruby-Cocoa bridge would be very appealing, as it produces applications with a completely native Mac look&amp;feel, and appears to be a joy to program.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.rubycocoa.com/">http://www.rubycocoa.com/</a></p>
<p style="margin-bottom: 0in;"><a href="http://rubycocoa.sourceforge.net/doc/">http://rubycocoa.sourceforge.net/doc/</a></p>
<h6 class="western">Fox</h6>
<p style="margin-bottom: 0in;">The Fox GUI toolkit was somewhat weak when I first learned of it a few years ago, but appears to have improved considerably since then. It uses non-native widgets (which resemble &#8220;vintage&#8221;, pre-XP-Themeing Windows controls), and has a somewhat limited selection of them. <a href="http://www.fox-toolkit.org/">http://www.fox-toolkit.org/</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">FXRuby, the Ruby binding, is in the “one click installer” box. The benefit of being in the box is hard to overstate.</p>
<p style="margin-bottom: 0in;"><a href="http://www.fxruby.org/">http://www.fxruby.org/</a></p>
<p style="margin-bottom: 0in;"><a href="http://fox-tool.rubyforge.org/">http://fox-tool.rubyforge.org/</a></p>
<h6 class="western">Gtk</h6>
<p style="margin-bottom: 0in;">Gtk, the graphic toolkit from the GIMP and Gnome problems, is a strong candidate. Gtk is stable and well documented, and thoroughly proven by the large number of polished Gtk applications for Gnome. Gtk feels most at home on Linux, but also works on MacOS and Windows. I didn&#8217;t try MacOS, but I found it works and looks good on Windows.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Glade, the Gtk GUI design tool, treats GUI layout as data rather than code. (NeXT did this in the 1980s, and MS has recently reinvented it in the form of XAML.)</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">To install Gtk-Ruby on Debian (<a href="http://kylecordes.com/from%20http://ruby-gnome2.sourceforge.jp/hiki.cgi?Install+Guide+for+Windows">from http://ruby-gnome2.sourceforge.jp/hiki.cgi?Install+Guide+for+Windows</a>):</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">sudo apt-get install ruby-gnome2</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Then to try it out:</p>
<p style="margin-bottom: 0in;">ruby -r gtk2 -e &#8216;Gtk.init ; Gtk::Window.new.show ; Gtk.main&#8217;</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Unfortunately the simple invocations above didn&#8217;t work for me; but with a bit more work the samples run well.</p>
<h6 class="western">JRuby + Swing, JRuby + SWT</h6>
<p style="margin-bottom: 0in;">Java Swing or Eclipse&#8217;s SWT can be used with <a href="http://jruby.codehaus.org/">JRuby</a>. I didn&#8217;t investigate these much (aside from running the samples), because JRuby was not yet “ready for prime time” yet, as of around the end of 2006. It looks like there has been a lot of progress since then, so if you are reading this in mid-2007 or later, give it a close look.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">require &#8216;java&#8217;</p>
<p style="margin-bottom: 0in;">JFrame = javax.swing.JFrame</p>
<p style="margin-bottom: 0in;">frame = JFrame.new(&#8220;Hello Swing&#8221;)</p>
<p style="margin-bottom: 0in;">frame.getContentPane.add javax.swing.JLabel.new(&#8220;Hello World&#8221;)</p>
<p style="margin-bottom: 0in;">frame.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE</p>
<p style="margin-bottom: 0in;">frame.pack</p>
<p style="margin-bottom: 0in;">frame.visible = true</p>
<h6 class="western">Local Web Application</h6>
<p style="margin-bottom: 0in;">Ship a “local” web application: install Rails + Mongrel + etc., and launch a web browser pointed at http://localhost:port.  AJAX or Flash can be used to build a richer GUI than you can get with plain HTML. Aside from the local install process (which is not difficult), the tools are mature and powerful, and programmers are abundant.  Because of these advantages, and because of the various problems with the GUI toolkits, I would consider this strongly if I needed to build a local Ruby GUI app today.</p>
<h6 class="western">.NET</h6>
<p style="margin-bottom: 0in;">There is a Ruby-.NET bridge which can use WinForms (in .NET 1.x), but it hasn&#8217;t been updated since 2004.:</p>
<p style="margin-bottom: 0in;"><a href="http://www.saltypickle.com/rubydotnet">http://www.saltypickle.com/rubydotnet</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">There is at least one Ruby compiler in development which targets .NET (analogous to JRuby). When that is ready, it will be possible to use WinForms and WPF (the new “Vista” era .NET GUI toolkit).</p>
<p style="margin-bottom: 0in;"><a href="http://www.plas.fit.qut.edu.au/Ruby.NET/">http://www.plas.fit.qut.edu.au/Ruby.NET/</a></p>
<h6 class="western">OpenGL / SDL</h6>
<p style="margin-bottom: 0in;">There are Ruby bindings for OpenGL and SDL; I didn&#8217;t investigate these because they are most suited for producing graphical / game software rather than application GUIs. However, as application GUIs become richer, I expect the two categories to merge to some extent, so don&#8217;t rule out this approach completely.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://ruby-opengl.rubyforge.org/">http://ruby-opengl.rubyforge.org/</a></p>
<h6 class="western">Qt</h6>
<p style="margin-bottom: 0in;">Qt is mature, stable, and of high quality. It is used for many commercial applications on Windows and Linux. The documentation is extensive and GUI layout tools are available. Qt uses native widgets on each platform. Qt is available for free for use on open source software (including KDE and the many KDE applications).  For commercial use, it is less free:</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">$2000 per dev, for the &#8220;desktop light&#8221; edition (one platform)</p>
<p style="margin-bottom: 0in;">$5000 per dev, for the “full” edition on 2 platforms</p>
<p style="margin-bottom: 0in;">$more for various other packages</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">The QtRuby bindings are free, and described as “very complete”:</p>
<p style="margin-bottom: 0in;"><a href="http://developer.kde.org/language-bindings/ruby/index.html">http://developer.kde.org/language-bindings/ruby/index.html</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">There is a book from the Pragmatic Press about QtRuby:</p>
<p style="margin-bottom: 0in;">“Rapid GUI Development with QtRuby”</p>
<p style="margin-bottom: 0in;"><a href="http://www.pragmaticprogrammer.com/titles/ctrubyqt/">http://www.pragmaticprogrammer.com/titles/ctrubyqt/</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Qt/QtRuby is very appealing, probably the most polished of all the options, except for the price. I believe the price will prevent large scale adoption. For those large corporate Ruby GUI projects, go with Qt.</p>
<h6 class="western">Tk</h6>
<p style="margin-bottom: 0in;">Tk is in the Ruby “box” (installed by the installer, though I also saw instructions to install it separately), and has a complete, documented API. Unfortunately, it is also quite old and generally ugly; it seems more suitable for simple GUIs for utility programs, than for large, rich applications. However, this seems to be changing &#8211; the <a href="http://tktable.sourceforge.net/tile/">&#8220;Tile&#8221; theme engine for Tk</a> greatly improves the appearance.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">require ‘tk’</p>
<p style="margin-bottom: 0in;">root = TkRoot.new</p>
<p style="margin-bottom: 0in;">button = TkButton.new(root) {</p>
<p style="margin-bottom: 0in;">text “Hello, World!”</p>
<p style="margin-bottom: 0in;">command proc { puts “I said, Hello!” }</p>
<p style="margin-bottom: 0in;">}</p>
<p style="margin-bottom: 0in;">button.pack</p>
<p style="margin-bottom: 0in;">Tk.mainloop</p>
<h6 class="western">Win32</h6>
<p style="margin-bottom: 0in;">Also included in the Ruby installers are SWin and VRuby. SWin is a low level Win32 API binding, with VRuby is a GUI toolkit (OO wrapper) on top of that.  VRuby appears to be inspired by Visual Basic or the Delphi VCL. Its controls are the Windows controls (including the TreeView and ListView), and are of course 100% native and 0% cross-platform. It uses a clever implicit event-binding technique, requiring generally 0 lines of code to bind an event to a method.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">The documentation, while detailed, is in Japanese, and this is a relatively low-level toolkit, so it may be quite hard to adopt for non-Japanese speakers.</p>
<p style="margin-bottom: 0in;"><strong>Update, January 2008</strong>: Anthony Leotta wrote in to point out that there is now good VRuby documentation, in English.</p>
<h6 class="western">WxRuby / WxSugar</h6>
<p style="margin-bottom: 0in;">WxWidgets itself is stable, featureful, free, and used in many commercial applications. The most common way to use Wx appear to be with its native C++ API, and with WxPython. Wx uses native widgets for each platforms, and with a little work can have a modern slick look and feel.</p>
<p style="margin-bottom: 0in;"><a href="http://www.wxwidgets.org">http://www.wxwidgets.org</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Unfortunately, the WxRuby bindings are incomplete and unstable – even the demo application crashed several times.</p>
<p style="margin-bottom: 0in;"><a href="http://wxruby.rubyforge.org/">http://wxruby.rubyforge.org/</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">WxSugar adds a layer of “syntactic sugar” on top of WxRuby, to enable a more expressive, compact coding style.</p>
<p style="margin-bottom: 0in;"><a href="http://wxruby.rubyforge.org/wiki/wiki.pl?WxSugar">http://wxruby.rubyforge.org/wiki/wiki.pl?WxSugar</a></p>
<h6 class="western">Ruby Scripting for a non-Ruby GUI</h6>
<p style="margin-bottom: 0in;">Ruby can be used as an embedded scripting language; to do this, you&#8217;d write your application “core” in something else, then use Ruby for instance-specific business rules, plugins, etc. I demonstrated this last year at Code Camp with Lua, the same approach works well with other languages.</p>
<h6 class="western">So What Do We Do?</h6>
<p style="margin-bottom: 0in;">I don&#8217;t have a single answer as to which of these to use; none of them has impressed me as a compelling replacement to the mature toolkits I&#8217;ve used, such as  Java Swing (in the Java language, which for all its issues, is a good language to use for interacting with massive Java APIs).</p>
<h6 class="western">Other References</h6>
<p style="margin-bottom: 0in;">Jeff Barczewski pointed out that the <a href="http://www.syngress.com/catalog/?pid=1830">“Ruby Developer&#8217;s Guide” (a 2002 book by Michael Neumann)</a>, which features a free <a href="http://www.syngress.com/book_catalog/183_Ruby/sample.htm">sample chapter</a> on Ruby GUIs.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://wiki.rubygarden.org/Ruby/page/show/ComparingGuiToolkits/TakeTwo">http://wiki.rubygarden.org/Ruby/page/show/ComparingGuiToolkits/TakeTwo</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://groups.google.com/group/comp.lang.ruby/msg/58504a6e39e6a1c7">http://groups.google.com/group/comp.lang.ruby/msg/58504a6e39e6a1c7</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.trug.ca/Ruby_GUI_Toolkits">http://www.trug.ca/Ruby_GUI_Toolkits</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.arachnoid.com/ruby/RubyGUIProject/index.html">http://www.arachnoid.com/ruby/RubyGUIProject/index.html</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><a href="http://www.trug.ca/VRuby">http://www.trug.ca/VRuby</a></p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Ruby/TK tutorial: <a href="http://members.chello.nl/~k.vangelder/ruby/learntk/hello.html">http://members.chello.nl/~k.vangelder/ruby/learntk/hello.html</a></p>
<p style="margin-bottom: 0in;">
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/ruby-gui-toolkits/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
<enclosure url="http://media.kylecordes.com/RubyGUIToolkitTalk.mp3" length="50201411" type="audio/mpeg" />
		</item>
		<item>
		<title>Indentation as Block Structure &#8211; HAML instead of RHTML</title>
		<link>http://kylecordes.com/2007/haml</link>
		<comments>http://kylecordes.com/2007/haml#comments</comments>
		<pubDate>Sat, 03 Mar 2007 04:12:01 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2007/03/02/haml/</guid>
		<description><![CDATA[When I starting with Python sometime in 2001, I was briefly frustrated by the intentation-as-block-structure syntax; but after a few weeks I found it  natural. Its most obvious advantage is that it avoid the duplication between indentation and braces / keywords. Yet this kind of syntax has not become popular outside of Python. Today I [...]]]></description>
			<content:encoded><![CDATA[<p>When I starting with Python sometime in 2001, I was briefly frustrated by the <a href="http://en.wikipedia.org/wiki/Python_syntax_and_semantics">intentation-as-block-structure syntax</a>; but after a few weeks I found it  natural. Its most obvious advantage is that it avoid the <a href="http://kylecordes.com/2003/02/11/code-dup-java-talk/">duplication</a> between indentation and braces / keywords. Yet this kind of syntax has not become popular outside of Python.</p>
<p>Today I saw an interesting use of it &#8220;in the wild&#8221;: <a href="http://haml.hamptoncatlin.com/">HAML</a>, an HTML templating mechanism for Ruby on Rails. I haven&#8217;t used HAML (and may not, since at the moment we have only some sample projects using RoR, nothing in production), but from the <a href="http://haml.hamptoncatlin.com/tutorial">tutorial</a> it appears to be a very tight (indentation-based) syntax for HTML templating. I&#8217;ve encountered a Rubyist or two who disdains the Python syntax &#8211; I wonder if that similarity will limit HAML&#8217;s adoption.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2007/haml/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>$200 -&gt; Rubinius</title>
		<link>http://kylecordes.com/2006/rubinius</link>
		<comments>http://kylecordes.com/2006/rubinius#comments</comments>
		<pubDate>Thu, 14 Dec 2006 14:09:02 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/12/14/rubinous/</guid>
		<description><![CDATA[I’ve been using Ruby sporadically for some time, including in a bit of production code (in which it is running well), but the apparent lack of progress toward a more modern VM for Ruby makes it harder to get more deeply involved. On the one hand, today’s Ruby interpreter/runtime is sufficiently good to build very [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been using Ruby sporadically for some time, including in a bit of production code (in which it is running well), but the apparent lack of progress toward a more modern VM for Ruby makes it harder to get more deeply involved. On the one hand, today’s Ruby interpreter/runtime is sufficiently good to build very successful services on (37Signal&#8217;s Rails-based services, for exampel); but in my own testing for the kinds of higher volume data handling I often need to do, it’s among the slowest I’d used. That matters little for populating a web page, but matters a lot for things like OLAP ETL.</p>
<p>So today I joined <a href="http://topfunky.com/">Geoffrey Grosenbach</a> in <a href="http://nubyonrails.com/articles/2006/12/06/peepcode-screencasts-places-a-1-000-bet-on-rubinius">supporting</a> <a href="http://blog.fallingsnow.net/">Evan Phoenix</a>’s <a href="http://blog.fallingsnow.net/rubinius/">rubinius</a> project, by sending $200 to help sponsor the work. It’s not much in the grand scheme of things, but I believe in “putting your money where your mouth is”.</p>
<p>This isn’t the first time I mentioned Geoff; earlier this year I <a href="http://kylecordes.com/2006/05/12/rails-conf/">took him to task for his choice of music</a> for the Ruby on Rails podcast, which has changed since then to something more suitable.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/rubinius/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Joel, you have got to be kidding</title>
		<link>http://kylecordes.com/2006/joel-irony</link>
		<comments>http://kylecordes.com/2006/joel-irony#comments</comments>
		<pubDate>Fri, 01 Sep 2006 13:37:07 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[dot-net]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/09/01/joel-irony/</guid>
		<description><![CDATA[Joel seems to &#8220;play it safe&#8221; … then goes off the deep end of irony in his final paragraph: “FogBugz is written in Wasabi, a very advanced, functional-programming dialect of Basic with closures and lambdas and Rails-like active records that can be compiled down to VBScript, JavaScript, PHP4 or PHP5. Wasabi is a private, in-house [...]]]></description>
			<content:encoded><![CDATA[<p>Joel <a href="http://joelonsoftware.com/items/2006/09/01.html">seems to &#8220;play it safe&#8221;</a> … then goes off the deep end of irony in his final paragraph:</p>
<blockquote><p>“FogBugz is written in Wasabi, a very advanced, functional-programming dialect of Basic with closures and lambdas and Rails-like active records that can be compiled down to VBScript, JavaScript, PHP4 or PHP5. Wasabi is a private, in-house language written by one of our best developers that is optimized specifically for developing FogBugz; the Wasabi compiler itself is written in C#.”</p></blockquote>
<p>Fortunately DHH saved me some minutes of typing about it, with a <a href="http://www.loudthinking.com/arc/000596.html">scathing commentary</a>.</p>
<p>Over at <a href="http://oasisdigital.com/">Oasis Digital</a> we use both common tools (.NET, Java, PHP, C, Delphi, etc.) and more unusual ones (Lua, Prolog, Ruby, sorry no Lisp yet), so I believe that puts us in the DHH and <a href="http://www.paulgraham.com/avg.html">Paul Graham</a> camp:  If you want to win, you must be willing to do something different from the pack&#8230; such as, in an extreme case, creating your own language optimized for the task at hand, whether in the form of Lisp macros or a C# compiler for Wasabi.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/joel-irony/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aiming for Mainstream</title>
		<link>http://kylecordes.com/2006/mainstream-prime-time</link>
		<comments>http://kylecordes.com/2006/mainstream-prime-time#comments</comments>
		<pubDate>Thu, 10 Aug 2006 21:53:22 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/08/10/mainstream-prime-time/</guid>
		<description><![CDATA[Over on defmacro today, a new article appeared: defmacro &#8211; Why Exotic Languages Are Not Mainstream in which the author laments that while there appear to be various choices to use Haskell on Windows, it turns out that all of them are, in some way, not ready for prime time&#8230; or even for effective hobbiest [...]]]></description>
			<content:encoded><![CDATA[<p>Over on <a href="http://www.defmacro.org/">defmacro</a> today, a new article appeared: <a href="http://www.defmacro.org/ramblings/not-ready.html?r">defmacro &#8211; Why Exotic Languages Are Not Mainstream</a> in which the author laments that while there appear to be various choices to use Haskell on Windows, it turns out that all of them are, in some way, not ready for prime time&#8230; or even for effective hobbiest use.</p>
<p>I&#8217;ve noticed this myself, in my last few forays in to esoteric languages: the illusion of plenty of choices, runs in the the reality of no good choices.  This is not a universal problem; I&#8217;ve had great results with <a href="http://www.ruby-lang.org/">Ruby</a>, <a href="http://www.python.org/">Python</a>, and <a href="http://www.lua.org/">Lua</a>, all of which are to some extent esoteric.  The thing that those languages have in common is that there is at least one (and generally, only one) robust, production grade implementation with a community actively supporting it.</p>
<p><strong>If you want to see your favorite language gain acceptance, spend your time creating / maintaining / vigorously supporting a production-ready implementation.<br />
</strong></p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/mainstream-prime-time/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Long Rails Stack Trace</title>
		<link>http://kylecordes.com/2006/rails-stack-trace</link>
		<comments>http://kylecordes.com/2006/rails-stack-trace#comments</comments>
		<pubDate>Sun, 25 Jun 2006 17:19:01 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/06/25/rails-stack-trace/</guid>
		<description><![CDATA[I was looking at the RailsConf schedule, and saw the Rails web app that runs it fail with this longish stack trace. A few Rubyists sitting nearby commented that the application was not well configured, that usually Rails apps are configured in deployment to store such traces to a log, rather than spit them at [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0in">I was looking at the <a href="http://railsconf.org/pages/schedule">RailsConf schedule</a>, and saw the Rails web app that runs it fail with <a href="/files/rails_stack_trace.txt">this longish stack trace</a>.  A few Rubyists sitting nearby commented that the application was not well configured, that usually Rails apps are configured in deployment to store such traces to a log, rather than spit them at the user.  Their mistake is my gain though, as it provided fodder for this post.</p>
<p style="margin-bottom: 0in">This stack trace is considerably shorter than a typical <a href="http://ptrthomas.wordpress.com/2006/06/06/java-call-stack-from-http-upto-jdbc-as-a-picture/">Java web app stack trace</a>.  But it is not so good either, and it is an ominous sign that excessive complexity is making its way in to Rails.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/rails-stack-trace/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How To Do Deployment (Dave Thomas RailsConf Keynote)</title>
		<link>http://kylecordes.com/2006/deployment</link>
		<comments>http://kylecordes.com/2006/deployment#comments</comments>
		<pubDate>Fri, 23 Jun 2006 17:44:14 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[commentary]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/06/23/deployment/</guid>
		<description><![CDATA[I just attended Dave Thomas&#8217;s keynote at RailsConf. He had many interesting things to say, most notably that 60%+ of his Java-centric conference-circuit friends, mostly people who have written books on Java, speak regularly on Java, and have lots of experience as Java &#8220;architects&#8221;, are now making a living with Ruby / Rails. Dave talked [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0in">I just attended Dave Thomas&#8217;s keynote at RailsConf.  He had many interesting things to say, most notably that 60%+ of his Java-centric conference-circuit friends, mostly people who have written books on Java, speak regularly on Java, and have lots of experience as Java &#8220;architects&#8221;, are now making a living with Ruby / Rails.</p>
<p style="margin-bottom: 0in">
<p style="margin-bottom: 0in">Dave talked about 3 key areas where Rails should improve.  The one I want to focus on is deployment.  Rails has Capistrano, a slick tools for deployment automation.  Capistrano is great, but it misses the boat in one key way: it is push-based.  It assumes a world where the developer sets up, controls, and performs deployment to production servers.  That is of course the case at the start of a small operation, but it doesn&#8217;t scale; in large organization, or even in small growing ones, sooner or later there is staff dedicated to production deployment and monitoring, separate from development.</p>
<p style="margin-bottom: 0in">
<p style="margin-bottom: 0in">One way, to me right way, to handle deployment is push / pull:</p>
<p style="margin-bottom: 0in">
<p style="margin-bottom: 0in">For the “push”, a developer uploads a new version to a storage site somewhere.  It travels in the form of an archive file (ZIP, tgz, whatever) which contains all of the needed artifacts, as well as metadata about the required libraries, pre- and post-install steps, etc. for the new version.  It has a unique name; it lands at a URL.  Normal, off the shelf technology (FTP, web servers, etc.) can be used to serve and secure this storage, implement policies about who can upload new versions, etc.  This upload happens with some simple one-line command (or as part of an auto-build); it does not actually put a new version in production, but only makes it available for pulling.</p>
<p style="margin-bottom: 0in">
<p style="margin-bottom: 0in">Then, on a production machine, someone with software installation rights on that machine (administrated by the normal tools – not by any special feature of the deployment mechanism) runs a command (something like “deploy staging <a href="http://ourserver/project1/project1-build-3453.tgz">http://ourserver/project1/project1-build-3453.tgz</a>”) which downloads the new build, runs various sanity checks, deploys it to a staging area, and makes it available to try out.  Once the staging is verified, a similar command brings it in to live production.  These builds refer as needed to configuration data on the deployment machines (such as production DB access credentials); the build archives are generic, not specific to any particular production machine.</p>
<p style="margin-bottom: 0in">
<p style="margin-bottom: 0in">The main idea behind this is that each person has the rights they need for the work they need to do, and these rights don&#8217;t need any special help or support from the deployment mechanism.  Developers don&#8217;t need any special rights on deployment machines, nor to deployers need any special rights on development machine</p>
<p style="margin-bottom: 0in">I wrote this in the context of a Rails / Ruby talk, but it&#8217;s at least as relevant in Java and Delphi world; in fact at Oasis Digital we need something like this on a Java project and a Delphi project right now.</p>
<p style="margin-bottom: 0in">
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/deployment/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pure Ruby Sparklines &#8211; No RMagick ImageMagick</title>
		<link>http://kylecordes.com/2006/pure-ruby-sparklines-no-rmagick-imagemagick</link>
		<comments>http://kylecordes.com/2006/pure-ruby-sparklines-no-rmagick-imagemagick#comments</comments>
		<pubDate>Tue, 23 May 2006 19:42:46 +0000</pubDate>
		<dc:creator>Kyle Cordes</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://kylecordes.com/2006/05/23/pure-ruby-sparklines-no-rmagick-imagemagick/</guid>
		<description><![CDATA[This Pure Ruby Sparklines implementation got my attention &#8211; unlike other Ruby graphics packages, it does not need RMagick, and thus not ImageMagick, sparing the installer considerable effort and misery. The source of that misery is the long list of dependencies; now of course a great positive of the open source world is that tools [...]]]></description>
			<content:encoded><![CDATA[<p>This <a href="http://mir.aculo.us/articles/2005/09/17/pure-ruby-sparklines">Pure Ruby Sparklines</a> implementation got my attention &#8211; unlike other Ruby graphics packages, it does not need <a href="http://rmagick.rubyforge.org/">RMagick</a>, and thus not <a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>, sparing the installer considerable effort and misery.  The source of that misery is the long list of dependencies; now of course a great positive of the open source world is that tools can readily build on each other &#8211; but this comes with a cost of unexpected complexity in getting things to compile and install.  We had a project here delayed by a couple of weeks of working through issues in getting it all to work on shared hosting account.  I never did get it working with Ruby 1.8.4 on Windows, I reverted back to 1.8.2 for now.</p>
<p>With a &#8220;Pure Ruby&#8221; implementation, you copy the .rb files over and it works.  I wonder if &#8220;Pure Ruby&#8221; will become a marketing point like &#8220;Pure Java&#8221;.</p>
<p>Lest anyone accuse me of unwarranted Ruby fanhood, I&#8217;ll point this out: with Ruby it is necessary to find or what code for graphic drawing.  With Java, it is <strong>in the box</strong>, in the form of the excellent Java2D feature set.  Ruby is way behind in the area.</p>
   ]]></content:encoded>
			<wfw:commentRss>http://kylecordes.com/2006/pure-ruby-sparklines-no-rmagick-imagemagick/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

