<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tales From The Cloud &#187; projects</title>
	<atom:link href="http://blog.newsplore.com/category/projects/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.newsplore.com</link>
	<description>Everything beta</description>
	<lastBuildDate>Tue, 07 Sep 2010 10:40:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Spincloud, now with worldwide forecast</title>
		<link>http://blog.newsplore.com/2009/12/13/spincloud-now-with-worldwide-forecast</link>
		<comments>http://blog.newsplore.com/2009/12/13/spincloud-now-with-worldwide-forecast#comments</comments>
		<pubDate>Mon, 14 Dec 2009 00:33:19 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[data freedom]]></category>
		<category><![CDATA[forecast]]></category>
		<category><![CDATA[weather]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=1395</guid>
		<description><![CDATA[In my constant search for free weather data for Spincloud, a short while ago I have found a gem: free forecast data offered by the progressive Norwegian Meteorologic Institute. The long range forecast coverage is fairly thorough and covers most more than 2700 locations worldwide. I am happy to announce that I have extended spincloud.com [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F12%2F13%2Fspincloud-now-with-worldwide-forecast"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F12%2F13%2Fspincloud-now-with-worldwide-forecast" height="61" width="51" /></a></div><p>In my constant search for free weather data for Spincloud, a short while ago I have found a gem: free forecast data offered by the progressive Norwegian Meteorologic Institute. The long range forecast coverage is fairly  thorough and covers most more than 2700 locations worldwide. I am happy to announce that I have extended <a href='http://spincloud.com'>spincloud.com</a> to include it.</p>
<table>
<tr>
<td><img src="http://blog.newsplore.com/wp-content/uploads/2009/12/worldwide_fcast.png" alt="worldwide_fcast" width="550" height="280" class="alignnone size-full wp-image-1396" /></td>
<td>&nbsp;&nbsp;&nbsp;</td>
</td>
</tr>
</table>
<p>The data is refreshed every hour and the forecast range is available for the next seven days. You can bookmark any <a href='http://www.spincloud.com:8080/weather/2775220'>location</a> or subscribe to weather reports via RSS.<br />
On a different but related note, I can only be thankful for the free data offered by various meteorological organizations that allows Spincloud to exist and I believe in freeing public data (weather related and otherwise) as it belongs to the public that finances government and inter-government agencies in the first place. The Norwegian Met Institute is a great example for freeing its data and I am saluting them for making the right decision.<br />
Now if only all such progressive Meteorological institutes around the world would agree on a common format for disseminating their data, it would make developers like me a tad happier&#8230;</p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/12/13/spincloud-now-with-worldwide-forecast" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/12/13/spincloud-now-with-worldwide-forecast/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Spincloud feature: heat map overlay</title>
		<link>http://blog.newsplore.com/2009/07/07/new-spincloud-feature-heat-map-overlay</link>
		<comments>http://blog.newsplore.com/2009/07/07/new-spincloud-feature-heat-map-overlay#comments</comments>
		<pubDate>Wed, 08 Jul 2009 00:40:56 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[mashups]]></category>
		<category><![CDATA[weather]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=1340</guid>
		<description><![CDATA[&#160;&#160; It took a while since the previous feature update to Spincloud. I have done a number of upgrades to the underlying tech and some intensive code refactoring but nothing visible. The time has come for another eye candy: heat maps. It is a map overlay that shows a color-translated temperature layer based on interpolated [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F07%2F07%2Fnew-spincloud-feature-heat-map-overlay"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F07%2F07%2Fnew-spincloud-feature-heat-map-overlay" height="61" width="51" /></a></div><table>
<tr>
<td><img src="http://blog.newsplore.com/wp-content/uploads/2009/07/heatmap-overlay.jpg" alt="heatmap-overlay" width="319" height="222" class="alignnone size-full wp-image-1343" /></td>
<td>&nbsp;&nbsp;</td>
<td align='justify'>It took a <a href='http://blog.newsplore.com/?p=382'>while</a> since the previous feature update to <a href='http://spincloud.com'>Spincloud</a>. I have done a number of upgrades to the underlying tech and some intensive code refactoring but nothing visible. The time has come for another eye candy: heat maps. It is a map overlay that shows a color-translated temperature layer based on interpolated values of the current weather conditions. It gives a quick indication of the average temperature across all land masses where data is available.</td>
</tr>
</table>
<p> Naturally in areas where data is more dense, the visual representation is better. The toughest job was to figure-out the interpolation math. I still have to refine the algorithm currently based on the <a href='http://en.wikipedia.org/wiki/Inverse_distance_weighting'>inverse distance weighting</a> algorithm which interpolates scattered points on a surface. Apparently a better one to use is <a href='http://en.wikipedia.org/wiki/Kriging'>kriging</a> but I have yet to implement it.<br />
The temperature map is generated from current temperatures and is updated once every hour. You can toggle the overlay by clicking the &#8220;Temp&#8221; button found on the top of the active map area.</p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/07/07/new-spincloud-feature-heat-map-overlay" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/07/07/new-spincloud-feature-heat-map-overlay/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A project triumvirate</title>
		<link>http://blog.newsplore.com/2009/07/05/the-project-triumvirate</link>
		<comments>http://blog.newsplore.com/2009/07/05/the-project-triumvirate#comments</comments>
		<pubDate>Mon, 06 Jul 2009 00:11:11 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[opinions]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[Project management]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=1302</guid>
		<description><![CDATA[There are three forces that shape a project: domain, process and technology. Add the &#8220;-driven&#8221; suffix to any of them and you&#8217;ll perhaps recognize some of the methods used in projects you&#8217;ve been involved in and yet, as soon as one takes too much of a lead against the other two, failure will follow almost [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F07%2F05%2Fthe-project-triumvirate"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F07%2F05%2Fthe-project-triumvirate" height="61" width="51" /></a></div><p>There are three forces that shape a project: domain, process and technology. Add the &#8220;-driven&#8221; suffix to any of them and you&#8217;ll perhaps recognize some of the methods used in projects you&#8217;ve been involved in and yet, as soon as one takes too much of a lead against the other two, failure will follow almost inevitably. At the intersection of these three forces we find familiar terms and concepts but first a word or two about each of them:</p>
<p><b>Technology</b><br />
Back in the days of the tech bubble, tech was allmighty. Buzzwords like Java, EJBs, PHP defined entire projects. It was the time where software became accessible to a much larger audience. The new wave of enthusiastic geeks embraced everything from new languages to professional certifications to the then-nascent open source. I admit having my share of technology-driven projects back in the day&#8230;</p>
<p><b>Process</b><br />
Process brings structure and pace to a project. The two complementary components of a project process are methodology and integration. We are all too familiar with <em>methodology</em>: waterfall, RUP or agile methods of software development are vastly documented and practiced; <em>integration</em> largely is defect management, testing, build, deployment and documentation. Today they all come together in what is called <a href="http://www.martinfowler.com/articles/continuousIntegration.html">continuous integration</a> where all these concepts become interrelated in a repetitive process that produces accountability and visibility into the progress of a project. Process is also the one force that tends to disappear first after a project is finished.</p>
<p><b>Domain</b><br />
The domain captures entities and business logic, is driven by the business requirements and is in no way influenced by the two other forces. The most successful way to employ the domain is through <a href="http://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a> where the main focus of software development is neither technology nor process but the business requirements.</p>
<p><span id="more-1302"></span><br />
There are times in the life cycle of a project where these forces have to be kept separate but most of the time they shape each other. At their confluence there are several artifacts that are paramount to a project&#8217;s success with <em>code</em> being at their core.</p>
<div><img class="alignnone size-full wp-image-1303" src="http://blog.newsplore.com/wp-content/uploads/2009/07/Project_Triumvirate.png" alt="Project_Triumvirate" width="500" height="500" /></div>
<p><i>Code</i><br />
Although each force is important during a project life-cycle, they all work towards producing code. No matter how many <a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language">UML diagrams</a>, <a href="http://www.codingthearchitecture.com/2008/03/18/software_architecture_document_guidelines.html">software architecture documents</a> or <a href="http://en.wikipedia.org/wiki/Burn_down_chart">burn down charts</a> are produced the most valuable and tangible value that a project creates is runnable code.</p>
<p><i>APIs</i><br />
Application Programming Interfaces represent the external view of runnable software products. APIs state the intent of the software. They should be cared-for and refined during a project lifecycle, until they become the best representation of the domain they are modeling. APIs also serve for integration purposes and so they should be extended to blend into the domain of the consumers as needed.</p>
<p><i>Features</i><br />
Features are defined within a project scope. They can be fully defined prior to coding in a waterfall process or, defined and/or shaped during the project development in an Agile setup. Features specify a system&#8217;s requirements (they are called <a href="http://en.wikipedia.org/wiki/User_story">user stories</a> in an agile project).</p>
<p><i>Test, Build, Deploy, Run</i><br />
Projects have to be monitored since inception to their natural end. Just like a child&#8217;s development stages, projects need to touch milestones, assess velocity and health. They do so by constant testing, building, deploying and running.</p>
<p><b>Roles</b><br />
Project roles that drive each of these forces can also be mapped in the above figure. Take the <a href="http://en.wikipedia.org/wiki/Scrum_(development)#Roles">Agile roles</a> for instance:</p>
<div><img class="alignnone size-full wp-image-1309" src="http://blog.newsplore.com/wp-content/uploads/2009/07/Roles_Forces.png" alt="Roles_Forces" width="600" height="500" /></div>
<p><b>A fine balance</b><br />
Imagine any of the forces represented by circles in the picture becoming disproportionally larger than the others. As a result, one or more of the artifacts at the intersection of the forces will become disproportionally smaller than the others upsetting the equilibrium. Whether is less features, less APIs or less testing, the end result is still unbalanced.</p>
<p>As always, people (roles) will drive the forces. Balancing them requires skill from all parts involved and the success or failure of a project depends on giving enough power to each not to overturn the balance. If <a href="http://en.wikipedia.org/wiki/First_Triumvirate">ancient romans</a> could do it two millennia ago, so can we.</p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/07/05/the-project-triumvirate" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/07/05/the-project-triumvirate/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reviewing Google AppEngine for Java (Part 1)</title>
		<link>http://blog.newsplore.com/2009/05/27/reviewing-google-appengine-for-java-part-1</link>
		<comments>http://blog.newsplore.com/2009/05/27/reviewing-google-appengine-for-java-part-1#comments</comments>
		<pubDate>Thu, 28 May 2009 02:08:56 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[cloud deployment]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java AppEngine]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=1093</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160; When Google announced that Java is the second language that the Appengine will support I almost didn&#8217;t believe it given the surge of the new languages and the perception that Java entered legacy but the JVM is a powerful tried-and-true environment and Google saw the potential of using it for what it is bound [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F05%2F27%2Freviewing-google-appengine-for-java-part-1"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F05%2F27%2Freviewing-google-appengine-for-java-part-1" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td>
<img class="alignnone size-full wp-image-1136" src="http://blog.newsplore.com/wp-content/uploads/2009/05/appengine_lowres.gif" alt="appengine_lowres" width="142" height="109" /></td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>
<div align='justify'>When Google <a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html">announced</a> that Java is the second language that the Appengine will support I almost didn&#8217;t believe it given the surge of the new languages and the perception that Java entered legacy but the JVM is a powerful tried-and-true environment and Google saw the potential of using it for what it is bound to</div>
</td>
</tr>
</tbody>
</table>
<p>become: a runtime environment for the new and exciting languages (see JRuby and Grails). The JVM is the new gateway drug in the world of languages.</p>
<p><i>Note:</i> I&#8217;ll break down this review into two posts as it&#8217;s too extensive to cover everything at once. This first part is about initial setup, JPA and some local webapp deployment issues. In the second part I&#8217;ll describe how to load data into the datastore, data indexing, how I reached some of the limitations of the AppEngine and how to get around some of them.</p>
<p>I managed to snatch an evaluation account and last few days I have been playing with it. (as of today Google opened the registrations to all). My goal was (<a href="http://blog.newsplore.com/?p=981">again</a>) simple: to port Spincloud to the AppEngine. The prize: free hosting which amounts to $20/month in my case (see my <a href="http://blog.newsplore.com/?p=880">post</a> about Java hosting providers), some cool monitoring tools that I can access on the web and of course the transparent super-scalability that Google is touting, in case I get techcrunched, slashdotted or whatever (slim chances but still&#8230;).<br />
I am a couple of weeks into the migration effort and I can conclude that the current state of the AppEngine is not quite ready for Spincloud as I&#8217;ll detail below but it comes quite close. The glaring omission was scheduling but Google <a href="http://www.techcrunch.com/2009/05/27/live-from-google-io-2009/">announced today</a> that the AppEngine will support it (awesome!) and I plan to use it from day one.</p>
<p>My stated goal is running Spincloud on AppEngine. Here are the technologies I use in Spincloud:<br />
- Spring 3.0 (details <a href="http://blog.newsplore.com/?p=773">here</a>)<br />
- SpringAOP<br />
- SpringSecurity with OpenId<br />
- Webapp management with JMX (I know, it won&#8217;t fly)<br />
- Job scheduling using Spring&#8217;s Timer Task abstraction (<a>not optimistic</a> about this one either)<br />
- SiteMesh (upgraded to 2.4.2 <a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine">as indicated</a>)<br />
- Spatial database support including spatial indexing<br />
- JPA 2.0 (back story <a href="http://blog.newsplore.com/?p=981">here</a>)<br />
- Level 2 JPA cache, query cache.<br />
- Native SQL query support including native SQL spatial queries.<br />
- Image processing (spincloud scraps images and processes pixel-level information to get some weather data)<br />
<span id="more-1093"></span><br />
That&#8217;s a lot of stuff but first things first. I recommend creating a new repository branch (I use Subversion) dedicated to the new environment as there may be many things to change and you still want to continue the development unaffected on your mainline.</p>
<p>I downloaded the latest <a href="http://code.google.com/appengine/downloads.html">SDK</a> and exploded it under the tools/ folder. Make sure you install the Eclipse plugin as it&#8217;s pretty useful.</p>
<p>After the initial setup I started-out with the JPA part since this seemed to be the most challenging piece of technology that I had to change. AppEngine uses DataNucleus JPA provider, a poor choice in my opinion since they are a JDO provider turned to JPA (much like KODO/OpenJPA) and so they drag a lot of JDO baggage along. I haven&#8217;t heard of them before and they don&#8217;t seem to be that popular (why not Hibernate or the new RI: EclipseLink? <i>Update:</i> because JPA is RDBMS oriented while JDO is not and the backing store of GAE is BigTable which is not RDBMS). DataNucleus JPA requires a pre-compilation step that does bytecode enhancement which I completely dislike as it&#8217;s archaic (all modern JPA providers don&#8217;t have this anymore) but I had no choice. So I&#8217;ve followed the <a href="http://code.google.com/appengine/docs/java/datastore/usingjpa.html">reference documentation</a>. The only thing not described there is the ant integration.<br />
Here is what I added to my build.xml</p>
<pre>&lt;project name="weather"  default="build"  basedir="."&gt;
...
  &lt;property name="sdk.dir" value="/Users/florin/tools/appengine-java-sdk-1.2.1"/&gt;
  &lt;import file="${sdk.dir}/config/user/ant-macros.xml" /&gt;

  &lt;path id="enhancer.classpath"&gt;
    &lt;pathelement path="${bin.dir}"/&gt;
    &lt;fileset dir="${sdk.dir}/lib"&gt;
      &lt;include name="appengine-tools-api.jar"/&gt;
    &lt;/fileset&gt;
    &lt;fileset dir="${lib.dir}"&gt;
      &lt;include name="gisjts/jts*.jar"/&gt;
      &lt;include name="appengine/appengine-api-1.0-sdk-1.2.1.jar"/&gt;
    &lt;/fileset&gt;
  &lt;/path&gt;

  &lt;target name="enhance" depends="compile"&gt;
    &lt;enhance verbose="true" classpathref="enhancer.classpath"&gt;
      &lt;fileset dir="${bin.dir}"&gt;
        &lt;include name="com/newsplore/weather/bo/*.class"/&gt;
      &lt;/fileset&gt;
    &lt;/enhance&gt;
  &lt;/target&gt;

  &lt;target name="build-appengine" depends="compile, enhance, jar"/&gt;
...
</pre>
<p>Essentially this is to accommodate the enhancement step (notice how the &#8220;enhance&#8221; target is interposed between compile and jar in the build-appengine target).<br />
I ran the &#8220;build-appengine&#8221; target and noticed the first exception:</p>
<pre>  [enhance] Please see the logs [/tmp/enhance64409.log] for further information.</pre>
<p>That&#8217;s a convoluted way of looking at the errors (why not showing the exception in the console?). Here&#8217;s the actual error found in the said file:</p>
<pre>java.lang.RuntimeException: Unexpected exception
...
   Caused by: java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger;
  at java.lang.Class.getDeclaredFields0(Native Method)</pre>
<p>This was because one of my business objects used log4j. Adding the log4j jar file didn&#8217;t help and the solution was to remove the logging from the class altogether.</p>
<p>After cleanup I got this error:</p>
<pre>  [enhance] SEVERE: Class "com.newsplore.weather.bo.GeometryUserType" was not found in the
CLASSPATH. Please check your specification and your CLASSPATH.
  [enhance] org.datanucleus.exceptions.ClassNotResolvedException: Class
"com.newsplore.weather.bo.GeometryUserType" was not found in the CLASSPATH.
    Please check your specification and your CLASSPATH.</pre>
<p>That was because GeometryUserType (a class I used to handle Geometry types in Hibernate) was in the com.newsplore.weather.bo package and the enhancer went through all classes in this package thinking they are all @Entities and failed with this one. Weird, I thought that the enhancer was smarter and filtered-out all non @Entities&#8230; The solution is either to specify all the classes to be enhanced in the &#8220;enhance&#8221; ant target or move the non-entities to other packages (a good practice). In my case I deleted the class since I wasn&#8217;t using it anyway (I used this utility class before Hibernate became a JPA provider).<br />
After this cleanup, the enhance target spat yet another error:</p>
<pre>[enhance]Class com.newsplore.weather.bo.UsForecast has property weatherIconByCode declared
    in MetaData, but its getter method doesnt exist in the class!
  [enhance] May 27, 2009 4:03:50 PM org.datanucleus.enhancer.DataNucleusEnhancer main
[enhance] SEVERE: DataNucleus Enhancer completed with an error. Please review the enhancer
log for full details. Some classes may have been enhanced but some caused errors
  [enhance] Class com.newsplore.weather.bo.UsForecast has property weatherIconByCode
declared in MetaData, but its getter method doesnt exist in the class!
  [enhance] org.datanucleus.metadata.InvalidMetaDataException: Class
com.newsplore.weather.bo.UsForecast has property weatherIconByCode declared in MetaData,
 but its getter method doesnt exist in the class!
  [enhance]     at org.datanucleus.metadata.ClassMetaData
.populateMemberMetaData(ClassMetaData.java:497)</pre>
<p>So a domain object (UsForecast) has a property called weatherIconByCode. Hmm, I didnt remember of such property but looking at the source I saw that the offender was a private utility method called getWeatherIconByCode(String code) that was being processed by the enhancer as if it was a property (I&#8217;m using annotations bound to getters and not to fields). Since adding @Transient didn&#8217;t fix it, the solution is to rename the method not to start with get/set (or move it in an utility class which you shouldn&#8217;t do if you follow DDD).<br />
To my relief, after this fix the build didn&#8217;t yield any more errors so I had a nice webapp folder ready to be deployed. AppEngine has a local sandbox (based on Jetty) that should be used before deploying into the cloud. You can start the appserver using an ant target but I chose to get more control and create a script that accomplishes the same thing. Here it is:</p>
<pre>cd build/webapp
java -classpath &lt;appengine-sdk-home&gt;/lib/appengine-tools-api.jar
com.google.appengine.tools.development.DevAppServerMain --port=8080 --address=localhost</pre>
<p>Save this in a file called startgae.sh (mind the path, you should be able to cd to the webapp folder from it) then make it executable.<br />
Using this script I fired-up the container and got no startup error. This was <a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine">weird</a> since I knew I was using JMX (via Spring and annotations) and as well the task scheduler (using <a href='http://www.opensymphony.com/quartz/'>Quartz</a>) was seemingly up and running.<br />
I hit the home page to see what has been deployed and I get a 404 error. My web.xml has this mapping:</p>
<pre>  &lt;servlet&gt;
    &lt;servlet-name&gt;weather&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
  &lt;/servlet&gt;

  &lt;servlet-mapping&gt;
	&lt;servlet-name&gt;weather&lt;/servlet-name&gt;
	&lt;url-pattern&gt;/&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;</pre>
<p>but this doesn&#8217;t work in the local servlet container. This was quite annoying as not only the home page doesn&#8217;t work, the static folders (css/, js/, img/) are routed through the weather servlet too. Surprisingly as it turns out, this mapping worked perfectly in the AppEngine environment. To be able to continue with the work in the local environment, I had to define fine grained mappings for all the URLs.<br />
After this change, the first URL that started working was the /faq which provided the first breakthrough. Although only the presentation tier is in use on the /faq page, the fact that the page worked provided a bunch of good news: Spring 3.0 DI container, SiteMesh, Spring Security and SpringAOP were all correctly running. </p>
<p>Stay tuned for the <a href='http://blog.newsplore.com/?p=1205'>second part</a> detailing more JPA, datastore indexing, a bunch of the AppEngine limitations, a bit of local environment hacking and how to use &#8220;request welding&#8221; to accomplish long running tasks.</p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/05/27/reviewing-google-appengine-for-java-part-1" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/05/27/reviewing-google-appengine-for-java-part-1/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Spincloud, a month old: looking good</title>
		<link>http://blog.newsplore.com/2009/02/10/spincloud-a-month-old-looking-good</link>
		<comments>http://blog.newsplore.com/2009/02/10/spincloud-a-month-old-looking-good#comments</comments>
		<pubDate>Wed, 11 Feb 2009 02:13:19 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[mashups]]></category>
		<category><![CDATA[weather]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=448</guid>
		<description><![CDATA[I launched Spincloud on New Year&#8217;s day. I didn&#8217;t expect a flood of traffic to hit the site since -let&#8217;s face it- there was nothing groundbreaking. Spincloud was born from my idea of having access to the world weather in one step or less and I&#8217;m pleased with the results so far. Spincloud gains adoption every [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F02%2F10%2Fspincloud-a-month-old-looking-good"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F02%2F10%2Fspincloud-a-month-old-looking-good" height="61" width="51" /></a></div><p align="justify">I launched <a href="http://spincloud.com">Spincloud </a>on New Year&#8217;s day. I didn&#8217;t expect a flood of traffic to hit the site since -let&#8217;s face it- there was nothing groundbreaking. Spincloud was born from my idea of having access to the world weather in one step or less and I&#8217;m pleased with the results so far. Spincloud gains adoption every day and this is only due to the people that saw something new and exciting in it. There are blog posts, traffic graphs and other goodies to talk about so let&#8217;s begin.</p>
<p>I <a href="http://blog.newsplore.com/?p=17">announced</a> spincloud&#8217;s launch on my personal blog then Keir from googlemapsmania <a href="http://googlemapsmania.blogspot.com/2009/01/coldest-wettest-google-map.html">broke the news</a> to the community. And so the first spike of traffic was logged on Jan 2nd. </p>
<p><img class="alignnone size-full wp-image-452" src="http://blog.newsplore.com/wp-content/uploads/2009/02/jan_traffic.png" alt="jan_traffic" width="333" height="197" /></p>
<p>Then followed a month of relative silence during which I took a much needed break from the project. I couldn&#8217;t help but refactoring and cleaning-up the code a bit. I had two minor releases deployed in prod in the mean time and everything went smooth.</p>
<p>I had a new feature I wanted to have online before the initial release, the<a href="http://blog.newsplore.com/?p=382"> meteoalarm mashup</a> that displays weather warnings across Europe but chose not to delay it (a Good Decision in hindsight) . I started working on it by mid January , did a lot of digging for administrative borders data then getting the meteoalarm warning data right (those guys don&#8217;t have <i>any</i> integration point). I was done two weeks later.</p>
<p>In the mean time I was trying to raise the awareness about spincloud. I submitted the site so some mapping/mashup themed websites, improved the indexing (still working on it). Then Wednesday last week the European bloggers finally found it. UK&#8217;s Mapperz ran a <a href="http://mapperz.blogspot.com/2009/02/spincloud-weather-mashup-map.html">nice little story</a> that seems to have set the things in motion. A number of other bloggers picked-up the story and a surprisingly good feedback came from Italy: <a href="http://www.matteodini.com/2009/02/05/situazione-meteo-da-tutto-il-mondo-in-tempo-reale/">Matteo</a> and <a href="http://www.italiasw.com/spin-cloud-il-mashup-per-ricevere-le-previsioni-del-meteo/">italiasw.com</a> did a great job while  <a href="http://gisdk.blogspot.com/2009/02/spincloud-weather-mashup-map.html">gisdk.blogspot.com</a> of Denmark  noticed the RSS facilities. Then the referral machine kicked in,  <a href="http://www.killerstartups.com/Web20/spincloud-com-worldwide-weather-conditions">killerstartups.com</a>, <a href="http://www.programmableweb.com/link/spincloud">programmableweb.com</a> amongst the sites linking. And thus the second spike registered on the traffic meter:<br />
<span id="more-448"></span></p>
<p>             <img class="alignnone size-full wp-image-458" src="http://blog.newsplore.com/wp-content/uploads/2009/02/spike2.png" alt="spike2" width="369" height="215" /></p>
<p>This one was three times bigger than the first spike and it was yet again all thanks to the blogger community that saw something useful in spincloud.</p>
<p>Things are looking up.  There are a few sites in Asia following spincloud: <a href="http://drchoi.or.kr/1034">drchoi.or.kr</a> and <a href="http://www.wangtam.com/50226711/spin_cloud_aeccc_167600.php">wangtam.com</a> and I see that 16 people<a href="http://delicious.com/url/5adac2284dae5efe76345a266963a5a5"> linked to spincloud</a> on delicious. Yey!</p>
<p>The traffic tripled on an average from last month and I&#8217;m delighted. The server hums happily for now and I have all reasons to keep it that way.</p>
<p>Huzzah!</p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/02/10/spincloud-a-month-old-looking-good" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/02/10/spincloud-a-month-old-looking-good/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>@Meteo_alarm twitter stream now available</title>
		<link>http://blog.newsplore.com/2009/02/05/meteoalarm-twitter-stream-now-available</link>
		<comments>http://blog.newsplore.com/2009/02/05/meteoalarm-twitter-stream-now-available#comments</comments>
		<pubDate>Thu, 05 Feb 2009 23:26:40 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[mashups]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[weather]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=432</guid>
		<description><![CDATA[  =   Update Nov.25.2009: The twitter name has changed to @meteo_alarm. Please update your bookmark or follow list. Between code refactoring and cooking new ideas, I took some time to add a new feature to Spincloud. Inspired by the crowd-sourced weather updates triggered by really bad snow storms in the UK, I (finally) started to see the [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F02%2F05%2Fmeteoalarm-twitter-stream-now-available"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F02%2F05%2Fmeteoalarm-twitter-stream-now-available" height="61" width="51" /></a></div><p></p>
<table border="0" align="center">
<tbody>
<tr>
<td align="center"><img class="alignnone size-full wp-image-434" src="http://blog.newsplore.com/wp-content/uploads/2009/02/ma_logo.png" alt="ma_logo" width="130" height="28" /></td>
<td rowspan="3">  =  </td>
<td rowspan="3"><a href="http://twitter.com/Meteoalarm"><img class="alignnone size-full wp-image-435" src="http://blog.newsplore.com/wp-content/uploads/2009/02/ma_sc_logo.png" alt="ma_sc_logo" width="130" height="50" /></a></td>
</tr>
<tr>
<td align="center"><img class="alignnone size-full wp-image-436" src="http://blog.newsplore.com/wp-content/uploads/2009/02/toplogo.gif" alt="toplogo" width="130" height="30" /></td>
</tr>
<tr>
<td align="center"><img class="alignnone size-full wp-image-437" src="http://blog.newsplore.com/wp-content/uploads/2009/02/twitter_logo.png" alt="twitter_logo" width="130" height="32" /></td>
</tr>
</tbody>
</table>
<p>
<i>Update Nov.25.2009: </i> The twitter name has changed to <a href="http://twitter.com/meteo_alarm">@meteo_alarm</a>. Please update your bookmark or follow list.<br />
<br />
Between code refactoring and cooking new ideas, I took some time to add a new feature to Spincloud. Inspired by the <a href="http://uk.techcrunch.com/2009/02/02/as-snow-hits-the-uk-the-twitter-mashups-storm-in/">crowd-sourced weather updates</a> triggered by really bad snow storms in the UK, I (finally) started to see the advantages to using Twitter. So I took the Meteoalarm data that I mashed-up on Spincloud&#8217;s map and streamed it to Twitter.</p>
<p>So here it is: Meteoalarm on Twitter via Spincloud =<del datetime="2009-11-25T21:38:28+00:00"> <a href="http://twitter.com/Meteoalarm">@Meteoalarm</a></del> <a href="http://twitter.com/Meteo_alarm">@Meteo_alarm</a>. The stream is updated twice a day and it presents a concise text-only representation of the color encoded weather warnings  in Europe for today and tomorrow.</p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/02/05/meteoalarm-twitter-stream-now-available" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/02/05/meteoalarm-twitter-stream-now-available/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spincloud now integrates with Europe&#8217;s weather warning service Meteoalarm</title>
		<link>http://blog.newsplore.com/2009/01/31/spincloud-integrates-now-with-europes-weather-warning-service-meteoalarm</link>
		<comments>http://blog.newsplore.com/2009/01/31/spincloud-integrates-now-with-europes-weather-warning-service-meteoalarm#comments</comments>
		<pubDate>Sun, 01 Feb 2009 02:28:47 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[mashups]]></category>

		<guid isPermaLink="false">http://blog.newsplore.com/?p=382</guid>
		<description><![CDATA[A short month after the initial public release of Spincloud, I am pleased to announce the addition of a new feature: integration with the European weather warning service Meteoalarm which provides the most relevant information needed to prepare for extreme weather, expected to occur over Europe.  The colors indicate the severity of the danger and [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F01%2F31%2Fspincloud-integrates-now-with-europes-weather-warning-service-meteoalarm"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F01%2F31%2Fspincloud-integrates-now-with-europes-weather-warning-service-meteoalarm" height="61" width="51" /></a></div><div align='justify' style="float:left;padding-right: 14px;"><img src="http://blog.newsplore.com/wp-content/uploads/2009/01/sc_ma.jpg" alt="Spincloud + Meteoalarm" width="220"></div>
<div align='justify'>A short month after the initial public release of Spincloud, I am pleased to announce the addition of a new feature: integration with the European weather warning service <a href="http://www.meteoalarm.eu">Meteoalarm</a> which provides the most relevant information needed to prepare for extreme weather, expected to occur over Europe.  The colors  indicate the severity of the danger and its possible impact:  <font color='red'><b>Red</b></font>: very dangerous, <font color='#FFA60B'><b>Orange</b></font>: dangerous,  <font color='yellow'><b>Yelllow</b></font>: potentially dangerous, <font color='green'><b>Green</b></font>: no warnings.<br />
<br />Currently only the country-level warnings are displayed. You can access the new feature by clicking the &#8220;Meteoalarm&#8221; button located on the top-left corner of the map. Note that the map has to be positioned over Europe for this buttton to be enabled.<br />
More information about Meteoalarm <a href="http://www.meteoalarm.eu/about.asp?lang=EN">here</a>.</p>
<p><i>Important note: </i>When using this new feature, the best experience is with Google&#8217;s Chrome, Mozilla or Safari browsers. Enabling the Meteoalarm overlay is much slower on IE browser which sometimes results in the browser reporting a slow-running script on slower hardware. Wait a few more seconds, the new overlay will render eventually.
</div>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/01/31/spincloud-integrates-now-with-europes-weather-warning-service-meteoalarm" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/01/31/spincloud-integrates-now-with-europes-weather-warning-service-meteoalarm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing a new weahter mashup: Spincloud</title>
		<link>http://blog.newsplore.com/2009/01/01/the-making-of-spincloud</link>
		<comments>http://blog.newsplore.com/2009/01/01/the-making-of-spincloud#comments</comments>
		<pubDate>Thu, 01 Jan 2009 21:52:48 +0000</pubDate>
		<dc:creator>Florin</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[mashups]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://spincloud.com/blog/?p=17</guid>
		<description><![CDATA[I started working on Spincloud back in 2003 when I got interested in regular expressions. I liked them so much I started looking for large sets of freely available data that I could crunch. Weather data was quite appealing; not only I&#8217;d parse it but I could get instant feedback by just looking at the parsed [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="padding-right:0;margin-top:3px"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F01%2F01%2Fthe-making-of-spincloud"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.newsplore.com%2F2009%2F01%2F01%2Fthe-making-of-spincloud" height="61" width="51" /></a></div><p><a href="http://spincloud.com"><img style="8px" src="http://blog.newsplore.com/wp-content/uploads/2008/09/barelogo.gif" border="0" alt="" width="111" height="63" align="left" /></a> I started working on Spincloud back in 2003 when I got interested in regular expressions. I liked them so much I started looking for large sets of freely available data that I could crunch. Weather data was quite appealing; not only I&#8217;d parse it but I could get instant feedback by just looking at the parsed data, after all we understand temperatures and wind speeds and the like. I&#8217;d get to use other technologies I couldn&#8217;t experiment at work where I was doing the regular J2EE stuff and I kept feeling the itch to do new things.</p>
<p>And so Spincloud was born; it&#8217;s mission: to track the weather worldwide. It didn&#8217;t have a name back then but as things started to shape-up, I realized that the experiment was slowly turning into a real project. Then Google published its Maps API and I just knew that my small little pet project just found the perfect playground. It&#8217;s been a while since I started with this and I had no intention of publishing it initially. It has grown beyond its initial purpose and I feel it&#8217;s time to set it free.</p>
<p>This is the third version of Spincloud, the first two iterations were not publicly released. This is not an open source project; however, I&#8217;m planning on blogging about the technical challenges I&#8217;m encountering and are interesting enough to share.</p>
<p>Here are the main features of Spincloud:</p>
<div>- Instant weather search</div>
<div>- Forecast displayed for all available locations in surveyed area (US only); radar mashup.</div>
<div>- Upon free registration, one can tag favorite locations then track the weather either through the website or via RSS; ability to set a home location </div>
<div>- Integration with Flickr</div>
<div>- Ability to add comments for individual locations through Google Friend Connect</div>
<div>- Easy registration that uses OpenId and Facebook Connect.</div>
<div>- Both metric and imperial units of measures supported.</div>
<p><em>Update: googlemapsmania.com just ran a story about Spincloud <a href="http://googlemapsmania.blogspot.com/2009/01/coldest-wettest-google-map.html#links">here.</a> Thanks guys!</em></p>
<p class="fbconnect_share"><fb:share-button class="url" href="http://blog.newsplore.com/2009/01/01/the-making-of-spincloud" /></p>]]></content:encoded>
			<wfw:commentRss>http://blog.newsplore.com/2009/01/01/the-making-of-spincloud/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
