<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>HickoryTech</title>
    <link>http://tech.hickorywind.org/articles.rss</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>The Geekier Side of Twang</description>
    <item>
      <title>Headless JavaScript Testing as of April 2011</title>
      <description>&lt;p&gt;&lt;em&gt;I recently got an email asking about the current status of running headless JavaScript tests in a post-Blue Ridge world.  They specifically asked if Jasmine would work with node.js.  Here's my reply:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm using &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt; plus &lt;a href="http://zombie.labnotes.org"&gt;zombie&lt;/a&gt; and &lt;a href="http://vowsjs.org"&gt;vows&lt;/a&gt; to run headlessly.  They run
very fast on node.js, but I don't have a solution for running these
headless tests in-browser.  I definitely miss that from Blue Ridge.&lt;/p&gt;

&lt;p&gt;I haven't used Jasmine on node, and it's probably possible, but since
node is architected to be so asynchronous I expect you'll have issues
eventually.  Vows.js is built from the ground-up to be node-friendly.&lt;/p&gt;

&lt;p&gt;Zombie is a fake web-browser (similar to env.js or Capybara/Webrat in
Ruby).  It's pretty good, but we've had some problems with some CSS
selectors.  This isn't really a problem in Zombie.js but in its html5
library dependency.  &lt;a href="http://spicycode.com/"&gt;Chad Humphries&lt;/a&gt; has been patching it.  We've had
to use some strange CSS selectors (using nth-child, etc) to get around
it.&lt;/p&gt;</description>
      <pubDate>Tue, 05 Apr 2011 21:31:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:b167c174-d1a3-4730-bd85-0d4e40c787fa</guid>
      <comments>http://tech.hickorywind.org/articles/2011/04/05/headless-javascript-testing-as-of-april-2011#comments</comments>
      <category>javascript</category>
      <category>testing</category>
      <link>http://tech.hickorywind.org/articles/2011/04/05/headless-javascript-testing-as-of-april-2011</link>
    </item>
    <item>
      <title>RailsConf 2010 Wrap-Up</title>
      <description>&lt;p&gt;My RailsConf experience this year was much better than last year's, despite not being a speaker this year.  Baltimore felt like a better fit for us than Vegas.  Plenty to do right near the conference center, but nothing so distracting that the conf felt empty or sparse.&lt;/p&gt;

&lt;p&gt;The range of talks was interesting -- a bit heavy on the back-end talks, but that's typical of a technical conference.  People like crunch.&lt;/p&gt;

&lt;p&gt;Interesting new bits of culture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DHH usually gives the high-level motivational keynote, and Yehuda gives the deep-dive tech overviews, but this year they traded roles.  It didn't really work for either, with both having only mediocre keynotes.  (I'm all for experimenting, and I'm glad they did.  Next year, though, let's get back to normal.)&lt;/li&gt;
&lt;li&gt;Lots more live music at the conference, especially before/after keynotes.  I really enjoyed this.&lt;/li&gt;
&lt;li&gt;A certain person showed his butt on-stage (figuratively, thankfully) by defaming a business competitor.  No need to mention names here and increase their Google-ability, but you know who I'm talking about.  Very childish.&lt;/li&gt;
&lt;li&gt;Lastly, the conf, while still hip &amp;amp; fun, is definitely showing it's maturation.  Several keynotes, most notably the Engine Yard talk show, which was fun, still felt like a commercial.  Worse, instead of a fun "MVC"-style video by Greg Pollack, we had an &lt;em&gt;actual&lt;/em&gt; commercial for his new Rails 3 screencasts.  Not terrible in either case, just new.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My big take-aways from this year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chris Wanstrath's ideas of what a good open source maintainer should be feel true: be transparent and ubiquitous; have lots of redundant information sources (blogs, email, getting started guide); and have a philosophy and communicate it, for example, Resque's is "zero features, only plugins".&lt;/li&gt;
&lt;li&gt;Agile software is &lt;em&gt;real&lt;/em&gt; engineering for software, not what folks call "software engineering" in schools.  (Thanks to Glenn Vanderburg for a great, great talk.)&lt;/li&gt;
&lt;li&gt;Multi-core is incredibly important -- Event Machine and especially Clojure.  Very cool to see the Clojure-love (or at least, interest) at RailsConf this year.&lt;/li&gt;
&lt;li&gt;Rails is still fun, but it "arrived" a long time ago and is now a toolset rather than a lifestyle.  I expect RailsConf to be officially boring in 2012.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lastly, a take-away for my own personal life: writing is more effective (for me) than speaking.  I will try hard to remember that.&lt;/p&gt;

&lt;p&gt;All in all, RailsConf 2010 was fun, educational, and inspiring.  It always feels good to go back to the well.&lt;/p&gt;</description>
      <pubDate>Fri, 11 Jun 2010 17:36:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:0bbeca98-ecf6-4718-b729-c7c958f751f4</guid>
      <comments>http://tech.hickorywind.org/articles/2010/06/11/railsconf-2010-wrap-up#comments</comments>
      <category>railsconf</category>
      <category>rails</category>
      <category>ruby</category>
      <category>clojure</category>
      <link>http://tech.hickorywind.org/articles/2010/06/11/railsconf-2010-wrap-up</link>
    </item>
    <item>
      <title>Silencing Rails 2.2 "gem has no specification" messages</title>
      <description>&lt;p&gt;Since upgrading to Rails 2.2, you might be seeing lots of messages like this:&lt;/p&gt;

&lt;pre&gt;
config.gem: Unpacked gem blah-1.0.0 in vendor/gems 
has no specification file. Run 'rake gems:refresh_specs' to fix this.
&lt;/pre&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;Running 'rake gems:refresh_specs" takes care of most of these, and  upgrading any remaining gems will usually take care of the rest.  But it seems like most of the projects I'm on still have one or three home-grown, really old, or really odd gems that just don't have specs.  I should write specs for these, I know.  So I let Rails complain... but...&lt;/p&gt;

&lt;p&gt;But now, months later, I'm realizing there are just a few gems I'm never going to upgrade.  And I'm seeing these messages... A LOT.  Every time I run a test in TextMate.  Every time I run tests from rake.  Every time I run almost any rake task, period.  It's driving me MAD!&lt;/p&gt;

&lt;p&gt;So, if you've been a good boy or girl and taken care of most your gems, and a few are still hanging around, here's the magic to make those messages go away:&lt;/p&gt;

&lt;p&gt;In your config/environment.rb file:&lt;/p&gt;

&lt;pre&gt;
# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')

# Add this line at your own risk!  
Rails::VendorGemSourceIndex.silence_spec_warnings = true

Rails::Initializer.run do |config|
&lt;/pre&gt;</description>
      <pubDate>Mon, 02 Feb 2009 18:14:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:b8d82ce5-a14c-4f44-ba02-a80de2d51d24</guid>
      <comments>http://tech.hickorywind.org/articles/2009/02/02/silencing-rails-2-2-gem-has-no-specification-messages#comments</comments>
      <category>ruby</category>
      <category>rubygems</category>
      <category>rails</category>
      <category>hack</category>
      <category>config</category>
      <link>http://tech.hickorywind.org/articles/2009/02/02/silencing-rails-2-2-gem-has-no-specification-messages</link>
    </item>
    <item>
      <title>JavaScript Testing with Screw.Unit</title>
      <description>&lt;p&gt;I've been quietly hacking away on integrating three great tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/nkallen/screw-unit"&gt;Screw.Unit&lt;/a&gt;, a wonderful RSpec-like JavaScript testing framework&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/jeresig/env-js"&gt;env.js&lt;/a&gt;, a wonderful fake JavaScript DOM implementation&lt;/li&gt;
&lt;li&gt;Ruby on Rails plugins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What does that get me?  Voila!  &lt;a href="http://github.com/relevance/javascript_testing"&gt;Easy headless and in-browser testing of my unobtrusive JavaScript!&lt;/a&gt;   (For more information on Screw.Unit, I also created a &lt;a href="http://groups.google.com/group/screw-unit"&gt;mailing list&lt;/a&gt; with the original authors' permission.)&lt;/p&gt;</description>
      <pubDate>Sat, 31 Jan 2009 14:42:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:06771725-a6df-4d83-aea6-a0fb4a4a1902</guid>
      <comments>http://tech.hickorywind.org/articles/2009/01/31/javascript-testing-with-screw-unit#comments</comments>
      <category>screw.unit</category>
      <category>javascript</category>
      <category>bdd</category>
      <category>tdd</category>
      <category>env.js</category>
      <category>rails</category>
      <category>plugin</category>
      <category>testing</category>
      <link>http://tech.hickorywind.org/articles/2009/01/31/javascript-testing-with-screw-unit</link>
    </item>
    <item>
      <title>Turning off text selection in Javascript</title>
      <description>&lt;p&gt;Say you're doing some drag or drag-and-drop operation in Javascript, and you notice that wherever the user drags, the underlying text or other elements are being highlighted.  This can obscure what the user is doing, and it just generally feels "wrong."  How do you turn that off?&lt;/p&gt;

&lt;p&gt;Here's two quick techniques, one for Firefox and another for Internet Explorer &amp;amp; Safari.  (Actually, this is IE7.  I haven't tested in IE6.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is a CSS fix.  Just add the following to your stylesheet and then add the "no-selection" class to whatever you're going to drag over.&lt;/p&gt;

&lt;pre&gt;
.no-selection {  -moz-user-select: none; }
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Internet Explorer &amp;amp; Safari&lt;/strong&gt;
We have to use Javascript for this one.  Call disable when you start your drag behavior, and then re-enable when the drag is complete.  Note that calling this function will disable &lt;em&gt;all&lt;/em&gt; text selection until you re-enable, so be careful.&lt;/p&gt;

&lt;pre&gt;
// This works for Safari &amp; IE7, and it is safely ignored in Firefox.  You'll have 
// to add a "-moz-user-select:none;" to whatever you don't want selected in Firefox.
function enableDocumentSelection(enable) {
  if(enable) {
    document.onselectstart = _original_onselectstart;
  }
  else {
    _original_onselectstart = document.onselectstart;
    document.onselectstart = function() { return false; }
  }
}
&lt;/pre&gt;</description>
      <pubDate>Fri, 24 Oct 2008 15:39:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:ca69e773-ba72-4b59-bab8-365cb71829fb</guid>
      <comments>http://tech.hickorywind.org/articles/2008/10/24/turning-off-text-selection-in-javascript#comments</comments>
      <category>javascript</category>
      <link>http://tech.hickorywind.org/articles/2008/10/24/turning-off-text-selection-in-javascript</link>
    </item>
    <item>
      <title>Great Lakes Ruby Bash</title>
      <description>&lt;p&gt;I'm flying to Ann Arbor, Michigan later today to give my "Usability on Rails" talk at the &lt;a href="http://www.greatlakesrubybash.org/"&gt;Great Lakes Ruby Bash&lt;/a&gt; tomorrow.  If you're attending, please drop me a note (as I don't know a soul that'll be there).  I'll also be hanging out on IRC in #glrb and #midwest.rb.  I'm hoping to meet some new friends and convince some geeks of the wonderful ways of "teh us4b1l1t13z"!&lt;/p&gt;</description>
      <pubDate>Fri, 10 Oct 2008 10:07:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:4d3d7d41-488a-426b-849c-8d85bc93de88</guid>
      <comments>http://tech.hickorywind.org/articles/2008/10/10/great-lakes-ruby-bash#comments</comments>
      <category>conference</category>
      <category>great</category>
      <category>lakes</category>
      <category>ruby</category>
      <category>bash</category>
      <category>usability</category>
      <category>on</category>
      <category>rails</category>
      <link>http://tech.hickorywind.org/articles/2008/10/10/great-lakes-ruby-bash</link>
    </item>
    <item>
      <title>Stop iPhoto from launching while syncing iPhone</title>
      <description>&lt;ul&gt;
&lt;li&gt;Connect your iPhone and let it sync.  &lt;/li&gt;
&lt;li&gt;Before you disconnect, run the "Image Capture" utility. It lives in your computer's "Applications" directory.  &lt;/li&gt;
&lt;li&gt;Go to the menu, click "Image Capture", then "Preferences".&lt;/li&gt;
&lt;li&gt;On the "Image Capture Preferences" window, change the "When a camera is connected, open:" setting to "No application".&lt;/li&gt;
&lt;li&gt;Close the "Image Capture" application.&lt;/li&gt;
&lt;li&gt;Voila!  No more iPhoto launching automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, be aware that this will stop iPhoto from launching when you connect &lt;strong&gt;any&lt;/strong&gt; digital camera.  If you want to pull photos from a camera, you'll have to manually launch iPhoto and hit the "import" button.  Snatch!&lt;/p&gt;</description>
      <pubDate>Thu, 04 Sep 2008 09:37:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:a6bb06a1-15f6-401d-a0bb-85384dfc3bd6</guid>
      <comments>http://tech.hickorywind.org/articles/2008/09/04/stop-iphoto-from-launching-while-syncing-iphone#comments</comments>
      <category>iphone</category>
      <category>tips</category>
      <category>iphoto</category>
      <link>http://tech.hickorywind.org/articles/2008/09/04/stop-iphoto-from-launching-while-syncing-iphone</link>
    </item>
    <item>
      <title>Always Pass a Block When Using alias_method_chain</title>
      <description>&lt;p&gt;If you're using Rails' alias_method_chain mechanism, please make sure that your new method always takes a block and passes that block up the chain, even if you don't need the block yourself.  Consider this being a good "alias_method_chain" neighbor.  Here's why -- if you don't, no one who comes along behind you can add a block to the chain.  You've effectively "block-blocked" them.  &lt;/p&gt;

&lt;p&gt;Here's an example.  I wanted to add some functionality to Rails' error_messages_for method.  Specifically, I wanted to be able to pass a block to it that implemented a tiny DSL for massaging the errors output before passing them up the chain to the normal error_messages_for functionality.  I implemented this by adding an alias_method_chain layer on top of the error_messages_for.&lt;/p&gt;

&lt;p&gt;In my tests this worked fine, but when I put it in my actual Rails project, the method just stopped working.  It took me a while to find that another developer on the project was also alias_method_chaining the error_messages_for, but was not taking a block, and thus not passing it up the chain.  In effect, he was dropping my block on the floor.  No good.&lt;/p&gt;

&lt;p&gt;So here's the template you should follow when creating an alias_method_chain:&lt;/p&gt;

&lt;pre&gt;
def method_with_something_cool(arg1, arg2, &amp;block)
  ... your custom pre-chain code ...

  method_without_something_cool(arg1, arg2, &amp;block)

  ... your custom post-chain code ...
end

alias_method_chain :method, :something_cool
&lt;/pre&gt;

&lt;p&gt;Call the old method with a block &lt;strong&gt;even if the old method never took a block&lt;/strong&gt;!  Don't be a cock-blocker!  Err.... block-blocker!&lt;/p&gt;</description>
      <pubDate>Fri, 29 Aug 2008 11:00:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:b7983483-4910-4947-9c16-7a99de371fe0</guid>
      <comments>http://tech.hickorywind.org/articles/2008/08/29/always-pass-a-block-when-using-alias_method_chain#comments</comments>
      <category>ruby</category>
      <category>rails</category>
      <category>alias_method_chain</category>
      <category>blocks</category>
      <link>http://tech.hickorywind.org/articles/2008/08/29/always-pass-a-block-when-using-alias_method_chain</link>
    </item>
    <item>
      <title>Tips for rsyncing MP3s from Linux to FAT32 USB external hard-drive</title>
      <description>&lt;p&gt;Here are some important lessons I learned about accurately copying MP3s (or really any kind of file) from a Linux ext3 filesystem to an external USB hard-drive using FAT32.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When mounting the USB hard drive, be sure to &lt;strong&gt;use iocharset=utf8 in your mount options&lt;/strong&gt;.  (To be safest, I put this in my /etc/fstab so I won't forget it.)  Otherwise you will have problems creating directories or files that have European or Asian characters in their names.  I had some real problems with all the Mexican, Celtic, and Yako Kanno albums I own.  Rsync will just flat out refuse to create them without this option.  (And forget the Icelandic heavy metal.  It's right out.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Similarly, when mounting, you might want to &lt;strong&gt;include the "shortname=mixed" mount option&lt;/strong&gt; too.  Although I personally didn't have a big problem with this, several posts I read online mentioned that rsync might try to upload a file multiple times.  The issue is that since FAT32 stores both a short-name (remember the 8.3 names?) and a long-name, the filesystem can get confused occasionally.  Again, I didn't see this myself.  I used the option, though, with no trouble.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lastly, don't use the standard "rsync -a" (archive) flag.  It tries to maintain user and group ownership, and FAT32 doesn't support either so you get a lot of "chown NO PERMISSION" errors, etc.  Basically, you're making rsync do more work than it has to.  Similarly, the "-a" option also tries to preserve symlinks which FAT32 doesn't support.  I'm not really sure what would happen in that case, probably more warnings.  Instead &lt;strong&gt;use "rsync -rt" to recurse through each subdirectory and to maintain the file's last modified time&lt;/strong&gt;.  That's about all FAT32 will let you do!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope this helps!  Keep rockin'!&lt;/p&gt;</description>
      <pubDate>Sun, 20 Jul 2008 20:22:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:286250ad-98a3-4012-8617-478be42fc56b</guid>
      <comments>http://tech.hickorywind.org/articles/2008/07/20/tips-for-rsyncing-mp3s-from-linux-to-fat32-usb-external-hard-drive#comments</comments>
      <category>rsync</category>
      <category>mp3</category>
      <category>utf8</category>
      <category>backup</category>
      <category>usb</category>
      <category>external</category>
      <category>fat32</category>
      <category>linux</category>
      <link>http://tech.hickorywind.org/articles/2008/07/20/tips-for-rsyncing-mp3s-from-linux-to-fat32-usb-external-hard-drive</link>
    </item>
    <item>
      <title>Larry vs. the Git Rebase Merge Conflict</title>
      <description>&lt;p&gt;While doing a "git svn rebase", if you have merge conflicts here are some things to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;While doing a rebase, if anything bad happens, you end up on a "(no-branch)" branch.&lt;/li&gt;
&lt;li&gt;When doing a "git status", you'll see a ".dotest" file in your working directory.  Just ignore it.&lt;/li&gt;
&lt;li&gt;If you want to bail, do a "git rebase --abort".  (Note there is no "git svn rebase --abort".)&lt;/li&gt;
&lt;li&gt;Fix the merge conflict file manually, then do a "git add [file]".&lt;/li&gt;
&lt;li&gt;Next do a "git rebase --continue".  (Note there's no "svn" version of this either.)&lt;/li&gt;
&lt;li&gt;If it complains about "did you forget to call 'git add'?", then evidently your edit turned the conflict into a no-op change.  Do a "git rebase --skip" to skip it. (Very weird, but true.)&lt;/li&gt;
&lt;li&gt;Rinse and repeat until the lather is gone, your scalp silky smooth, and the rebase is complete.  At any time you can "git rebase --abort" to bail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What happened to me?  Well, I didn't realize what was going on, continued to work on the "not a branch" branch, commited changes, even dcommited changes back to Subversion.  It was ugly, but not insurmountable.  A buddy clued me into the "not a branch" situation, I was able to get back to my real branch and resurrect my code.  It took a few "git rebase --continue" commands, and a tense moment around a "git rebase --skip", but now everything's hunky dory.&lt;/p&gt;

&lt;p&gt;This &lt;a href="http://kerneltrap.org/mailarchive/git/2007/10/31/373985"&gt;very odd email&lt;/a&gt; really helped me a lot.  You might be interested at some point.&lt;/p&gt;</description>
      <pubDate>Tue, 10 Jun 2008 08:30:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:bdece0c0-d3f7-4385-b4c2-485952ccfe4d</guid>
      <comments>http://tech.hickorywind.org/articles/2008/06/10/larry-vs-the-git-rebase-merge-conflict#comments</comments>
      <category>git</category>
      <link>http://tech.hickorywind.org/articles/2008/06/10/larry-vs-the-git-rebase-merge-conflict</link>
    </item>
  </channel>
</rss>
