<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>Javarants</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=dth0BVnE2xG19PBwrscPhQ</link>
      <pubDate>Thu, 20 Nov 2008 03:44:30 -0800</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <geo:lat>37.353741</geo:lat><geo:long>-122.087172</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://www.javarants.com/rss.xml" type="application/rss+xml" /><item>
         <title>Delicious/spullara on 11/17/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://news.cnet.com/8301-10787_3-10098194-60.html'&gt;Murdoch to media: You dug yourself a huge hole | Coop's Corner - CNET News&lt;/a&gt;&lt;br&gt;Cool, I was one of the bloggers! :) "To make his point, Murdoch criticized the media reaction after bloggers debunked a "60 Minutes" report by former CBS anchor, Dan Rather, that President Bush had evaded service during his days in the National Guard.
"Far from celebrating this citizen journalism, the establishment media reacted defensively. During an appearance on Fox News, a CBS executive attacked the bloggers in a statement that will go down in the annals of arrogance. &amp;#039;60 Minutes,&amp;#039; he said, was a professional organization with &amp;#039;multiple layers of checks and balances.&amp;#039; By contrast, he dismissed the blogger as &amp;#039;a guy sitting in his living room in his pajamas writing.&amp;#039; But eventually it was the guys sitting in their pajamas who forced Mr. Rather and his producer to resign."&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://news.cnet.com/8301-10787_3-10098194-60.html</guid>
         <pubDate>Mon, 17 Nov 2008 16:04:26 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/15/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/'&gt;10 Tips for Optimizing MySQL Queries (That don’t suck) | 20bits&lt;/a&gt;&lt;br&gt;Excellent practical advice for optimizing your mysql (or almost any database) queries.&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/</guid>
         <pubDate>Sat, 15 Nov 2008 15:12:10 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/14/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.techcrunch.com/2008/11/13/the-death-of-packaged-software-microsoft-store-opens-on-the-web-for-us-shoppers/'&gt;The Death Of Packaged Software: Microsoft Store Opens On The Web For U.S. Shoppers&lt;/a&gt;&lt;br&gt;It is insane that Apple didn&amp;#039;t do this first with iTunes.&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://www.techcrunch.com/2008/11/13/the-death-of-packaged-software-microsoft-store-opens-on-the-web-for-us-shoppers/</guid>
         <pubDate>Fri, 14 Nov 2008 14:49:19 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/10/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.webmonkey.com/blog/Someday_You_Will_Not_Hate_the_CSS3_Advanced_Layout'&gt;Someday You Will Not Hate the CSS3 Advanced Layout - Webmonkey&lt;/a&gt;&lt;br&gt;Seems a hell of a lot easier than floats and clears.&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://www.webmonkey.com/blog/Someday_You_Will_Not_Hate_the_CSS3_Advanced_Layout</guid>
         <pubDate>Mon, 10 Nov 2008 17:39:27 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/09/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://nagiworld.net/2008/11/oauth-ify-this-2-legged-oauth-service-for-yql'&gt;Nagesh Susarla’s Blog » Blog Archive » OAuth-ify this: 2 Legged OAuth service for YQL&lt;/a&gt;&lt;br&gt;I have OAuthproxy.com if you want to deploy it on there :)&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://nagiworld.net/2008/11/oauth-ify-this-2-legged-oauth-service-for-yql</guid>
         <pubDate>Sun, 09 Nov 2008 10:23:27 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/08/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://blog.unto.net/'&gt;unto.net&lt;/a&gt;&lt;br&gt;Seems like we ought to standardize the mapping of email addresses to openid providers through DNS or some similar channel.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://500hats.typepad.com/500blogs/2008/11/successful-plat.html'&gt;Master of 500 Hats: Successful Developer Platforms Have 3 Things: Features, Users, Money.&lt;/a&gt;&lt;br&gt;"Yahoo continues to choke on both feet planted firmly next to its own tonsils, but they still do some great work on platforms &amp;amp; developer communities. If only they can show a little business leadership &amp;amp; stability, they&amp;#039;ll be around."&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.guardian.co.uk/environment/2008/nov/09/miniature-nuclear-reactors-los-alamos'&gt;Mini nuclear plants to power 20,000 homes | Environment | The Observer&lt;/a&gt;&lt;br&gt;This would quite possibly be the most awesome thing ever. Thank god people have woken up and realized that nuclear power can be used for good. Though it would really be $2500/home.&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://blog.unto.net/</guid>
         <pubDate>Sat, 08 Nov 2008 23:48:16 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/07/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://weblogs.java.net/blog/vivekp/archive/2008/11/new_and_improve_1.html'&gt;Vivek Pandey's Blog: New and improved GlassFish gem&lt;/a&gt;&lt;br&gt;Super simple rails deployment.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://blogs.zdnet.com/Burnette/?p=680'&gt;Worst. Bug. Ever. | Ed Burnette’s Dev Connection | ZDNet.com&lt;/a&gt;&lt;br&gt;Hmm. That is an extremely amazing bug. Don&amp;#039;t type rm -rf /.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://grails.org/GrailsUI Plugin'&gt;Grails - GrailsUI Plugin&lt;/a&gt;&lt;br&gt;Very cool. Can&amp;#039;t wait to play with this. I&amp;#039;m a big fan of YUI.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.sfgate.com/webdb/prop8/'&gt;Proposition 8 Contributions&lt;/a&gt;&lt;br&gt;It seems like a transparent government could quickly lead to voter intimidation. Showing who/what individuals contributed to is about the same as exposing their actual vote. I could imagine this being used for evil.&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://weblogs.java.net/blog/vivekp/archive/2008/11/new_and_improve_1.html</guid>
         <pubDate>Fri, 07 Nov 2008 16:52:46 -0800</pubDate>
      </item>
      <item>
         <title>Delicious/spullara on 11/04/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://blog.rectalogic.com/2008/08/virtualizing-mac-os-x-leopard-client.html'&gt;rectalogic: Virtualizing Mac OS X Leopard Client&lt;/a&gt;&lt;br&gt;Cool. Have to try this when I get home.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.guardian.co.uk/world/oliverburkemanblog/2008/oct/30/uselections2008'&gt;Oliver Burkeman's Campaign Diary: CNN's hologram plan for election night interviews |&lt;/a&gt;&lt;br&gt;This sounds really cool. I wonder if the Emperor will also be joining.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.uspto.gov/ebc/efs_help.html'&gt;EFS-Web Help&lt;/a&gt;&lt;br&gt;Eletronic submission of patent applications... interesting.&lt;/p&gt;</description>
         <author>spullara</author>
         <guid isPermaLink="false">http://blog.rectalogic.com/2008/08/virtualizing-mac-os-x-leopard-client.html</guid>
         <pubDate>Tue, 04 Nov 2008 15:53:46 -0800</pubDate>
      </item>
      <item>
         <title>Time Machine vs. ZFS + rsync</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/437636019/</link>
         <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I actually got the fslogger thing at the end of this entry working so I can do incremental backups. Not really a product yet but it isn&amp;#8217;t hard to do. &lt;a rel="nofollow" target="_blank" href="http://buildandtest.com/files/rlogsync.tar.gz"&gt;Here is the super rough version of it.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I can&amp;#8217;t stand inefficiency. Time Machine is fundamentally a very inefficient mechanism for backing up large files that change. So bad actually that most things like Parallels and VMWare disable backups of your disk images. Here is the basic algorithm:&lt;/p&gt;
&lt;p&gt;1) Get the list of files that have changed since the last backup&lt;br /&gt;
2) Create new directory in backup store&lt;br /&gt;
3) Copy any file that has changed since the last backup&lt;br /&gt;
4) Create hard links to any file or even whole directory in the new backup to the last backup for any file that has not changed&lt;/p&gt;
&lt;p&gt;Step 1 is pretty efficient for Time Machine as they keep hooks into the filesystem to track those changes as they occur. Step 2 is obviously easy. Step 3 is a doosy. If you change 1 byte in a VMWare image it will copy the several gigs over to the backup store. Not a great result from such small change and that would quickly consume your disk flushing valuable older changes out of the system. Step 4 is also very efficient because hard links are trivial to create and use virtually no space, though they did have to make special changes to HFS+ so that you could hard link directories to make Time Machine more efficient.&lt;/p&gt;
&lt;p&gt;The obvious big problem here is that in the case that a file changes at all you need to copy the whole thing to you backup device. Not that viable over the internet or even WiFi for really big files that are updated often like VM images. You might have wondered why Apple is considering integrating ZFS directly into Mac OS X, now you know why. ZFS lets you do something very special: create a snapshot of a whole filesystem. Essentially a copy of that filesystem at a particular point in time and they do this without copying whole files when they change but instead at the block level. This amazing capability is critical in this more efficient way to backup your system with multi-level snapshots.&lt;/p&gt;
&lt;p&gt;Enter &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Rsync"&gt;rsync&lt;/a&gt;. Rsync has been around for a long time. It is used by system adminstrators everywhere to efficiently update files in one location with files from another location, even over the internet. It does this by comparing them at the block level and only sending diffs when needed to update files on the other end. Using the right command line options you can essentially make one filesystem look like a carbon copy of another filesystem. Using this in combination you can make a backup solution that is much better than most out there:&lt;/p&gt;
&lt;p&gt;1) Rsync your current filesystem to a ZFS filesystem &amp;#8212; remote or attached storage&lt;br /&gt;
2) Take a snapshot of the resulting filesystem to forever capture its state&lt;/p&gt;
&lt;p&gt;Those are the two steps. Nothing more. Here is the script that I use to backup my Macbook Air to my server at home:&lt;/p&gt;
&lt;pre&gt;
#!/bin/sh
cd /Users
time rsync -av --delete sam 192.168.1.90:/Volumes/zdisk/macbookair
ssh 192.168.1.90 sudo zfs snapshot zdisk/macbookair@`date "+%s"`
&lt;/pre&gt;
&lt;p&gt;This results in a set of filesytems that looks like this:&lt;/p&gt;
&lt;pre&gt;
zdisk/macbookair 14.9G 898G 14.6G /Volumes/zdisk/macbookair
zdisk/macbookair@1225350709 125M - 14.6G -
zdisk/macbookair@1225351248 117M - 14.6G -
zdisk/macbookair@1225418584 21.7M - 14.6G -
&lt;/pre&gt;
&lt;p&gt;This obviously isn&amp;#8217;t as awesome as using Time Machine to recover my files because I don&amp;#8217;t have a great UI, I have to run a script and generally have to know more about the system than a Time Machine user. However&amp;#8230; I can update a VM without sending gigs of data over the internet to back it up or deal with not having a backup at all.&lt;/p&gt;
&lt;p&gt;The only downside is that an empty backup still takes about 8 minutes to go through all my files. Next step would be to integrate into the fslogger into the solution and only look at those files that changed for sure.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=qZA7M"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=qZA7M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=9VEXM"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=9VEXM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/437636019" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=916</guid>
         <pubDate>Thu, 30 Oct 2008 20:17:18 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/10/30/time-machine-vs-zfs-rsync/</feedburner:origLink></item>
      <item>
         <title>Yahoo! Application Platform (YAP) and Yahoo! Query Language (YQL) launch today</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/435258246/</link>
         <description>&lt;p&gt;Since I moved into the platform group at the beginning of the year I had worked with the &lt;a rel="nofollow" target="_blank" href="http://developers.yahoo.com/yap"&gt;YAP&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://developers.yahoo.com/yql"&gt;YQL&lt;/a&gt; teams to help them define their strategy and direction but without being part of the day-to-day operations. In August, the head of the Y!OS project asked me to step in to take them through their final run to launch. It has been a great couple of months working with the teams. They both had an amazing showing at Hack Day and now today we are launching the platforms worldwide.&lt;/p&gt;
&lt;p&gt;Over the next few months and into 2009 YAP will be rolling across Yahoo!. Developers will be able to embed their applications in places like My Yahoo, Frontpage, Media properties and Mail. YQL will continue to be extended to other services by Yahoo! and through a plugin API in the future. Please check out the announcements at the &lt;a rel="nofollow" target="_blank" href="http://ycorpblog.com/2008/10/28/were-open-have-at-it/"&gt;Yodel&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.net/blog/archives/2008/10/yos_10_launch.html"&gt;YDN&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://opensocialapis.blogspot.com/2008/10/launched-yahoos-first-implementation-of.html"&gt;OpenSocial blog.&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=tE4HM"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=tE4HM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=NDkWM"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=NDkWM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/435258246" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=909</guid>
         <pubDate>Tue, 28 Oct 2008 15:40:32 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/10/28/yahoo-application-platform-yap-and-yahoo-query-language-yql-launch-today/</feedburner:origLink></item>
      <item>
         <title>2008 Olympic Medal Counts by Population</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/373657930/</link>
         <description>&lt;p&gt;There are obviously a lot of ways to measure how well a country did at the Olympics. This post takes a view that we should look at how many people the country had to draw on in order to send the athletes to China to compete. There are a lot of problems with this including: ex-pats competing for their home country, vast disparity in wealth between countries and the relative interest in the Olympic games of the cultures. One of the things that jumps out immediately is that island nations that draw on a larger related population do very well in the games. They likely have inherited not only the interest in the competition but are also wealthy enough to train and compete in the games.&lt;/p&gt;
&lt;p&gt;One of the things that was interesting in putting this together was that I eventually settled on &lt;a rel="nofollow" target="_blank" href="http://www.powerset.com"&gt;PowerSet&lt;/a&gt;&lt;noscript&gt;&lt;a rel="nofollow" target="_blank" href="http://www.sibresource.ru/"&gt;&amp;#1083;&amp;#1072;&amp;#1085;&amp;#1076;&amp;#1096;&amp;#1072;&amp;#1092;&amp;#1090;&lt;/a&gt;&lt;/noscript&gt; as the easiest way to lookup the population of a country. Both Yahoo and Google will give shortcuts to many of them, they don&amp;#8217;t do it for all of them. Though PowerSet gets this population data through &lt;a rel="nofollow" target="_blank" href="http://www.freebase.com"&gt;Freebase&lt;/a&gt;, Freebase itself doesn&amp;#8217;t have a great search interface.&lt;/p&gt;
&lt;p&gt;If I was going to declare an overall country winner for the games I would likely choose Australia. I&amp;#8217;ve highlighted the top-10 total medal winners in the table in blue and they are far ahead of anyone else in the top-10 on a people / medal basis.&lt;/p&gt;
&lt;p&gt;  &amp;nbsp;&lt;/p&gt; 
&lt;p&gt; &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=PQGy4K"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=PQGy4K" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=uUrgmK"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=uUrgmK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/373657930" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=882</guid>
         <pubDate>Sun, 24 Aug 2008 12:25:18 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/08/24/2008-olympic-medal-counts-by-population/</feedburner:origLink></item>
      <item>
         <title>Yuil is dead! 4hoursearch is now online.</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/353092429/</link>
         <description>&lt;p&gt;As this was really just a demonstration of the power of &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/search/boss/"&gt;Yahoo! BOSS,&lt;/a&gt; I have brought the site back as a demonstration site. Additionally, &lt;a rel="nofollow" target="_blank" href="http://www.yahoo.com"&gt;Yahoo!&lt;/a&gt; is making the source code to the new site available so anyone with a knack for Python, HTML and CSS can take a swipe at making a better search experience. In order to make a nice UI I teamed up with another Sam, &lt;a rel="nofollow" target="_blank" href="http://sam.besigner.com"&gt;Sam Lind&lt;/a&gt;. I put together the skeleton using Yahoo!&amp;#8217;s amazing &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt; tools and he created the look and feel. Please try it out and take advantage of Yahoo!&amp;#8217;s open search API:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a rel="nofollow" title="4hoursearch" target="_blank" href="http://www.4hoursearch.com"&gt;&lt;img class="aligncenter" src="http://buildandtest.com/files/4hoursearch.png" alt="" width="435" height="220"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Why &lt;a rel="nofollow" target="_blank" href="http://www.4hoursearch.com"&gt;4hoursearch&lt;/a&gt;? It took 4 hours to write the initial code, 4 hours for it to go from unknown to 20 hits / second, 4 hours looking for a domain name and 4 hours to build the brand new UI. Fortunately, it won&amp;#8217;t take 4 hours to find something with it &lt;img src='http://www.javarants.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley'/&gt; &lt;/p&gt;
&lt;p&gt;If you want the classic list of links, now enhanced with &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/searchmonkey/"&gt;SearchMonkey&lt;/a&gt; results, you can always start &lt;a rel="nofollow" target="_blank" href="http://search.yahoo.com"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=6TwKcK"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=6TwKcK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=CAtL2K"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=CAtL2K" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/353092429" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=880</guid>
         <pubDate>Fri, 01 Aug 2008 15:22:07 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/08/01/yuil-is-dead-4hoursearch-is-now-online/</feedburner:origLink></item>
      <item>
         <title>Yahoo! BOSS is easy &amp;#8212; meet Yuil</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/350328879/</link>
         <description>&lt;p style="text-align:left;"&gt;&lt;strong&gt;Updated Yet Again: Relaunched as &lt;/strong&gt;&lt;a rel="nofollow" target="_blank" href="http://www.4hoursearch.com"&gt;&lt;strong&gt;4hoursearch&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; including the source code. See this &lt;/strong&gt;&lt;a rel="nofollow" target="_blank" href="http://www.javarants.com/2008/08/01/yuil-is-dead-4hoursearch-is-now-online/"&gt;&lt;strong&gt;blog entry&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated Again: Yuil is dead. However, you can always get the same great search results &lt;/strong&gt;&lt;a rel="nofollow" target="_blank" href="http://search.yahoo.com"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated: Using Glue I was able to add some &lt;/strong&gt;&lt;a rel="nofollow" target="_blank" href="http://sampullara.appspot.com/search?q=friend&amp;amp;sl=long"&gt;&lt;strong&gt;simple category functionality&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure everyone saw the recent announcement of a new search engine, &lt;a rel="nofollow" target="_blank" href="http://www.cuil.com"&gt;Cuil&lt;/a&gt;. I thought I would have a little fun with it and put together a quick parody of it by mashing up their UI and Yahoo!&amp;#8217;s search results. As usual, the biggest problems I had were related to my pathetic Python skills. I&amp;#8217;d love to add the category stuff in (Yahoo! has that info as you can see in &lt;a rel="nofollow" target="_blank" href="http://tools.search.yahoo.com/newsearch/searchassist"&gt;search assist&lt;/a&gt;) but BOSS doesn&amp;#8217;t yet have that in the API. But it does have web and image search and even search suggestions. Here is the one, the only, the amazing:&lt;/p&gt;
&lt;p&gt;It was great fun to hack together. Check out the &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/search/boss/"&gt;BOSS APIs&lt;/a&gt;. Maybe I should have converted the UI to YUI as well&amp;#8230;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=leqIMJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=leqIMJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=qsMobJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=qsMobJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/350328879" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=879</guid>
         <pubDate>Wed, 30 Jul 2008 02:01:40 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/07/30/yahoo-boss-is-easy-meet-yuil/</feedburner:origLink></item>
      <item>
         <title>Better Javadoc results using SearchMonkey</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/293704111/</link>
         <description>&lt;p&gt;When you are searching for things like &lt;a rel="nofollow" title="Search for java.util.HashMap" target="_blank" href="http://search.yahoo.com/search?p=java.util.HashMap"&gt;java.util.HashMap&lt;/a&gt; one of the issues that you run into is that it will give you the result with the highest rank which more often than not is the 1.4.2 version of the documentation. &amp;nbsp;I&amp;#8217;ve moved on from that version of Java and would much rather see results for version 6. &amp;nbsp;I actually did this plugin back in December for the first &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/searchmonkey/"&gt;SearchMonkey&lt;/a&gt; hackday and won &amp;#8220;most useful&amp;#8221; as it could be extended to any type of versioned documentation you might find on the web. &amp;nbsp;Today I&amp;#8217;ll also include my plugin for MySQL but I&amp;#8217;ll use Java as the example.&lt;/p&gt;
&lt;p&gt;Here is the normal search result that you get on Yahoo:&lt;/p&gt;
&lt;p&gt;&lt;img style="border:1px solid black;" src="http://buildandtest.com/files/javautilhashmapnormal.png" alt="Normal search result" width="592" height="76"/&gt;&lt;/p&gt;
&lt;p&gt;What I would like to do is give some more options for the user. &amp;nbsp;Eventually I expect that SearchMonkey might allow per user preferences, but in the interim, I&amp;#8217;ll produce links for 1.4.2, 1.5, 1.6 and a link to the entries package page:&lt;/p&gt;
&lt;p&gt;&lt;img style="border:1px solid black;" src="http://buildandtest.com/files/javautilhashmapenhanced.png" alt="Enhanced search result" width="560" height="117"/&gt;&lt;/p&gt;
&lt;p&gt;This gives you direct access to other versions of the classes documentation from the search result page without having to qualify your search terms or scroll through pages of results looking for the one most relevant to you as a developer. &amp;nbsp;To create this enhanced result go to the &lt;a rel="nofollow" title="SearchMonkey Developer Tool" target="_blank" href="http://developer.search.yahoo.com/wizard/index"&gt;SearchMonkey Developer Tool&lt;/a&gt; and create a new application. &amp;nbsp;Choose Enhanced Result rather than Infobar. &amp;nbsp;The URL pattern that I used was &amp;#8220;*.java.sun.com/*&amp;#8221;. &amp;nbsp;Obviously the real work is done in the PHP code for the appearance of the enhanced result:&lt;/p&gt;
&lt;pre&gt;public static function getOutput() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret = array();&amp;nbsp;&amp;nbsp;&amp;nbsp; $classname = Data::get('yahoo:index/dc:identifier');
&amp;nbsp;&amp;nbsp;&amp;nbsp; $pattern = "/.*&amp;#92;/docs&amp;#92;/api&amp;#92;/(.*&amp;#92;/[A-Z].*).html/";
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (preg_match($pattern, $classname, $matches)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; $classname = $matches[1];
&amp;nbsp;&amp;nbsp;&amp;nbsp; $link = $classname;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $classname = str_replace("/", ".", $classname);
&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp; return $ret;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } /* pull the package reference out */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (preg_match("/(.*)&amp;#92;.([^.]+)/", $classname, $matches)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; $packagename = $matches[1];
&amp;nbsp;&amp;nbsp;&amp;nbsp; } /* change the title to the name of the class */
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['title'] = $classname; // Deep links - up to 4
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][0]['text'] = "1.6.0";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][0]['href'] = "http://java.sun.com/javase/6/docs/api/" . $link . ".html";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][1]['text'] = "1.5.0";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][1]['href'] = "http://java.sun.com/j2se/1.5.0/docs/api/" . $link . ".html";;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][2]['text'] = "1.4.2";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][2]['href'] = "http://java.sun.com/j2se/1.4.2/docs/api/" . $link . ".html";
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][3]['text'] = $packagename;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $ret['links'][3]['href'] = "http://java.sun.com/javase/6/docs/api/" . str_replace(".", "/", $packagename) . "/package-summary.html"; return $ret;
}&lt;/pre&gt;
&lt;p&gt;Once that is done you confirm that you are finished and you will then see these enhanced result when you use &lt;a rel="nofollow" title="Alpha Search" target="_blank" href="http://www.javarants.com/wp-admin/alpha.search.yahoo.com"&gt;alpha.search.yahoo.com&lt;/a&gt;. &amp;nbsp;Here are links to my applications that you can import into your own developer environment:&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.javarants.com/wp-content/uploads/2008/05/javadoc-smapp.txt"&gt;javadoc-smapp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.javarants.com/wp-content/uploads/2008/05/mysql-smapp.txt"&gt;mysql-smapp&lt;/a&gt;&lt;font style="overflow:hidden;height:0;width:0;"&gt;&lt;a rel="nofollow" target="_blank" href="http://kvantservice.com/"&gt;компютри&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=kXHVFH"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=kXHVFH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=LyRSZH"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=LyRSZH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/293704111" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=874</guid>
         <pubDate>Mon, 19 May 2008 12:00:13 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/05/19/better-javadoc-results-using-searchmonkey/</feedburner:origLink></item>
      <item>
         <title>Code Changes on 05/07/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=22&amp;to=23'&gt;dbmapper 23: [ISSUE-6] close those result sets.&lt;/a&gt;&lt;br&gt;spullara on Wed May 07 16:02:02 PDT 2008&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/main/java/com/moonspider/dbmap/DB.java&amp;from=22&amp;to=23'&gt;/trunk/src/main/java/com/moonspider/dbmap/DB.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/main/java/com/moonspider/dbmap/DBTable.java&amp;from=22&amp;to=23'&gt;/trunk/src/main/java/com/moonspider/dbmap/DBTable.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=22&amp;to=23</guid>
         <pubDate>Wed, 07 May 2008 16:02:02 -0700</pubDate>
      </item>
      <item>
         <title>Idiomatic Python?</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/276374750/</link>
         <description>&lt;p&gt;I&amp;#8217;ve been working my way through compiling Java into Python code but the Python back end of my isn&amp;#8217;t that good (my brain). I would call my stage of Python development the &amp;#8220;magic incantation&amp;#8221; stage. This is the stage where you really aren&amp;#8217;t comfortable yet with the way things work in a new language but you can still get things done by miming other developers. I&amp;#8217;ve also had some help from some friends on &lt;a rel="nofollow" target="_blank" href="http://twitter.com/spullara"&gt;Twitter&lt;/a&gt;: @&lt;a rel="nofollow" target="_blank" href="http://twitter.com/lhl"&gt;lhl&lt;/a&gt;, @&lt;a rel="nofollow" target="_blank" href="http://twitter.com/precipice"&gt;precipice&lt;/a&gt; and @&lt;a rel="nofollow" target="_blank" href="http://twitter.com/jkwatson"&gt;jkwatson&lt;/a&gt;. My distributed information system is now getting some redundancy. Little did they know that I was doing parallel invocations of identical requests for reliability and incrementally higher performance &amp;#8212; and the results were verified using a quorum of responders.&lt;/p&gt;
&lt;p&gt;Here is my first service that I am porting. It takes an RSS feed (in JSON format from Pipes) and combines all the entries from each day into a single entry:&lt;/p&gt;
&lt;pre&gt;
import logging
import wsgiref.handlers from datetime import date
from google.appengine.ext import webapp
from django.utils import simplejson class DayBinPipesWebService (webapp.RequestHandler): def post(self): now = date.today() now = now.strftime("%m/%d/%Y") data = self.request.get("data") items = simplejson.loads(data)["items"] bins = {} for item in items: published = item["y:published"] updateDay = "%(month)02d/%(day)02d/%(year)04d" % published if now != updateDay: bin = bins.get(updateDay, []) bin.append(item) bins[updateDay] = bin entries = [] for bin in bins.items(): dayDate = bin[0] binEntries = bin[1] first = binEntries[0].copy() first["description"] = "" for e in binEntries: first["description"] += "&amp;lt;p&amp;gt;&amp;lt;a href='%(link)s'&amp;gt;%(title)s&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;%(description)s&amp;lt;/p&amp;gt;" % e first["title"] = "Items from " + dayDate first["link"] = "" entries.append(first) self.response.content_type = "application/json" simplejson.dump(entries, self.response.out)
&lt;/pre&gt;
&lt;p&gt;How would you write this in idiomatic Python as opposed to my rudimentary translation? Would you change the whole design?&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=U3KqKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=U3KqKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=k8bddI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=k8bddI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/276374750" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=873</guid>
         <pubDate>Wed, 23 Apr 2008 11:19:51 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/04/23/idiomatic-python/</feedburner:origLink></item>
      <item>
         <title>Tivo targeted advertising</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/276005868/</link>
         <description>&lt;style type="text/css"&gt;
.flickr-photo {border:solid 2px #000000;}
.flickr-yourcomment {}
.flickr-frame {text-align:left;padding:3px;}
.flickr-caption {font-size:0.8em;margin-top:0px;}
&lt;/style&gt;
&lt;div class="flickr-frame"&gt; &lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/spullara/2434706426/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3121/2434706426_3fdeab16d0.jpg" class="flickr-photo" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt; &lt;span class="flickr-caption"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/spullara/2434706426/"&gt;Tivo targeted advertising&lt;/a&gt;, originally uploaded by &lt;a rel="nofollow" target="_blank" href="http://www.flickr.com/people/spullara/"&gt;Sam Pullara&lt;/a&gt;.&lt;/span&gt;
&lt;/div&gt;
&lt;p class="flickr-yourcomment"&gt; This looks like it might be both effective and also something that TV advertisers would like to buy.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=whntxI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=whntxI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=NrCKrI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=NrCKrI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/276005868" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/2008/04/23/tivo-targeted-advertising/</guid>
         <pubDate>Wed, 23 Apr 2008 00:52:43 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/04/23/tivo-targeted-advertising/</feedburner:origLink></item>
      <item>
         <title>Using Google App Engine to Extend Yahoo! Pipes</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/269770750/</link>
         <description>&lt;p&gt;Update: A commenter pointed out that you can
&lt;pre&gt;from django.utils import simplejson&lt;/pre&gt;
&lt;p&gt; instead of including it. Makes this even easier.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://pipes.yahoo.com"&gt;Yahoo! Pipes&lt;/a&gt; has always been a great tool for manipulating data but often you have to go to great contortions to get it to do what you want because of its very simple data flow programming model. &lt;a rel="nofollow" target="_blank" href="http://appengine.google.com"&gt;Google&amp;#8217;s App Engine &lt;/a&gt;opens up the possibility of extending Yahoo! Pipes in very interesting ways through Pipes&amp;#8217; Web Service operator. Currently this operator sees little use as it requires you to be running an external server somewhere on the internet that is always available for the Pipe execution which is quite a high barrier to entry for the typical Pipes developer. Here is what a Pipe that is using web service looks like and our example pipe:&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" title="Web Services Example Pipe" target="_blank" href="http://pipes.yahoo.com/spullara/mirror"&gt;&lt;img src="http://buildandtest.com/files/pipeusingwebservice.png" alt="Web Service Pipes Example" width="676" height="585"/&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;With the launch of Google App Engine there is now a very simple way to get code up on the internet quickly in order to include arbitrary processing in the interior of your Pipes.&lt;/p&gt;
&lt;p&gt;To demonstrate how this works, let&amp;#8217;s first build a very simple web service that simply mirrors the data that it receives from Pipes. If you don&amp;#8217;t have a Google App Engine account you can still follow along by download the &lt;a rel="nofollow" target="_blank" href="http://code.google.com/appengine/"&gt;SDK&lt;/a&gt; and executing all the stuff locally though it will have to be accessible from the public internet if you want Pipes to send you requests.&lt;/p&gt;
&lt;p&gt;First create a new application directory:&lt;/p&gt;
&lt;pre&gt;mkdir pipes-mirror
cd pipes-mirror &lt;/pre&gt;
&lt;p&gt;Now create an application descriptor called app.yaml:&lt;/p&gt;
&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt;application: javarants
version: 1
runtime: python
api_version: 1 handlers:
- url: /.* script: pipes.py&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;This application descriptor basically tells Google how to deploy your application. Your application name should match an application name that you create within the GAE administration tool:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://buildandtest.com/files/applicationname.png" alt="Application Name" width="495" height="161"/&gt;&lt;/p&gt;
&lt;p&gt;Now we need to process the data coming from pipes. Pipes is going to pass this web service some data in JSON format and we need to parse it. GAE doesn&amp;#8217;t include &amp;#8216;&lt;code&gt;simplejson&lt;/code&gt;&amp;#8216; in the Python container so you are going to have to include it with your application. I downloaded &lt;a rel="nofollow" target="_blank" href="http://pypi.python.org/pypi/simplejson"&gt;simplejson-1.8.1&lt;/a&gt; and symbolically linked its &lt;code&gt;simplejson&lt;/code&gt; directory into my application directory. When the request comes in the JSON data will be in the &amp;#8216;&lt;code&gt;data&lt;/code&gt;&amp;#8216; parameter so we are going to pull it out, parse it, grab the &lt;code&gt;items&lt;/code&gt; array and write it back over the wire in pipes.py:&lt;/p&gt;
&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;import&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; simplejson
&lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;import&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; wsgiref.handlers &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;from&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; google.appengine.ext &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;import&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; webapp &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;class&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; MirrorPipesWebService (webapp.RequestHandler): &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;def&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; post(self): data = self.request.get(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"data"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) obj = simplejson.loads(data) obj = obj[&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"items"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;] self.response.content_type = &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"application/json"
&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; simplejson.dump(obj, self.response.out) &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;def&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; main(): application = webapp.WSGIApplication([(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;'/mirror'&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;, MirrorPipesWebService)], debug=True) wsgiref.handlers.CGIHandler().run(application) &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; __name__ == &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"__main__"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;: main()&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Now you should have a directory structure that looks a lot like this:&lt;/p&gt;
&lt;pre&gt;-rw-r--r--@ 1 sam sam 106 Apr 13 18:55 app.yaml
-rw-r--r-- 1 sam sam 559 Apr 13 19:28 pipes.py
lrwxr-xr-x 1 sam sam 47 Apr 13 17:40 simplejson -&amp;gt; /Users/sam/Software/simplejson-1.8.1/simplejson&lt;/pre&gt;
&lt;p&gt;Now that we have all the pieces we can deploy the application to GAE with a simple command from the GAE SDK:&lt;/p&gt;
&lt;pre&gt;appcfg.py update .&lt;/pre&gt;
&lt;p&gt;At this point you should be able to replace my &lt;a rel="nofollow" target="_blank" href="http://javarants.appspot.com/mirror"&gt;web service URL&lt;/a&gt; that you find in my example Pipe with your application URL which will be
&lt;pre&gt;http://[application name].appspot.com/mirror&lt;/pre&gt;
&lt;p&gt; and get the same results as mine.&lt;/p&gt;
&lt;p&gt;What kind of uses can you put this great power? I currently have a web service that I run that combines RSS entries from the same day into a single entry and have it deployed on my own server. I will likely port that to GAE as it doesn&amp;#8217;t require a lot of CPU and it is a pain having to administer it. In fact, most of the functionality that you see in a service like &lt;a rel="nofollow" target="_blank" href="http://feedburner.com"&gt;FeedBurner&lt;/a&gt; would be easy to build on top of this framework. More exotic use cases can be found on Y! Pipes itself where at least one person uses web services to pass in &lt;a rel="nofollow" target="_blank" href="http://pipes.yahoo.com/pipes/pipe.info?_id=qKDcUk1r3BGBg4HtODY80A"&gt;photo URLs and return the coordinates of human faces&lt;/a&gt; in the images.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=YxaxTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=YxaxTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=jvbYfI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=jvbYfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/269770750" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/?p=871</guid>
         <pubDate>Sun, 13 Apr 2008 19:59:45 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/04/13/using-google-app-engine-to-extend-yahoo-pipes/</feedburner:origLink></item>
      <item>
         <title>Code Changes on 03/25/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=16&amp;to=17'&gt;cli-parser 17: fix array defaut values in the usage printout&lt;/a&gt;&lt;br&gt;spullara on Tue Mar 25 10:21:46 PDT 2008&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/src/main/java/com/sampullara/cli/Args.java&amp;from=16&amp;to=17'&gt;/trunk/src/main/java/com/sampullara/cli/Args.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=16&amp;to=17</guid>
         <pubDate>Tue, 25 Mar 2008 10:21:46 -0700</pubDate>
      </item>
      <item>
         <title>JPA 2.0 with Criteria</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/252228026/</link>
         <description>&lt;p&gt;(see: &lt;a rel="nofollow" target="_blank" href="http://www.sdtimes.com/content/article.aspx?ArticleID=31655"&gt;JSR 317 Persistently Improving&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I love the idea of adding a criteria API to JPA, the only thing I hope that they do differently than Hibernate is to implement that API in addition to string queries. In Gauntlet we had issues where we wanted to use EJB-QL for selecting the right data and then a criteria-like API for applying security and filtering constraints on the query. We ended up writing a criteria-like API that augmented the WHERE clause of the query to get the behavior that we needed (like described &lt;a rel="nofollow" target="_blank" href="http://www.javalobby.org/articles/hibernatequery102/"&gt;here&lt;/a&gt;). For example, you could do this:&lt;/p&gt;
&lt;pre&gt;
Query q = em.createQuery("SELECT p FROM Project p");
q.addExpression(Expression.notEqual("id", 2));
&lt;/pre&gt;
&lt;p&gt;Or something like that. This would give you the best of both worlds, where you have the expressiveness of the textual query and the ability to further hone that query programmatically.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=xRV5gI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=xRV5gI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=F5ylwI"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=F5ylwI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/252228026" height="1" width="1"/&gt;</description>
         <author>sam</author>
         <guid isPermaLink="false">http://www.javarants.com/2008/03/15/jpa-20-with-criteria/</guid>
         <pubDate>Sat, 15 Mar 2008 18:51:12 -0700</pubDate>
      <feedburner:origLink>http://www.javarants.com/2008/03/15/jpa-20-with-criteria/</feedburner:origLink></item>
      <item>
         <title>Code Changes on 03/11/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=54&amp;to=55'&gt;dbmigrate 55: Ignore maven target directory&lt;/a&gt;&lt;br&gt;mick.brooks on Tue Mar 11 03:57:17 PDT 2008&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk&amp;from=54&amp;to=55'&gt;/trunk&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=53&amp;to=54'&gt;dbmigrate 54: Add a simple parser for SQL statements: fixes case where a semi-colon character
inside a single-quoted string would prematurely terminate the current
statement.&lt;/a&gt;&lt;br&gt;mick.brooks on Tue Mar 11 03:52:15 PDT 2008&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/java/com/sampullara/db/SqlStatementParserTest.java'&gt;/trunk/src/test/java/com/sampullara/db/SqlStatementParserTest.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/src/main/java/com/sampullara/db/Migrate.java&amp;from=53&amp;to=54'&gt;/trunk/src/main/java/com/sampullara/db/Migrate.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/java/com/sampullara/db/SqlStatementParser.java'&gt;/trunk/src/main/java/com/sampullara/db/SqlStatementParser.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=54&amp;to=55</guid>
         <pubDate>Tue, 11 Mar 2008 03:57:17 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 03/06/2008</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=21&amp;to=22'&gt;dbmapper 22: map BINARY columns to byte[] instead of java.io.Serializable&lt;/a&gt;&lt;br&gt;realjolly on Thu Mar 06 09:49:05 PST 2008&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/main/java/com/moonspider/dbmap/ColumnConfig.java&amp;from=21&amp;to=22'&gt;/trunk/src/main/java/com/moonspider/dbmap/ColumnConfig.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=21&amp;to=22</guid>
         <pubDate>Thu, 06 Mar 2008 09:49:05 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 12/23/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=52&amp;to=53'&gt;dbmigrate 53: update dependencies and make the scripts a little more undeprecated&lt;/a&gt;&lt;br&gt;spullara on Sun Dec 23 16:00:24 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/plugin/scripts/CreateMigration.groovy&amp;from=52&amp;to=53'&gt;/trunk/plugin/scripts/CreateMigration.groovy&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/plugin/scripts/Migrate.groovy&amp;from=52&amp;to=53'&gt;/trunk/plugin/scripts/Migrate.groovy&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/pom.xml&amp;from=52&amp;to=53'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=52&amp;to=53</guid>
         <pubDate>Sun, 23 Dec 2007 16:00:24 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 12/15/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=51&amp;to=52'&gt;dbmigrate 52: add a full assembly packaging step for making a standalone executable&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 13:43:10 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;D /trunk/test&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/pom.xml&amp;from=51&amp;to=52'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=20&amp;to=21'&gt;dbmapper 21: add a full assembly packaging step for making a standalone executable&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 13:41:13 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/pom.xml&amp;from=20&amp;to=21'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=19&amp;to=20'&gt;dbmapper 20: convert to maven project&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 13:27:59 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources/com/moonspider/dbmap/hibernate.template'&gt;/trunk/src/main/resources/com/moonspider/dbmap/hibernate.template&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main'&gt;/trunk/src/main&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/java'&gt;/trunk/src/main/java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/test/resources'&gt;/trunk/src/test/resources&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources/com/moonspider/dbmap/jpa.template'&gt;/trunk/src/main/resources/com/moonspider/dbmap/jpa.template&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/test/java/com'&gt;/trunk/src/test/java/com&lt;/a&gt;&lt;br&gt;D /trunk/src/com&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources/com/moonspider/dbmap'&gt;/trunk/src/main/resources/com/moonspider/dbmap&lt;/a&gt;&lt;br&gt;R &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/test/java/com/moonspider'&gt;/trunk/src/test/java/com/moonspider&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources/com/moonspider'&gt;/trunk/src/main/resources/com/moonspider&lt;/a&gt;&lt;br&gt;D /trunk/test&lt;br&gt;D /trunk/dbmap.ipr&lt;br&gt;D /trunk/test-data/generate.xml.template&lt;br&gt;D /trunk/dbmap.iml&lt;br&gt;D /trunk/src/main/java/com/moonspider/dbmap/gorm.template&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/test'&gt;/trunk/src/test&lt;/a&gt;&lt;br&gt;R &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/java/com/moonspider'&gt;/trunk/src/main/java/com/moonspider&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/pom.xml'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/java/com'&gt;/trunk/src/main/java/com&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/test/resources/generate.xml'&gt;/trunk/src/test/resources/generate.xml&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/test/java/com/moonspider/dbmap/GenerateBeansTest.java&amp;from=19&amp;to=20'&gt;/trunk/src/test/java/com/moonspider/dbmap/GenerateBeansTest.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources'&gt;/trunk/src/main/resources&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/test/java'&gt;/trunk/src/test/java&lt;/a&gt;&lt;br&gt;D /trunk/src/main/java/com/moonspider/dbmap/jpa.template&lt;br&gt;D /trunk/build.xml&lt;br&gt;D /trunk/src/main/java/com/moonspider/dbmap/hibernate.template&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources/com'&gt;/trunk/src/main/resources/com&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/src/main/resources/com/moonspider/dbmap/gorm.template'&gt;/trunk/src/main/resources/com/moonspider/dbmap/gorm.template&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=18&amp;to=19'&gt;dbmapper 19: add index verification and some more types&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 13:03:47 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;D /trunk/test-lib&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/dbmap.ipr&amp;from=18&amp;to=19'&gt;/trunk/dbmap.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/DB.java&amp;from=18&amp;to=19'&gt;/trunk/src/com/moonspider/dbmap/DB.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/DBTable.java&amp;from=18&amp;to=19'&gt;/trunk/src/com/moonspider/dbmap/DBTable.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/ColumnConfig.java&amp;from=18&amp;to=19'&gt;/trunk/src/com/moonspider/dbmap/ColumnConfig.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=50&amp;to=51'&gt;dbmigrate 51: have to include the custom repo since i don't have it in the settings&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 12:58:29 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/pom.xml&amp;from=50&amp;to=51'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=49&amp;to=50'&gt;dbmigrate 50: convert to maven project&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 12:53:18 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/resources/com/sampullara/db'&gt;/trunk/src/main/resources/com/sampullara/db&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/mysql/migratefrom0.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/mysql/migratefrom0.sql&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/migrateto6.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/migrateto6.sql&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/h2/migratefrom0.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/db'&gt;/trunk/src/test/resources/com/sampullara/db&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/resources/com/sampullara/db/db.properties'&gt;/trunk/src/main/resources/com/sampullara/db/db.properties&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/postgresql/migratefrom4.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/java/com'&gt;/trunk/src/test/java/com&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test'&gt;/trunk/src/test/resources/com/sampullara/test&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/migrateto6.sql&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/h2/migratefrom4.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/h2/migratefrom4.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/h2/migratefrom4.sql&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/migratefrom1.groovy&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/db/mysql.test.properties'&gt;/trunk/src/test/resources/com/sampullara/db/mysql.test.properties&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/mysql/migratefrom4.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/mysql/migratefrom4.sql&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/migrate1.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/migrate1.sql&lt;/a&gt;&lt;br&gt;D /trunk/src/main/java/com/sampullara/db/db.properties&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/src/test/java/com/sampullara/db/MigrateTest.java&amp;from=49&amp;to=50'&gt;/trunk/src/test/java/com/sampullara/db/MigrateTest.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/postgresql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/postgresql&lt;/a&gt;&lt;br&gt;D /trunk/dbmigrate.iml&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/mysql/migratefrom4.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com'&gt;/trunk/src/test/resources/com&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/migrate1.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/db/postgresql.test.properties'&gt;/trunk/src/test/resources/com/sampullara/db/postgresql.test.properties&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test'&gt;/trunk/src/test&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/pom.xml'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/db/h2.test.properties'&gt;/trunk/src/test/resources/com/sampullara/db/h2.test.properties&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/postgresql/migratefrom4.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/postgresql/migratefrom4.sql&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/h2/migratefrom0.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/h2/migratefrom0.sql&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/outofsync.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/outofsync.sql&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/mysql/migratefrom0.sql&lt;br&gt;D /trunk/dbmigrate.ipr&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/postgresql/migratefrom0.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main'&gt;/trunk/src/main&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/java'&gt;/trunk/src/main/java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources'&gt;/trunk/src/test/resources&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara'&gt;/trunk/src/test/resources/com/sampullara&lt;/a&gt;&lt;br&gt;D /trunk/src/com&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/mysql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/mysql&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/postgresql/migratefrom0.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/postgresql/migratefrom0.sql&lt;/a&gt;&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/migratefrom2.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/migratefrom1.groovy'&gt;/trunk/src/test/resources/com/sampullara/test/migration/migratefrom1.groovy&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/bootstrap.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/bootstrap.sql&lt;/a&gt;&lt;br&gt;D /trunk/lib&lt;br&gt;D /trunk/test/com&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/outofsync.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration'&gt;/trunk/src/test/resources/com/sampullara/test/migration&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/db/test.properties'&gt;/trunk/src/test/resources/com/sampullara/db/test.properties&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/resources/com/sampullara'&gt;/trunk/src/main/resources/com/sampullara&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/migratefrom2.sql'&gt;/trunk/src/test/resources/com/sampullara/test/migration/migratefrom2.sql&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/java/com'&gt;/trunk/src/main/java/com&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/resources'&gt;/trunk/src/main/resources&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/java'&gt;/trunk/src/test/java&lt;/a&gt;&lt;br&gt;D /trunk/build.xml&lt;br&gt;D /trunk/test-lib&lt;br&gt;D /trunk/src/test/java/com/sampullara/test/migration/bootstrap.sql&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/test/resources/com/sampullara/test/migration/h2'&gt;/trunk/src/test/resources/com/sampullara/test/migration/h2&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/src/main/resources/com'&gt;/trunk/src/main/resources/com&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=15&amp;to=16'&gt;cli-parser 16: get rid of intellij files and try and use maven only&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 12:19:58 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;D /trunk/cli.iml&lt;br&gt;D /trunk/cli.ipr&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=14&amp;to=15'&gt;cli-parser 15: convert to maven project&lt;/a&gt;&lt;br&gt;spullara on Sat Dec 15 12:14:37 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/test/java'&gt;/trunk/src/test/java&lt;/a&gt;&lt;br&gt;D /trunk/test/com&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/main'&gt;/trunk/src/main&lt;/a&gt;&lt;br&gt;D /trunk/build.xml&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/main/java'&gt;/trunk/src/main/java&lt;/a&gt;&lt;br&gt;D /trunk/test-lib&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/test/java/com'&gt;/trunk/src/test/java/com&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/test'&gt;/trunk/src/test&lt;/a&gt;&lt;br&gt;D /trunk/ant-lib&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/pom.xml'&gt;/trunk/pom.xml&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/main/java/com'&gt;/trunk/src/main/java/com&lt;/a&gt;&lt;br&gt;D /trunk/src/com&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=51&amp;to=52</guid>
         <pubDate>Sat, 15 Dec 2007 13:43:10 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 12/05/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=17&amp;to=18'&gt;dbmapper 18: make the test very generic&lt;/a&gt;&lt;br&gt;spullara on Wed Dec 05 13:31:51 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/test-data/simplelock.sql&amp;from=17&amp;to=18'&gt;/trunk/test-data/simplelock.sql&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/test/com/moonspider/dbmap/GenerateBeansTest.java&amp;from=17&amp;to=18'&gt;/trunk/test/com/moonspider/dbmap/GenerateBeansTest.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/test-data/generate.xml.template&amp;from=17&amp;to=18'&gt;/trunk/test-data/generate.xml.template&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=17&amp;to=18</guid>
         <pubDate>Wed, 05 Dec 2007 13:31:51 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 12/04/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=16&amp;to=17'&gt;dbmapper 17: add a test case that shows dbmapper generating illegal java when
a database column is the same name as the table it is a foreign key to. The fix is probably to disambiguate with something like set_Foo() and
get_Foo() for the field setter/getter and leave the Relation
setter/getter as setFoo() and getFoo()&lt;/a&gt;&lt;br&gt;realjolly on Tue Dec 04 23:16:14 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/test/com/moonspider/dbmap/GenerateBeansTest.java&amp;from=16&amp;to=17'&gt;/trunk/test/com/moonspider/dbmap/GenerateBeansTest.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/test-data/test1.sql'&gt;/trunk/test-data/test1.sql&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=16&amp;to=17</guid>
         <pubDate>Tue, 04 Dec 2007 23:16:14 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 11/18/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=48&amp;to=49'&gt;dbmigrate 49: modify for the new PropertiesArgs stuff in cli&lt;/a&gt;&lt;br&gt;spullara on Sun Nov 18 14:53:11 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/lib/cli-r14.jar'&gt;/trunk/lib/cli-r14.jar&lt;/a&gt;&lt;br&gt;D /trunk/lib/cli-10.jar&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/dbmigrate.iml&amp;from=48&amp;to=49'&gt;/trunk/dbmigrate.iml&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/dbmigrate.ipr&amp;from=48&amp;to=49'&gt;/trunk/dbmigrate.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/src/com/sampullara/db/Migrate.java&amp;from=48&amp;to=49'&gt;/trunk/src/com/sampullara/db/Migrate.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=47&amp;to=48'&gt;dbmigrate 48: fix locking on mysql&lt;/a&gt;&lt;br&gt;spullara on Sun Nov 18 10:58:13 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/test/com/sampullara/db/MigrateTest.java&amp;from=47&amp;to=48'&gt;/trunk/test/com/sampullara/db/MigrateTest.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/dbmigrate.iml&amp;from=47&amp;to=48'&gt;/trunk/dbmigrate.iml&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/dbmigrate.ipr&amp;from=47&amp;to=48'&gt;/trunk/dbmigrate.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/build.xml&amp;from=47&amp;to=48'&gt;/trunk/build.xml&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/src/com/sampullara/db/db.properties&amp;from=47&amp;to=48'&gt;/trunk/src/com/sampullara/db/db.properties&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/src/com/sampullara/db/Migrate.java&amp;from=47&amp;to=48'&gt;/trunk/src/com/sampullara/db/Migrate.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=13&amp;to=14'&gt;cli-parser 14: Extract the properties file stuff so you don't have to include it. Also makes it easier to implement other formats. Might want to make this more generic at some point.&lt;/a&gt;&lt;br&gt;spullara on Sun Nov 18 09:29:34 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/test/com/sampullara/cli/PropertiesArgsTest.java'&gt;/trunk/test/com/sampullara/cli/PropertiesArgsTest.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/src/com/sampullara/cli/Args.java&amp;from=13&amp;to=14'&gt;/trunk/src/com/sampullara/cli/Args.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/test/com/sampullara/cli/ArgsTest.java&amp;from=13&amp;to=14'&gt;/trunk/test/com/sampullara/cli/ArgsTest.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://cli-parser.googlecode.com/svn/trunk/src/com/sampullara/cli/PropertiesArgs.java'&gt;/trunk/src/com/sampullara/cli/PropertiesArgs.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=48&amp;to=49</guid>
         <pubDate>Sun, 18 Nov 2007 14:53:11 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 11/04/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/&amp;from=3&amp;to=4'&gt;imapsync 4: Add the ability to connect to IMAPS servers that don't have valid certificates.&lt;/a&gt;&lt;br&gt;spullara on Sun Nov 04 15:35:28 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/src/com/sampullara/imapsync/IMAPSync.java&amp;from=3&amp;to=4'&gt;/trunk/src/com/sampullara/imapsync/IMAPSync.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/IMAPSync.ipr&amp;from=3&amp;to=4'&gt;/trunk/IMAPSync.ipr&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com/sampullara/imapsync/ssl'&gt;/trunk/src/com/sampullara/imapsync/ssl&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com/sampullara/imapsync/ssl/DummyTrustManager.java'&gt;/trunk/src/com/sampullara/imapsync/ssl/DummyTrustManager.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com/sampullara/imapsync/ssl/DummySSLSocketFactory.java'&gt;/trunk/src/com/sampullara/imapsync/ssl/DummySSLSocketFactory.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/&amp;from=2&amp;to=3'&gt;imapsync 3: make the build a little better&lt;/a&gt;&lt;br&gt;spullara on Sun Nov 04 14:25:16 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;D /trunk/IMAPSync.iws&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/module_imapsync.xml&amp;from=2&amp;to=3'&gt;/trunk/module_imapsync.xml&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/&amp;from=1&amp;to=2'&gt;imapsync 2: initial import of project&lt;/a&gt;&lt;br&gt;spullara on Sun Nov 04 14:06:31 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/IMAPSync.iml'&gt;/trunk/IMAPSync.iml&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES/LICENSE.commons-logging'&gt;/trunk/LICENCES/LICENSE.commons-logging&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/mstor/jdom.jar'&gt;/trunk/lib/mstor/jdom.jar&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES/LICENCE.CDDL'&gt;/trunk/LICENCES/LICENCE.CDDL&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com'&gt;/trunk/src/com&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com/sampullara/imapsync'&gt;/trunk/src/com/sampullara/imapsync&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/IMAPSync.iws'&gt;/trunk/IMAPSync.iws&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES/LICENSE.mstor'&gt;/trunk/LICENCES/LICENSE.mstor&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/mstor/xstream.jar'&gt;/trunk/lib/mstor/xstream.jar&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/mstor/mstor.jar'&gt;/trunk/lib/mstor/mstor.jar&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES'&gt;/trunk/LICENCES&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src'&gt;/trunk/src&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib'&gt;/trunk/lib&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES/LICENSE.cli'&gt;/trunk/LICENCES/LICENSE.cli&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/IMAPSync.ipr'&gt;/trunk/IMAPSync.ipr&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com/sampullara'&gt;/trunk/src/com/sampullara&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/mail-1.4.jar'&gt;/trunk/lib/mail-1.4.jar&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES/LICENSE.xstream'&gt;/trunk/LICENCES/LICENSE.xstream&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/src/com/sampullara/imapsync/IMAPSync.java'&gt;/trunk/src/com/sampullara/imapsync/IMAPSync.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/LICENCES/LICENSE.jdom'&gt;/trunk/LICENCES/LICENSE.jdom&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/imapsync.properties'&gt;/trunk/imapsync.properties&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/build.xml'&gt;/trunk/build.xml&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/README'&gt;/trunk/README&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/mstor/commons-logging.jar'&gt;/trunk/lib/mstor/commons-logging.jar&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/cli-969.jar'&gt;/trunk/lib/cli-969.jar&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/module_imapsync.xml'&gt;/trunk/module_imapsync.xml&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/mstor'&gt;/trunk/lib/mstor&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk/lib/activation-1.1.jar'&gt;/trunk/lib/activation-1.1.jar&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/&amp;from=0&amp;to=1'&gt;imapsync 1: Initial directory structure.&lt;/a&gt;&lt;br&gt;null on Sun Nov 04 14:03:47 PST 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/branches'&gt;/branches&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/trunk'&gt;/trunk&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://imapsync.googlecode.com/svn/tags'&gt;/tags&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://imapsync.googlecode.com/svn/trunk/&amp;from=3&amp;to=4</guid>
         <pubDate>Sun, 04 Nov 2007 15:35:28 -0800</pubDate>
      </item>
      <item>
         <title>Code Changes on 10/21/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=46&amp;to=47'&gt;dbmigrate 47: add the ability to use the Migrate class as an Ant task&lt;/a&gt;&lt;br&gt;spullara on Sun Oct 21 13:18:09 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/test/com/sampullara/db/MigrateTest.java&amp;from=46&amp;to=47'&gt;/trunk/test/com/sampullara/db/MigrateTest.java&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/lib/groovy-all-1.1-rc-1.jar'&gt;/trunk/lib/groovy-all-1.1-rc-1.jar&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/dbmigrate.iml&amp;from=46&amp;to=47'&gt;/trunk/dbmigrate.iml&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/dbmigrate.ipr&amp;from=46&amp;to=47'&gt;/trunk/dbmigrate.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/build.xml&amp;from=46&amp;to=47'&gt;/trunk/build.xml&lt;/a&gt;&lt;br&gt;D /trunk/lib/groovy-all-1.1-beta-3.jar&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/trunk/src/com/sampullara/db/Migrate.java&amp;from=46&amp;to=47'&gt;/trunk/src/com/sampullara/db/Migrate.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=12&amp;to=13'&gt;cli-parser 13: make it show that its a revision number, not a version&lt;/a&gt;&lt;br&gt;spullara on Sun Oct 21 12:06:43 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/build.xml&amp;from=12&amp;to=13'&gt;/trunk/build.xml&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=11&amp;to=12'&gt;cli-parser 12: Increase code coverage in the tests and optimize some code paths.&lt;/a&gt;&lt;br&gt;spullara on Sun Oct 21 12:04:44 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/cli.ipr&amp;from=11&amp;to=12'&gt;/trunk/cli.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/src/com/sampullara/cli/Args.java&amp;from=11&amp;to=12'&gt;/trunk/src/com/sampullara/cli/Args.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/test/com/sampullara/cli/ArgsTest.java&amp;from=11&amp;to=12'&gt;/trunk/test/com/sampullara/cli/ArgsTest.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=46&amp;to=47</guid>
         <pubDate>Sun, 21 Oct 2007 13:18:09 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 10/20/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=15&amp;to=16'&gt;dbmapper 16: Edited wiki page through web user interface.&lt;/a&gt;&lt;br&gt;spullara on Sat Oct 20 17:40:56 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/wiki/Grails.wiki&amp;from=15&amp;to=16'&gt;/wiki/Grails.wiki&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=14&amp;to=15'&gt;dbmapper 15: fix issues 1 and 2. added CHAR as a recognized type. added Schema as a parameter to the metadata.&lt;/a&gt;&lt;br&gt;spullara on Sat Oct 20 11:26:21 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/dbmap.ipr&amp;from=14&amp;to=15'&gt;/trunk/dbmap.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/DB.java&amp;from=14&amp;to=15'&gt;/trunk/src/com/moonspider/dbmap/DB.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/Generator.java&amp;from=14&amp;to=15'&gt;/trunk/src/com/moonspider/dbmap/Generator.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/DBTable.java&amp;from=14&amp;to=15'&gt;/trunk/src/com/moonspider/dbmap/DBTable.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/GenerateConfig.java&amp;from=14&amp;to=15'&gt;/trunk/src/com/moonspider/dbmap/GenerateConfig.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/test/com/moonspider/dbmap/DBTest.java&amp;from=14&amp;to=15'&gt;/trunk/test/com/moonspider/dbmap/DBTest.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/trunk/src/com/moonspider/dbmap/ColumnConfig.java&amp;from=14&amp;to=15'&gt;/trunk/src/com/moonspider/dbmap/ColumnConfig.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=15&amp;to=16</guid>
         <pubDate>Sat, 20 Oct 2007 17:40:56 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 10/15/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=13&amp;to=14'&gt;dbmapper 14: add eclipse project files&lt;/a&gt;&lt;br&gt;dave.brown on Mon Oct 15 11:40:49 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/.classpath'&gt;/trunk/.classpath&lt;/a&gt;&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmapper.googlecode.com/svn/trunk/.project'&gt;/trunk/.project&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://dbmapper.googlecode.com/svn/&amp;from=13&amp;to=14</guid>
         <pubDate>Mon, 15 Oct 2007 11:40:49 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 10/13/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=10&amp;to=11'&gt;cli-parser 11: left out the description for flags in the usage message&lt;/a&gt;&lt;br&gt;spullara on Sat Oct 13 13:23:20 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/src/com/sampullara/cli/Args.java&amp;from=10&amp;to=11'&gt;/trunk/src/com/sampullara/cli/Args.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=10&amp;to=11</guid>
         <pubDate>Sat, 13 Oct 2007 13:23:20 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 10/07/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=45&amp;to=46'&gt;dbmigrate 46: add externals&lt;/a&gt;&lt;br&gt;spullara on Sun Oct 07 16:11:12 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;A &lt;a rel="nofollow" target="_blank" href='http://dbmigrate.googlecode.com/svn/trunk/checkout'&gt;/trunk/checkout&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://buildandtest.com:2080/svn2rss/diff?url=http://dbmigrate.googlecode.com/svn/&amp;from=45&amp;to=46</guid>
         <pubDate>Sun, 07 Oct 2007 16:11:12 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 09/15/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=9&amp;to=10'&gt;cli-parser 10: fix it up so that the name is set propertly in the error message&lt;/a&gt;&lt;br&gt;spullara on Sat Sep 15 20:39:20 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/src/com/sampullara/cli/Args.java&amp;from=9&amp;to=10'&gt;/trunk/src/com/sampullara/cli/Args.java&lt;/a&gt;&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=9&amp;to=10</guid>
         <pubDate>Sat, 15 Sep 2007 20:39:20 -0700</pubDate>
      </item>
      <item>
         <title>Code Changes on 09/08/2007</title>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=8&amp;to=9'&gt;cli-parser 9: get rid of some of the build stuff&lt;/a&gt;&lt;br&gt;spullara on Sat Sep 08 21:59:29 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;D /trunk/emma-macros.xml&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/build.xml&amp;from=8&amp;to=9'&gt;/trunk/build.xml&lt;/a&gt;&lt;br&gt;D /trunk/test-lib/emma-2.0.5312.jar&lt;br&gt;D /trunk/test-lib/emma_ant-2.0.5312.jar&lt;br&gt;D /trunk/repository-macros.xml&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=7&amp;to=8'&gt;cli-parser 8: add the ability to use a properties file rather than command line arguments&lt;/a&gt;&lt;br&gt;spullara on Sat Sep 08 17:25:12 PDT 2007&lt;br&gt;&lt;br&gt;Changed paths:&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/cli.iml&amp;from=7&amp;to=8'&gt;/trunk/cli.iml&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/cli.ipr&amp;from=7&amp;to=8'&gt;/trunk/cli.ipr&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/src/com/sampullara/cli/Args.java&amp;from=7&amp;to=8'&gt;/trunk/src/com/sampullara/cli/Args.java&lt;/a&gt;&lt;br&gt;M &lt;a rel="nofollow" target="_blank" href='http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/trunk/test/com/sampullara/cli/ArgsTest.java&amp;from=7&amp;to=8'&gt;/trunk/test/com/sampullara/cli/ArgsTest.java&lt;/a&gt;&lt;br&gt;D /trunk/cli.iws&lt;br&gt;&lt;/p&gt;</description>
         <author />
         <guid isPermaLink="false">http://svnfeed.com/svn2rss/diff?url=http://cli-parser.googlecode.com/svn/&amp;from=8&amp;to=9</guid>
         <pubDate>Sat, 08 Sep 2007 21:59:29 -0700</pubDate>
      </item>
      <item>
         <title>Using the Yahoo! Mail SOAP API 1.1 from Java's JAX-WS 2.1</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/151798870/index.html</link>
         <description>&lt;div&gt;&lt;font face="Helvetica"&gt;On &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/"&gt;YDN&lt;/a&gt; they have samples and documentation on how to use the &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/mail/docs/html/index.html"&gt;Yahoo! Mail SOAP API&lt;/a&gt; from &lt;a rel="nofollow" target="_blank" href="http://ws.apache.org/axis2/"&gt;Axis2&lt;/a&gt;. I'm not a big fan of that method so I went ahead and used &lt;a rel="nofollow" target="_blank" href="https://jax-ws.dev.java.net/"&gt;JAX-WS&lt;/a&gt; to do my dirty work. As an example, I will build an &lt;a rel="nofollow" target="_blank" href="http://javarants.com/rssmail/"&gt;RSS feed of the users unread messages&lt;/a&gt;.&lt;/font&gt;&lt;/div&gt; &lt;br /&gt; &lt;div&gt;&lt;font face="Helvetica"&gt;First get &lt;a rel="nofollow" target="_blank" href="https://jax-ws.dev.java.net/2.1.2rc1/"&gt;JAX-WS 2.1.x&lt;/a&gt; or possibly just JDK 1.6 (though I did all my testing with the former and JDK 1.5). Since its easiest to work with typed APIs we are first going to generate the classes needed to talk to the the Yahoo! Mail web service. From their site, we find that the latest &lt;a rel="nofollow" target="_blank" href="http://mail.yahooapis.com/ws/mail/v1.1/wsdl"&gt;WSDL&lt;/a&gt; URL. To generate the API from the WSDL we use the 'wsimport' command from JAX-WS like this:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="CourierNewPSMT"&gt;wsimport.sh -extension -s src -p com.yahoo.mail http://mail.yahooapis.com/ws/mail/v1.1/wsdl&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;The key command line option there is the '-extension' option as the Yahoo! Mail WSDL has a few things that by default would get named the same thing by the schema compiler. By using Sun's extensions we can automatically rename them rather than making our own binding. This will generate 120+ classes representing each part of the complex API along with some special classes like &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;ObjectFactory&lt;/font&gt;&lt;font face="Helvetica"&gt;. This gives us the foundation for accessing Y! Mail but there are still a few quirks that we need to understand. Normally when you use JAX-WS you would simply access the web service using the main &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;Ymws&lt;/font&gt;&lt;font face="Helvetica"&gt; class that was generated like this:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Instantiate the SOAP proxy &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Ymws service = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Ymws(); YmwsPortType stub = service.getYmws(); &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Then you would be able to make calls on that stub directly like this:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; UserData userData = stub.getUserData(); &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;You'd find though if you tried to do this that you would not be authenticated with the service nor would there be anyway to select what user for which you are making this call. Yahoo! Mail's web services have their own authentication scheme that is built on Yahoo's &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/auth/"&gt;BBAuth&lt;/a&gt; -- a 3rd party authentication system. In order to make use of BBAuth you will need to &lt;a rel="nofollow" target="_blank" href="https://developer.yahoo.com/wsregapp/index.php"&gt;register your application&lt;/a&gt; with Yahoo. Make sure that you use a publicly available URL for your application and also select the third option at the bottom: "Yahoo! Mail (via BBAuth) with Read/Write access" so that you will be able to use this application ID to access the Y! Mail API. Once you have registered you will be asked to authenticate your URL by placing a special file at the root of the domain of your URL. This means you needs write access to the root of the web server so don't attempt this on a domain that you don't control in that way. After this is complete you continue to the success page where it provides you with your &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;application ID&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; (&lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;appid&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt;) and your &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;shared secret&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; (&lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;secret&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt;). These will be required for you to access the Y! Mail APIs on behalf of Y! users.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;The core of the way BBAuth works is for you to redirect to their server when you want to authenticate a user and then they send back the token that is required to access Y! as that user to the registered application URL. Here is the code that we can use to generate the URL required to get authenticated:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;long&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ts = date.getTime() / &lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;1000&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;; String uri; uri = &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"/WSLogin/V1/wslogin?send_userhash=1&amp;appid="&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; + URLEncoder.&lt;/span&gt;&lt;span style="background-color:#ffffff;font-style:italic;"&gt;encode(&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;appid,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) + &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"&amp;ts="&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; + ts; MessageDigest md; md = MessageDigest.&lt;/span&gt;&lt;span style="background-color:#ffffff;font-style:italic;"&gt;getInstance(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"md5"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;); String sig = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; BigInteger(&lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;1&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;, md.digest((uri + &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;secret)&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;.getBytes())).toString(&lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;16&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;); &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;return&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;LOGIN_URL &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;+ uri + &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"&amp;sig="&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; + sig; &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Essentially this code creates a URI with our &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;appid&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; and signs it with the &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;secret&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; which is then used to create a URL that includes the signature. This ensures that only someone with the &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;secret&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; can work on behalf of the application that we registered. Once the user is authenticated you will receive a callback at the registered URL that includes the information passed here plus a &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;token&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; that can be used to retrieve a WSSID and cookie that can then be used to construct authenticated web service requests. There is an additional login URL parameter that you can pass called &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;appdata &lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt;that will be returned to you when Y! redirects the user back to your application. The &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;token&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; that is returned is generally good for 2 weeks of authenticated access. The &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;send_userhash=1&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; option tells Yahoo to return to us a unique identifier tied to your application id that will always be the same so you can use it to tie back to a particular user in your application.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Now that we have gotten the token back from Yahoo we can get our WSSID and Cookie. Included with the Yahoo! Mail sample code they have an inner class called BrowserBasedAuthManager. We'll just use that rather than rewrite it but basically it does something similar to the code above and retrieves the two values from an XML document returned from a URL:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Instantiate the auth manager and set it up with the date, application ID, &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// shared secret and the user token. &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; BrowserBasedAuthManager authManager = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; BrowserBasedAuthManager(date, &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;appid,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;secret,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; token); &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;These two values, &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;wssid&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; and &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;cookie&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt;, are then needed to construct our web service requests. JAX-WS doesn't expose this functionality directly in the API but instead allows you to set various properties on the request context:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; Map&amp;lt;String, Object&amp;gt; requestContext = ((BindingProvider) stub).getRequestContext(); requestContext.put(BindingProvider.&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;ENDPOINT_ADDRESS_PROPERTY, &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"http://mail.yahooapis.com/ws/mail/v1.1/soap?appid="&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; + URLEncoder.&lt;/span&gt;&lt;span style="background-color:#ffffff;font-style:italic;"&gt;encode(&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;appid,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) + &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"&amp;wssid="&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; + URLEncoder.&lt;/span&gt;&lt;span style="background-color:#ffffff;font-style:italic;"&gt;encode(&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;authManager.getWssid(), &lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;)); Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; cookies = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; HashMap&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt;(); cookies.put(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"Cookie"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;, Arrays.&lt;/span&gt;&lt;span style="background-color:#ffffff;font-style:italic;"&gt;asList(&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;authManager.getCookie())); requestContext.put(MessageContext.&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;HTTP_REQUEST_HEADERS,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; cookies); &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;The first property allows us to change the actual endpoint of the web service call to include the WSSID that we got from our authentication request. The second call allows us to set cookies on the HTTP request that is used to make the specific call. Together these will give us the access we need in order to use the stub securely. Actually making use of the API is quite easy now that we are authenticated. For instance, we can trivially discover whether or not the user is a &lt;a rel="nofollow" target="_blank" href="http://www.jdoqocy.com/nt83uoxuowBEHKJJLIBDCGILJLG"&gt;Y! Mail Plus subscriber&lt;/a&gt; and has access to the &lt;a rel="nofollow" target="_blank" href="http://developer.yahoo.com/mail/account_types.html"&gt;full API functionality&lt;/a&gt; (non-premium users can't get the contents of messages for instance):&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; UserData userData = stub.getUserData(); &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;boolean&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; isPremium = userData.getUserFeaturePref().isIsPremium() &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Here is the code to pull all the unread messages from a folder:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// List out up to 100 new messages in the folder &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ListMessages lm = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ListMessages(); Flag flag = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Flag(); flag.setIsRead(&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;FALSE)&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;; lm.setFilterBy(&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;of.&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;createListMessagesFilterBy(flag)); lm.setFid(folder.getFid()); lm.setNumInfo(BigInteger.&lt;/span&gt;&lt;span style="background-color:#ffffff;font-style:italic;"&gt;valueOf(&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;NUM_MESSAGES)&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;); ListMessagesResponse lmResp = stub.listMessages(lm); &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;return&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; lmResp.getMessageInfo(); &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Notice how we use the &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;ObjectFactory&lt;/font&gt;&lt;font face="Helvetica"&gt; to create the &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;filterBy&lt;/font&gt;&lt;font face="Helvetica"&gt; element. Whenever you see a reference like &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;JAXBElement&amp;lt;Flag&amp;gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; in the API you will likely want to use one of the convenience APIs within &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;ObjectFactory&lt;/font&gt;&lt;font face="Helvetica"&gt; to create the argument.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Now lets get to our RSS feed of unread messages example. To create our RSS feeds we could have just written out the feed directly but instead I'm going to use &lt;a rel="nofollow" target="_blank" href="https://rome.dev.java.net/"&gt;ROME&lt;/a&gt; as we might want to extend the example to a real application later. ROME has one dependency, &lt;a rel="nofollow" target="_blank" href="http://www.jdom.org/"&gt;JDOM-1.0&lt;/a&gt; so we will have to get that as well. We can encapsulate the application into a single servlet that serves both the authentication feed and the mail feed. Here is the core servlet method:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="line-height:100%;font-family:monospace;background-color:#ffffff;border-width:0.01mm;border-color:#000000;border-style:solid;padding:4px;"&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;try&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; { String token = httpServletRequest.getParameter(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"token"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;); &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (token == &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;null&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) { &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// If there is no token we are not authenticated &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;throw&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; AuthException(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"No token"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;); } &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Current date, needed for many API calls &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Date date = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Date(); &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Instantiate the SOAP proxy &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Ymws service = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Ymws(); YmwsPortType stub = service.getYmws(); &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Instantiate the auth manager and set it up with the date, application ID, &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// shared secret and the user token. &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; BrowserBasedAuthManager authManager = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; BrowserBasedAuthManager(date, &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;appid,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;secret,&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; token); &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Set up the web service call &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; setupWebServiceCall(authManager, stub); &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Create the feed &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; SyndFeed sf = createFeed(date); &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;// Go and get the list of folders and pull out the inbox &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Fid inbox = getInbox(stub); &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (inbox != &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;null&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) { List&amp;lt;MessageInfo&amp;gt; messages = listUnreadMessagesInFolder(stub, inbox); List&amp;lt;SyndEntry&amp;gt; entries = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ArrayList&amp;lt;SyndEntry&amp;gt;(); &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;for&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (MessageInfo message : messages) { SyndEntry se = createEntry(message); entries.add(se); } sf.setEntries(entries); } writeFeed(httpServletResponse, sf); } &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;catch&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (AuthException e) { unauthorizedFeedResponse(httpServletResponse); } &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;This code should be fairly self-explantory and it builds on all the work that we have done so far. The only new things are the actual calls into the Y! Mail API that retrieve the messages from Y! Mail, converts them into an RSS 2.0 feed, and writes that feed to the wire. There are a couple of issues with this code that we don't address, like generating a permanent URL for the user to use. Right now whenever their authentication is reset (at least every 2 weeks) they will have to get a new feed URL from the application.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Throughout these simple examples there are opportunities for optimization. Many of the pieces of data can be cached for some amount of time and regenerated later like the token, the wssid and the cookie when the user fails to authenticate. The user hash can, of course, be used forever as a unique identifier for the user. Other opportunities for optimization include the ability to multiply dispatch requests to the API using &lt;/font&gt;&lt;font face="CourierNewPSMT"&gt;batchExecute&lt;/font&gt;&lt;font face="Helvetica"&gt;. Our example is an unoptimized version so that you can see how everything works before its made more complicated through the optimization process. &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;Here is a link to the &lt;a rel="nofollow" target="_blank" href="http://buildandtest.com/files/rssmail.war"&gt;full application&lt;/a&gt;, the source code is under WEB-INF/src. You will need to configure the web.xml with your own &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;appid&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; and &lt;/font&gt;&lt;font face="Helvetica-Bold"&gt;&lt;b&gt;secret&lt;/b&gt;&lt;/font&gt;&lt;font face="Helvetica"&gt; but otherwise it should run in a standard JEE Servlet 2.4 container out of the box.&lt;/font&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=bd4k8stm"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=bd4k8stm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=Ejv1YjZ2"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=Ejv1YjZ2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/javarants?a=btfQtIn7"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=btfQtIn7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javarants/~4/151798870" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://www.javarants.com/C1464297901/E20070903132239/index.html</guid>
         <pubDate>Fri, 31 Aug 2007 13:22:39 -0700</pubDate>
      <category domain="http://rss.financialcontent.com/stocksymbol">FALSE</category><feedburner:origLink>http://www.javarants.com/C1464297901/E20070903132239/index.html</feedburner:origLink></item>
      <item>
         <title>Versus: Argue why Foo is better than Bar</title>
         <link>http://feeds.feedburner.com/~r/javarants/~3/145387396/index.html</link>
         <description>&lt;div&gt;&lt;font face="Helvetica"&gt;&lt;a rel="nofollow" target="_blank" href="http://versus.bix.yahoo.com"&gt;Versus&lt;/a&gt; is a research project by some &lt;a rel="nofollow" target="_blank" href="http://bix.yahoo.com"&gt;Bix&lt;/a&gt; developers (my friend &lt;a rel="nofollow" target="_blank" href="http://johndbeatty.com/"&gt;John Beatty&lt;/a&gt; is one of them) at &lt;a rel="nofollow" target="_blank" href="http://yahoo.com"&gt;Yahoo&lt;/a&gt; that is trying to aggregate the arguments for choosing between two or more competitive offerings.&lt;/font&gt;&lt;/div&gt; &lt;br /&gt; &lt;div&gt;&lt;font face="Helvetica"&gt;It was just released near the beginning of the month and is building momentum but there are already very good comparisons with many arguments on both sides:&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;&lt;a rel="nofollow" target="_blank" href="http://versus.bix.yahoo.com/vs/MySQL-vs-PostgreSQL"&gt;MySQL vs PostgreSQL&lt;/a&gt;&lt;/font&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;&lt;a rel="nofollow" target="_blank" href="http://versus.bix.yahoo.com/vs/Static_typing-vs-Duck_typing"&gt;Static typing vs Duck typing&lt;/a&gt; &lt;/font&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;&lt;a rel="nofollow" target="_blank" href="http://versus.bix.yahoo.com/vs/Squeezebox-vs-AirTunes"&gt;Squeezebox vs AirTunes&lt;/a&gt;&lt;/font&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;&lt;a rel="nofollow" target="_blank" href="http://versus.bix.yahoo.com/vs/Yelp-vs-Zagat"&gt;Yelp vs Zagat&lt;/a&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="Helvetica"&gt;The other cool thing about it is that anyone can add new arguments, people can vote for arguments on both sides, there are comments associated with each argument, and anyone can introduce a new competition. With luck Versus will become the place to settle arguments of all kinds!&lt;/font&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/javarants?a=Uv5Pa3te"&gt;&lt;img src="http://feeds.feedburner.com/~f/javarants?i=Uv5Pa3te" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fee