<?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>Lovable Lyle</title>
	<atom:link href="http://lylejohnson.name/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://lylejohnson.name/blog</link>
	<description>Covering Software Development with Ruby and FXRuby</description>
	<lastBuildDate>Thu, 24 Dec 2009 15:12:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Book Review: Debug It!</title>
		<link>http://lylejohnson.name/blog/2009/12/23/book-review-debug-it/</link>
		<comments>http://lylejohnson.name/blog/2009/12/23/book-review-debug-it/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 22:52:52 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=367</guid>
		<description><![CDATA[I started programming as a teenager. My first paid programming job involved writing a sort of mail-merge program in BASIC, on a TRS-80 Model II at my Dad&#8217;s office. Over the years, I figured out that by adding enough print statements here and there I could eventually figure out what was going on and make [...]]]></description>
			<content:encoded><![CDATA[<p>I started programming as a teenager. My first paid programming job involved writing a sort of mail-merge program in BASIC, on a <a href="http://oldcomputers.net/trs80ii.html">TRS-80 Model II</a> at my Dad&#8217;s office. Over the years, I figured out that by adding enough print statements here and there I could eventually figure out what was going on and make the bugs (or at least their symptoms) go away.</p>

<p>Another ten years or so passed, however, before I really learned how to debug software. That happened at my first job out of graduate school, when I went to work for a <a href="http://www.cfdrc.com/">company</a> that produced commercial software for computational fluid dynamics (CFD) analysis. The sort of scattershot debugging approach that I&#8217;d used up until then would no longer suffice. We had customers paying pretty hefty licensing fees to use our software, and when they reported a bug we needed to make sure that we could get a solid, reliable fix out to them so that their work wasn&#8217;t disrupted. It wasn&#8217;t enough to make the symptoms of the problem go away. We needed to understand what was broken, how it got that way, and only then implement a solution. Fortunately, one of my mentors at that company taught me this more rigorous approach to debugging software, one that I continue to use to this day.</p>

<p>Earlier this year, I had the opportunity to do a technical review of <a href="http://www.paulbutcher.com/">Paul Butcher</a>&#8217;s new book, <a href="http://pragprog.com/titles/pbdp/debug-it"><cite>Debug It!</cite></a> and now that it&#8217;s been published I&#8217;m pleased to be able to review the final product. A number of classic programming books, such as Steve Maguire&#8217;s <cite>Writing Solid Code</cite> or Steve McConnell&#8217;s <cite>Code Complete</cite>, touch on debugging as one aspect of the software development process, but I&#8217;m not sure that I&#8217;ve ever seen or read an entire book devoted to the topic of debugging software. In that regard, Paul&#8217;s new book fills a pretty interesting niche.</p>

<p>Paul breaks the debugging process up into four stages: reproduce, diagnose, fix and reflect. These stages are covered in detail in the first five chapters of the book, and this is the most important section. In the chapter on reproducing bugs, he touches on topics such as how to control the environmental conditions under which bugs manifests themselves, and techniques for reproducing the inputs that trigger the bugs. He also addresses some of the difficulties involved in dealing with especially difficult-to-reproduce nondeterministic bugs. In the chapter on diagnosis, Paul moves on to the process of forming a hypothesis about what&#8217;s causing the bug and then performing experiments to refine that hypothesis until you settle in on a root cause. There are a lot of useful guidelines here, including my favorite: Only change one thing at a time! The chapter on fixing bugs is relatively short, which reflects the reality that once you understand what&#8217;s going on it&#8217;s usually not that difficult to fix the problem. Here the author stresses the importance of adding regression tests, and making sure that you&#8217;re fixing the root cause and not merely the symptoms. The last step is to reflect on the significance of this bug and what it might be telling you about the overall quality of your code (e.g. are similar bugs lurking elsewhere in the code?)</p>

<p>The second section of the book (&#8220;The Bigger Picture&#8221;) takes a higher-level look at the issues surrounding software bugs, namely, how do you create an environment such that you stay on top of bugs and not fall into an &#8220;infinite defects&#8221; situation. It addresses topics such as tracking bugs and working with users and the support staff to better understand the bugs they&#8217;re seeing in production. The third section of the book (&#8220;Debug-Fu&#8221;) is sort of a hodge-podge of more advanced topics, I suppose. Some of the information in these later chapters is arguably out of place in this book. For example, Chapter 9, &#8220;The Ideal Debugging Environment,&#8221; stresses the importance of having automated tests, a continuous build system, and so forth. There&#8217;s no question that this is good advice; I&#8217;m just not sure that it&#8217;s completely on-topic for this book. Having said that, they <em>are</em> good disciplines for any programmer to have, and if the stuff in the rest of this book is new to you there&#8217;s a good chance that Paul&#8217;s advice on testing and continuous builds is new to you too.</p>

<p>It is important to note that the focus of this book is the debugging mindset, and strategies and techniques that you&#8217;ll use when debugging software. It does <em>not</em> teach you how to use any particular debugging tools. If you merely want to learn how to use the GNU debugger (gdb), or the graphical debugger in your IDE of choice, this is not the book for you.</p>

<p>In conclusion, I would highly recommend <cite>Debug It!</cite> to any junior-level programmer who&#8217;s interested in developing a more disciplined approach to debugging. If you&#8217;re not a junior-level programmer but still feel like you waste a lot of time debugging, you will probably find this book helpful as well. It&#8217;s like having a mentor sitting there with you, teaching you how to take your debugging game to the next level.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/12/23/book-review-debug-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wait, what was that last bit?</title>
		<link>http://lylejohnson.name/blog/2009/10/26/wait-what-was-that-last-bit/</link>
		<comments>http://lylejohnson.name/blog/2009/10/26/wait-what-was-that-last-bit/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 21:29:00 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[FXRuby]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=361</guid>
		<description><![CDATA[So some of you may have seen the news about Gemcutter.org changing its name to RubyGems.org and becoming the new default gem repository for the Ruby community. I&#8217;m not completely clear yet on all the pros and cons of this move, but I do have to admit that the new site is pretty to look [...]]]></description>
			<content:encoded><![CDATA[<p>So some of you may have seen the <a href="http://update.gemcutter.org/2009/10/26/transition.html">news</a> about Gemcutter.org changing its name to RubyGems.org and becoming the new default gem repository for the Ruby community. I&#8217;m not completely clear yet on all the pros and cons of this move, but I do have to admit that the new site is pretty to look at. As a maintainer, I like the idea of being able to just type &#8220;gem push fxruby&#8221; (or whatever the command syntax is) and being done with it. So I think this will probably turn out to be a good thing.</p>

<p>Buried a few paragraphs down in the news, however, is this tidbit:</p>

<blockquote>So, what does this mean for RubyForge? The Ruby-specific functionality and data will be moved into RubyGems.org, and the parts that other hosting sites (GitHub, Google Code, SourceForge) can do better will be pruned away.</blockquote>

<p>In the comments, I asked for clarification on exactly what RubyForge services will be going away, and Tom Copeland&#8217;s reply seems to indicate (to me) that the answer is &#8220;everything&#8221;:</p>

<blockquote>&#8230; We&#8217;re putting together a schedule for standing down (or making read-only) various bits of RubyForge. The thing is that now there are much better options for hosting code/forums/lists/files/etc, so that stuff is going to be retired. I think back in 2003 it made sense for the Ruby community to have a dedicated site for hosting that stuff. Now I don&#8217;t think it does&#8230; I think GitHub/Google Code/SourceForge can all do a better job at that, and Ruby Central doesn&#8217;t have to expend resources/time/money supporting functionality that others are doing better.</blockquote>

<p>This is troubling to me since several FXRuby-related services (such as the web page hosting, bug tracker, and mailing lists) are handled by RubyForge, and have been for a long time now. For me, it&#8217;s not merely a question of, say, finding a new place to host the mailing lists. It&#8217;s also making a decision about what to do with the archives, and dealing with all of the <a href="http://www.codinghorror.com/blog/archives/001306.html">non-readers</a> who will go out their way to try to subscribe to the old lists even when they&#8217;re clearly marked as inactive and then send e-mails to me to ask why that&#8217;s so. But I know that Tom and company are sensitive to these concerns, and we&#8217;ll figure out a way to make the transition work as painlessly as possible, so I&#8217;m going to try not to be a grumpy old man about it.</p>

<p>So in the meantime, I&#8217;m beginning to consider what my post-RubyForge options are. Setting up a dedicated <a href="http://www.redmine.org/">Redmine</a> installation, as <a href="http://onestepback.org/redmine/">Jim Weirich</a> has done for his projects, is an attractive option as it provides one-stop shopping (and I&#8217;ve had some experience with setting up Redmine for other projects already). Another option is to go with different sites targeted at the different services, like entp&#8217;s <a href="http://lighthouseapp.com/">Lighthouse</a> for bug tracking, maybe <a href="http://groups.google.com/">Google Groups</a> for the mailing list hosting, and maybe piggybacking the static web site content off of my personal web site somehow (ugh). What about you, dear reader? If you&#8217;re hosting one of the 8,500 projects at RubyForge, what plans are you contemplating for RubyForge&#8217;s looming retirement?</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/10/26/wait-what-was-that-last-bit/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Newly Supported Build Platforms for FXRuby (Coming Soon)</title>
		<link>http://lylejohnson.name/blog/2009/10/20/newly-supported-build-platforms-for-fxruby-coming-soon/</link>
		<comments>http://lylejohnson.name/blog/2009/10/20/newly-supported-build-platforms-for-fxruby-coming-soon/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 21:57:29 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[FXRuby]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=359</guid>
		<description><![CDATA[A long while has passed since the last release of FXRuby (in March 2009) and a couple of new platforms have appeared on the Ruby scene in the meantime. This post provides a brief status update on how support for those platforms is coming along.

One of those platforms is the new MinGW-based Ruby installer for [...]]]></description>
			<content:encoded><![CDATA[<p>A long while has passed since the last release of FXRuby (in March 2009) and a couple of new platforms have appeared on the Ruby scene in the meantime. This post provides a brief status update on how support for those platforms is coming along.</p>

<p>One of those platforms is the new MinGW-based <a href="http://rubyinstaller.org/">Ruby installer for Windows</a>, which is quickly approaching its first release candidate. This is a really exciting development and while it&#8217;s not quite yet the official Ruby distribution on Windows, I don&#8217;t think that day is far off.</p>

<p>I actually quietly released a MinGW-compatible gem for FXRuby 1.6.19 a month or so ago, but there&#8217;s a little problem with it, which is that it&#8217;s only compatible with Ruby 1.8.6. If you&#8217;re running the MinGW build of Ruby 1.9.1, this gem isn&#8217;t going to work for you. That&#8217;s not a problem in and of itself, but it <em>is</em> a problem because the RubyGems installation process has no built-in smarts to distinguish between gems that only work with one Ruby version or another. Before someone jumps on that: Yes, I&#8217;m aware of the <strong>required<em>ruby</em>version</strong> attribute for the gem specification. What I mean is, there&#8217;s no way to say, &#8220;I want to install the <strong>FXRuby</strong> gem for my platform, but make sure you get the one that was compiled for Ruby 1.9.1 and not the one compiled for Ruby 1.8.6.&#8221; The <strong>required<em>ruby</em>version</strong> attribute seems to only be used to prevent you from installing an incompatible gem&#8211;it&#8217;s not something that the gems are indexed on.</p>

<p>The recommendation from Luis Lavena of the RubyInstaller project is to build what he calls a &#8220;fat&#8221; gem (as described <a href="http://github.com/luislavena/rake-compiler">here</a> and <a href="http://tenderlovemaking.com/2009/05/07/fat-binary-gems-make-the-rockin-world-go-round/">here</a>), one that includes multiple builds of FXRuby and that selects the &#8220;right&#8221; one at load time. This will naturally increase the gem&#8217;s size, but hey, disk space is cheap and it&#8217;s a proven solution to the problem. So I&#8217;m looking into this approach now and hope to incorporate it into my build process soon.</p>

<p>Another new platform is Mac OS 10.6 (aka Snow Leopard). For an operating system that&#8217;s just a little over a month old, you&#8217;d be surprised at how many people are already looking for an FXRuby gem for Snow Leopard. (Well, maybe I <em>shouldn&#8217;t</em> be surprised, given the Mac love in the Ruby community). This has been a little tricky because some of the tricks that I&#8217;d used in the past to build universal binaries on OS 10.5 (Leopard) didn&#8217;t work quite the same way under 10.6, but I think I&#8217;ve just solved that. If you&#8217;d like to help me test this, you can download a pre-release version of that gem <a href="http://dl.getdropbox.com/u/60906/FXRuby-1.6.20-universal-darwin-10.gem">here</a>. Note that this is intended for use that the Ruby 1.8.7 that comes pre-installed with Snow Leopard. If you&#8217;ve built your own Ruby (as many folks do), this <em>might</em> work for you too, but if it does that&#8217;s just a nice bonus.</p>

<p>Once I&#8217;ve resolved the problems involved in supporting these two platforms, I&#8217;m planning to release FXRuby version 1.6.20. There won&#8217;t be that many functional improvements for those of you already using FXRuby 1.6.19, but it will help to prove out the new build process and re-stabilize things for future releases. I&#8217;ve also been doing a lot of work behind the scenes recently (since the move to <a href="http://github.com/lylejohnson/fxruby">GitHub</a>) to make it easier for people to hack on FXRuby and contribute code back to the project, but that&#8217;s a subject for another post.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/10/20/newly-supported-build-platforms-for-fxruby-coming-soon/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby Hoedown 2009 Wrap-Up</title>
		<link>http://lylejohnson.name/blog/2009/08/31/ruby-hoedown-2009-wrap-up/</link>
		<comments>http://lylejohnson.name/blog/2009/08/31/ruby-hoedown-2009-wrap-up/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 18:01:47 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubyhoedown]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=346</guid>
		<description><![CDATA[The third annual Ruby Hoedown took place this past weekend at the Opryland Hotel in Nashville. In what I think is a first for Ruby conferences, the Hoedown was free (as in beer) this year. And thanks to the hard work of conference organizer Jeremy McAnally, and the support of a number of sponsors, the [...]]]></description>
			<content:encoded><![CDATA[<p>The third annual <a href="http://rubyhoedown.com/">Ruby Hoedown</a> took place this past weekend at the Opryland Hotel in Nashville. In what I think is a first for Ruby conferences, the Hoedown was free (as in beer) this year. And thanks to the hard work of conference organizer <a href="http://www.jeremymcanally.com/">Jeremy McAnally</a>, and the support of a number of sponsors, the conference was a great success. I haven&#8217;t heard any of the numbers yet, so I don&#8217;t know how this year&#8217;s attendance compared to that for previous hoedowns, but I can tell you that it was a packed house.</p>

<h1>What Happened on Friday</h1>

<p><a href="http://www.benmabey.com/">Ben Mabey</a> opened the Hoedown Friday morning with his overview of how to use Cucumber (and related tools) in the <a href="http://behaviour-driven.org/">Behavior-Driven Development (BDD)</a> of software. He made the point that BDD is a mindset and not a toolset. In other words, BDD is not synonomous with <a href="http://cukes.info/">Cucumber</a> and <a href="http://rspec.info/">RSpec</a>, and it&#8217;s less important which tools you&#8217;re using than that you&#8217;re doing BDD. Ben&#8217;s talk moved at a very quick pace and I found it difficult to follow despite my familiarity with the basic concepts. A number of his slides also included dark text on dark backgrounds, which were difficult or impossible to read. Despite these flaws, he did provide some useful information for Rails developers who are looking to take their BDD skills to the next level. Several of the tools and techniques he mentioned (such as using <a href="http://htmlunit.sourceforge.net/">HtmlUnit</a> with JRuby) were new to me and have given me ideas about how to do more effective testing.</p>

<p><a href="http://atmos.org/">Corey Donohoe</a> was up next. The title of Corey&#8217;s talk was &#8220;How to Be Simply Awesome,&#8221; but I&#8217;m not exactly sure what the topic was. It was a bit of a ramble, but entertaining nevertheless. The part that most resonated with me had to do with how he and his co-workers at <a href="http://www.engineyard.com/">Engine Yard</a> have structured their internal software projects as collections of services instead of monolithic applications. It gave me some ideas about how we could maybe use <a href="http://www.sinatrarb.com/">Sinatra</a> and <a href="http://www.jruby.org/">JRuby</a> to provide a RESTful interface (for third-party clients) to one of our existing Java-based web applications that&#8217;s hurting for an API.</p>

<p>After a break for lunch, <a href="http://fallenrogue.com/">Leon Gersing</a> gave a presentation on desktop and mobile application development with <a href="http://www.appcelerator.com/">Appcelerator Titanium</a>. Titanium has been on my radar for awhile now, and so I was especially looking forward to this talk. One of the most interesting takeaways for me, and one that I had not yet picked up on, was that Titanium&#8217;s compiler (if that&#8217;s the correct term) will convert embedded Ruby or Python code into Javascript, or at least something that can talk to the rest of the runtime via a Javascript bridge. Don&#8217;t quote me on that. But it&#8217;s something approximately that cool.</p>

<p>Next up was <a href="http://madstop.com/">Luke Kanies</a>, talking about how to use Ruby to develop <a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html">external domain-specific languages</a> (DSLs). I&#8217;ve heard Luke speak about <a href="http://reductivelabs.com/trac/puppet">Puppet</a> before, and was afraid this was going to be another Puppet-centric talk. (Not that Puppet isn&#8217;t cool, but you know, I&#8217;ve heard about it before.) But this was really more of a lessons-learned kind of talk, and a good overview of the motivation, tools and general process for developing external DSLs. Although most of the information that Luke presented was familiar to me, it was nevertheless a timely reminder that despite all of the recent attention on building internal DSLs on top of Ruby, there are some very good reasons to opt for an external DSL. For example, one of the dangers of using an internal DSL is that it makes it harder to restrict what the user is able to do.</p>

<p>Following Luke was <a href="http://luigimontanez.com/">Luigi Montanez</a>, on &#8220;How to be a Civic Hacker.&#8221; Now <em>this</em> was an interesting topic, and one that I don&#8217;t believe I&#8217;ve ever seen addressed at a Ruby conference (or other tech conferences for that matter). Luigi works for <a href="http://sunlightlabs.com/">Sunlight Labs</a>, part of the <a href="http://sunlightfoundation.com/">Sunlight Foundation</a>, and their mission is using the Internet to promote government transparency. Luigi posited (a little tongue-in-cheek) that the pinnacle of participatory government, much better than merely tweeting about your pet cause or joining a Facebook group to promote your candidate, is to engage in &#8220;civic hacking.&#8221; He gave a number of examples of how people are taking the raw data published by the government and turning it into useful information via web applications and other services. The only drawback to the presentation came near the end, where Luigi veered off into a quick demonstration of how one could take advantage of Google&#8217;s <a href="http://code.google.com/p/appengine-jruby/wiki/GettingStarted">App Engine</a> gem to publish their JRuby applications to the cloud (and get free hosting to boot). It would have been a good topic for a lightning talk, or even a separate full-blown presentation, but it felt sort-of tacked on to the end of an otherwise coherent talk.</p>

<p>Due to a cancellation earlier in the day, a slot had opened up in the schedule by the end of the day, and so were treated to a surprise presentation by <a href="http://onestepback.org/">Jim Weirich</a> on &#8220;Source Control for People Who Don&#8217;t Like Source Control.&#8221; He opened by promising us that despite the title, &#8220;this talk is <em>not</em> about <a href="http://git-scm.com/">Git</a>.&#8221; Jim went on to construct from first principles how his ideal source code control system would work, if he had to design one from scratch. As time went on, it became clear that while he was describing a mythical SCCS called &#8220;csc&#8221;, he was in fact talking about how Git works under the hood. Like every presentation of Jim&#8217;s that I&#8217;ve ever seen, it was thoroughly engaging, entertaining and educational.</p>

<h1>What Happened on Saturday</h1>

<p>Something I ate on Friday really did a number on me, and let&#8217;s just leave it at that. The result was that I didn&#8217;t get much sleep on Friday night, and I slept in and generally took it easy on Saturday morning, so I missed several presentations. I heard through the grapevine that there was a good presentation on <a href="http://heroku.com/">Heroku</a>, and another on how threads work in Ruby 1.9, so I hope to review the slides for those talks at some later date.</p>

<p>The first talk that I heard after my return to the living was <a href="http://davidchelimsky.net/">David Chelimsky</a>&#8217;s talk on the use of mock objects in testing. It wasn&#8217;t really an introduction to the topic, more of a &#8220;best practices&#8221; type of talk. I was encouraged (sort of) to see that other people are struggling with some of the same problems that I struggle with when using mocks. For example, it can sometimes be tricky to decide whether to use a &#8220;stub&#8221; or a mock in a particular situation. David&#8217;s advice in this situation is to use stubs to enable execution, but to use expectations (via mock objects) to express the intent of the test. For some of the thornier questions about how to deal with mock objects, David recommended the forthcoming <a href="http://www.amazon.com/Growing-Object-Oriented-Software-Addison-Wesley-Signature/dp/0321503627"><cite>Growing Object-Oriented Software, Guided by Tests</cite></a>, by Steve Freeman and Nat Pryce. (A free <a href="http://mockobjects.com/book/">preview</a> of this book is also available online.) He also managed to get in a plug or two for <a href="http://www.pragprog.com/titles/achbd/the-rspec-book">the RSpec book</a>, which is currently in beta but should be available in print later this year. I&#8217;m reading the beta of this right now, and can highly recommend it for anyone who&#8217;s interested in learning how to use Cucumber, RSpec and <a href="http://github.com/brynary/webrat/tree/master">Webrat</a> for test-driven development.</p>

<p>Then came the lightning talks. I didn&#8217;t take many notes on these, but this seems like the time to mention that there was a <strong>lot</strong> of buzz about <a href="http://www.mongodb.org/">MongoDB</a> this weekend. Luigi made reference in his presentation to the fact that MongoDB just reached 1.0 status, and at least two different lightning talks were about MongoDB.</p>

<p>The Ruby Hoedown proper closed with <a href="http://weblog.jamisbuck.org/">Jamis Buck</a>&#8217;s keynote address. I can&#8217;t remember for sure, but I think this was the first time I&#8217;d ever heard Jamis speak. He&#8217;s very good at it. Jamis opened with a discussion of the art of making <a href="http://www.isfa.org/">string figures</a>. He covered the different notations (or languages) that people use to describe string figures, the &#8220;libraries&#8221; or patterns of standard moves that are combined and incorporated into more complex patterns, and the string figure-making community at large. He made the point that at first, before you&#8217;ve taken the time to really understand how string figures are constructed, the process of turning a simple loop of string into a complex figure can be appear to be &#8220;magic&#8221;. He went on to relate this to our experience as software developers. The difference between good and great programmers, Jamis said, is the level of understanding, and there are four ways to increase your understanding and thus become a better programmer:</p>

<ol>
<li><strong>Know Thy Tools.</strong> Take the time to learn how the tools you use regularly, such as the operating system, text editors, the shell, source code control systems, etc. work.</li>
<li><strong>Know Thy Languages.</strong> You&#8217;re rarely working with just one language, such as Ruby or Java. If you&#8217;re doing any sort of web application development, at a minimum you&#8217;re also dealing with HTML, CSS and Javascript. Take the time to understand the finer points of these languages.</li>
<li><strong>Know Thy Libraries.</strong> Know why you&#8217;re using the particular libraries you&#8217;re using, and what distinguishes them from competing libraries. Engage in <a href="http://www.codespelunking.org/">code spelunking</a> to understand how libraries work under the hood.</li>
<li><strong>Know Thy Communities.</strong> Don&#8217;t merely be a &#8220;consumer&#8221; of community resources like mailing lists, forums and IRC channels. Be actively involved, recognizing that for these communities to really work it requires both giving and taking.</li>
</ol>

<p>And with that, the conference concluded. I know that there were various after-hours parties on Friday and Saturday night, but I didn&#8217;t make it to any of those so I&#8217;ll leave it to others to say what went on there. It looks like a few photos are starting to appear on <a href="http://www.flickr.com/search/?q=rubyhoedown&#038;m=tags">Flickr</a>, and I know that people were making pretty liberal use of the <a href="http://twitter.com/#search?q=%23rubyhoedown">#rubyhoedown</a> hashtag on Twitter despite our failure to make the &#8220;trending topics&#8221; list, so be sure to check out those sources for more insight into the weekend&#8217;s festivities!</p>

<p><b>Update:</b> Tommy Morgan has posted his recap <a href="http://blog.duwanis.com/past/2009/8/31/ruby_flippin_hoedown_flippin_recap/">here</a>. If I come across any others I&#8217;ll try to remember to link &#8216;em up here.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/08/31/ruby-hoedown-2009-wrap-up/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kindle 2 Review</title>
		<link>http://lylejohnson.name/blog/2009/03/31/kindle-2-review/</link>
		<comments>http://lylejohnson.name/blog/2009/03/31/kindle-2-review/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 18:14:10 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=337</guid>
		<description><![CDATA[I&#8217;ve had my Kindle for about three weeks now, and so I feel like I&#8217;ve used it enough at this point to be able to write an objective review. I&#8217;ll try to skip the things that you presumably already know from more general reviews and focus on my experience with it.

The Kindle Itself

For starters, let&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had my Kindle for about three weeks now, and so I feel like I&#8217;ve used it enough at this point to be able to write an objective review. I&#8217;ll try to skip the things that you presumably already know from more general reviews and focus on my experience with it.</p>

<h2>The Kindle Itself</h2>

<p>For starters, let&#8217;s get it out of the way and admit that the Kindle&#8217;s user interface is just horrible. I am thinking specifically of the little 5-way joystick that you use to navigate around a page&#8217;s content. If you push the stick in a given direction and hold it, it will at least &#8220;repeat&#8221; and hop across the page until you release it, but it&#8217;s still very awkward to use. I&#8217;ve never had my hands on a first-generation Kindle so I don&#8217;t know if this is an improvement over how navigation worked in that model. The 5-way feels extremely fragile and I can easily imagine it snapping off or otherwise breaking. If a touchscreen like the iPhone&#8217;s wasn&#8217;t feasible for the Kindle 2, I wish they could at least found some other mechanism, such as a trackball or a small trackpad, to handle this need.</p>

<p>My other gripe has to do with the Kindle&#8217;s built-in web browser. To be fair, it&#8217;s labelled as an &#8220;experimental&#8221; feature, but it&#8217;s pretty lousy and it&#8217;s awfully slow. If you had some notion (as I did) that you might be using your Kindle as a web browser on any regular basis, you&#8217;re probably going to be disappointed. For occasional Google or Wikipedia searches, it&#8217;s fine, but anything more than that is an exercise in frustration.</p>

<p>Those issues aside, I&#8217;m pretty happy with it. The Kindle is a lot thinner and more lightweight than I would have expected. It is so thin, in fact, that it feels a little flimsy, and I&#8217;m worried that I&#8217;m going to accidentally snap it in half one of these days. But I do like the form factor a lot.</p>

<p>You have probably already read that the screen &#8220;flashes&#8221; when you turn pages in a book. It&#8217;s definitely distracting at first, but believe it or not, you get used to it after awhile. I also haven&#8217;t had any problems due to the lack of a backlight for the Kindle&#8217;s screen, but I try not to read too much in low light environments anyways. At any rate, for straightforward reading, the Kindle provides a really nice reading experience.</p>

<h2>The Kindle Store</h2>

<p>Buying a book in Amazon&#8217;s Kindle Store works very well, and it is as fast as advertised. Once you purchase a book, it&#8217;s typically downloaded and ready to read in a minute or so. I also appreciate that you can download a free sample chapter for most (or all?) of the books in the store.</p>

<p>The book selection is still hit or miss. If you&#8217;re looking for a current bestseller, you&#8217;re almost certainly going to find it. A number of older books that I was looking for aren&#8217;t yet available, however. For example, only one of Douglas Coupland&#8217;s books (<cite>Miss Wyoming</cite>) is available in Kindle format as of this writing. On the other hand, Amazon seem to be adding new books all the time. For example, when I did a search the night before last, David Foster Wallace&#8217;s <cite>Infinite Jest</cite> wasn&#8217;t available, but I just looked again and it&#8217;s now available for pre-order. Their selection of technical books also seems to be improving, slowly but surely.</p>

<p>If you&#8217;re the kind of person who reads this blog, you&#8217;re also the kind of person that already knows there&#8217;s a lot of <a href="http://lmgtfy.com/?q=free+kindle+books">free content</a> available for the Kindle. I tend to stick with <a href="http://feedbooks.com/">Feedbooks</a>, but there are several other good sources out there, and there&#8217;s a lot of overlap between the various collections. To be honest, most of this free content is either (1) books you already read in high school or college and (2) books you wouldn&#8217;t care to read even if they&#8217;re free. But occasionally, you&#8217;ll run across something interesting.</p>

<h2>Other Uses for the Kindle</h2>

<p>One of the less hyped Kindle features is that you can e-mail documents directly to it and, if necessary, they will be converted to the Kindle&#8217;s native format. I admittedly haven&#8217;t tried this much yet. I do have a number of technical papers and documents in PDF format, and it doesn&#8217;t seem to do a very good job of converting those, so I&#8217;m not sure how much use I&#8217;ll get out of the document conversion service. This capability does however open the Kindle up to some interesting applications.</p>

<p>One of my favorite uses for the Kindle involves Marco Arment&#8217;s <a href="http://www.instapaper.com/">Instapaper</a> service. You know about Instapaper, right? You should check this out even if you don&#8217;t have a Kindle. Instapaper provides you with a &#8220;Read Later&#8221; bookmarklet that you can drag to your web browser&#8217;s bookmarks bar. If you come across a long article, or one that you&#8217;d just like to read later, click the &#8220;Read Later&#8221; button and Instapaper will save it for you.</p>

<p>I had already been using Instapaper&#8217;s iPhone application to read saved stories on my iPhone, but Instapaper can also be configured to send unread articles to your Kindle on a regular basis. Every Friday morning, Instapaper collects all of my unread stories into a sort-of custom newspaper and sends it to my Kindle. This is a real killer app for me.</p>

<p>Another apparently popular service is <a href="http://kindlefeeder.com/">Kindlefeeder</a>, which is an aggregator that collects up all of the stories from a given news feed and sends them to your Kindle on a scheduled basis. I haven&#8217;t tried this yet, but if there are any feeds that you typically read every story from, you should find this extremely useful. It sure beats paying for a blog subscription in the Amazon Kindle Store.</p>

<h2>Summary</h2>

<p>There are a number of problems with the Kindle that have nothing to do with its lack of a color touchscreen or its high price tag. It certainly lacks the polish that I&#8217;ve become accustomed to with, for example, Apple&#8217;s products. But I&#8217;m getting a lot of use out of my Kindle, and I don&#8217;t regret purchasing it. If you read a lot, I think that you will get your money&#8217;s worth out of the Kindle too. And if, like me, you do a lot of your reading on the web these days, the combination of a Kindle with services like <a href="http://www.instapaper.com/">Instapaper</a> and <a href="http://kindlefeeder.com/">Kindlefeeder</a> is very handy.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/03/31/kindle-2-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Help Sponsor a Free Ruby Hoedown!</title>
		<link>http://lylejohnson.name/blog/2009/03/04/help-sponsor-a-free-ruby-hoedown/</link>
		<comments>http://lylejohnson.name/blog/2009/03/04/help-sponsor-a-free-ruby-hoedown/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 18:36:27 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=328</guid>
		<description><![CDATA[At last year&#8217;s Ruby Hoedown, organizer Jeremy McAnally announced his intention to make this year&#8217;s Hoedown free for all conference attendees. Unfortunately, it seems that he hasn&#8217;t been able to enlist enough big sponsors to make that a reality, so he is reaching out to the Ruby community for donations. 

Jeremy has set a goal [...]]]></description>
			<content:encoded><![CDATA[<p>At last year&#8217;s <a href="http://www.rubyhoedown.com/">Ruby Hoedown</a>, organizer Jeremy McAnally announced his intention to make this year&#8217;s Hoedown <strong>free</strong> for all conference attendees. Unfortunately, it seems that he hasn&#8217;t been able to enlist enough big sponsors to make that a reality, so <a href="http://omgbloglol.com/help-make-a-free-ruby-conferen">he is reaching out to the Ruby community for donations</a>. </p>

<p>Jeremy has set a goal of $15,000, which would cover the basic costs of a venue in downtown Nashville (this year&#8217;s conference site), sound and promotional materials. Obviously, if you&#8217;re associated with a business that&#8217;s able to make a sizable donation, that would be great, but individual donations of any amount are greatly appreciated. See Jeremy&#8217;s <a href="http://omgbloglol.com/help-make-a-free-ruby-conferen">blog</a> for more details about how you can participate.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/03/04/help-sponsor-a-free-ruby-hoedown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free FXRuby Course Online at RubyLearning.org</title>
		<link>http://lylejohnson.name/blog/2009/03/02/free-fxruby-course-online-at-rubylearningorg/</link>
		<comments>http://lylejohnson.name/blog/2009/03/02/free-fxruby-course-online-at-rubylearningorg/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 21:15:36 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[FXRuby]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=324</guid>
		<description><![CDATA[Satish Talim has announced that RubyLearning.org will be offering a free online course entitled &#8220;FXRuby: A Quick Start&#8221;, beginning March 14, 2009. RubyLearning.org is, among other things, the recipient of a 2008 Shorty Award in Education.
]]></description>
			<content:encoded><![CDATA[<p>Satish Talim has <a href="http://twitter.com/IndianGuru/status/1261684131">announced</a> that <a href="http://rubylearning.org/">RubyLearning.org</a> will be offering a free online course entitled <a href="http://rubylearning.org/class/course/category.php?id=13">&#8220;FXRuby: A Quick Start&#8221;</a>, beginning March 14, 2009. RubyLearning.org is, among other things, the recipient of a <a href="http://shortyawards.com/">2008 Shorty Award</a> in Education.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/03/02/free-fxruby-course-online-at-rubylearningorg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Demi-Entendre Site</title>
		<link>http://lylejohnson.name/blog/2009/01/13/the-demi-entendre-site/</link>
		<comments>http://lylejohnson.name/blog/2009/01/13/the-demi-entendre-site/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 16:57:40 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=312</guid>
		<description><![CDATA[And now, a quick plug for David Black&#8217;s collection of demi-entendres:
A demi-entendre is an expression or phrase that comes from accidentally combining two common expressions&#8230;
For example, when you combine
Give us something to hang our hats on.
with
Give us something to sink our teeth into.
you get
&#8220;Give us something to hang our teeth on.&#8221; (Atlanta advertising agency director [...]]]></description>
			<content:encoded><![CDATA[<p>And now, a quick plug for David Black&#8217;s collection of <a href="http://demientendre.wobblini.net/">demi-entendres</a>:
<blockquote>A <em>demi-entendre</em> is an expression or phrase that comes from accidentally combining two common expressions&#8230;</blockquote>
For example, when you combine
<blockquote><em>Give us something to hang our hats on.</em></blockquote>
with
<blockquote><em>Give us something to sink our teeth into.</em></blockquote>
you get
<blockquote>&#8220;Give us something to hang our teeth on.&#8221; (Atlanta advertising agency director Selena Smith, as quoted in the <a href="http://www.nytimes.com/2005/11/26/politics/26voices.html?pagewanted=2">New York Times</a>).</blockquote></p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2009/01/13/the-demi-entendre-site/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Building Standalone FXRuby Applications with Exerb</title>
		<link>http://lylejohnson.name/blog/2008/12/30/building-standalone-fxruby-applications-with-exerb/</link>
		<comments>http://lylejohnson.name/blog/2008/12/30/building-standalone-fxruby-applications-with-exerb/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 17:49:59 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[FXRuby]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=308</guid>
		<description><![CDATA[Distributing FXRuby-based applications to end-users who don&#8217;t have Ruby (or FXRuby) installed on their computers can be a challenge. Fortunately, there are a number of freely available tools for building &#8220;standalone&#8221; versions of Ruby applications. In this post, we&#8217;re going to focus on how to use Exerb, developed by Yuya Kato, to build standalone FXRuby [...]]]></description>
			<content:encoded><![CDATA[<p>Distributing FXRuby-based applications to end-users who don&#8217;t have Ruby (or FXRuby) installed on their computers can be a challenge. Fortunately, there are a number of freely available tools for building &#8220;standalone&#8221; versions of Ruby applications. In this post, we&#8217;re going to focus on how to use <a href="http://exerb.sourceforge.jp/index.en.html">Exerb</a>, developed by Yuya Kato, to build standalone FXRuby applications on Windows.</p>

<p>The first step is to <a href="http://exerb.sourceforge.jp/index.en.html#download">download</a> and install the latest Exerb distribution (version 4.2.0, as of this writing). It&#8217;s packaged as a ZIP file, which you&#8217;ll need to extract into some convenient place on your hard drive. Once that&#8217;s done, change directories into the <tt>exerb-4.2.0</tt> directory and run the <tt>setup.rb</tt> script.</p>

<p><code lang="bash">
cd exerb-4.2.0
ruby setup.rb
</code></p>

<p>Now, to actually go through the process of building a standalone FXRuby application, let&#8217;s start with a simple example. We&#8217;ll use the <a href="http://www.fxruby.org/examples/hello.rb">hello.rb</a> example program from the FXRuby source code distribution. The first step is to generate a &#8220;recipe&#8221; file for your Ruby application, which is basically a listing of all the files that Exerb should use to build the executable. You&#8217;ll use the <tt>mkexy</tt> tool to do this.</p>

<p><code lang="bash">
ruby -r exerb/mkexy hello.rb
</code></p>

<p>The <tt>mkexy</tt> tool runs your application in a custom version of Ruby to analyze which libraries it requires while it&#8217;s running. Once you exit the application, <tt>mkexy</tt> spits out a recipe file (for this example, <tt>hello.exy</tt>) in the current working directory.</p>

<p>Now that you have a recipe, you&#8217;re ready to run Exerb to generate the executable.</p>

<p><code lang="bash">
exerb hello.exy
</code></p>

<p>Note that the executable that Exerb creates is quite large, as it bundles both a copy of the Ruby interpreter as well as the FXRuby library code. When I did this experiment, the executable weighed in at close to 9 Mb. You can distribute this executable to other people who don&#8217;t have Ruby or FXRuby installed on their computers.</p>

<p>Now let&#8217;s look at a slightly more complicated example, the <a href="http://www.fxruby.org/examples/hello2.rb">hello2.rb</a> program. The complication is that this example uses an external file, a PNG icon that it loads from disk at runtime, as shown in this excerpt:</p>

<p><code lang="ruby">
icon = nil
File.open(File.join("icons", "hello2.png"), "rb") do |input|
  icon = FXPNGIcon.new(application, input.read)
end
</code></p>

<p>This is unfortunately something that Exerb doesn&#8217;t handle very well, but there is a workaround. What we must first do is dump the contents of the PNG icon to a Ruby string, and store the contents in a regular <tt>.rb</tt> file. Here&#8217;s some code to do that:</p>

<p><code lang="ruby">
File.open(File.join("icons", "hello2.png"), "rb") do |input|
  bytes = input.read
  File.open("hello2_icon.rb", "w") do |output|
    output.puts "ICON = #{bytes.inspect}"
  end
end
</code></p>

<p>Now we need to modify the bit in <tt>hello2.rb</tt> that loads the icon data, so that it instead loads this Ruby code instead:</p>

<p><code lang="ruby">
require 'hello2_icon'</p>

<p>icon = FXPNGIcon.new(application, ICON)
</code></p>

<p>Now, run the <tt>mkexy</tt> tool as before to generate a recipe file (<tt>hello2.exy</tt>) and then <tt>exerb</tt> to generate the executable.</p>

<p><code lang="bash">
ruby -r exerb/mkexy hello2.rb
exerb hello2.exy
</code></p>

<p>There are at least a couple of other tools out there for building standalone Ruby applications, including Erik Veenstra&#8217;s <a href="http://www.erikveen.dds.nl/rubyscript2exe/">RubyScript2Exe</a> and Jeremy Hinegardner&#8217;s <a href="http://copiousfreetime.rubyforge.org/crate/">Crate</a>. I&#8217;m not at all familiar with how those tools work, but if you&#8217;ve had luck building standalone FXRuby applications with either of these tools, I&#8217;d love to hear about your experience.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2008/12/30/building-standalone-fxruby-applications-with-exerb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FXRuby 1.6.17 Now Available</title>
		<link>http://lylejohnson.name/blog/2008/12/23/fxruby-1617-now-available/</link>
		<comments>http://lylejohnson.name/blog/2008/12/23/fxruby-1617-now-available/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 21:19:53 +0000</pubDate>
		<dc:creator>Lyle</dc:creator>
				<category><![CDATA[FXRuby]]></category>

		<guid isPermaLink="false">http://lylejohnson.name/blog/?p=306</guid>
		<description><![CDATA[Just in time for Christmas, a new release of FXRuby. It&#8217;s been almost six months since the last release, which is way too long to go between releases (even when it&#8217;s just for minor bug fixes). A summary of all the changes for this release can be found in the change log, but the most [...]]]></description>
			<content:encoded><![CDATA[<p>Just in time for Christmas, a <a href="http://rubyforge.org/forum/forum.php?forum_id=29302">new release</a> of <a href="http://www.fxruby.org/">FXRuby</a>. It&#8217;s been almost six months since the last release, which is way too long to go between releases (even when it&#8217;s just for minor bug fixes). A <a href="http://www.fxruby.org/doc/changes.html">summary of all the changes</a> for this release can be found in the change log, but the most important change has to do with addressing some problems that were introduced when <a title="Changes to GC in Ruby 1.8.6?" href="http://pivotallabs.com/users/brianj/blog/articles/606-standup-11-24-2008-changes-to-gc-in-ruby-1-8-6-">Ruby&#8217;s garbage collection algorithm was changed</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lylejohnson.name/blog/2008/12/23/fxruby-1617-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
