<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>google-app-engine &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/google-app-engine/</link>
	<description>Feed of posts on WordPress.com tagged "google-app-engine"</description>
	<pubDate>Sun, 29 Nov 2009 00:54:16 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Google App Engine: NoClassDefFoundError on run]]></title>
<link>http://research2009.wordpress.com/2009/11/28/google-app-engine-noclassdeffounderror-on-run/</link>
<pubDate>Sat, 28 Nov 2009 13:07:02 +0000</pubDate>
<dc:creator>falloutkee</dc:creator>
<guid>http://research2009.wordpress.com/2009/11/28/google-app-engine-noclassdeffounderror-on-run/</guid>
<description><![CDATA[Everytime I try to run my project, I get the following error message: Exception in thread “main” jav]]></description>
<content:encoded><![CDATA[Everytime I try to run my project, I get the following error message: Exception in thread “main” jav]]></content:encoded>
</item>
<item>
<title><![CDATA[Google App Engine Quotas on &gt; 430k Requests/Day]]></title>
<link>http://niryariv.wordpress.com/2009/11/27/google-app-engine-quotas-on-43k-requestsday/</link>
<pubDate>Fri, 27 Nov 2009 18:47:08 +0000</pubDate>
<dc:creator>Nir</dc:creator>
<guid>http://niryariv.wordpress.com/2009/11/27/google-app-engine-quotas-on-43k-requestsday/</guid>
<description><![CDATA[[UPDATE: Posted this yesterday for &gt;140k requests/day, updating now with &gt;430k requests..] The]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>[UPDATE: Posted this yesterday for &#62;140k requests/day, updating now with &#62;430k requests..]</p>
<p><a href="http://therealurl.appspot.com/">TheRealURL</a> had a particularly busy <span style="text-decoration:line-through;">Thanksgiving Day</span> Black Friday for some reason. Just for curiosity&#8217;s sake, here&#8217;s the quota usage for a GAE application under a relatively high load. The quotas that aren&#8217;t pictured are all on %0. Billing is now turned on (for the Incoming Bandwidth) but limited to up to $1/day &#8211; and was never used yet.</p>
<p>Bear in mind this is a pretty minimal app, of course, but still &#8211; not too shabby.</p>
<p><a href="http://niryariv.wordpress.com/files/2009/11/picture-17.png"><img class="aligncenter size-full wp-image-381" title="Google App Engine Quota Usage" src="http://niryariv.wordpress.com/files/2009/11/picture-17.png" alt="" width="700" height="207" /></a></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Comparing Clouds: EC2, Azure, App Engine]]></title>
<link>http://loosexaml.wordpress.com/2009/11/25/comparing-clouds-ec2-azure-app-engine/</link>
<pubDate>Wed, 25 Nov 2009 20:06:51 +0000</pubDate>
<dc:creator>loosexaml</dc:creator>
<guid>http://loosexaml.wordpress.com/2009/11/25/comparing-clouds-ec2-azure-app-engine/</guid>
<description><![CDATA[There are a few definitions of cloud computing out there, but now that three big players (Amazon, Go]]></description>
<content:encoded><![CDATA[There are a few definitions of cloud computing out there, but now that three big players (Amazon, Go]]></content:encoded>
</item>
<item>
<title><![CDATA[Cloud Computing Service - Amazon EC2 vs Google GAE]]></title>
<link>http://setandbma.wordpress.com/2009/11/25/cloud-computing-service-amazon-ec2-vs-google-gae/</link>
<pubDate>Wed, 25 Nov 2009 07:09:05 +0000</pubDate>
<dc:creator>Udayan Banerjee</dc:creator>
<guid>http://setandbma.wordpress.com/2009/11/25/cloud-computing-service-amazon-ec2-vs-google-gae/</guid>
<description><![CDATA[Cloud Computing Service Service provider with large number of networked computer systems Allowing yo]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><div>
<table style="border-collapse:collapse;" border="0">
<col>
<col>
<tbody valign="top">
<tr>
<td style="padding-left:7px;padding-right:7px;border-top:solid black .5pt;border-left:solid black .5pt;border-bottom:solid black .5pt;border-right:solid black .5pt;">
<p><strong><em>Cloud Computing Service</em></strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:solid black .5pt;border-left:none;border-bottom:solid black .5pt;border-right:solid black .5pt;">
<ol>
<li><em>Service provider with large number of networked computer systems<br />
</em></li>
<li><em>Allowing you to use a slice of that processing power and storage<br />
</em></li>
<li><em>Shielding your program and data from others sharing the same service, and<br />
</em></li>
<li><em>Charging you for your actual usage</em></li>
</ol>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid black .5pt;border-bottom:solid black .5pt;border-right:solid black .5pt;">
<p><strong><em>Value Proposition of Cloud Computing</em></strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid black .5pt;border-right:solid black .5pt;">
<ul>
<li><em>Elastic Capacity – Pay for what you actually use<br />
</em></li>
<li><em>Economy of Scale – Of hardware, Infrastructure and Management</em></li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<h1><span style="font-size:14pt;">Comparison between Amazon EC2 and Google GAE<br />
</span></h1>
<p>Though different cloud service providers are following different strategies, these are the two uniquely different approaches. Others either are similar to one of these or fall somewhere in between.
</p>
<p>I have excluded SaaS from this discussion – you can see the comparison between IaaS, PaaS and SaaS on this post on <a href="http://setandbma.wordpress.com/2009/09/03/cloud-strategy/">Cloud Strategy</a>.</p>
<table style="border-collapse:collapse;" border="0">
<col>
<col>
<col>
<tbody valign="top">
<tr style="background:#b8cce4;">
<td style="padding-left:7px;padding-right:7px;border-top:solid #4bacc6 1pt;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 2.25pt;border-right:solid #4bacc6 1pt;"> </td>
<td style="padding-left:7px;padding-right:7px;border-top:solid #4bacc6 1pt;border-left:none;border-bottom:solid #4bacc6 2.25pt;border-right:solid #4bacc6 1pt;">
<p><a href="http://aws.amazon.com/ec2/">Amazon EC2</a><strong> (<em>Elastic Computing Cloud)</em></strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:solid #4bacc6 1pt;border-left:none;border-bottom:solid #4bacc6 2.25pt;border-right:solid #4bacc6 1pt;">
<p><a href="http://code.google.com/appengine/docs/whatisgoogleappengine.html">Google GAE</a><strong> (<em>Google App Engine)</em></strong></p>
</td>
</tr>
<tr style="background:#d2eaf1;">
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Base Technology</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Virtualization</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Existing Google infrastructure</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Unit of Scalability</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Dynamically instantiated virtual machines</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Every transactions initiated by user
</p>
<p>Every scheduled or queued task</p>
</td>
</tr>
<tr style="background:#d2eaf1;">
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Persistence</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Reserved Virtual Machine using standard RDBMS</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>By directly persisting objects on to <a href="http://labs.google.com/papers/bigtable.html">Google BigTable</a>
						</p>
<p>No need for any object-relational mapping</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Software License</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>All software license required
</p>
<p>OS, RDBMS, Web Server, App Server …</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Behaves like a Service Bus of infinite capacity
</p>
<p>Application code can be directly deployed</p>
</td>
</tr>
<tr style="background:#d2eaf1;">
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Readiness</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Reasonably mature
</p>
<p>Can be viewed as an extension to existing hosting services</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Very much in Beta
</p>
<p>Will take couple of years to mature</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Best for …</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Application requiring heavy processing power for short duration</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Startups wanting to start free and have the ability to scale when the venture succeed</p>
</td>
</tr>
<tr style="background:#d2eaf1;">
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Economics</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Saving potential of 30-70% for the right type of application</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Not clear
</p>
<p>However, it can be an order of magnitude improvement</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:solid #4bacc6 1pt;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Innovativeness</strong></p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p>Incremental</p>
</td>
<td style="padding-left:7px;padding-right:7px;border-top:none;border-left:none;border-bottom:solid #4bacc6 1pt;border-right:solid #4bacc6 1pt;">
<p><strong>Potentially Disruptive</strong></p>
</td>
</tr>
</tbody>
</table>
<h1><span style="font-size:14pt;">Why is GAE potentially disruptive?<br />
</span></h1>
<ul>
<li>Over the last decade, Google has build a huge cloud infrastructure for its search and other services
</li>
</ul>
<ul style="margin-left:54pt;">
<li>The infrastructure has been build using very cost effective hardware
</li>
<li>Fault tolerance is designed into the architecture
</li>
<li>They have perfected technologies and algorithms like <a href="http://en.wikipedia.org/wiki/MapReduce">MapReduce</a> and <a href="http://en.wikipedia.org/wiki/BigTable">BigTable</a> created for such infrastructure
</li>
<li>It is highly scalable
</li>
</ul>
<ul>
<li>Google is following a strategy of opening up their infrastructure for developers to use – for example <a href="http://news.cnet.com/8301-30685_3-10391002-264.html">Closure JavaScript Toolset</a>
		</li>
<li>They will optimize cloud access through <a href="http://en.wikipedia.org/wiki/Google_Chrome_OS">Chrome OS</a> and <a href="http://en.wikipedia.org/wiki/Android_(operating_system)">Android Mobile OS</a>
		</li>
</ul>
<p><strong>Their economy of scale will be difficult to match.<br />
</strong></p>
<p><span style="color:red;"><strong>What about Microsoft – they are constrained by the fact that they have to defend their desktop business – which will prevent them from following optimal cloud strategy!<br />
</strong></span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Can't Get On The Apex Scheduler Pilot? Here's a Short Term Solution.]]></title>
<link>http://blog.jeffdouglas.com/2009/11/24/cant-get-on-the-apex-scheduler-pilot/</link>
<pubDate>Tue, 24 Nov 2009 11:41:39 +0000</pubDate>
<dc:creator>jeffdonthemic</dc:creator>
<guid>http://blog.jeffdouglas.com/2009/11/24/cant-get-on-the-apex-scheduler-pilot/</guid>
<description><![CDATA[In Winter &#8216;10, Salesforce.com released the Apex Scheduler. This feature allows you to schedule]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>In Winter &#8216;10, <a href="http://na1.salesforce.com/help/doc/en/salesforce_winter10_release_notes.pdf" target="_blank">Salesforce.com released the Apex Scheduler</a>. This feature allows you to schedule Apex classes to run at specific times. The features appears to be widely popular (200+ votes on the IdeaExchange) but is only in limited release. I&#8217;ve heard from a number of companies that they were not able to get on the pilot. The L1 Support Rep told me that an org would need 5000+ seats to qualify for the Apex Scheduler.</p>
<p>Hopefully Apex Scheduler will be GA next release but in the meantime here&#8217;s a short-term solution that <a href="http://www.kyleroche.com" target="_blank">Kyle Roche</a> and I were discussing last week. You can <a href="http://appengine.google.com" target="_blank">sign up for a free Google App Engine account</a> and then schedule tasks with cron in either Java or Python.</p>
<p><a href="http://links.jeffdouglas.com/book"><img class="alignleft size-full wp-image-1256" style="padding-right:10px;" title="java-google-app-engine" src="http://jeffdonthemic.wordpress.com/files/2009/09/java-google-app-engine.jpg" alt="" width="121" height="160" /></a>The solution is relative straight forward and you can find all the info you need in our book <a href="http://links.jeffdouglas.com/book" target="_blank">Beginning Java Google App Engine</a>. We not only cover cron jobs but have a number of examples using the <a href="http://developer.force.com/codeshare/apex/projectpage?id=a06300000046mKnAAI" target="_blank">Force.com for Google App Engine Java toolkit</a>.</p>
<p><a href="http://links.jeffdouglas.com/book" target="_blank">Pre-order</a> your copy now just in time for Christmas. It goes nicely with eggnog and figgy pudding.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Salesforce terá plataforma de colaboração corporativa]]></title>
<link>http://saasbr.wordpress.com/2009/11/23/salesforce-tera-plataforma-de-colaboracao-corporativa/</link>
<pubDate>Mon, 23 Nov 2009 12:19:11 +0000</pubDate>
<dc:creator>Flavio Henrique</dc:creator>
<guid>http://saasbr.wordpress.com/2009/11/23/salesforce-tera-plataforma-de-colaboracao-corporativa/</guid>
<description><![CDATA[Em conferência anual, companhia aponta para foco na integração entre redes sociais, ferramentas cola]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Em conferência anual, companhia aponta para foco na integração entre redes sociais, ferramentas colaborativas e aplicativos corporativos </p>
<p>É praticamente inevitável para uma companhia ignorar processos de colaboração, troca de ideias, redes sociais e outras funcionalidades que vieram com o apogeu da web 2.0, ainda que a empresa não tenha aplicado essa realidade ao seu dia a dia. A indústria assiste de perto a esta movimentação ávida para encontrar uma forma de ganhar sua fatia nessa chamada evolução social. E algumas têm conseguido algum sucesso. O Google tem capitalizado com sua plataforma Google Apps que, aos poucos, amplia presença no mercado empresarial e a Salesfoce.com, uma das pioneiras na oferta de programas no modelo software como serviço (SaaS, da sigla em inglês), mostra que está com os dois pés nesta era.</p>
<p>Prova dessa determinação é o lançamento do Salesforce Chatter, apresentado durante o Dreamforce 2009, conferência que a companhia realiza anualmente em São Francisco, Estados Unidos, cidade onde a empresa foi fundada, e que neste ano ocorre entre os dias 17 e 20 de novembro. Trata-se de uma espécie de Google Wave, mas totalmente voltado para o mundo das corporações. Como explica a própria empresa, o Chatter é, ao mesmo tempo, uma aplicação de colaboração corporativa e uma plataforma de desenvolvimento social. Por meio de uma interface aparentemente fácil, o funcionário pode acessar um aplicativo financeiro, observar dicas, criar fóruns, acessar redes sociais compartilhadas.</p>
<p>CEO da Salesforce diz que produtos das rivais são lentos ou complexos e caros </p>
<p>De acordo com a companhia, os 135 mil aplicativos Salesforce se converterão para a plataforma social. Para Marc Benioff, CEO e chairman da empresa, o produto é uma forma de aproximar os funcionários da empresa, já que essas pessoas passam a acessar ferramentas que encontram fora da companhia e que podem contribuir com o processo de colaboração e inovação. É uma complexa combinação, em tempo real, de ferramentas de redes familiares e aplicativos empresariais dentro de um formato de compartilhamento seguro.</p>
<p>&#8220;Não conheço ninguém que discorde que Twitter e Facebook sejam fenômenos e trouxeram novas possibilidades para a indústria com meio bilhão de usuários. Eu uso Facebook e Twitter&#8221;, comentou Benioff, sobre a realidade das redes, diante de uma plateia formada por milhares de pessoas (foram 19 mil inscritos) entre analistas, clientes, jornalistas e desenvolvedores. &#8220;A mágica é levar a inteligência por meio da rede social. Une conteúdo, aplicativo e pessoas no mesmo espaço. Nas empresas, isso está separado. Por que não levar inteligência para as empresas? Você tem conteúdo por meio de compartilhamento de arquivo, intranet, Lotus Notes; tem aplicativo da Salesforce, Oracle, SAP e tem pessoas que utilizam e-mail, outlook e mensagem instantânea e porque não usar tudo isso junto?&#8221;, questionou o CEO da Salesforce.</p>
<p>De acordo com Benioff, a colaboração por meio do Chatter será tão fácil como ocorre no Facebook e os aplicativos &#8220;conversarão com o usuário&#8221;. Em relação à segurança e privacidade, ele esclareceu que a ferramenta traz funcionalidades que permitem determinar quem tem acesso à determinada apresentação que será compartilhada na rede, quais pessoas podem ingressar em um grupo recém criado. Os filtros funcionam inclusive para os aplicativos.</p>
<p>Logo após a apresentação que também marcou a abertura do evento, Benioff participou de um bate-papo com jornalistas. Ele explicou que a estratégia da companhia está, sobretudo, em criar produtos que possam ser integrados. Mas adiantou que, no caso do Chatter, &#8220;o primeiro passo é colocar o produto como a próxima geração de colaboração. Não é um software de rede social, é uma plataforma de colaboração e o segundo passo é diferenciar os produtos como CRM da plataforma de integração.&#8221;</p>
<p>Versões atualizadas<br />
Além do lançamento do Chatter, a Salesforce.com apresentou versões atualizadas do Sales Cloud2 e Service Cloud2. Ambos produtos receberam ferramentas colaborativas e integração com redes sociais. Tudo para facilitar o trabalho, melhorar o desempenho das companhias e deixar tudo dentro do conceito integração e colaboração.</p>
<p>No caso do Service Cloud, Benioff avisou que se trata de uma nova geração de serviço ao cliente e apresentou um slide com dado creditado à Frost &#38; Sullivan que, em 2009, a Salesforce terá 55% de market share em CRM no modelo SaaS. &#8220;Os contacts center estão desconectados e os clientes estão nas redes sociais. As empresas investem em SAP, Oracle e Microsoft, mas os clientes estão em outros lugares&#8221;, provocou o executivo.</p>
<p>O vice-presidente de marketing da companhia, Kraig Swensrud, mostrou que a Dell, por exemplo, adotou o CRM da Salesforce, já nesta nova era e lembrou que os usuários têm, na mesma tela, acesso a todos os canais como telefone, redes sociais, e-mail e site. &#8220;O sistema é totalmente integrado. Pode saber de onde e o que as pessoas estão falando. É possível fazer filtros por perfil de clientes ou produtos, por exemplo.&#8221;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Google knows you don't understand Google Wave and knows you understand Google Wave better]]></title>
<link>http://sriramvenkit.com/2009/11/21/google-knows-you-dont-understand-google-wave-and-knows-you-understand-google-wave-better/</link>
<pubDate>Sat, 21 Nov 2009 20:15:53 +0000</pubDate>
<dc:creator>Sriram Venkitachalam</dc:creator>
<guid>http://sriramvenkit.com/2009/11/21/google-knows-you-dont-understand-google-wave-and-knows-you-understand-google-wave-better/</guid>
<description><![CDATA[As planners &#8211; strategists &#8211; advertising folk, we&#8217;re after reducing complex things ]]></description>
<content:encoded><![CDATA[As planners &#8211; strategists &#8211; advertising folk, we&#8217;re after reducing complex things ]]></content:encoded>
</item>
<item>
<title><![CDATA[Got Started With Google App Engine]]></title>
<link>http://sankarsan.wordpress.com/2009/11/21/got-started-with-google-app-engine/</link>
<pubDate>Sat, 21 Nov 2009 15:52:20 +0000</pubDate>
<dc:creator>sankarsan</dc:creator>
<guid>http://sankarsan.wordpress.com/2009/11/21/got-started-with-google-app-engine/</guid>
<description><![CDATA[The term &#8220;Cloud Computing&#8221; has gained a lot of attention by now and the momentum seems t]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>The term &#8220;<span style="color:#0000ff;">Cloud Computing</span>&#8221; has gained a lot of attention by now and the momentum seems to be rising even in 2010.Cloud Computing appears in Gartner&#8217;s list of <a href="http://www.gartner.com/it/page.jsp?id=1210613" target="_blank">Top 10 Strategic Technologies for 2010</a> and as per the report:</p>
<blockquote><p>Cloud computing is a style of computing that characterizes a model in which providers deliver a variety of IT-enabled capabilities to consumers. Cloud-based services can be exploited in a variety of ways to develop an application or a solution. Using cloud resources does not eliminate the costs of IT solutions, but does re-arrange some and reduce others. In addition, consuming cloud services enterprises will increasingly act as cloud providers and deliver application, information or business process services to customers and business partners.</p></blockquote>
<p><!--more--></p>
<p>Today I started looking into Google&#8217;s offering in this space &#8220;<span style="color:#0000ff;">Google App Engine</span>&#8220;.App Engine allows to host web applications in Google Cloud infrastructure which can scale up in terms of processing and storage needs as per demand and the billing model is pay as you use.</p>
<p>To host the applications in App Engine the application has to necessarily comply to the technical standards and constraints enforced by the platform.So we have got the <span style="color:#0000ff;">Google App Engine SDK</span> which provides a set of libraries and utilities for developing and deploying applications in App Engine.It also provides a simulation environment where we can run the programs in developer machine before uploading them to App Engine.</p>
<p>As far programming languages are concerned Google App Engine SDK is currently available for the <span style="color:#0000ff;">Java</span> and <span style="color:#0000ff;">Python</span> environments.I have started looking into the Python environment to start with.</p>
<p>The key components of the App Engine based application is shown below:</p>
<p><a href="http://sankarsan.files.wordpress.com/2009/11/appe.png"><img style="border-width:0;" src="http://sankarsan.files.wordpress.com/2009/11/appe_thumb.png?w=344&#038;h=282" border="0" alt="appe" width="344" height="282" /></a></p>
<ul>
<li><span style="color:#0000ff;">Web App Framework</span> &#8211; The App Engine web server and the web application interacts based on <span style="color:#0000ff;">CGI</span> protocol.The <span style="color:#0000ff;">webapp</span> framework is a simple web application framework provided by App Engine which contains Request Handlers,Request and Response objects.The webapp is also compatible with <span style="color:#0000ff;">WSGI</span> protocol widely used by the Python web containers.It&#8217;s not mandatory to use the webapp framework other frameworks like <span style="color:#0000ff;"><a href="http://www.djangoproject.com/" target="_blank">Django</a></span> can be used well in conjunction with the App Engine.</li>
<li><span style="color:#0000ff;">DataStore</span> &#8211; App Engine uses a non relational schemaless database which is suited for web applications and specifically suited for scalable read and query performance.</li>
<li><span style="color:#0000ff;">API for App Engine Datastore</span> &#8211; App Engine provide a rich set of Python API to access the datastore and also a SQL like query language called <span style="color:#0000ff;">GQL</span>.</li>
<li><span style="color:#0000ff;">Services</span>
<ul>
<li><span style="color:#0000ff;">Memcache</span> &#8211; A distributed in-memory caching service</li>
<li><span style="color:#0000ff;">URL Fetch</span> &#8211; A service for accesing services hosted in other web servers outside google app engine.</li>
<li><span style="color:#0000ff;">Mail</span> &#8211; A service for sending/receiving email</li>
<li><span style="color:#0000ff;">Images</span> &#8211; Service to manipulate image data like resize,rotate,flip,crop etc.</li>
<li><span style="color:#0000ff;">Google Accounts</span> &#8211; This provides an authentication service with Google accounts.</li>
</ul>
</li>
</ul>
<p>This is all for now.In the next post I will explain the simple steps I have followed to build my first App Engine application.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Writing Java Hello World for Google app engine]]></title>
<link>http://kashifahmed.wordpress.com/2009/11/20/writing-java-hello-world-for-google-app-engine/</link>
<pubDate>Fri, 20 Nov 2009 15:12:13 +0000</pubDate>
<dc:creator>Kashi</dc:creator>
<guid>http://kashifahmed.wordpress.com/2009/11/20/writing-java-hello-world-for-google-app-engine/</guid>
<description><![CDATA[Thanks to Vineet Manohar! Please visit the following link to see step by step guide to create Java H]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Thanks to Vineet Manohar!</p>
<p>Please visit the following link to see step by step guide to create Java Hello World program for Google App. Engine:</p>
<p><strong>Writing Java Hello World for Google app engine</strong><br />
<a href="http://www.vineetmanohar.com/2009/04/11/writing-java-hello-world-for-google-app-engine/">http://www.vineetmanohar.com/2009/04/11/writing-java-hello-world-for-google-app-engine/</a></p>
<p>Thanks</p>
<p>Kashi</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Spring 3 on the Google App Engine: REST in Peace]]></title>
<link>http://ice09.wordpress.com/2009/11/19/spring-3-on-the-google-app-engine-rest-in-peace/</link>
<pubDate>Thu, 19 Nov 2009 21:49:35 +0000</pubDate>
<dc:creator>ice09</dc:creator>
<guid>http://ice09.wordpress.com/2009/11/19/spring-3-on-the-google-app-engine-rest-in-peace/</guid>
<description><![CDATA[Note: The complete source and necessary jars are available in github here. For just downloading, unz]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><i><b>Note: The complete source and necessary jars are available in github <a href='http://github.com/Radgon/Collection/tree/master/gae-rest-sample/'>here</a>. For just downloading, unzipping and importing the project into Eclipse, press <img src="http://ice09.wordpress.com/files/2009/11/download1.png"></img> on the github site.</b><br />
Important: this is a collection of projects, the relevant project for this post is gae-rest-sample and spring3-resttemplate.</i></p>
<p>Finally I succeeded in getting REST (with the new REST support in Spring 3) done in the Google App Engine.<br />
It wouldn&#8217;t be an easy task, but thanks to one brilliant blog post, a forum post and a very helpful JIRA issue, it can be resolved just by searching.</p>
<ol>
<li>The <a href='http://www.jroller.com/eyallupu/entry/content_negotiation_using_spring_mvc'>brilliant blog post</a> about Spring REST in general by Eyal Lupu.<br />
This post is just a rewrite of that one, just adding the GAE-related stuff.<br />
<i>All details about REST content negotiation and how the Spring MVC works with REST is explained there.</i></li>
<li>The <a href='http://groups.google.com/group/google-appengine-java/browse_thread/thread/96442cc90c55d90f'>forum post</a> about problems with GAE and XStream</a>.<br />
This helps to unterstand the reason for the <i>sun.reflect.ReflectionFactory is a restricted class</i> exception when using XStream on GAE.</li>
<li>The <a href='http://jira.codehaus.org/browse/XSTR-566'>JIRA issue 566</a>, which investigates the problem in more detail and provides a solution which is valid for at least the usage in this context (note the last entry).</li>
</ol>
<p>I finally took the snapshot jar attached to the JIRA issue, which works well for the samples in this post. Nevertheless, there might still be difficulties with XStream on the GAE, so be aware.</p>
<p><b>The client</b></p>
<p>Eyal Lupu also provides a JSON-Client in his post. The client itself is straightforward &#8211; it uses the Spring RestTemplate. The <i>JsonHttpMessageConverter</i> uses Spring&#8217;s FileCopyUtils for InputStream  String conversion which is quite cool.</p>
<p>Spring RestTemplate:</p>
<pre class="brush: java;">
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(new HttpMessageConverter[]{new JsonHttpMessageConverter()});

    JSONObject result = restTemplate.getForObject(&#34;http://localhost:8080/users/.js&#34;, JSONObject.class);

    JSONArray aresult = result.getJSONArray(&#34;payload&#34;);
    for (int x=0; x&#60;aresult.length(); ++x) {
        JSONObject currResult = (JSONObject) aresult.get(x);
        System.out.format(&#34;%-100s &#124; %s%n&#34;, currResult.get(&#34;name&#34;), currResult.get(&#34;lastLoggedInAt&#34;));
    }
</pre>
<p>JSON-Unmarshaller:</p>
<pre class="brush: java;">
	@Override
	protected JSONObject readInternal(Class&#60;JSONObject&#62; clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
                MediaType contentType = inputMessage.getHeaders().getContentType();
		Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : Charset.forName(&#34;utf-8&#34;);
		String stringResult =  FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));

		JSONObject jObject;
		try {
			jObject = new JSONObject(stringResult);
		} catch (JSONException e) {
			throw new IOException (e);
		}
		return jObject;
	}
</pre>
<p><i>Annoyances</i></p>
<p>Here are some things I don&#8217;t understand and I had to work around.<br />Please comment if you know more about the problem.</p>
<ol>
<li>In the <i>web.xml</i>, the url-pattern has to be <b>/</b> instead of <b>/*</b> (or <b>/rest</b> in the original sample) to get it working in the GAE</li>
<li>Usually, I would prefer having the jsp-views in <b>/WEB-INF/*</b>. However, this does not work in GAE (doesn&#8217;t find <b>WEB-INF</b> or anything below <b>WEB-INF</b>)</li>
</ol>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[McHenry Cloud Developers Group]]></title>
<link>http://just3ws.wordpress.com/2009/11/19/mchenry-cloud-developers-group/</link>
<pubDate>Thu, 19 Nov 2009 19:48:54 +0000</pubDate>
<dc:creator>just3ws</dc:creator>
<guid>http://just3ws.wordpress.com/2009/11/19/mchenry-cloud-developers-group/</guid>
<description><![CDATA[Azure. EC2. App Engine. Do any of those names sound familiar? If so then join us for the first meeti]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Azure. EC2. App Engine.</p>
<p>Do any of those names sound familiar? If so then join us for the first meeting of the McHenry Cloud Developers Group in Crystal Lake, Illinois!</p>
<p>Our first meeting will be an informal discussion of the goal of the group, ideas for projects and presentations. Also, we want to know what you are looking to get out of the group.</p>
<p>The meeting is <b>Monday, December 14th</b> from 7:00 PM until 8:00 PM. We&#8217;ll be meeting in the downstairs Ames-1 meeting room.</p>
<p>Please join us in Crystal Lake and join the projects or hang back and soak up some info!</p>
<p>Our first meeting will be held at the <a href="http://www.crystallakelibrary.org/">Crystal Lake Public Library</a>.</p>
<p></p>
<p><a href="http://clouddevelopersgroup.eventbrite.com/" style="text-transform:uppercase;font-weight:bold;color:red;font-size:x-large;text-align:center;">Register here!</a></p>
<p></p>
<p>Directions:<br /><a style="font-weight:bolder;font-size:large;" href="http://maps.google.com/maps?hl=en&#38;client=firefox-a&#38;num=50&#38;ie=UTF8&#38;cid=0,0,18131785654961966104&#38;fb=1&#38;hq=public+library&#38;hnear=crystal+lake&#38;gl=us&#38;daddr=126+W+Paddock+St,+Crystal+Lake,+IL+60014-6194&#38;geocode=4825050078974684836,42.240243,-88.324550&#38;ei=cCkDS_7LONPVngfvtaF0&#38;ved=0CAwQngIwAA&#38;z=16">Crystal Lake Public Library<br />126 W Paddock St<br />Crystal Lake, IL 60014-6194</a></p>
<p><iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?hl=en&amp;#38;client=firefox-a&amp;#38;num=50&amp;#38;ie=UTF8&amp;#38;cid=0,0,18131785654961966104&amp;#38;fb=1&amp;#38;hq=public library&amp;#38;hnear=crystal lake&amp;#38;gl=us&amp;#38;daddr=126 W Paddock St, Crystal Lake, IL 60014-6194&amp;#38;geocode=4825050078974684836,42.240243,-88.324550&amp;#38;ei=cCkDS_7LONPVngfvtaF0&amp;#38;ved=0CAwQngIwAA&amp;#38;ll=42.240243,-88.32455&amp;#38;spn=0.006295,0.008503&amp;#38;output=embed&amp;#38;w=425&amp;#38;h=350"></iframe><br /><small><a href="http://maps.google.com/maps?hl=en&amp;#38;client=firefox-a&amp;#38;num=50&amp;#38;ie=UTF8&amp;#38;cid=0,0,18131785654961966104&amp;#38;fb=1&amp;#38;hq=public library&amp;#38;hnear=crystal lake&amp;#38;gl=us&amp;#38;daddr=126 W Paddock St, Crystal Lake, IL 60014-6194&amp;#38;geocode=4825050078974684836,42.240243,-88.324550&amp;#38;ei=cCkDS_7LONPVngfvtaF0&amp;#38;ved=0CAwQngIwAA&amp;#38;ll=42.240243,-88.32455&amp;#38;spn=0.006295,0.008503&amp;#38;source=embed&amp;#38;w=425&amp;#38;h=350" style="color:#0000FF;text-align:left">View Larger Map</a></small></p>
<p>Also, we have a brand new site up. <a href="http://www.clouddevelopersgroup.com">http://www.clouddevelopersgroup.com</a>. It&#8217;s a very early draft but feel free to check it out.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Google App Engine, Spring, retrying transactions]]></title>
<link>http://lumpynose.wordpress.com/2009/11/16/google-app-engine-spring-retrying-transactions/</link>
<pubDate>Tue, 17 Nov 2009 07:26:03 +0000</pubDate>
<dc:creator>Rusty Wright</dc:creator>
<guid>http://lumpynose.wordpress.com/2009/11/16/google-app-engine-spring-retrying-transactions/</guid>
<description><![CDATA[The xml transaction configuration file. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><strong>The xml transaction configuration file.</strong></p>
<pre class="brush: xml;">
&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;

&#60;beans:beans
    xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
    xmlns:tx=&#34;http://www.springframework.org/schema/tx&#34;
    xmlns:aop=&#34;http://www.springframework.org/schema/aop&#34;
    xmlns:beans=&#34;http://www.springframework.org/schema/beans&#34;
    xsi:schemaLocation=&#34;
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&#34;&#62;

    &#60;!-- the transactionManager is declared in the                          --&#62;
    &#60;!-- src/main/resources/spring/jdo-&#60;whatever&#62;-context.xml file.         --&#62;
    &#60;!-- the transactional advice; what 'happens'; used by the              --&#62;
    &#60;!-- &#60;aop:advisor/&#62; bean.                                               --&#62;
    &#60;tx:advice id=&#34;transactionAdvice&#34; transaction-manager=&#34;transactionManager&#34;&#62;
        &#60;tx:attributes&#62;
            &#60;!-- for read only, propagation=NOT_SUPPORTED suspends any      --&#62;
            &#60;!-- current transaction, if there is one. I.e., read only      --&#62;
            &#60;!-- queries are run without a transaction.  With this,    --&#62;
            &#60;!-- we can do queries on multiple unowned entities.            --&#62;
            &#60;tx:method
                name=&#34;find*&#34;
                read-only=&#34;true&#34;
                propagation=&#34;NOT_SUPPORTED&#34;
            /&#62;

            &#60;!-- always starts a transaction.  if any exception is thrown   --&#62;
            &#60;!-- the transaction is rolled back.                            --&#62;
            &#60;tx:method
                name=&#34;*&#34;
                rollback-for=&#34;Throwable&#34;
                propagation=&#34;REQUIRED&#34;
            /&#62;
        &#60;/tx:attributes&#62;
    &#60;/tx:advice&#62;

    &#60;!-- ordinarily you'd only wrap the service layer classes with --&#62;
    &#60;!-- transactions but I needed transactions around the dao classes --&#62;
    &#60;!-- for testing.  but that's when I was doing things differently --&#62;
    &#60;!-- and now I don't know if I still need them around the dao classes. --&#62;
    &#60;!-- it shouldn't hurt to leave them this way; the inner transactions --&#62;
    &#60;!-- (the daos) are combined with the outer ones (the services). --&#62;
    &#60;aop:config&#62;
        &#60;aop:pointcut
            id=&#34;waitlistServiceOperation&#34;
            expression=&#34;execution(* com.objecteffects.waitlist.service.api.*.*(..))&#34;
        /&#62;

        &#60;aop:pointcut
            id=&#34;waitlistDaoOperation&#34;
            expression=&#34;execution(* com.objecteffects.waitlist.db.api.dao.*.*(..))&#34;
        /&#62;

        &#60;aop:advisor
            advice-ref=&#34;transactionAdvice&#34;
            pointcut-ref=&#34;waitlistServiceOperation&#34;
            order=&#34;99&#34;
        /&#62;

        &#60;aop:advisor
            advice-ref=&#34;transactionAdvice&#34;
            pointcut-ref=&#34;waitlistDaoOperation&#34;
            order=&#34;99&#34;
        /&#62;

        &#60;aop:aspect id=&#34;retryAspect&#34; ref=&#34;transactionRetryer&#34;&#62;
            &#60;aop:around
                method=&#34;retry&#34;
                pointcut-ref=&#34;waitlistServiceOperation&#34;
            /&#62;

            &#60;aop:around
                method=&#34;retry&#34;
                pointcut-ref=&#34;waitlistDaoOperation&#34;
            /&#62;
        &#60;/aop:aspect&#62;
    &#60;/aop:config&#62;

    &#60;beans:bean id=&#34;transactionRetryer&#34; class=&#34;com.objecteffects.waitlist.db.transaction.TransactionRetryer&#34;&#62;
        &#60;beans:property
            name=&#34;order&#34;
            value=&#34;1&#34;
        /&#62;
    &#60;/beans:bean&#62;
&#60;/beans:beans&#62;
</pre>
<p><strong>The dummy dao interface with its dummy method.</strong></p>
<pre class="brush: java;">
package com.objecteffects.waitlist.db.api.dao;

import javax.jdo.JDOCanRetryException;

/**
 * This interface is used for testing transactions.  It needs to be in
 * this package because the xml configuration file for transactions
 * says to proxy all classes in this package.
 *
 * @author Rusty Wright
 */
public interface IDummyDao {
    /**
     * always throws the exception.
     *
     * @throws JDOCanRetryException
     */
    void dummy() throws JDOCanRetryException;

    /**
     * throws the exception the first time it's called and doesn't
     * throw it after that on subsequent calls.
     *
     * @throws JDOCanRetryException
     */
    void dummyOnce() throws JDOCanRetryException;
}
</pre>
<p><strong>The dummy dao implementation.</strong><br />
All it does is throw an exception.</p>
<pre class="brush: java;">
package com.objecteffects.waitlist.db.transaction;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Repository;

import com.objecteffects.waitlist.db.api.dao.IDummyDao;

/**
 * @author Rusty Wright
 */
@Repository(&#34;dummyDao&#34;)
public class DummyDao implements IDummyDao {
    private final transient Logger log = LoggerFactory.getLogger(getClass());

    static int count = 0;

    public void dummy() {
        this.log.debug(&#34;called&#34;);

        throw (new javax.jdo.JDOCanRetryException(&#34;urk&#34;));
    }

    public void dummyOnce() {
        if (DummyDao.count++ == 0)
            throw (new javax.jdo.JDOCanRetryException(&#34;urk&#34;));
    }
}
</pre>
<p><strong>The test.</strong></p>
<pre class="brush: java;">
package com.objecteffects.waitlist.db.transaction;

import javax.annotation.Resource;
import javax.jdo.JDOCanRetryException;

import org.junit.Test;
import org.junit.runner.RunWith;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;

import com.objecteffects.gaeutils.LocalDatastoreTestCase;
import com.objecteffects.waitlist.db.api.dao.IDummyDao;

/**
 * @author Rusty Wright
 */
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
    DependencyInjectionTestExecutionListener.class
})
@ContextConfiguration(locations = {
        &#34;classpath:spring/jdo-tx-context.xml&#34;,
        &#34;classpath:spring/applicationContext.xml&#34;,
        &#34;classpath:spring/jdo-gae-context.xml&#34;,
        &#34;classpath:gae-utils.xml&#34;
})
public class TransactionRetryerTest extends LocalDatastoreTestCase {
    private final transient Logger log = LoggerFactory.getLogger(getClass());

    @Resource(name=&#34;dummyDao&#34;)
    private IDummyDao dummyDao;

    /** */
    @Test(expected = JDOCanRetryException.class)
    public void testDummy() {
        this.log.debug(&#34;called&#34;);

        this.dummyDao.dummy();

    }

    /** */
    @Test
    public void testDummyOnce() {
        this.log.debug(&#34;called&#34;);

        this.dummyDao.dummyOnce();

    }
}
</pre>
<p><strong>The transaction retryer.</strong></p>
<pre class="brush: java;">
package com.objecteffects.waitlist.db.transaction;

import java.util.ConcurrentModificationException;

import org.aspectj.lang.ProceedingJoinPoint;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.core.Ordered;

/**
 * @author Rusty Wright
 */
public class TransactionRetryer implements Ordered {
    private final transient Logger log = LoggerFactory.getLogger(getClass());

    private int order;
    private int maxRetries = 3;

    /**
     * @param pjp
     * @return next caller's return value
     * @throws Throwable
     */
    public Object retry(final ProceedingJoinPoint pjp) throws Throwable {
        this.log.debug(&#34;called&#34;);

        Throwable exception = new Throwable(&#34;oops&#34;);

        int retryCount = 0;

        while (retryCount++ &#60; this.maxRetries) {
            try {
                return (pjp.proceed());
            }
            catch (final JDOCanRetryException ex) {
                exception = ex;

                // retry
            }
            catch (final JDOException ex) {
                /**
                 * to quote Google's documentation: If any action
                 * fails due to the requested entity group being in
                 * use by another process, JDO throws a
                 * JDODataStoreException or a JDOException, caused by a
                 * java.util.ConcurrentModificationException.
                 */
                if (!(ex.getCause() instanceof ConcurrentModificationException))
                    throw (ex); // fail

                exception = ex;

                // retry
            }

            this.log.debug(&#34;retryCount: {}, exception: {}&#34;,
                    Integer.valueOf(retryCount),
                    ExceptionUtils.getFullStackTrace(exception));
        }

        throw (exception);
    }

    /**
     * @param _order
     */
    public void setOrder(final int _order) {
        this.order = _order;
    }

    /**
     * @return the order
     */
    public int getOrder() {
        return (this.order);
    }

    /**
     * @param _maxRetries the maxRetries to set
     */
    public void setMaxRetries(final int _maxRetries) {
        if (_maxRetries &#60;= 0)
            throw (new IllegalArgumentException(&#34;maxRetries must be &#62; 0&#34;));

        this.maxRetries = _maxRetries;
    }
}
</pre>
<p><strong>The logs.</strong><br />
Hover your mouse over this and in its top right corner are some gizmos where you can view source, or copy it to the clip board; that will make it easier to read with less line wrapping.</p>
<pre class="brush: plain;">
2009-11-16 23:24:20.184 PST, DEBUG: [main] org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource.addTransactionalMethod.94: Adding transactional method [find*] with attribute [PROPAGATION_NOT_SUPPORTED,ISOLATION_DEFAULT,readOnly]
2009-11-16 23:24:20.184 PST, DEBUG: [main] org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource.addTransactionalMethod.94: Adding transactional method [*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Throwable]
2009-11-16 23:24:20.184 PST, DEBUG: [main] org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource.addTransactionalMethod.94: Adding transactional method [*] with attribute [PROPAGATION_NEVER,ISOLATION_DEFAULT]
2009-11-16 23:24:20.450 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryerTest.testDummy.44: called
2009-11-16 23:24:20.466 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryer.retry.25: called
2009-11-16 23:24:20.466 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction.367: Creating new transaction with name [com.objecteffects.waitlist.db.api.dao.IDummyDao.dummy]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Throwable
2009-11-16 23:24:20.481 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doBegin.310: Opened new PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@159ea8e] for JDO transaction
2009-11-16 23:24:20.481 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.DummyDao.dummy.20: called
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback.856: Initiating transaction rollback
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doRollback.449: Rolling back JDO transaction on PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@159ea8e]
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doCleanupAfterCompletion.501: Closing JDO PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@159ea8e] after transaction
2009-11-16 23:24:20.497 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryer.retry.46: retryCount: 1, exception: javax.jdo.JDOCanRetryException: urk
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction.367: Creating new transaction with name [com.objecteffects.waitlist.db.api.dao.IDummyDao.dummy]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Throwable
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doBegin.310: Opened new PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@170984c] for JDO transaction
2009-11-16 23:24:20.497 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.DummyDao.dummy.20: called
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback.856: Initiating transaction rollback
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doRollback.449: Rolling back JDO transaction on PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@170984c]
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doCleanupAfterCompletion.501: Closing JDO PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@170984c] after transaction
2009-11-16 23:24:20.497 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryer.retry.46: retryCount: 2, exception: javax.jdo.JDOCanRetryException: urk
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction.367: Creating new transaction with name [com.objecteffects.waitlist.db.api.dao.IDummyDao.dummy]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Throwable
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doBegin.310: Opened new PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@45aa2c] for JDO transaction
2009-11-16 23:24:20.497 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.DummyDao.dummy.20: called
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback.856: Initiating transaction rollback
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doRollback.449: Rolling back JDO transaction on PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@45aa2c]
2009-11-16 23:24:20.497 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doCleanupAfterCompletion.501: Closing JDO PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@45aa2c] after transaction
2009-11-16 23:24:20.497 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryer.retry.46: retryCount: 3, exception: javax.jdo.JDOCanRetryException: urk
2009-11-16 23:24:20.513 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryerTest.testDummyOnce.56: called
2009-11-16 23:24:20.513 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryer.retry.25: called
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction.367: Creating new transaction with name [com.objecteffects.waitlist.db.api.dao.IDummyDao.dummyOnce]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Throwable
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doBegin.310: Opened new PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@1c19919] for JDO transaction
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback.856: Initiating transaction rollback
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doRollback.449: Rolling back JDO transaction on PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@1c19919]
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doCleanupAfterCompletion.501: Closing JDO PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@1c19919] after transaction
2009-11-16 23:24:20.513 PST, DEBUG: [main] com.objecteffects.waitlist.db.transaction.TransactionRetryer.retry.46: retryCount: 1, exception: javax.jdo.JDOCanRetryException: urk
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction.367: Creating new transaction with name [com.objecteffects.waitlist.db.api.dao.IDummyDao.dummyOnce]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Throwable
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doBegin.310: Opened new PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@413fc6] for JDO transaction
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit.765: Initiating transaction commit
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doCommit.432: Committing JDO transaction on PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@413fc6]
2009-11-16 23:24:20.513 PST, DEBUG: [main] org.springframework.orm.jdo.JdoTransactionManager.doCleanupAfterCompletion.501: Closing JDO PersistenceManager [org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager@413fc6] after transaction
</pre>
<p>The project that this is for is at <a href="http://code.google.com/p/waitlist/source/browse/#svn/trunk">wait list</a>.  It&#8217;s a work in progress.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Voicify Me]]></title>
<link>http://geekcredential.wordpress.com/2009/11/16/voicify-me/</link>
<pubDate>Mon, 16 Nov 2009 20:26:31 +0000</pubDate>
<dc:creator>msilverboard</dc:creator>
<guid>http://geekcredential.wordpress.com/2009/11/16/voicify-me/</guid>
<description><![CDATA[Voicify is the product of one weekend&#8217;s efforts by Michael Potter&#8217;s team at Atlanta Star]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><a href="http://www.voicify.me/">Voicify</a> is the product of one weekend&#8217;s efforts by <a href="http://www.linkedin.com/profile?authToken=5nB4&#38;viewProfile=&#38;authType=name&#38;trk=api_1154_OS_LI_EVENTS_PROD&#38;key=10630332">Michael Potter</a>&#8217;s team at <a href="http://atlanta.startupweekend.org/">Atlanta Startup Weekend</a>. It does an automated telephone survey using the questions you specify from a web form. (Caution &#8211; being a simple proof-of-concept, it does not check against the FTC Do Not Call list.)</p>
<p>It uses Python and Django on Google App Engine and BigTable.</p>
<p>Try it out &#8211; every user gets a $2.00 credit to begin with, and it costs 10&#162; per call. </p>
<p>And all I did with my weekend was rake leaves.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Google App Engine ]]></title>
<link>http://yasmine215.wordpress.com/2009/11/16/google-app-engine/</link>
<pubDate>Mon, 16 Nov 2009 01:37:51 +0000</pubDate>
<dc:creator>yasmine215</dc:creator>
<guid>http://yasmine215.wordpress.com/2009/11/16/google-app-engine/</guid>
<description><![CDATA[  Google App Engine lets you run your web applications on Google&#8217;s infrastructure. App Engine ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><div> <br />
Google App Engine lets you run your web applications on Google&#8217;s infrastructure. App Engine applications are easy to build, easy to maintain, and easy to scale as your traffic and data storage needs grow. W</div>
<div>ith App Engine, there are no servers to maintain: You just upload your application, and it&#8217;s ready to serve your users.</div>
<div> </div>
<div>Google App Engine supports apps written in several programming languages. With App Engine&#8217;s Java runtime environment, you can build your app using standard Java technologies, including the JVM, Java servlets, and the Java programming language—or any other language using a JVM-based interpreter or compiler, such as JavaScript or Ruby. App Engine also features a dedicated Python runtime environment, which includes a fast Python interpreter and the Python standard library. The Java and Python runtime environments are built to ensure that your application runs quickly, securely, and without interference from other apps on the system.</div>
<div>Google App Engine makes it easy to build an application that runs reliably, even under heavy load and with large amounts of data. App Engine includes the following features:</div>
<div>
<ul>
<li>dynamic web serving, with full support for common web technologies</li>
<li>persistent storage with queries, sorting and transactions</li>
<li>automatic scaling and load balancing</li>
<li>APIs for authenticating users and sending email using Google Accounts</li>
<li>a fully featured local development environment that simulates Google App Engine on your computer</li>
<li>task queues for performing work outside of the scope of a web request</li>
<li>scheduled tasks for triggering events at specified times and regular intervals</li>
</ul>
<p>Your application can run in one of two runtime environments: the <a href="http://java.sun.com/">Java</a> environment, and the <a href="http://www.python.org/">Python</a> environment. Each environment provides standard protocols and common technologies for web application development.</p>
<p>&#160;</p>
<p>Resources:</p>
<p><a href="http://code.google.com/appengine/docs/whatisgoogleappengine.html">http://code.google.com/appengine/docs/whatisgoogleappengine.html</a></p>
</div>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[TDC – The Developers Conference 2009 – day 2]]></title>
<link>http://jcranky.wordpress.com/2009/11/12/tdc-the-developers-conference-2009-day-2/</link>
<pubDate>Thu, 12 Nov 2009 00:30:22 +0000</pubDate>
<dc:creator>Paulo Renato</dc:creator>
<guid>http://jcranky.wordpress.com/2009/11/12/tdc-the-developers-conference-2009-day-2/</guid>
<description><![CDATA[In the last post, I talked about the first day of The Developers Conference. Now lets talk about day]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>In the last <a title="TDC 2009 Day 1" href="http://jcranky.com/2009/11/10/tdc-the-developers-conference-2009-day-1/" target="_blank">post</a>, I talked about the first day of <a title="the Developers Conference" href="http://www.thedevelopersconference.com.br/" target="_blank">The Developers Conference</a>. Now lets talk about day number 2.</p>
<p>Very different from the previous day, this one started full of coding. And during the day, we kept seeing lighting talks and Vinicius&#8217; toys. The only real problem we had was that the place ran out of eletricity for a while&#8230; but at least it didn&#8217;t last too long and the event could finish right.</p>
<h2>Rod Johnson</h2>
<p>The first speech was again from Rod Johnson. But this time, it was not philosophical at all. He presented <a title="Spring Roo" href="http://www.springsource.org/roo" target="_blank">Spring Roo</a>, a project that aims at bringing to Java the productivity found in Rails. After seeing what he showed, I believe it. And love it.</p>
<p>In summary, the tool generates a lot of boilerplate code that we would otherwise have to write ourselves. And keeps it all out of the way while you develop your project.</p>
<p>I liked this so much that Spring Roo will be covered in a new post, exclusive to it, soon enough. And look, I don&#8217;t like Spring, but this thing can make me change my mind.</p>
<div id="attachment_457" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-457" title="Rod Johnson on SpringRoo" src="http://jcranky.wordpress.com/files/2009/11/071120091119.jpg" alt="Rod Johnson on SpringRoo" width="450" height="337" /><p class="wp-caption-text">Rod Johnson on SpringRoo</p></div>
<h2>Lightning Talks</h2>
<p>One of these lightning talks was about Spring best practices, which followed Spring Roo&#8217;s presentation. Ricardo Jun presented it, and mentioned things like how people tend to simply want to totally discard xml, instead of using it in moderation; the importance of using tools; the importance of modularization and also that we should always mind concurrency.</p>
<div id="attachment_458" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-458" title="Jun and Spring Best Practices" src="http://jcranky.wordpress.com/files/2009/11/071120091120.jpg" alt="Jun and Spring Best Practices" width="450" height="337" /><p class="wp-caption-text">Jun and Spring Best Practices</p></div>
<p>Another quick demonstration about robotics had an application server installed in a device, which was accessed through http. This device was connected to a lamp, and Vinicius turned it on and off through a web interface. Meaning: I want all the power plugs in my house accessible through the internet!! =D</p>
<p>On the note of excited people, I must talk about Vinicius Senger again. When presenting the balloon robot for the second time now, he breathed Helium, the gas used in the balloon to make it float. The effect was that his voice got very thin for a few seconds, creating a very funny moment.</p>
<div id="attachment_459" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-459" title="Balloon Robot" src="http://jcranky.wordpress.com/files/2009/11/071120091129.jpg" alt="Balloon Robot" width="450" height="337" /><p class="wp-caption-text">Balloon Robot</p></div>
<p>Another lightning talk was about what was previously called Web Beans &#8211; now Weld: the reference implementation of <a title="JSR 299" href="http://jcp.org/en/jsr/summary?id=299" target="_blank">JSR 299: Contexts and Dependency Injection</a>. Alessandro Lazzarotti, from Red Hat, gave a quick demo on the implementation which is, of course, full of annotations everywhere.</p>
<p>An interesting lightning talk was about performance in JPA. Alberto &#8220;Spock&#8221; talked about how the <em>Open Session in View</em> filter pattern can be a little bit outdated when it comes to ajax applications &#8211; an environment which wasn&#8217;t there when the pattern was created.</p>
<div id="attachment_460" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-460" title="Alberto &#34;Spock&#34; on Ajax and JPA Performance" src="http://jcranky.wordpress.com/files/2009/11/071120091138.jpg" alt="Alberto &#34;Spock&#34; on Ajax and JPA Performance" width="450" height="337" /><p class="wp-caption-text">Alberto &#34;Spock&#34; on Ajax and JPA Performance</p></div>
<p>In <a title="Performance with JPA / Spring Web Flow etc" href="http://blog.globalcode.com.br/2009/11/melhorando-performance-de-jpa-com.html" target="_blank">Globalcode&#8217;s blog here</a>, he explains this problem better. During the presentation, he also mentioned the <a title="Apache Myfaces Orchestra" href="http://myfaces.apache.org/orchestra/myfaces-orchestra-core/" target="_blank">Apache Myfaces Orchestra</a> project, which should also help minimize the problem bringing the conversation scope to your application. The conversation scope was first introduced by <a title="JBoss Seam" href="http://seamframework.org/" target="_blank">JBoss Seam</a>, and brings us a scope bigger than request, and smaller than session, which can really help us manage resources in a lot of situations.</p>
<h2>Mike Keith</h2>
<p>This time Mike Keith presented about JPA 2.0. The goal of JPA 2.0 is basically to standartise what we currently do with, for example, <a title="Hibernate" href="http://www.hibernate.org" target="_blank">hibernate</a>, because we can&#8217;t with JPA 1. Nothing really new was presented &#8211; unless you didn&#8217;t know anything about JPA 2 already. But a few topics are worth mentioning.</p>
<p>A new <em>evictall</em> function was added. Useful to completetly clear cache between test cases. Small change but sounds interesting.</p>
<p>Now my pet peeve: the new criteria API. He presented it and showed a few examples and comparisons between the criteria code and the JPQL code. Just made me dislike it more. Just as a reminder, I already said that I don&#8217;t like this thing when I wrote about <a title="Casual Class #006" href="http://jcranky.com/2009/09/06/globalcodes-casual-class-javaee-6/" target="_blank">Globalcode&#8217;s Casual Class #006</a>. Trying to access a database completely through OO code is just too much purism. At least, Mike is a very funny presenter to watch =)</p>
<div id="attachment_461" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-461" title="Mike Keith on JPA 2.0" src="http://jcranky.wordpress.com/files/2009/11/071120091121.jpg" alt="Mike Keith on JPA 2.0" width="450" height="337" /><p class="wp-caption-text">Mike Keith on JPA 2.0</p></div>
<h2>Francisco Gioelli (Google)</h2>
<p>The original plan was to have Chris Schalk talking about <a title="Google App Engine" href="http://code.google.com/appengine/" target="_blank">Google App Engine</a>. Unfortunatelly, he had problems with the immigration and couldn&#8217;t get into the country. So google sent Francisco Gioelli, who did a nice job instead.</p>
<p>Among other languages, <a title="Google App Engine" href="http://code.google.com/appengine/" target="_blank">Google App Engine</a> allows us to write Java web applications and publish them on the google cloud, leaveraging from the monstruous google scalability. A few features available include possibility of scheduling cron tasks through a xml file and the <em>Big Table</em>, their (non-relational) database. This last feature is the only thing that makes me a little bit worried about using google&#8217;s cloud.</p>
<div id="attachment_462" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-462" title="Francisco on Google App Engine" src="http://jcranky.wordpress.com/files/2009/11/071120091133.jpg" alt="Francisco on Google App Engine" width="450" height="337" /><p class="wp-caption-text">Francisco on Google App Engine</p></div>
<p>This talk had a demo and was complemented by another one from Rafael (from <a title="Globalcode" href="http://www.globalcode.com.br" target="_blank">Globalcode</a>) &#8211; this last one using JSF 2.0 &#8211; nice! Two little extras mentioned by him: each request can take at the very most 30 seconds and the internal server used seems to be <a title="Jetty" href="http://www.mortbay.org/jetty/" target="_blank">Jetty</a>.</p>
<h2>Alejandro Guizar (Red Hat Mexico)</h2>
<p>This one was about BPEL. This is not a topic I can talk too much, so I won&#8217;t. The only thing that took my attention was something called <em>BPEL Unit</em>. I never heard of it and found interesting that such a thing exists. But I couldn&#8217;t find any good references&#8230;</p>
<div id="attachment_463" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-463" title="Alejandro on BPEL" src="http://jcranky.wordpress.com/files/2009/11/071120091135.jpg" alt="Alejandro on BPEL" width="450" height="337" /><p class="wp-caption-text">Alejandro on BPEL</p></div>
<h2>Cloud Computing Panel</h2>
<p>To close the event, a panel on Cloud Computing, featuring the main speakers that were present. This is a trendy topic nowadays, full of buzz words, but interesting, it was!</p>
<p>Ed Burns started talking that Sun have something (I forgot the name&#8230;) since 2000. Makes sense&#8230; very tipical of Sun: great products, terrible marketing. He also mentioned <a title="Zembly.com" href="http://zembly.com" target="_blank">Zembly.com</a>. If you are insterested, go to the site <strong>now</strong>. I just went there and found out that they are closing the service permanently from November 30th. Nice&#8230; (no, not really).</p>
<p>From Rod Johnson, we learnt that <a title="Springsource" href="http://www.springsource.com/" target="_blank">Springsource</a> have their hand on Cloud Computing in the form of <a title="Cloud Foundry" href="http://www.cloudfoundry.com/" target="_blank">CloudFoundry</a>. Also, he made sure to say how important it is to have multiple players in the market. Agreed.</p>
<p>Some points were easily agreed by the panelists:</p>
<ul>
<li>private clouds will have big importance in the future;</li>
<li>a good thing of the cloud is the economy;</li>
<li>but a bad thing is the loss of control in a lot of senses, but probably mainly data;</li>
<li>we need easy of migration between cloud providers.</li>
</ul>
<p>Someone asked about cloud computing and peer-to-peer. The panelists didn&#8217;t seem to believe too much in this possibility. Well, who knows&#8230;</p>
<div id="attachment_464" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-464" title="A lot of gurus on Cloud Computing" src="http://jcranky.wordpress.com/files/2009/11/071120091142.jpg" alt="A lot of gurus on Cloud Computing" width="450" height="337" /><p class="wp-caption-text">A lot of gurus on Cloud Computing</p></div>
<p>Last picture, to change the mood a litle bit:</p>
<div id="attachment_465" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-465" title="Relaxing between presentations" src="http://jcranky.wordpress.com/files/2009/11/071120091132.jpg" alt="Relaxing between presentations" width="450" height="337" /><p class="wp-caption-text">Relaxing between presentations</p></div>
<p>And so it ends this year&#8217;s event. I&#8217;m already waiting for the one next year! =D</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Google Chart API with Gaelyk on the Google App Engine]]></title>
<link>http://ice09.wordpress.com/2009/11/04/google-chart-api-with-gaelyk-on-the-google-app-engine/</link>
<pubDate>Wed, 04 Nov 2009 00:07:53 +0000</pubDate>
<dc:creator>ice09</dc:creator>
<guid>http://ice09.wordpress.com/2009/11/04/google-chart-api-with-gaelyk-on-the-google-app-engine/</guid>
<description><![CDATA[Note: Github available here. It works best with the current SpringSource Tool Suite. Having had even]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><b>Note: Github available <a href='http://github.com/Radgon/Collection'>here</a>. It works best with the current <a href='http://www.springsource.com/products/sts'>SpringSource Tool Suite.</a></b></p>
<p>Having had evening to spare, together with a colleague I came up with the following nano-project:</p>
<p><i>Write a prototype for creating a chart from some series of numbers, which is hosted in a cheap cloud.</i></p>
<p>So this brings me to: &#8220;Write a prototype (<b>Groovy</b>) for creating a chart (<b>Google Chart API</b>) from some series of numbers (taken from spreadsheets of <b>Google Docs</b>), which is hosted in a cheap cloud (<b>Google App Engine</b>).&#8221;<br />
Some day, I will have to fix this Google addiction &#8211; however, Groovy is not affiliated to Google at all.</p>
<p><b>Evaluation of Frameworks</b></p>
<p>Wanting to combine Groovy and the Google App Engine, I immediately came across two different frameworks, the almighty and ubiquitous <b><a href="http://www.grails.org/">Grails</a></b> and the much more pragmatic <b><a href="http://gaelyk.appspot.com/">Gaelyk</a></b>.<br />
Since for this purpose Gaelyk is more than enough and because I wanted to try it, I used this for prototyping. By downloading the sources from <a href='http://github.com/Radgon/Collection'>Github</a>, the typical Gaelyk project setup can be concluded if analyzed together with the information given in the Gaelyk tutorial &#8211; it&#8217;s quite easy.</p>
<p>The data (about 100-1000 random numbers between 5000 to 6000) should come from a web based, private (authorization-based) available data source &#8211; even though many possibilities exist, I chose Google Docs for two reasons:</p>
<ol>
<li>Easy creation of &#8220;some&#8221; random numbers</li>
<li>Authorization based on Google Authorization</li>
<li>Access class already exists (cmp. <a href='http://ice09.wordpress.com/2009/06/07/google-app-engine-gwt-spring-3-jpa-and-google-spreadsheet/'>this post</a>)</li>
</ol>
<p>The last important feature should be the creation of a chart. Here, really a lot compelling solutions exist. Mainly, there are three different ways to realize Chart creation:</p>
<ol>
<li>Java based, eg. <a href="http://www.jfree.org/jfreechart/">JFreeChart</a></li>
<li>Javascript based, eg. JQuery plugin <a href="http://code.google.com/p/flot/">flot</a></li>
<li>Pure Web based, eg. <a href="http://code.google.com/intl/de-DE/apis/chart/">Google Chart API</a></li>
</ol>
<p>Since I want to have it simple &#38; easy, the third option is really great for this use case. A chart can very easily be created, compare this, which is rendered dynamically:</p>
<p><img src="http://chart.apis.google.com/chart?chxl=0:&#124;&#124;1:&#124;&#38;cht=lc&#38;chxt=x,y&#38;chs=500x150&#38;chco=0077CC&#38;chm=B,E6F2FA,0,0,0&#38;chd=t:5563.0,5807.0,5096.0,5898.0,5306.0,5944.0,5932.0,5510.0,5088.0,5791.0,5039.0,5145.0,5459.0,5395.0,5997.0,5075.0,5587.0,5760.0,5561.0,5719.0,5108.0,5339.0,5321.0,5686.0,5213.0,5987.0,5228.0,5670.0,5594.0,5292.0,5909.0,5616.0,5978.0,5375.0,5504.0,5558.0,5840.0,5233.0,5947.0,5028.0,5592.0,5992.0,5020.0,5991.0,5953.0,5471.0,5243.0,5784.0,5472.0,5801.0,5652.0,5700.0,5183.0,5949.0,5809.0,5426.0,5130.0,5394.0,5919.0,5741.0,5134.0,5402.0,5801.0,5567.0,5478.0,5740.0,5563.0,5677.0,5346.0,5020.0,5243.0,5137.0,5787.0,5241.0,5351.0,5834.0,5630.0,5542.0,5238.0,5242.0,5312.0,5642.0,5424.0,5988.0,5796.0,5912.0,5599.0,5567.0,5832.0,5559.0,5760.0,5061.0,5629.0,5951.0,5095.0,5585.0,5602.0,5686.0,5562.0,5700.0,5267.0,5656.0,5757.0,5023.0,5498.0,5935.0,5650.0,5807.0,5345.0,5080.0,5919.0,5308.0,5316.0,5076.0,5154.0,5399.0,5537.0,5923.0,5968.0,5973.0,5528.0,5640.0,5097.0,5369.0,5374.0,5248.0,5955.0,5243.0,5949.0,5126.0,5659.0,5010.0,5473.0,5012.0,5536.0,5274.0,5115.0,5809.0,5212.0,5400.0,5550.0,5274.0,5931.0,5762.0,5343.0,5655.0,5434.0,5981.0,5844.0,5277.0,5823.0,5905.0,5741.0,5168.0,5057.0,5956.0,5841.0,5804.0,5421.0,5933.0,5667.0,5171.0,5083.0,5322.0,5410.0,5459.0,5092.0,5678.0,5401.0,5817.0,5526.0,5663.0,5753.0,5802.0,5289.0,5917.0,5020.0,5372.0,5993.0,5023.0,5773.0,5469.0,5681.0,5442.0,5736.0,5552.0,5678.0,5493.0,5758.0,5726.0,5713.0,5103.0,5201.0,5435.0,5583.0,5318.0,5501.0,5076.0,5004.0&#38;chds=4000,7000"></p>
<p>which is:<br />
<code><br />
http://chart.apis.google.com/chart?chxl=0:&#124;&#124;1:&#124;&#38;cht=lc&#38;chxt=x,y&#38;chs=500x150&#38;chco=0077CC&#38;chm=B,E6F2FA,0,0,0&#38;chd=t:5563.0,5807.0,5096.0,5898.0,5306.0,5944.0,5932.0,5510.0,5088.0,5791.0,5039.0,5145.0,5459.0,5395.0,5997.0,5075.0,5587.0,5760.0,5561.0,5719.0,5108.0,5339.0,5321.0,5686.0,5213.0,5987.0,5228.0,5670.0,5594.0,5292.0,5909.0,5616.0,5978.0,5375.0,5504.0,5558.0,5840.0,5233.0,5947.0,5028.0,5592.0,5992.0,5020.0,5991.0,5953.0,5471.0,5243.0,5784.0,5472.0,5801.0,5652.0,5700.0,5183.0,5949.0,5809.0,5426.0,5130.0,5394.0,5919.0,5741.0,5134.0,5402.0,5801.0,5567.0,5478.0,5740.0,5563.0,5677.0,5346.0,5020.0,5243.0,5137.0,5787.0,5241.0,5351.0,5834.0,5630.0,5542.0,5238.0,5242.0,5312.0,5642.0,5424.0,5988.0,5796.0,5912.0,5599.0,5567.0,5832.0,5559.0,5760.0,5061.0,5629.0,5951.0,5095.0,5585.0,5602.0,5686.0,5562.0,5700.0,5267.0,5656.0,5757.0,5023.0,5498.0,5935.0,5650.0,5807.0,5345.0,5080.0,5919.0,5308.0,5316.0,5076.0,5154.0,5399.0,5537.0,5923.0,5968.0,5973.0,5528.0,5640.0,5097.0,5369.0,5374.0,5248.0,5955.0,5243.0,5949.0,5126.0,5659.0,5010.0,5473.0,5012.0,5536.0,5274.0,5115.0,5809.0,5212.0,5400.0,5550.0,5274.0,5931.0,5762.0,5343.0,5655.0,5434.0,5981.0,5844.0,5277.0,5823.0,5905.0,5741.0,5168.0,5057.0,5956.0,5841.0,5804.0,5421.0,5933.0,5667.0,5171.0,5083.0,5322.0,5410.0,5459.0,5092.0,5678.0,5401.0,5817.0,5526.0,5663.0,5753.0,5802.0,5289.0,5917.0,5020.0,5372.0,5993.0,5023.0,5773.0,5469.0,5681.0,5442.0,5736.0,5552.0,5678.0,5493.0,5758.0,5726.0,5713.0,5103.0,5201.0,5435.0,5583.0,5318.0,5501.0,5076.0,5004.0&#38;chds=4000,7000<br />
</code><br />
Now, was this easy?</p>
<p><b>Preparation/Implementation</b></p>
<p>First, the Groovy file which dispatches the request is as follows (must go to the groovy folder):</p>
<pre class="brush: java;">
import java.net.URLConnection;

def labels = [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;]
int ivalue = new Random().nextInt(5);

String link;
if (memcacheService.get(labels.get(ivalue)) == null) {
	def ts = new com.commons.gse.TestSheets();
	link = ts.getData(labels.get(ivalue));
	memcacheService.put(labels.get(ivalue), link)
} else {
	link = memcacheService.get(labels.get(ivalue))
}
request.setAttribute ('counter', com.commons.gse.TestSheets.counter++)
request.setAttribute ('appendix', link)
forward '/data.gtpl'
</pre>
<p>The interesting part is the usage of the predefined object <i>memcacheService</i> which makes it possible to just use Google App Engine&#8217;s <a href="http://code.google.com/intl/de-DE/appengine/docs/java/memcache/overview.html">memcache</a> without having to deal with creation, exception handling, etc.<br />
One of five (&#8220;A-E&#8221;) cached number series is used. If no cache for the character is found, the number is extracted from a speadsheet called <i>data</i> in Google Docs (see screenshots below).<br />
After having calculated or retrieved the numerb series from the cache, the values (which is the complete link with the numbers included) are put into the ServletRequest (in this case the predefined object <i>request</i>). Finally, the request is dispatched to the view, a Groovy template (data.tgpl).</p>
<pre class="brush: xml;">
&#60;html&#62;
&#60;head/&#62;
&#60;body&#62;
  &#60;span&#62;counter:&#60;%= request.getAttribute('counter') %&#62;&#60;/span&#62;
  &#60;form&#62;
    &#60;input type=&#34;button&#34; value=&#34;Reload&#34; onClick=&#34;window.location='/data.groovy'&#34;&#62;
  &#60;/form&#62;
  &#60;img src='&#60;%= request.getAttribute('appendix') %&#62;'/&#62;
&#60;/body&#62;
&#60;/html&#62;
</pre>
<p><b>A final note: if you want to use this from Github, you will have to change the Google authorization data in TestSheets.java (which is completely left out here, but is described <a href='http://ice09.wordpress.com/2009/06/07/google-app-engine-gwt-spring-3-jpa-and-google-spreadsheet/'>here</a>).</b></p>
<p>Here is the setup of the Google Docs spreadsheets:</p>
<p><img src="http://ice09.wordpress.com/files/2009/11/namespreadsheet.png" alt="namespreadsheet"><br />
<img src="http://ice09.wordpress.com/files/2009/11/randomnumbers.png" alt="randomnumbers"></p>
<p><b>Running</b></p>
<p>If you have installed the SpringSource Tool Suite, you can just import the Eclipse project and choose &#8220;Run as&#8230;/Web Application&#8221;. The local server should be startet. Afterwards, you can call <a href='http://localhost:8080/data.groovy'> http://localhost:8080/data.groovy</a>.</p>
<p><b>Note: Be sure to change the username/password combination in TestSheets.java</b></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[In the rush to commercialize cloud computing, is security getting overlooked?  ]]></title>
<link>http://cmdoel.wordpress.com/2009/10/29/in-the-rush-to-commercialize-cloud-computing-is-security-getting-overlooked/</link>
<pubDate>Thu, 29 Oct 2009 18:26:24 +0000</pubDate>
<dc:creator>cmdoel</dc:creator>
<guid>http://cmdoel.wordpress.com/2009/10/29/in-the-rush-to-commercialize-cloud-computing-is-security-getting-overlooked/</guid>
<description><![CDATA[The promising technology of Cloud computing recently suffered its first serious bout of growing pain]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>The promising technology of Cloud computing recently suffered its first serious bout of growing pains when Microsoft/Danger, which provides cloud computing services crashed and lost all of T-Mobile Sidekick customers’ mobile phone information on their servers and back-up. That has to have cast a pall of concern over corporate customers evaluating the wisdom of outsourcing their relationship with their customers to a third party.  Microsoft was at fault, but T-Mobile gets the blame. The other reasoning that has to be running through customers’ mind is that with an emerging technology, what can go wrong will. Anyone who has experienced Microsoft’s blue screen of death can attest to this. </p>
<p>The other vulnerability cloud computing customers face is security. Imagine if the T-Mobile Sidekick disaster had been a raid by hackers instead of a server farm and back-up meltdown. In a world of computer hackers that have become expert at finding the flaws in each new release of software, cloud computing has to offer an appealing target. And it’s not only financial records.  Cracking into a server farm is the equivalent of breaking into the vault of a Swiss bank: personal records in the millions and not just one credit card company but charge accounts for them all.  All of these problems will get solved in time as vulnerabilities get identified and fixes are implemented. The question for anyone contemplating being an early adopter is “do I want to be the guinea pig that finds the bug?” like T-Mobile. </p>
<p>Perhaps the greatest vulnerability is the lack of a single point of contact ensuring the security of the cloud computing solution. If a client buys the computing resource and storage capacity from Amazon, Microsoft, Google, or another cloud supplier; he purchases middleware from one or more third parties; and he gets applications software from someone else, the only one that has a vested interest in security across these different vendors is the client buying the service.  If a break-in occurs finger pointing ensues.  More importantly, hackers understand this vulnerability and seek out the weakest link in the collection of elements comprising a solution for any given client. For example, they might find the back door in a middleware program that can be used to gain entry into the main database.</p>
<p>Google’s cloud computing solution is called the Google App Engine.  When asked after his introductory remarks at the Google Internet Summit May 5 and 6, 2009, in Mountain View, California to comment of security not being built into the architecture for cloud computing, Google CEO Eric Schmidt made the following statement.  “The answer to your question depends upon where you think security should lie.  Do you think it should be at the application layer? Or do you think it should be at some middleware layer&#8230; I think it’s too early to really know. It’s very strategic for us that people build—think of them as Ajax applications, Ajax++ (see note) with all the extensions—because that displaces the traditional PC dedicated client architecture… I don’t know how security will play out. I’m not aware within Google of a lot of activity at the applications level in security because the kinds of questions that are asked are still relatively early. Maybe we should fix that.”</p>
<p>Cloud computing is relearning all the security lessons that previous computing generation—the early mainframes, the minicomputers, and the PCs—already experienced. For those not familiar with them, the book “Cyberpunk” by Katie Hafner and John Markoff is an entertaining and informative place to start. You’ll follow the exploits of, among others, Kevin Mitnick who exploited the lax security that protected most minicomputer systems 30 years ago.  In 1979, Mitnick gained unauthorized access to Ark, the computer system Digital Equipment Corp. (now part of Hewlett Packard) and stole DEC’s next generation RSTS/E operating system software—then in development, a crime for which he was charged and convicted in 1988.  </p>
<p>Maybe security should be given more consideration in the development of cloud computing architectures.</p>
<p>Note:  according to Wikipedia, Ajax (asynchronous JavaScript + XML) is a group of interrelated web development techniques used on the client-side to create interactive web applications. With Ajax, web applications can retrieve data from the server asynchronously in the background without interfering with the display and behavior of the existing page. The use of Ajax techniques has led to an increase in interactive or dynamic interfaces on web page and better quality of Web services due to the asynchronous mode. Data is usually retrieved using the XMLHttpRequest object. </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Sun Jersey 1.0.3.1 and Google App Engine 1.2.6]]></title>
<link>http://javadocs.wordpress.com/2009/10/25/sun-jersey-1-0-3-1-and-google-app-engine-1-2-6/</link>
<pubDate>Sun, 25 Oct 2009 14:12:21 +0000</pubDate>
<dc:creator>joshjcarrier</dc:creator>
<guid>http://javadocs.wordpress.com/2009/10/25/sun-jersey-1-0-3-1-and-google-app-engine-1-2-6/</guid>
<description><![CDATA[You most likely have come across the following &#8220;warning&#8221; level log entry in your Google ]]></description>
<content:encoded><![CDATA[You most likely have come across the following &#8220;warning&#8221; level log entry in your Google ]]></content:encoded>
</item>
<item>
<title><![CDATA[More on Spring Security in Google App Engine]]></title>
<link>http://objectuser.wordpress.com/2009/10/24/more-on-spring-security-in-google-app-engine/</link>
<pubDate>Sat, 24 Oct 2009 14:14:55 +0000</pubDate>
<dc:creator>objectuser</dc:creator>
<guid>http://objectuser.wordpress.com/2009/10/24/more-on-spring-security-in-google-app-engine/</guid>
<description><![CDATA[I previously blogged about my setup for Spring Security in Google App Engine. Recently, a reader has]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I <a href="http://objectuser.wordpress.com/2009/06/24/spring-security-in-google-app-engine/">previously blogged</a> about my setup for Spring Security in Google App Engine.</p>
<p>Recently, a reader has asked me to post more details on my configuration.  This post provides those details.  Note that I simply cannot post my complete source, but hopefully everything relevant to security is available between the two posts.  The same Spring version numbers apply.</p>
<p>First, here is a relevant excerpt from my web.xml:</p>
<pre class="brush: xml;">

&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;web-app xmlns=&#34;http://java.sun.com/xml/ns/javaee&#34; version=&#34;2.5&#34;&#62;
	&#60;context-param&#62;
		&#60;param-name&#62;contextConfigLocation&#60;/param-name&#62;
		&#60;param-value&#62;
			/WEB-INF/spring/*-context.xml
		&#60;/param-value&#62;
	&#60;/context-param&#62;
	&#60;!-- ... --&#62;
	&#60;listener&#62;
		&#60;listener-class&#62;org.springframework.web.context.ContextLoaderListener&#60;/listener-class&#62;
	&#60;/listener&#62;
	&#60;filter&#62;
		&#60;filter-name&#62;springSecurityFilterChain&#60;/filter-name&#62;
		&#60;filter-class&#62;org.springframework.web.filter.DelegatingFilterProxy&#60;/filter-class&#62;
	&#60;/filter&#62;
	&#60;filter-mapping&#62;
		&#60;filter-name&#62;springSecurityFilterChain&#60;/filter-name&#62;
		&#60;url-pattern&#62;/*&#60;/url-pattern&#62;
		&#60;dispatcher&#62;FORWARD&#60;/dispatcher&#62;
		&#60;dispatcher&#62;REQUEST&#60;/dispatcher&#62;
	&#60;/filter-mapping&#62;
	&#60;!-- ... --&#62;
&#60;/web-app&#62;
</pre>
<p>My security-context.xml looks like this:</p>
<pre class="brush: xml;">
&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;beans:beans xmlns=&#34;http://www.springframework.org/schema/security&#34;
	xmlns:beans=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;
	xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd&#34;&#62;

	&#60;beans:import resource=&#34;integration-context.xml&#34; /&#62;

	&#60;http&#62;
		&#60;intercept-url pattern=&#34;/register.*&#34; filters=&#34;none&#34; /&#62;
		&#60;intercept-url pattern=&#34;/styles/**&#34; filters=&#34;none&#34; /&#62;
		&#60;intercept-url pattern=&#34;/login.*&#34; filters=&#34;none&#34; /&#62;
		&#60;intercept-url pattern=&#34;/**&#34; access=&#34;ROLE_USER&#34; /&#62;
		&#60;form-login login-page=&#34;/login.f&#34; login-processing-url=&#34;/j_spring_security_check&#34;
			default-target-url=&#34;/index.f&#34; authentication-failure-url=&#34;/login.f&#34; /&#62;
		&#60;logout logout-url=&#34;/logout&#34; logout-success-url=&#34;/&#34; /&#62;
	&#60;/http&#62;

	&#60;authentication-provider user-service-ref=&#34;userSecurityManagerService&#34; /&#62;

	&#60;beans:bean id=&#34;userSecurityManagerService&#34;
		class=&#34;my.app.security.GaeUserDetailsService&#34;&#62;
		&#60;beans:property name=&#34;userSecurityDao&#34; ref=&#34;userSecurityDao&#34; /&#62;
		&#60;beans:property name=&#34;userDao&#34; ref=&#34;userDao&#34; /&#62;
	&#60;/beans:bean&#62;

	&#60;beans:bean id=&#34;loggerListener&#34;
		class=&#34;org.springframework.security.event.authentication.LoggerListener&#34; /&#62;

	&#60;authentication-manager alias=&#34;authenticationManager&#34; /&#62;

&#60;/beans:beans&#62;
</pre>
<p>That should be it.  If it helps, let me know and tell your friends.  If it doesn&#8217;t, tell me so and I&#8217;ll give it another shot.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Virtual File System for Google App Engine]]></title>
<link>http://blog.jeffdouglas.com/2009/10/23/virtual-file-system-for-google-app-engine/</link>
<pubDate>Fri, 23 Oct 2009 13:01:25 +0000</pubDate>
<dc:creator>jeffdonthemic</dc:creator>
<guid>http://blog.jeffdouglas.com/2009/10/23/virtual-file-system-for-google-app-engine/</guid>
<description><![CDATA[App Engine has a number of security restrictions that it imposes on applications. One that is often ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>App Engine has a number of <a href="http://code.google.com/appengine/docs/whatisgoogleappengine.html" target="_blank">security restrictions</a> that it imposes on applications. One that is often cited as a major source of frustration is the inability to read/write to a local file system. It looks like the developer community may have developed a workaround.</p>
<p><a href="http://www.kyleroche.com" target="_blank">Kyle Roche</a> sent me a link to a <a href="http://code.google.com/p/gaevfs/" target="_blank">GaeVFS</a>, a distributed, writeable virtual file system for Google App Engine Java. It doesn&#8217;t actually use the local file system but simulates it using the datastore and memcache.</p>
<blockquote><p>&#8220;GaeVFS is an Apache Commons VFS plug-in that implements a distributed, writeable virtual file system for Google App Engine (GAE) for Java. GaeVFS is implemented using the GAE datastore and memcache APIs. The primary goal of GaeVFS is to provide a portability layer that allows you to write application code to access the file system&#8211;both reads and writes&#8211;that runs unmodified in either GAE or non-GAE servlet environments.&#8221;</p></blockquote>
<p>I&#8217;m not sure if we have enough time to get this added to <a href="http://links.jeffdouglas.com/book" target="_blank">our book</a> but it may be interesting.</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
