<?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>game, game. repeat.</title>
	<atom:link href="http://ggr.com/feed" rel="self" type="application/rss+xml" />
	<link>http://ggr.com</link>
	<description>if Scott Bonds had a home on the interwebs, this would be it</description>
	<lastBuildDate>Tue, 09 Feb 2010 00:59:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pandora vs Last.fm</title>
		<link>http://ggr.com/pandora-vs-last-fm.html</link>
		<comments>http://ggr.com/pandora-vs-last-fm.html#comments</comments>
		<pubDate>Sun, 07 Feb 2010 21:51:37 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[organization]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[pandora]]></category>
		<category><![CDATA[radio]]></category>
		<category><![CDATA[versus]]></category>
		<category><![CDATA[vs]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=451</guid>
		<description><![CDATA[
They&#8217;re both good, but Last.fm wins.  How can this be?  Last.fm&#8217;s amazing powers are put on display after the break.

Last.fm can perform these amazing tricks:
 Tag (and Multitag) radio.  If you want to listen to &#8216;piano&#8217; music on Pandora, you have to select a song or artist that exemplifies &#8216;piano&#8217;, then vote up/down songs [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/pandora-vs-last-fm.html"><img class="size-full wp-image-454 aligncenter" title="pandora vs last.fm" src="http://ggr.com/wp-content/uploads/pandora-vs-last.fm_.jpg" alt="" width="581" height="73" /></a></p>
<p>They&#8217;re both good, but <a href="http://last.fm/">Last.fm</a> wins.  How can this be?  Last.fm&#8217;s amazing powers are put on display after the break.</p>
<p><span id="more-451"></span></p>
<p>Last.fm can perform these amazing tricks:</p>
<p><strong> Tag (and Multitag) radio</strong>.  If you want to listen to &#8216;piano&#8217; music on Pandora, you have to select a song or artist that exemplifies &#8216;piano&#8217;, then vote up/down songs until Pandora figures out what you want.  On Last.fm, you can simply tell it to play a radio station made up of music that has the &#8216;piano&#8217; tag.  Multitag stations are particularly powerful because you can further refine your selection, i.e. &#8216;piano&#8217; and &#8216;happy&#8217;.</p>
<p><strong>More variety</strong>.  After listening to similar radio stations on both Pandora and Last.fm for 8+ hours, I noticed a lot of repeated songs on Pandora, but no repeated songs on Last.fm.</p>
<p><strong>Apps</strong> (and API).  Google&#8217;s vision of the future puts the browser at the center of the universe, so call me a luddite, but I still prefer desktop apps for a lot of things.  Last.fm has a spiffy Flash-based player, but there are also a lot of <a href="http://www.snarb.co.uk/everplay.html">desktop apps</a> that are more pleasant to use (more stable, nicer looking, etc).  Pandora, it appears, is an entirely closed system without a publicly available API.  While developers have still found ways to <a href="http://code.google.com/p/pandoraboy/">wrap the Pandora Flash widget</a> in apps that add some features (like Growl notification), they leave a lot to be desired.</p>
<p><strong>Monthly subscription</strong>.  Want to try Last.fm out for a month, no commitment?  Its easy to do.  Pandora, on the other hand, only offers their premium service in 1-year chunks.  It&#8217;s only $36, but I still prefer Last.fm&#8217;s bite-sized, 1 month for $3, offering.</p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/pandora-vs-last-fm.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Post Your Dynamic Internal IP To DynDNS From Your Windows Machine</title>
		<link>http://ggr.com/how-to-post-your-dynamic-internal-ip-to-dyndns-from-your-windows-machine.html</link>
		<comments>http://ggr.com/how-to-post-your-dynamic-internal-ip-to-dyndns-from-your-windows-machine.html#comments</comments>
		<pubDate>Fri, 09 Oct 2009 19:37:49 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[dynamic ip]]></category>
		<category><![CDATA[dyndns]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=429</guid>
		<description><![CDATA[
I looked around for an easier way to post an internal IP to DynDNS, but I didn&#8217;t find one. Scripting to the rescue.

If you have a paid account at DynDNS (may work for free ones too, I&#8217;m not sure), you can update a DNS entry by hitting a URL like this:
http://login:password@members.dyndns.org/nic/update?hostname=host.domain.com&#38;myip=10.0.0.1&#38;wildcard=NOCHG&#38;mx=NOCHG&#38;backmx=NOCHG
So, to update your DNS [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-post-your-dynamic-internal-ip-to-dyndns-from-your-windows-machine.html"><img class="size-full wp-image-441 aligncenter" title="UpdateIP.bat screenshot" src="http://ggr.com/wp-content/uploads/UpdateIP.bat-screenshot.jpg" alt="UpdateIP.bat screenshot" width="580" height="286" /></a></p>
<p>I looked around for an easier way to post an <strong>internal</strong> IP to DynDNS, but I didn&#8217;t find one. Scripting to the rescue.</p>
<p><span id="more-429"></span></p>
<p>If you have a paid account at DynDNS (may work for free ones too, I&#8217;m not sure), you can update a DNS entry by hitting a URL like this:</p>
<p><code>http://login:password@members.dyndns.org/nic/update?hostname=host.domain.com&amp;myip=10.0.0.1&amp;wildcard=NOCHG&amp;mx=NOCHG&amp;backmx=NOCHG</code></p>
<p>So, to update your DNS entry, you just need to <a href="http://ggr.com/how-to-get-your-ip-and-only-your-ip-in-windows.html">get your IP alone in a variable</a> that a batch file can use, then setup a task to request that URL every so often.  In more detail, the steps are:</p>
<ol>
<li>Install Cygwin including the &#8216;curl&#8217; package.  Curl allows you to make web requests from the command line.</li>
<li>Create a batch file that gets your IP then makes the DynDNS update request (see below).</li>
<li>Create a new scheduled task through the Windows Control Panel: setup multiple schedules so it runs the batch file you created in step #2 at startup, login, and when the machine is idle 60 minutes.</li>
</ol>
<p>The batch file is like so, be sure to update the curl location, DynDNS login, password, and hostname info before you use it:</p>
<p><code> :: Script from: http://www.ericphelps.com/batch/samples/ip.txt<br />
@echo off<br />
cd %temp%<br />
:: Make a line fragment "temp.txt"<br />
echo e 100 "call temp2.bat "&gt; script<br />
echo rcx&gt;&gt; script<br />
echo f&gt;&gt; script<br />
echo n temp.txt&gt;&gt; script<br />
echo w&gt;&gt; script<br />
echo q&gt;&gt;script<br />
debug &lt; script &gt; junk<br />
del script<br />
:: Make the working file "temp2.bat"<br />
echo shift&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo set IP=%%9&gt;&gt; temp2.bat<br />
:: Run the command that finds the IP and create "temp1.bat"<br />
copy temp.txt temp1.bat &gt; junk<br />
ipconfig.exe | find "IP Address" | find /v " 0.0.0.0" &gt;&gt; temp1.bat<br />
:: Run the temp1.bat, which runs temp2.bat, which sets the IP variable<br />
call temp1.bat<br />
:: Remove temporary files<br />
del temp1.bat<br />
del temp2.bat<br />
del temp.txt<br />
del junk<br />
:: Display the result<br />
echo Your IP is %IP%<br />
:: Send to DynDNS<br />
c:\cygwin\bin\curl "http://login:password@members.dyndns.org/nic/update?hostname=host.domain.com&amp;myip=10.0.0.1&amp;wildcard=NOCHG&amp;mx=NOCHG&amp;backmx=NOCHG"<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-post-your-dynamic-internal-ip-to-dyndns-from-your-windows-machine.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How To Get Your IP and ONLY Your IP in Windows</title>
		<link>http://ggr.com/how-to-get-your-ip-and-only-your-ip-in-windows.html</link>
		<comments>http://ggr.com/how-to-get-your-ip-and-only-your-ip-in-windows.html#comments</comments>
		<pubDate>Fri, 09 Oct 2009 19:30:52 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[bat]]></category>
		<category><![CDATA[batch]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[ipconfig]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=426</guid>
		<description><![CDATA[
Sometimes you need to know your Windows machine&#8217;s IP.  For example, if you would like to update your dynamic DNS entry from a script file. Here&#8217;s a hack that gets the job done.

This is from someone good with windows scripts, updated with some extra &#8217;shifts&#8217; to get it to work under XP.  Check [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-get-your-ip-and-only-your-ip-in-windows.html"><img class="alignnone size-full wp-image-436" title="getIP.bat screenshot" src="http://ggr.com/wp-content/uploads/getIP.bat-screenshot1.jpg" alt="getIP.bat screenshot" width="580" height="287" /></a></p>
<p>Sometimes you need to know your Windows machine&#8217;s IP.  For example, if you would like to <a href="http://ggr.com/how-to-post-your-dynamic-internal-ip-to-dyndns-from-your-windows-machine.html">update your dynamic DNS entry from a script</a> file. Here&#8217;s a hack that gets the job done.</p>
<p><span id="more-426"></span></p>
<p>This is from <a href="http://www.ericphelps.com/batch/samples/ip.txt">someone good with windows scripts</a>, updated with some extra &#8217;shifts&#8217; to get it to work under XP.  Check out the link for an explanation.  Save this in a batch file, I call mine &#8216;GetIP.bat&#8217;:</p>
<p><code> :: Script from: http://www.ericphelps.com/batch/samples/ip.txt<br />
@echo off<br />
cd %temp%<br />
:: Make a line fragment "temp.txt"<br />
echo e 100 "call temp2.bat "&gt; script<br />
echo rcx&gt;&gt; script<br />
echo f&gt;&gt; script<br />
echo n temp.txt&gt;&gt; script<br />
echo w&gt;&gt; script<br />
echo q&gt;&gt;script<br />
debug &lt; script &gt; junk<br />
del script<br />
:: Make the working file "temp2.bat"<br />
echo shift&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo shift&gt;&gt; temp2.bat<br />
echo set IP=%%9&gt;&gt; temp2.bat<br />
:: Run the command that finds the IP and create "temp1.bat"<br />
copy temp.txt temp1.bat &gt; junk<br />
ipconfig.exe | find "IP Address" | find /v " 0.0.0.0" &gt;&gt; temp1.bat<br />
:: Run the temp1.bat, which runs temp2.bat, which sets the IP variable<br />
call temp1.bat<br />
:: Remove temporary files<br />
del temp1.bat<br />
del temp2.bat<br />
del temp.txt<br />
del junk<br />
:: Display the result<br />
echo Your IP is %IP%<br />
pause<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-get-your-ip-and-only-your-ip-in-windows.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How To Scan For Viruses in Your Email When Using Apple Mail</title>
		<link>http://ggr.com/how-to-scan-for-viruses-in-your-email-when-using-apple-mail.html</link>
		<comments>http://ggr.com/how-to-scan-for-viruses-in-your-email-when-using-apple-mail.html#comments</comments>
		<pubDate>Wed, 16 Sep 2009 21:10:29 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[antivirus]]></category>
		<category><![CDATA[apple mail]]></category>
		<category><![CDATA[applescript]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[growl]]></category>
		<category><![CDATA[launchd]]></category>
		<category><![CDATA[lingon]]></category>
		<category><![CDATA[macports]]></category>
		<category><![CDATA[mpack]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=415</guid>
		<description><![CDATA[
There&#8217;s more than way to go about it, but I prefer using the open source ClamAV and a script that runs to scan each email as it comes in.
Setup ClamAV

Install ClamAV.  I used MacPorts to install it: sudo port install clamav
Make sure all the ClamAV binaries are in your PATH.  Chances are if you&#8217;re using MacPorts, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-scan-your-email-in-apple-mail.html"><img class="size-full wp-image-419 aligncenter" title="apple mail antivirus rule" src="http://ggr.com/wp-content/uploads/apple-mail-antivirus-rule.jpg" alt="apple mail antivirus rule" width="580" height="273" /></a></p>
<p>There&#8217;s more than way to go about it, but I prefer using the open source ClamAV and a script that runs to scan each email as it comes in.</p>
<p><span id="more-415"></span><strong>Setup ClamAV</strong></p>
<ol>
<li>Install <a href="http://www.clamav.net/">ClamAV</a>.  I used <a href="http://www.macports.org/">MacPorts</a> to install it: <code>sudo port install clamav</code></li>
<li>Make sure all the ClamAV binaries are in your PATH.  Chances are if you&#8217;re using MacPorts, you&#8217;ve already taken care of that.</li>
<li>Configure freshclam and clamd.  Since I used MacPorts to install ClamAV, this consisted of&#8230;</li>
<li>rename the example conf files in /opt/local/etc: <code>mv example-freshclam.conf freshclam.conf;</code> <code>mv example-clamd.conf clamd.conf</code></li>
<li>read the conf files and edit them as appropriate, then add the line <code>NotifyClamd /opt/local/etc/clamd.conf (</code>substituting the full path to your clamd.conf file) to the end of freshclam.conf so that clamd knows about it when freshclam has updated the virus definitions</li>
<li>run freshclam to see if it works</li>
<li>notice that it doesn&#8217;t work because it needs permissions to certain directories; <code>sudo chown -R &lt;clamav user&gt; &lt;directory&gt;</code>&#8230;the directory you need to update will be clear based on the error message, the user that freshclam and clamd run under is configured in the conf files.  In the MacPorts case its &#8216;clamav&#8217;.</li>
<li>rinse and repeat until freshclam works</li>
<li>run clamd to see if it works</li>
<li>fix its permissions too</li>
<li>run clamdscan to check that it can scan some files using clamdscan</li>
<li>Create <a href="http://developer.apple.com/macosx/launchd.html">launchd</a> items for freshclam and clamd.  Freshclam should run every 168 hours or so.  Clamd should run all the time.  I recommend using <a href="http://sourceforge.net/projects/lingon/files/">Lingon</a> to configure your launchd items.</li>
<li>Reboot.  Check to see that clamd is running.  Fix it if its not.</li>
</ol>
<p><strong>Setup Growl</strong></p>
<ol>
<li>Install <a href="http://growl.info/">Growl</a>.</li>
<li>Install GrowlNotify.  It&#8217;s in the Extras folder of the Growl installer.</li>
<li>Make sure GrowlNotify is in your PATH.</li>
</ol>
<p><strong>Setup Mpack</strong></p>
<ol>
<li>Install Mpack.  With MacPorts its: <code>sudo port install mpack</code></li>
<li>Make sure Mpack is in your PATH.</li>
</ol>
<p><strong>Setup the antivirus script</strong></p>
<ol>
<li>Download the <a href="http://ggr.com/wp-content/uploads/VirusChecker.scpt">antivirus script</a> I updated (fixed it to work with Snow Leopard, added Growl support, removed Stuffit support).  A big thank you to the <a href="http://creativeeyes.at/tools/clamav">original authors</a>!</li>
<li>Move the script to your ~/Library/Scripts directory.</li>
<li>Edit the script, updating the configuration options at the top of the file.</li>
<li>Create a local mail folder called &#8216;Infected&#8217; in Apple Mail.</li>
<li>Create a rule in Apple Mail that runs the script on all email messages.</li>
<li>Try emailing yourself a <a href="http://www.eicar.org/anti_virus_test_file.htm">test virus</a> and verify that your antivirus script sends a Growl alert and moves the message to the infected folder.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-scan-for-viruses-in-your-email-when-using-apple-mail.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Use Facebook Open Streams With Facebooker</title>
		<link>http://ggr.com/how-to-use-facebook-open-streams-with-facebooker.html</link>
		<comments>http://ggr.com/how-to-use-facebook-open-streams-with-facebooker.html#comments</comments>
		<pubDate>Tue, 15 Sep 2009 22:02:40 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[authlogic facebook connect plugin]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook connect]]></category>
		<category><![CDATA[facebooker]]></category>
		<category><![CDATA[news feed]]></category>
		<category><![CDATA[open streams api]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[stream]]></category>
		<category><![CDATA[stream.publish]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=395</guid>
		<description><![CDATA[
I would like my Facebook Connect app to publish stories to my users&#8217; Facebook news stream.  I went looking for how do this with Facebooker and figured out an answer.

The old way of doing this, and the one built into Facebooker, is to publish a user action.  There are two limitations of the [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-use-facebook-open-streams-with-facebooker.html"><img class="size-full wp-image-399 aligncenter" title="facebook_extended_permissions" src="http://ggr.com/wp-content/uploads/facebook_extended_permissions.jpg" alt="facebook_extended_permissions" width="580" height="287" /></a></p>
<p>I would like my Facebook Connect app to publish stories to my users&#8217; Facebook news stream.  I went looking for how do this with Facebooker and figured out an answer.</p>
<p><span id="more-395"></span></p>
<p>The <a href="http://wiki.developers.facebook.com/index.php/Feed.publishUserAction">old way</a> of doing this, and the one built into Facebooker, is to <a href="http://facebooker.rubyforge.org/classes/Facebooker/Rails/Publisher.html">publish a user action</a>.  There are two limitations of the old way: 1: you need a valid session_key (so, the user must be logged in); 2: you may only send up to 10 messages per day (without special permissions from the user).</p>
<p>Fortunately Facebook released their <a href="http://wiki.developers.facebook.com/index.php/Using_the_Open_Stream_API">Open Stream API</a> in April 2009 and it suffers from neither restriction: you can post without a session_key and there are no explicit limits on how many posts you can make in a day.  Unfortunately Facebooker does not yet offer native support for publishing to Facebook streams, at least that I could find, but it DOES support rolling your own API calls, and in this case its not that hard to do.  To post to a users&#8217; Facebook stream from your Rails app&#8217;s script/console, do the following:</p>
<ol>
<li>Integrate Facebooker into your Rails app.  Verify that it works.  There are a number of ways to integrate Facebooker depending on what kind of app you are making.  e.g. I&#8217;m making a Facebook Connect app, so I used <a href="http://github.com/binarylogic/authlogic">AuthLogic</a> and the <a href="http://github.com/kalasjocke/authlogic_facebook_connect">AuthLogic Facebook Connect plugin</a> so users can login to my app using their Facebook credentials.</li>
<li>Get a user&#8217;s <a href="http://wiki.developers.facebook.com/index.php/Extended_permission">permission to publish</a> to their stream.  Make a note of their Facebook UID.  e.g. in my app, the AuthLogic Facebook Connect plugin stores the UID in my user table each time a new Facebook user logs into my site.</li>
<li>Run script/console and execute the following commands:</li>
</ol>
<p><code><strong> f = Facebooker::Session.create<br />
f.post 'facebook.stream.publish', :uid =&gt; '&lt;insert_facebook_uid_here&gt;', :message =&gt; 'test'<br />
</strong> </code></p>
<p>Not so bad, huh?</p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-use-facebook-open-streams-with-facebooker.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>How To Include a Gem&#8217;s Rake Tasks in Your Rails App</title>
		<link>http://ggr.com/how-to-include-a-gems-rake-tasks-in-your-rails-app.html</link>
		<comments>http://ggr.com/how-to-include-a-gems-rake-tasks-in-your-rails-app.html#comments</comments>
		<pubDate>Mon, 14 Sep 2009 19:21:32 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[facebooker]]></category>
		<category><![CDATA[gems]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake tasks]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby gem]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=387</guid>
		<description><![CDATA[Rake tasks contained in a gem are not automatically available to a rails app that requires the gem.  Whether that&#8217;s the right way to do things is under debate, but in the mean time there are a couple workarounds.

Option #1: Use the gem as a plugin instead.  Files that match the following pattern [...]]]></description>
			<content:encoded><![CDATA[<p>Rake tasks contained in a gem are not automatically available to a rails app that requires the gem.  Whether that&#8217;s the right way to do things is <a href="https://rails.lighthouseapp.com/projects/8994/tickets/59">under debate</a>, but in the mean time there are a couple workarounds.</p>
<p><span id="more-387"></span></p>
<p><strong>Option #1</strong>: Use the gem as a plugin instead.  Files that match the following pattern are automatically pulled in, so you&#8217;re good to go:</p>
<p><code>"#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"</code></p>
<p><strong>Option #2</strong>: Create a ruby file that loads the gem&#8217;s tasks, then require the ruby file you made in your rail app&#8217;s Rakefile.  For example, if you&#8217;ve installed the Facebooker gem and you want to use its rake tasks, you might create a file called &#8216;facebooker.rb&#8217; and save it to your <em>&lt;railsapproot&gt;/tasks</em> directory with these contents:</p>
<p><code>$VERBOSE = nil<br />
Dir["#{Gem.searcher.find('facebooker').full_gem_path}/lib/tasks/*.rake"].each { |ext| load ext }</code></p>
<p>Then add this line to your Rakefile:</p>
<p><code>require 'tasks/facebooker'</code></p>
<p>But as it turns out, Facebooker&#8217;s tasks uses relative paths to get at its config file in your rails app, which won&#8217;t work if its installed in the gem path as a gem rather than in your rails app as a plugin!  So be careful with using option #2, it may not be what the gem you&#8217;re trying to use expects.</p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-include-a-gems-rake-tasks-in-your-rails-app.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Permit A Blank Email Field With AuthLogic</title>
		<link>http://ggr.com/how-to-permit-a-blank-email-field-with-authlogic.html</link>
		<comments>http://ggr.com/how-to-permit-a-blank-email-field-with-authlogic.html#comments</comments>
		<pubDate>Wed, 09 Sep 2009 19:32:12 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[blank email]]></category>
		<category><![CDATA[empty email]]></category>
		<category><![CDATA[no email]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=380</guid>
		<description><![CDATA[
I too ran into some trouble before discovering that my beloved AuthLogic is validating my email field.  The validation is a good thing overall, but I want to support blank email addresses as well as properly formatted ones.

It&#8217;s all in the AuthLogic docs of course, but if I can save you a few minutes [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-permit-a-blank-email-field-with-authlogic.html"><img class="size-full wp-image-381 aligncenter" title="errors from blank email with AuthLogic" src="http://ggr.com/wp-content/uploads/errors-from-blank-email-with-AuthLogic.jpg" alt="errors from blank email with AuthLogic" width="580" height="282" /></a></p>
<p>I too <a href="http://ficial.wordpress.com/2009/03/15/ruby-on-rails-getting-error-messages-authlogic-email-validation/">ran into some trouble</a> before discovering that my beloved AuthLogic is validating my email field.  The validation is a good thing overall, but I want to support blank email addresses as well as properly formatted ones.</p>
<p><span id="more-380"></span></p>
<p>It&#8217;s all in the AuthLogic docs of course, but if I can save you a few minutes of hunting around, that&#8217;s all good:</p>
<p><code><br />
acts_as_authentic do |c|<br />
&nbsp;&nbsp;c.merge_validates_length_of_email_field_options({:allow_nil =&gt; true})<br />
&nbsp;&nbsp;c.merge_validates_format_of_email_field_options({:allow_nil =&gt; true})<br />
end<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-permit-a-blank-email-field-with-authlogic.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Predict The Future Using Excel</title>
		<link>http://ggr.com/how-to-predict-the-future-using-excel.html</link>
		<comments>http://ggr.com/how-to-predict-the-future-using-excel.html#comments</comments>
		<pubDate>Tue, 25 Aug 2009 23:35:01 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[capacity]]></category>
		<category><![CDATA[drobo]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[hard drive]]></category>
		<category><![CDATA[predictions]]></category>
		<category><![CDATA[trend]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=372</guid>
		<description><![CDATA[
I&#8217;m going to run out of hard drive space at some point.  I&#8217;ve got 1.5TB drives in my Drobo right now, I wonder when the 3TB drives will come out so I can just upgrade them in place for double the capacity&#8230;

First I looked up when each of the last several capacity jumps were announced. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-predict-the-future-using-excel.html"><img class="size-full wp-image-373 aligncenter" title="Picture 3" src="http://ggr.com/wp-content/uploads/Picture-3.png" alt="Picture 3" width="580" height="235" /></a></p>
<p>I&#8217;m going to run out of hard drive space at some point.  I&#8217;ve got 1.5TB drives in my <a href="http://www.drobo.com/products/drobo.php">Drobo</a> right now, I wonder when the 3TB drives will come out so I can just upgrade them in place for double the capacity&#8230;</p>
<p><span id="more-372"></span></p>
<p>First I looked up when each of the last several capacity jumps were announced.  Google news did the trick: 500MB in 2005, 1TB in 2007, 1.5TB in 2008, 2TB in 2009.</p>
<p><a href="http://ggr.com/wp-content/uploads/Picture-1.png"><img class="alignnone size-full wp-image-374" title="Picture 1" src="http://ggr.com/wp-content/uploads/Picture-1.png" alt="Picture 1" width="855" height="150" /></a></p>
<p>Then I plugged my data into Excel and used the &#8216;trend&#8217; formula.</p>
<p><a href="http://ggr.com/wp-content/uploads/Picture-2.png"><img class="alignnone size-full wp-image-375" title="Picture 2" src="http://ggr.com/wp-content/uploads/Picture-2.png" alt="Picture 2" width="390" height="55" /></a></p>
<p>Voila.  3TB is coming out September 3rd, 2012.  And that&#8217;s about <a href="http://www.tomshardware.com/news/IDC-HDD-SSD,5527.html">what IDC said</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-predict-the-future-using-excel.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Monitor Amazon For Price Drops</title>
		<link>http://ggr.com/how-to-monitor-amazon-for-price-drops.html</link>
		<comments>http://ggr.com/how-to-monitor-amazon-for-price-drops.html#comments</comments>
		<pubDate>Sun, 26 Jul 2009 20:05:11 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[organization]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[price chart]]></category>
		<category><![CDATA[price drop]]></category>
		<category><![CDATA[price history]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[used]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=360</guid>
		<description><![CDATA[
Want to buy a blu-ray movie, but not interested in paying full price?  Search on CamelCamelCamel for what you want then subscribe to the associated &#8220;3rd party used price&#8221; RSS feed (look for the RSS icon: ).  You&#8217;ll get an RSS update each time the price changes.
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-monitor-amazon-for-price-drops.html"><img class="size-full wp-image-361 aligncenter" style="border: 2px dashed #dddddd;" title="price history graph" src="http://ggr.com/wp-content/uploads/price-history-graph.jpg" alt="price history graph" width="580" height="356" /></a></p>
<p>Want to buy a blu-ray movie, but not interested in paying full price?  Search on <a href="http://camelcamelcamel.com/">CamelCamelCamel</a> for what you want then <a href="http://ggr.com/how-to-subscribe-to-a-website.html">subscribe</a> to the associated &#8220;3rd party used price&#8221; RSS feed (look for the RSS icon: <img class="alignnone size-full wp-image-362" title="RSS icon" src="http://ggr.com/wp-content/uploads/RSS-icon.png" alt="RSS icon" width="16" height="16" />).  You&#8217;ll get an RSS update each time the price changes.</p>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-monitor-amazon-for-price-drops.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to Increase Traffic to Your Site By Optimizing For Search Engines</title>
		<link>http://ggr.com/how-to-increase-traffic-to-your-site-by-optimizing-for-search-engines.html</link>
		<comments>http://ggr.com/how-to-increase-traffic-to-your-site-by-optimizing-for-search-engines.html#comments</comments>
		<pubDate>Sat, 18 Jul 2009 00:50:00 +0000</pubDate>
		<dc:creator>Scott Bonds</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[external links]]></category>
		<category><![CDATA[increase traffic]]></category>
		<category><![CDATA[internal links]]></category>
		<category><![CDATA[key phrases]]></category>
		<category><![CDATA[keywords]]></category>
		<category><![CDATA[natural search]]></category>
		<category><![CDATA[organic search]]></category>
		<category><![CDATA[search engine]]></category>
		<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://ggr.com/?p=332</guid>
		<description><![CDATA[
Want more traffic from your friendly neighborhood search engine to your site?  Here are some of the Search Engine Optimization (SEO) tricks I&#8217;ve picked up along the way.

Rule #1: make it easy for the search engines to see and understand your content

make as much content visible to users that are not logged in as you [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://ggr.com/how-to-increase-traffic-to-your-site-by-optimizing-for-search-engines.html"><img class="size-full wp-image-347 aligncenter" style="border: 2px dashed #dddddd;" title="alexa_results_for_penny_arcade" src="http://ggr.com/wp-content/uploads/alexa_results_for_penny_arcade.jpg" alt="alexa_results_for_penny_arcade" width="580" height="256" /></a></p>
<p>Want more traffic from your friendly neighborhood search engine to your site?  Here are some of the Search Engine Optimization (SEO) tricks I&#8217;ve picked up along the way.</p>
<p><span id="more-332"></span></p>
<p><strong>Rule #1: make it easy for the search engines to see and understand your content</strong></p>
<ul>
<li>make as much content visible to users that are <strong>not</strong> logged in as you can&mdash;search engines cannot login and they will not index any content that is behind a login barrier</li>
<li>use descriptive names for everything, including your domains, paths, pages, and assets, i.e. <em>http://</em><strong><em>tofo-recipes</em></strong><em>.ggr.com/</em> and <em>h</em><em>ttp://ggr.com/</em><strong><em>recipes</em></strong><em>/</em><strong><em>how_to_make_tofo</em></strong><em>.html</em> and <strong><em>tofo_raw_ingredients</em></strong><em>.jpg</em></li>
<li><em><span style="font-style: normal;">include descriptive &#8220;alt&#8221; attributes in your image tags</span></em></li>
<li>avoid JavaScript links&mdash;search engines cannot click on them</li>
<li>make certain all of your content is reachable within 3 clicks of the homepage, i.e. add a sitemap</li>
<li>try surfing your site with a <a href="http://lynx.isc.org/">text web browser</a> to get an idea what your site looks like to a search engine</li>
</ul>
<p><strong>Rule #2: stake out a small number of key phrases</strong></p>
<ul>
<li>choose a prioritized list of phrases you want to rank well with.  You can start by looking at your web logs to see what terms are already generating natural search traffic for you.  <a href="https://adwords.google.com/select/KeywordToolExternal">Google&#8217;s Keyword Tool</a> can also give you some ideas.</li>
<li>choose 2-3 phrases to brand each page.  Incorporate the phrases you chose onto their pages.  Including each key phrase 3-6 times on a page is usually ok, 100 is usually not&mdash;search engines will penalize you for gaming the system if you put too many on there, but where the line is is not public knowledge.</li>
<li>make certain both internal and external links to your pages use an associated key phrase as the text of the anchor</li>
<li>include your key phrases in your title, header, and meta tags; include them in your host, domain, and path names as well, whenever practical</li>
<li>buy your key phrases from the search engines, so your ads show up instead of your competition when searching on those phrases</li>
</ul>
<p><strong>Rule #3: get more external links<br />
</strong></p>
<p>One of the single most important things you can do (for Google in particular) is to increase the number of links to your site from other sites (the more reputable, the better).</p>
<ul>
<li>encourage folks to link to your website from their Facebook, LinkedIn, and other profiles</li>
<li>encourage folks to Twitter,  blog, or include a link to your site to their Facebook/LinkedIn/etc status updates</li>
<li>offer links with your content to Digg, Reddit, and <a href="http://www.gigya.com/">other services</a> that make it easy for your visitors to link to your content and tell their friends about your site</li>
<li>don&#8217;t forget to make certain the links to your site use a key phrase associated with the page they link to, whenever possible</li>
</ul>
<p><strong>Rule #4: don&#8217;t split your traffic</strong></p>
<ul>
<li>redirect old links to the current pages (or you won&#8217;t get credit for those external links).  Look in your web logs and in Google for old links.</li>
<li>any given page/content should have only one URL <em>including</em> parameters whenever practical</li>
<li>eliminate parameters from the URL&mdash;try using redirects to eliminate parameters while preserving their functionality</li>
<li>use robots.txt to prevent indexing of pages you don&#8217;t want indexed (i.e. error pages)</li>
<li>don&#8217;t have more than 3 or so key phrases associated with a given page</li>
</ul>
<p><strong>Rule #5: follow up</strong></p>
<p>SEO is a moving target: the search engine algorithms change, your competitions&#8217; sites change, your site changes.  You have to stay vigilant or you may lose ranking on your key phrases over time.</p>
<ul>
<li>search Google&#8217;s for &#8220;link:ggr.com&#8221; to track how many external links you have (replace &#8220;ggr.com&#8221; with your site).  Record the number once per week.</li>
<li>search for your key phrases in the major search engines once per week.  Record where you rank.  Record where your top competition ranks.</li>
<li>analyze your competition and copy the tactics that work&mdash;they may stumble onto a good SEO tactic before it is well known</li>
</ul>
<p><strong>Further reading:</strong></p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Search_engine_optimization">SEO on Wikipedia</a></li>
<li><a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;answer=35291">Google&#8217;s SEO guide</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ggr.com/how-to-increase-traffic-to-your-site-by-optimizing-for-search-engines.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
