<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.2" -->
<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/"
	>

<channel>
	<title>Bogle's Blog</title>
	<link>http://thebogles.com/blog</link>
	<description>Things I care about</description>
	<pubDate>Mon, 08 Feb 2010 18:45:41 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.2</generator>
	<language>en</language>
			<item>
		<title>Snellspace: Critique of the Google Contacts Atom format</title>
		<link>http://thebogles.com/blog/2008/03/snellspace-critique-of-the-google-contacts-atom-format/</link>
		<comments>http://thebogles.com/blog/2008/03/snellspace-critique-of-the-google-contacts-atom-format/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 18:21:15 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2008/03/snellspace-critique-of-the-google-contacts-atom-format/</guid>
		<description><![CDATA[Good critique of the Google Contacts API over on Snellspace:

&#8230; as is typical of GData, all of the application specific data is contained in extension elements. While this is technically not a bad thing, it does mean that Google has effectively invented Yet Another Way of representing contact information. We already have vCard and hCard, [...]]]></description>
			<content:encoded><![CDATA[<p>Good critique of the Google Contacts API over on <a href="http://www.snellspace.com/wp/?p=912">Snellspace</a>:</p>
<blockquote><p>
&#8230; as is typical of GData, all of the application specific data is contained in extension elements. While this is technically not a bad thing, it does mean that Google has effectively invented Yet Another Way of representing contact information. We already have vCard and hCard, both of which have been extremely effective and have a ton of existing application support. However, none of that existing code can be used with GData contacts. I understand why Google is using the extension elements but I disagree that the tradeoff is worth it.</p>
<p>Using extension elements basically means that “dumb clients” — Atom clients that do not understand the GData API, will not be able to do anything at all with the feed. There’s not even any displayable content that a human can use to extract information. Clients have to be written specifically against the GData API. Assuming that Microsoft also puts together a Contacts API, and assuming they also use extension elements to represent the data, client implementors end up having to write vendor specific code that does exactly the same thing. That’s bad.
</p></blockquote>
<p>Lotus, on the other hand, uses the hCard microformat in the payload, allowing standardized parsing and useful rendering even by downlevel clients.</p>
<blockquote><p>
The entry itself is generally just an envelope for an hCard and a linked vCard. Because the content element contains XHTML, dumb clients can render the feed content regardless of the fact that our hCard uses a number of Profiles-specific fields; and the linked vCard makes it significantly easier to integrate this feed with existing contact management systems. For instance, we have one customer who has used the Profiles feed to integrate directly into mobile device contact databases using the vcard links.</p>
<p>The main advantage the Profiles approach has over GData Contacts is that client applications do not have to write Profiles-specific code to integrate and interoperate. If the client understands Atom, XHTML, hCard and vCard, they can use the feed.</p>
<p>Standards are a good thing.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2008/03/snellspace-critique-of-the-google-contacts-atom-format/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>libxml_helper: a more delightful approach to parsing XML in Ruby</title>
		<link>http://thebogles.com/blog/2008/03/678/</link>
		<comments>http://thebogles.com/blog/2008/03/678/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 07:39:02 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2008/03/678/</guid>
		<description><![CDATA[Libxml-Ruby is a blindingly fast way to parse XML in Ruby.  However, many have complained that the interface is verbose and not especially Rubyish, and that the documentation lacks details and examples.
Thanks to the flexibility of Ruby, it&#8217;s easy to remedy this situation.
libxml_helper.rb, described here, opens up the XML::Node class from Libxml and adds [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://libxml.rubyforge.org/">Libxml-Ruby</a> is a blindingly fast way to parse XML in Ruby.  However, many have complained that the interface is verbose and not especially Rubyish, and that the documentation lacks details and examples.</p>
<p>Thanks to the flexibility of Ruby, it&#8217;s easy to remedy this situation.</p>
<p>libxml_helper.rb, described here, opens up the XML::Node class from Libxml and adds helper functions that make it easier to use.  The helpers also make it easier to use xpath with nodes that include default namespaces. (I intend to continue adding to the helpers to smooth rough edges as I encounter them.)</p>
<p>The interface was inspired by the fantastic <a href="http://code.whytheluckystiff.net/hpricot/">HPricot</a>, a &#8220;fast and delightful HTML parser&#8221;, and many HPricot examples will work unmodified. </p>
<h3>Convenience functions</h3>
<p>You can call to_libxml_doc on any string to convert it into an XML::Document:</p>
<pre>
&gt;&gt; s = '&lt;foo&gt;&lt;author&gt;p. bogle&lt;/author&gt;&lt;bar&gt;content&lt;/bar&gt;&lt;bar&gt;cont2&lt;/bar&gt;&lt;/foo&gt;'
&gt;&gt; root = s.to_libxml_doc.root
</pre>
<p>The at() method returns the first Node matching the given xpath:</p>
<pre>
>> root.at("author")
=> &lt;author>p. bogle&lt;/author>
</pre>
<p>The search() method returns a list of Nodes matching the given xpath:</p>
<pre>
&gt;&gt; root.search("bar")
=&gt; [&lt;bar&gt;content&lt;/bar&gt;, &lt;bar&gt;content2&lt;/bar&gt;]
</pre>
<p>search() can also be called with a block to iterate through each of the matching nodes:</p>
<pre>
&gt;&gt;  root.search("bar") do |bar| puts bar.xpath; end
/foo/bar[1]
/foo/bar[2]
</pre>
<p>The helper also improves the handling of default namespaces&#8230;</p>
<p><b><a href="http://thebogles.com/blog/an-hpricot-style-interface-to-libxml/">Read More</a></b>
</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2008/03/678/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Urbanspoon adds the Bay Area and Los Angeles</title>
		<link>http://thebogles.com/blog/2007/03/urbanspoon-adds-the-bay-area-and-los-angeles/</link>
		<comments>http://thebogles.com/blog/2007/03/urbanspoon-adds-the-bay-area-and-los-angeles/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 04:28:29 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Mobile</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2007/03/urbanspoon-adds-the-bay-area-and-los-angeles/</guid>
		<description><![CDATA[Ethan writes on the Urbanspoon blog:

We’ve just started covering two more very important cities - or depending on how you look at it, about a hundred new cities.
Urbanspoon Bay Area - from Marin in the North to San Jose in the South, Oakland in the East to San Francisco in the West, with a combined [...]]]></description>
			<content:encoded><![CDATA[<p>Ethan writes on the <a href="http://urbanspoon.wordpress.com/2007/03/07/fog-city-and-the-city-of-angels/">Urbanspoon blog</a>:</p>
<blockquote><p>
We’ve just started covering two more very important cities - or depending on how you look at it, about a hundred new cities.</p>
<p>Urbanspoon Bay Area - from Marin in the North to San Jose in the South, Oakland in the East to San Francisco in the West, with a combined total of 13,528 restaurants.</p>
<p>Urbanspoon Los Angeles - including a swath of other cities stretching from San Fernando to Long Beach, with 18,833 restaurants.
</p></blockquote>
<p><a href="http://urbanspoon.com">Urbanspoon</a> is a cool search engine for restaurant information and reviews, combining links to newspaper reviews and other online sources with user contributed reviews. <br/><br/></p>
<p>(The founders of Urbanspoon are good buddies of mine, as you might guess from several <a href="http://thebogles.com/yp?q=ame&#038;near=san+francisco,ca" rel="nofollow">points of integration</a>.)</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2007/03/urbanspoon-adds-the-bay-area-and-los-angeles/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Open Search Platforms take root</title>
		<link>http://thebogles.com/blog/2007/01/open-search-platforms-take-root/</link>
		<comments>http://thebogles.com/blog/2007/01/open-search-platforms-take-root/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 22:10:06 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Innovation</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2007/01/open-search-platforms-take-root/</guid>
		<description><![CDATA[Google&#8217;s announcement that they are discontinuing support for their Search API has added urgency to the development of open search platforms.&#160;
Alexa and Nutch approach the problem from different directions, each of them interesting.&#160; 
Alexa provides a hosted, scalable search service that you pay for; you can access their full-text index of their web, distributing computations [...]]]></description>
			<content:encoded><![CDATA[<p>Google&#8217;s announcement that they are discontinuing support for their Search API has added urgency to the development of open search platforms.&nbsp;</p>
<p>Alexa and Nutch approach the problem from different directions, each of them interesting.&nbsp; </p>
<p><a href="http://awis.blogspot.com/2007/01/developers-corner-gets-facelift.html">Alexa</a> provides a hosted, scalable search service that you pay for; you can access their full-text index of their web, distributing computations across their cloud, and creating new indices to capture the results of those computations.&nbsp;Costs are modest.&nbsp; </p>
<p><img src="http://client.alexa.com/common/images/now-open-small.jpg" style="float: right"/></p>
<blockquote><p>Our goal is to give unparalleled and unlimited access to search. Just think of it&#8230; where else can you:
<ul>
<li>Take the reins of a Web crawler and direct it to crawl specific pages on specific domains and collect specific document types
<li>Mine the documents in the crawl and generate custom indices
<li>Reorder search results and create custom verticals
<li>Use your own advertising solution</li>
</ul>
<p>This is by no means a complete list. I just put it together to illustrate a point.
<p>Where other search engines may give you access to their search results, they will tie your hands. You won&#8217;t be able to access the raw documents in their crawl, create your own index, reorder the results or even use your own advertising solution. In some extreme cases they will only provide results if you give over part of your page to their ajax script. Why would these search giants create search solutions that are obviously limited and of little use to inventors? Because they are not interested in helping to create their next competitor.
<p>Alexa on the other hand&#8230; that&#8217;s exactly what we are here to do. We are here to build a platform for you. We are designing our services to be consumed and manipulated by developers and inventors. We fully expect that the next great search engine will be unimaginable to us and won&#8217;t be based on a plain vanilla search index from one of the big boys. It will be built and based on a new idea and it will require the kind of access that only Alexa can provide.
<p>You can get started in the new and revamped <a href="http://www.alexa.com/site/devcorner">Developer&#8217;s Corner</a>.</p>
</blockquote>
<p><a href="http://lucene.apache.org/nutch/docs/en/">Nutch</a>, on the hand, is a fully open source web search engine; the work of creating a cloud to run Nutch on is up to you or a partner:</p>
<p><img src="http://lucene.apache.org/nutch/images/nutch-logo.gif" style="float: right"/></p>
<blockquote><p>Web search is a basic requirement for internet navigation, yet the number of web search engines is decreasing. Today&#8217;s oligopoly could soon be a monopoly, with a single company controlling nearly all web search for its commercial gain. That would not be good for users of the internet. </p>
<p>Nutch provides a transparent alternative to commercial web search engines. Only open source search results can be fully trusted to be without bias. (Or at least their bias is public.) All existing major search engines have proprietary ranking formulas, and will not explain why a given page ranks as it does. Additionally, some search engines determine which sites to index based on payments, rather than on the merits of the sites themselves. Nutch, on the other hand, has nothing to hide and no motive to bias its results or its crawler in any way other than to try to give each user the best results possible.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2007/01/open-search-platforms-take-root/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>What is Evil 2.0?</title>
		<link>http://thebogles.com/blog/2007/01/what-is-evil-20/</link>
		<comments>http://thebogles.com/blog/2007/01/what-is-evil-20/#comments</comments>
		<pubDate>Sat, 20 Jan 2007 20:47:24 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2007/01/what-is-evil-20/</guid>
		<description><![CDATA[
Evil 1.0 was Microsoft.&#160; Evil 2.0 is Apple and Google.&#160;
I know Evil 1.0 well.&#160;I worked for it.&#160;I recognize Evil 2.0 easily by its signs.&#160; I know the bad&#8211; and the good&#8211; that Evil can&#160;accomplish.
&#160;Evil 2.0 must be understood.




Evil 1.0 was geeky and&#160;asocial.&#160; 








Evil 2.0 is cool and charismatic.



Evil 2.0 seduces.&#160; We lust to touch the [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>Evil 1.0 was Microsoft.&nbsp; Evil 2.0 is Apple and Google.&nbsp;</p>
<p>I know Evil 1.0 well.&nbsp;I worked for it.&nbsp;I recognize Evil 2.0 easily by its signs.&nbsp; I know the bad&#8211; and the good&#8211; that Evil can&nbsp;accomplish.</p>
<p>&nbsp;Evil 2.0 must be understood.</p>
<p></p>
<table style="font-size: 130%; font-style: italic; background-color: #F0F0F0; width: 75%; border-color: silver; border-collapse: collapse; text-align: center" border="1">
<tr>
<td>
Evil 1.0 was geeky and&nbsp;asocial.&nbsp; </p>
<td>
<img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="85" src="http://images.google.com/images?q=tbn:QWALBylc4XqBQM:http://www.command-post.org/desk/archives/apme2.jpg" style="width: 150px" border="0">
</td>
</tr>
<tr>
<td>
<img src="http://images.google.com/images?q=tbn:05Xi81OMKKpLUM:http://www.shanghaidaily.com/NewsImage/2007/2007-01/2007-01-10/20070110_302370_04.jpg" width="129">
</td>
<td>Evil 2.0 is cool and charismatic.</td>
</tr>
</table>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="158" src="http://blog.sciam.com/media/dsc_0182.jpg" width="240" align="right" border="0"></p>
<p>Evil 2.0 seduces.&nbsp; We lust to touch the IPhone, even at the cost of our ability to choose software, carriers, and media formats.&nbsp; No Skype or Ogg here, unless Apple and Cingular want them.</p>
<p>Evil 2.0 is lock in at the grandest scale.&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img height="240" src="http://jeremy.zawodny.com/i/gevil.jpg" width="240" align="left"></a> </p>
<p>Evil 2.0 is smarter than you are.</p>
<p>Evil 2.0 misleads through paradox.</p>
<p>It is the evil that says &#8220;Don&#8217;t be evil&#8221;.&nbsp; It&#8217;s the crawler that can&#8217;t be crawled, the datamining blackhole. </p>
<p>It&#8217;s the privately owned judge of who gets noticed on the internet.</p>
<p>Evil 2.0 is the Google search API that goes straight from beta to oblivion. </p>
<p>Evil 2.0 is all-knowing.&nbsp;No one knows exactly how much Google knows about you&#8211; except Google. </p>
<p>Take the thesis of Evil 1.0, synthesize with Evil 2.0, and toss in a good dash of Homeland Security, and we have a grave threat to freedom of software, thought and privacy. And we will greet our new overlords with flowers and iPhones.</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2007/01/what-is-evil-20/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Google more closed with data than Microsoft is with code?</title>
		<link>http://thebogles.com/blog/2006/12/google-is-to-data-as-microsoft-is-to-code/</link>
		<comments>http://thebogles.com/blog/2006/12/google-is-to-data-as-microsoft-is-to-code/#comments</comments>
		<pubDate>Fri, 29 Dec 2006 23:26:05 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/12/google-discontinues-search-api-the-growth-of-a-data-black-hole/</guid>
		<description><![CDATA[Google is taking an approach towards search and datamining that is diametrically opposed towards the web search platform&#160;and Elastic Computing Cloud&#160;of Amazon/Alexa.&#160; 
Even as Amazon works to democratize access to web indexes and scalable web services, Google is increasingly becoming a data black hole, collecting and mining data from everywhere for its own purposes but [...]]]></description>
			<content:encoded><![CDATA[<p>Google is taking an approach towards search and datamining that is diametrically opposed towards the <a href="http://pages.alexa.com/awsp/docs/WebHelp/AWSP_User_Guide.htm">web search platform</a>&nbsp;and <a href="http://www.amazon.com/gp/browse.html?node=201590011">Elastic Computing Cloud</a>&nbsp;of Amazon/Alexa.&nbsp; </p>
<p>Even as Amazon works to democratize access to web indexes and scalable web services, Google is increasingly becoming a data black hole, collecting and mining data from everywhere for its own purposes but exposes little of what what is mined to other web services. </p>
<p>Google&#8217;s Search API was always more of a toy than a real platform&#8211; the limit of 1000 queries per day was uselessly small, as was the limitation of only being able to access the first 1000 results of any query.</p>
<p>Recently, <a href="http://code.google.com/apis/soapsearch/">Google discontinued support for their Search API</a>, and is no longer issuing new API keys.</p>
<p><a href="http://thebogles.com/blog/wp-content/uploads/2006/12/WindowsLiveWriter/GooglediscontinuessearchAPIthegrowthofad_DAA7/image%7B0%7D%5B18%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="143" src="http://thebogles.com/blog/wp-content/uploads/2006/12/WindowsLiveWriter/GooglediscontinuessearchAPIthegrowthofad_DAA7/image%7B0%7D_thumb%5B10%5D.png" width="500" border="0"></a> </p>
<p>What would people say if Microsoft stopped issuing &#8220;API keys&#8221; and documentation for Windows developers?</p>
<p>A project called <a href="http://evilapi.com/">EvilAPI</a> aims to be a replacement for the SOAP Search API, and is an expression of the frustration felt by developers left out in the cold.</p>
<blockquote><p>In response to Google’s <a href="http://code.google.com/apis/soapsearch/">discontinuation of support</a> for their SOAP Search API, we have created the EvilAPI. The EvilAPI supports <a href="http://evilapi.com/service/">most of the same SOAP calls</a> that Google’s SOAP Search API supports — it just doesn’t use their deprecated API to get the data. Instead, it uses page scraping. Evil? Maybe. But not nearly as evil as providing a powerful development tool for people who are loyal to Google and then discontinuing it without any warning or regard to their users.</p>
</blockquote>
<p>Of course Google disallows EvilAPI in their terms of service and can break it at&nbsp;any time they chose.</p>
<p>There&#8217;s a clear parallel between Google&#8217;s closed approach to data and Microsoft&#8217;s closed approach to software, and a clear need for a more open marketplaces for data as pioneered by Amazon.&nbsp;Fortunately, developers do have a choice and a chance to exert market pressure on Google.</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/12/google-is-to-data-as-microsoft-is-to-code/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The best Rails is a virtual Rails: Virtualization for Mac and Windows</title>
		<link>http://thebogles.com/blog/2006/12/the-best-rails-is-a-virtual-rails-virtualization-for-mac-and-windows/</link>
		<comments>http://thebogles.com/blog/2006/12/the-best-rails-is-a-virtual-rails-virtualization-for-mac-and-windows/#comments</comments>
		<pubDate>Fri, 29 Dec 2006 00:27:50 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/12/the-best-rails-is-a-virtual-rails-virtualization-for-mac-and-windows/</guid>
		<description><![CDATA[I&#8217;ve noticed an interesting trend towards mainstream developer use of virtual machines:&#160; Those of us who develop in Rails in Jobster increasingly do so on Linux, either real or&#160;virtualized.&#160; 
Linux tends to be better supported than either Windows or OSX when it comes to Rails gems&#8211; the libxml gem for instance, is critical for&#160;fast XML [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve noticed an interesting trend towards mainstream developer use of virtual machines:&nbsp; Those of us who develop in Rails in Jobster increasingly do so on Linux, either real or&nbsp;virtualized.&nbsp; </p>
<p>Linux tends to be better supported than either Windows or OSX when it comes to Rails gems&#8211; the <a href="http://libxml.rubyforge.org/">libxml gem</a> for instance, is critical for&nbsp;fast XML parsing, but is difficult if not impossible to run on Windows. Linux is also better supported than Intel OSX for things like the closed source (boo hiss) Oracle OCI8 drivers. </p>
<p>There are even performance advantages. Tools like Subversion perform much faster in virtualized Linux than they do in native Windows, and even Rails startup time feels faster. </p>
<p>Virtualized Linux is now fast and affordable&#8211; <a href="http://register.vmware.com/content/download.html">VMWare Server</a>&nbsp;is&nbsp;a free download&nbsp;for Windows, and <a href="http://www.parallels.com/">Parallels workstation</a>&nbsp;for the Mac is only $49. </p>
<p>A typical setup shares out the virtualized drive with the Windows or Mac box so that native development environment can continue to be used.&nbsp; (The virtual machine host allocates a new dynamic IP address for the virtual machine and transparently bridges traffic to the virtual MAC address, so it truly appears as a separate machine to the local network.)</p>
<p>The last compelling aspect of virtualization is the ability to create a system image with all of the tools and gems a developer needs to be productive.&nbsp; In a few minutes this image can be copied to a developers machine, be mounted, and running.</p>
<p>(If you use virtualized Ubuntu and want to share system images, you should definitely read <a href="http://www.vmware.com/community/thread.jspa?threadID=46069&amp;tstart=0">this thread</a>&nbsp;about a script to update the cached MAC address when you copy an image, otherwise your eth0 ethernet device won&#8217;t work in a cloned machine.) </p>
<p>It&#8217;s clearly only a matter of time before virtualization becomes mainstream for all users and not just developers.&nbsp; </p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/12/the-best-rails-is-a-virtual-rails-virtualization-for-mac-and-windows/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>S3 + Rake = Easy Rails Backups</title>
		<link>http://thebogles.com/blog/2006/12/s3-rake-easy-rails-backups/</link>
		<comments>http://thebogles.com/blog/2006/12/s3-rake-easy-rails-backups/#comments</comments>
		<pubDate>Wed, 20 Dec 2006 23:41:32 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/12/s3-rake-easy-rails-backups/</guid>
		<description><![CDATA[Peter Cooper blogs on Easy Backups for SVN Repositories, Databases, and Code&#160;using Amazon&#8217;s S3 service.&#160;
Adam Greene has put together a great set of Rake tasks that use the Amazon S3 file storage service (and Amazon&#8217;s own Ruby API) to make backing up your Rails application&#8217;s code and databases easy. All it takes is a single [...]]]></description>
			<content:encoded><![CDATA[<p>Peter Cooper blogs on <a href="http://www.rubyinside.com/advent2006/15-s3rake.htm">Easy Backups for SVN Repositories, Databases, and Code</a>&nbsp;using Amazon&#8217;s S3 service.&nbsp;</p>
<blockquote><p>Adam Greene has put together a great set of Rake tasks that use the Amazon S3 file storage service (and Amazon&#8217;s own Ruby API) to make backing up your Rails application&#8217;s code and databases easy. All it takes is a single call to Rake and you&#8217;re backed up on Amazon&#8217;s redundant, secure systems.
</p></blockquote>
<pre>(Discovered via the <a href="http://www.rubyinside.com/advent2006/">Ruby Advent Calendar</a>.) </pre>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/12/s3-rake-easy-rails-backups/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>acts_as_ferrett: easy, efficient full-text search for Rails applications</title>
		<link>http://thebogles.com/blog/2006/12/acts_as_ferrett-easy-efficient-full-text-search-for-rails-applications/</link>
		<comments>http://thebogles.com/blog/2006/12/acts_as_ferrett-easy-efficient-full-text-search-for-rails-applications/#comments</comments>
		<pubDate>Tue, 19 Dec 2006 00:32:08 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Jobster</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/12/acts_as_ferrett-easy-efficient-full-text-search-for-rails-applications/</guid>
		<description><![CDATA[
Based on a tip from Russell Williams, I’ve played a little bit with acts_as_ferret and like what I see so far.&#160; &#160;
Ferret is a port of the Lucene full-text engine for Ruby, and acts_as_ferret is a plugin for Rails that makes it easy to make any ActiveRecord model full-text searchable.&#160;
Roman Mackovcak provides a set of [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>Based on a tip from <a href="http://www.jobster.com/at/person/show/102">Russell Williams</a>, I’ve played a little bit with <a href="http://projects.jkraemer.net/acts_as_ferret/">acts_as_ferret</a> and like what I see so far.&nbsp; &nbsp;
<p><a href="http://ferret.davebalmain.com/trac/">Ferret</a> is a port of the Lucene full-text engine for Ruby, and <a href="http://projects.jkraemer.net/acts_as_ferret/">acts_as_ferret</a> is a plugin for Rails that makes it easy to make any ActiveRecord model full-text searchable.&nbsp;
<p>Roman Mackovcak provides a set of <a href="http://blog.zmok.net/articles/2006/10/18/full-text-search-in-ruby-on-rails-3-ferret">ferret recipes</a>, including how to do pagination, which is not supported out of the box.&nbsp;
<p>Ferret supports the same rich <a href="http://lucene.apache.org/java/docs/queryparsersyntax.html">query syntax</a> that Lucene does <st>and can read files created using standard Lucene without conversions.</st> Some of the supported query syntax options include wildcard searches (<code>te?t</code> matches <code>test</code>), fuzzy matching based on <a href="http://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein </a>distance (<code>dictonary~</code> matches <code>dictionary</code>), proximity searches, range searches, keyword weight, and boolean operators. </p>
<p><b>Update</b>: <a href="http://www.almaer.com/blog/archives/001244.html">Dion</a> notes that Ferret no longer uses the Lucene file format, unfortunately..  The file format was changed in order to improve performance.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/12/acts_as_ferrett-easy-efficient-full-text-search-for-rails-applications/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Hibernates loves Spring?</title>
		<link>http://thebogles.com/blog/2006/12/hibernates-loves-spring/</link>
		<comments>http://thebogles.com/blog/2006/12/hibernates-loves-spring/#comments</comments>
		<pubDate>Mon, 18 Dec 2006 20:14:09 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Jobster</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/12/hibernates-loves-spring/</guid>
		<description><![CDATA[
To accompany the rumored renewal of affections between Brad and Jen, eWeek&#160;is reporting a thaw in the chill between Hibernate and Spring:

Despite an often tense relationship between leaders in their respective open-source communities, the Spring and JBoss leaders are now talking about a truce.
Rod Johnson, chief executive of Interface21, the company that maintains the Spring [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>To accompany the rumored renewal of affections between Brad and Jen, <a href="http://www.eweek.com/article2/0,1895,2073457,00.asp">eWeek</a>&nbsp;is reporting a thaw in the chill between Hibernate and Spring:<br />
<blockquote>
<p>Despite an often tense relationship between leaders in their respective open-source communities, the Spring and JBoss leaders are now talking about a truce.
<p>Rod Johnson, chief executive of Interface21, the company that maintains the Spring Framework, told eWEEK that he would welcome an opportunity to work with JBoss. Johnson spoke with eWEEK just weeks after JBoss leader Marc Fleury told eWEEK <a href="http://www.eweek.com/article2/0,1895,2066749,00.asp">he was open to working with the Spring community</a>&nbsp;in some fashion.
<p>The apparent thaw in the often chilly relationship could signal a big boon to Java <a href="http://www.eweek.com/article2/0,1895,2073457,00.asp#">developers</a> who use the Spring Framework with JBoss&#8217; Hibernate technology. Spring is a lightweight Java application framework that helps developers avoid the complexity of the Java 2 Platform Enterprise Edition (J2EE), while Hibernate is an object/relational persistence and query service for Java. </p>
</blockquote>
<p>Reporting the conflict from the frontlines was Jobster&#8217;s senior war correspondant Scott Haug:&nbsp;<br />
<blockquote>
<p>The height of the friction between the two camps was perhaps best captured in a <a href="http://houseofhaug.net/blog/archives/2005/08/12/hibernate-hates-spring/">blog post from last year</a> by Scott Haug, a developer at Jobster, entitled &#8220;Hibernate Hates Spring.&#8221;
<p>However, many developers who posted comments to Haug&#8217;s post said they use both Spring and Hibernate, and many called for a truce.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/12/hibernates-loves-spring/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The Rails Way: new blog from Jamis Buck and Michael Koziarski</title>
		<link>http://thebogles.com/blog/2006/11/the-rails-way-new-blog-from-jamis-buck-and-michael-koziarski/</link>
		<comments>http://thebogles.com/blog/2006/11/the-rails-way-new-blog-from-jamis-buck-and-michael-koziarski/#comments</comments>
		<pubDate>Tue, 21 Nov 2006 07:25:39 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/11/the-rails-way-new-blog-from-jamis-buck-and-michael-koziarski/</guid>
		<description><![CDATA[The Rails Way&#160;is a new blog from Rails gurus Jamis Buck and Michael Koziarski.&#160;They accept submissions of real world web applications and suggest ways to improve the code through the right MVC factorings.&#160;
Interesting reading.&#160;(Also check out some of Jamis&#8217;s past posts, such as Skinny Controller, Fat Model.)

With all the attention Rails has received in the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.therailsway.com/2006/10/31/the-rails-way">The Rails Way</a>&nbsp;is a new blog from Rails gurus <a href="http://weblog.jamisbuck.org">Jamis Buck</a> and <a href="http://www.koziarski.net">Michael Koziarski</a>.&nbsp;They accept submissions of real world web applications and suggest ways to improve the code through the right MVC factorings.&nbsp;
<p>Interesting reading.&nbsp;(Also check out some of Jamis&#8217;s past posts, such as <a href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model">Skinny Controller, Fat Model</a>.)<br />
<blockquote>
<p>With all the attention Rails has received in the last year, there has been an enormous influx of people wanting to learn how to write web applications with it. Rails itself attempts to shepherd programmers along well-trod paths, to help them build well-designed applications “by default”. Alas, Rails’ conventions are not always enough.
<p>This blog is our attempt to back up Rails’ opinions on <em>what</em> things should be done, with our own opinions on <em>how</em> things should be done.
<p>Here’s how we’ll do it: if you have an application or a piece of code which you think could be done better, but you aren’t quite sure how, send it in. We’ll review all submissions, then publish an article or two showing the changes we’d make, and explain why we’d make them.
<p>Readers get the chance to learn tips and tricks for enhancing your design, submitters get their application refactored for free, and we get some free-inspiration for our blog posts. Nobody loses!</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/11/the-rails-way-new-blog-from-jamis-buck-and-michael-koziarski/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Ruby Module for Searching using the Alexa Web Services API</title>
		<link>http://thebogles.com/blog/2006/11/ruby-module-for-searching-using-alexa-web-services-api/</link>
		<comments>http://thebogles.com/blog/2006/11/ruby-module-for-searching-using-alexa-web-services-api/#comments</comments>
		<pubDate>Thu, 16 Nov 2006 14:21:14 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/11/ruby-module-for-searching-using-alexa-web-services-api/</guid>
		<description><![CDATA[This post includes an improved version of the query example in Ruby for hitting the Alexa Web Search web service. Sample usage is as follows. 
require 'alexa'
Alexa.search('bogle').each {&#124;hit&#124; puts hit.title}

For convenience, you might want to edit the code below to replace INSERT_YOUR_ACCESS_KEY_HERE with your actual access key and INSERT_YOUR_SECRET_ACCESS_KEY with your secret access key; otherwise [...]]]></description>
			<content:encoded><![CDATA[<p>This post includes an improved version of the <a href="http://developer.amazonwebservices.com/connect/entry.jspa?entryID=413">query example in Ruby</a> for hitting the <a href="http://www.amazon.com/gp/browse.html?node=269962011">Alexa Web Search</a> web service. Sample usage is as follows. </p>
<pre>require 'alexa'
Alexa.search('bogle').each {|hit| puts hit.title}
</pre>
<p>For convenience, you might want to edit the code below to replace INSERT_YOUR_ACCESS_KEY_HERE with your actual access key and INSERT_YOUR_SECRET_ACCESS_KEY with your secret access key; otherwise these will need to be passed in as the <tt>AWSAccessKeyId</tt> and <tt>SecretAccessKey</tt> options. </p>
<p><a href="http://thebogles.com/blog/ruby-module-for-searching-using-the-alexa-web-services-api/">Read Full Post</a>
</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/11/ruby-module-for-searching-using-alexa-web-services-api/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Ruby Wrapper for MSN Live Search API</title>
		<link>http://thebogles.com/blog/2006/11/ruby-wrapper-for-msn-live-search-api/</link>
		<comments>http://thebogles.com/blog/2006/11/ruby-wrapper-for-msn-live-search-api/#comments</comments>
		<pubDate>Fri, 10 Nov 2006 00:05:10 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/11/ruby-wrapper-for-msn-live-search-api/</guid>
		<description><![CDATA[After a couple painful hours of trial and error, I&#8217;d like to share some code that simplifies the process of accessing the MSN Live Search API from Ruby.&#160; 
The code assumes that you have auto-generated the SOAP driver for the MSN Search web services in a directory called msn_search_driver, using the following command.
wsdl2ruby &#8211;wsdl http://soap.search.msn.com/webservices.asmx?wsdl [...]]]></description>
			<content:encoded><![CDATA[<p>After a couple painful hours of trial and error, I&#8217;d like to share some code that simplifies the process of accessing the <a href="http://msdn.microsoft.com/live/search/">MSN Live Search API</a> from <a href="http://www.ruby-lang.org/en/">Ruby</a>.&nbsp; </p>
<p>The code assumes that you have auto-generated the SOAP driver for the MSN Search web services in a directory called msn_search_driver, using the following command.</p>
<blockquote><p><tt>wsdl2ruby &#8211;wsdl <a href="http://soap.search.msn.com/webservices.asmx?wsdl">http://soap.search.msn.com/webservices.asmx?wsdl</a> &#8211;type client</tt></p>
</blockquote>
<p><strong>msn_search.rb</strong> takes care of the nasty details for you, so that you can write simple code like this:</p>
<blockquote><pre>require 'msn_search'
MsnSearch.new.search("bogle").results.each {|r| puts r.url}</pre>
</blockquote>
<p><strong>&lt;RANT&gt; <br /></strong>Although it&#8217;s possible in to call the SOAP driver directly, the API is hard to use because of complex, nested request and response types, poorly documented mandatory arguments, and unhelpful error messages on invalid requests. (These shortcomings are not unique to the MSN SOAP interface&#8211; I&#8217;ve experience similar shortcomings in many other SOAP apis. REST-based APIs tend to win hands down in terms of simplicity and debuggability.&nbsp;&nbsp; </p>
<p>Note that neither Google, Yahoo, nor MSN will allow to fetch beyond the first 1000 results in a search, independent of their daily hit limits.&nbsp;If you need to use a web index for an application that&#8217;s more than a toy, you&#8217;re probably much better off using something like <a href="http://websearch.alexa.com/welcome.html">Alexa Web Search Platform</a>&nbsp;than any of the major search APIs. <strike>The downside to the Alexa platform is that C and Java are the only supported languages.&nbsp;</strike>&nbsp; The Alexa platform supports C, Java, and Ruby.&nbsp; Alexa provides&nbsp;Ruby-based tutorial on <a href="http://www.alexa.com/site/devcorner/samples?page=cis">how to build an image search application</a> using their index.<br /><strong>&lt;/RANT&gt;</strong></p>
<p>Now that I&#8217;ve got that rant off my chest, here&#8217;s the code.</p>
<pre><hr /></pre>
<pre><strong><u>msn_search.rb</u></strong></pre>
<pre>($:).push('msn_search_driver')

require &#8216;defaultDriver.rb&#8217;

class MsnSearch
	attr_accessor :driver

	def initialize(appID = &#8216;INSERT_YOUR_APP_ID_HERE&#8217;)
		@driver = MSNSearchPortType.new
		@appID = appID
	end

	def search(query, offset=0, count=50, source=&#8221;Web&#8221;,
safeSearch=&#8221;Off&#8221;, culture=&#8221;en-US&#8221;)
		s = Search.new
		s.request = with_new(SearchRequest) do |r|
			r.cultureInfo = culture
			r.safeSearch = safeSearch
			r.query = query
			r.appID = @appID
			r.requests = source_requests =
ArrayOfSourceRequestRequests.new
			source_requests &lt;&lt; with_new(SourceRequest) do |sr|
				sr.offset = offset
				sr.count = count
				sr.source = source
				sr.resultFields = &#8220;All&#8221;
			end
		end
		@driver.search(s).response.responses.sourceResponse
	end

	def set_debug_mode(dev = STDOUT)
		@driver.wiredump_dev = dev
	end

protected
	def with_new(klass)
		instance = klass.new
		yield instance
		return instance
	end

end
</pre>
<hr /><br />
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/11/ruby-wrapper-for-msn-live-search-api/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>3d Triangles in Javascript</title>
		<link>http://thebogles.com/blog/2006/11/3d-triangles-in-javascript/</link>
		<comments>http://thebogles.com/blog/2006/11/3d-triangles-in-javascript/#comments</comments>
		<pubDate>Thu, 02 Nov 2006 18:17:49 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/11/3d-triangles-in-javascript/</guid>
		<description><![CDATA[Here&#8217;s a nifty trick for&#160;real-time 3D in Javascript, via Grant Rodgers.&#160; The solution uses only Javascript, DOM, and CSS.

]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a nifty trick for&nbsp;<a href="http://www.uselesspickles.com/triangles/demo.html">real-time 3D in Javascript</a>, via <a href="http://www.jobster.com/at/person/show/14623">Grant Rodgers</a>.&nbsp; The solution uses only Javascript, DOM, and CSS.</p>
<p><a href="http://thebogles.com/blog/wp-content/uploads/2006/11/WindowsLiveWriter/3dTrianglesinJavascript_90CE/image%7B0%7D%5B5%5D.png" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="74" src="http://thebogles.com/blog/wp-content/uploads/2006/11/WindowsLiveWriter/3dTrianglesinJavascript_90CE/image%7B0%7D_thumb%5B1%5D.png" width="75" border="0"></a></p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/11/3d-triangles-in-javascript/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Named references in Rails test fixtures</title>
		<link>http://thebogles.com/blog/2006/10/named-references-in-rails-test-fixtures/</link>
		<comments>http://thebogles.com/blog/2006/10/named-references-in-rails-test-fixtures/#comments</comments>
		<pubDate>Tue, 31 Oct 2006 00:32:59 +0000</pubDate>
		<dc:creator>philbo</dc:creator>
		
	<category>General</category>
	<category>Development</category>
		<guid isPermaLink="false">http://thebogles.com/blog/2006/10/named-references-in-rails-test-fixtures/</guid>
		<description><![CDATA[Court3nay has created support for named references&#160;in test fixtures&#160;in Rails:
I&#8217;ve written some fun code to ease the pain of associating between fixtures. &#160;&#8217;Tis tested and documented! &#160;Essentially it allows you to replace this syntax
&#160; user_id: 5
with this:
&#160; user: :joe
as long as you have users.yml with
joe: 

This is a big time save for anyone creating Rails [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.caboo.se/">Court3nay</a> has created support for <a href="http://blog.caboo.se/articles/2006/10/17/named-references-for-test-fixtures">named references&nbsp;in test fixtures</a>&nbsp;in Rails:</p>
<blockquote><p>I&#8217;ve written some fun code to ease the pain of associating between <br />fixtures. &nbsp;&#8217;Tis tested and documented! &nbsp;Essentially it allows you to <br />replace this syntax
<p>&nbsp; user_id: 5
<p>with this:
<p>&nbsp; user: :joe
<p>as long as you have users.yml with
<p>joe: </p>
</blockquote>
<p>This is a big time save for anyone creating Rails tests that use associations.</p>
]]></content:encoded>
			<wfw:commentRSS>http://thebogles.com/blog/2006/10/named-references-in-rails-test-fixtures/feed/</wfw:commentRSS>
		</item>
	</channel>
</rss>
