<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-582168471268695449</id><updated>2011-07-30T17:42:48.337-07:00</updated><category term='GigaSpaces'/><title type='text'>Scalability Unlimited</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jeroenremmerswaal.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jeroenremmerswaal.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeroen Remmerswaal</name><uri>http://www.blogger.com/profile/11044980846839086813</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_eorWw3Ob4YI/SWMWHQ5qELI/AAAAAAAAA1U/N73TvFgl6O4/S220/picture.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-582168471268695449.post-4588651481764791528</id><published>2009-08-17T08:30:00.000-07:00</published><updated>2009-09-18T13:36:04.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>A GigaSpaces solution to the Poison Message problem</title><content type='html'>GigaSpaces uses the notion of Event-containers for matching and handling data in the Space as events. This can be done in either Polling mode (the container polls the Space for data matching the criteria), or Notify (the Space pushes matching data as events to the container).&lt;br /&gt;&lt;br /&gt;In case of a polling-container, the object should be changed and returned to the Space, to ensure it no longer matches the criteria. Otherwise the event would be re-triggered.&lt;br /&gt;&lt;br /&gt;Now, what would happen in case the event-handler encounters a (permanent or temporary) failure during processing, such as a down-stream system is not available?&lt;br /&gt;&lt;br /&gt;Well, clearly, the object is not handled, transactions will be rolled-back, etc, but most importantly: the object is returned to the Space in its &lt;span style="font-weight: bold;"&gt;original state&lt;/span&gt;. This means the object will still match the polling-criteria. This can cause endless loops in your polling container, unnecessarily consuming resources, and the problem will only disappear when the underlying problem is resolved.&lt;br /&gt;&lt;br /&gt;This problem is known as the Poison Message problem (see for example &lt;a href="http://www.ibm.com/developerworks/websphere/library/techarticles/0405_titheridge/0405_titheridge.html"&gt;this link&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;A solution is to add try-catch blocks in your event-handler, and handle the problematic events appropriately to avoid loops. Simply catching and handling the exception has an issue though: It does not take in account that the problem may only be temporary. Therefore adding a retry-mechanism may make sense in your application.&lt;br /&gt;&lt;br /&gt;However, adding a &lt;span style="font-family:courier new;"&gt;retryCount&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;maxRetries&lt;/span&gt; to the problematic object will not work: We cannot modify the erroneous object and write it back to the space, as we &lt;span style="font-weight: bold;"&gt;must&lt;/span&gt; revert the transaction under which it failed - there might have been very viable reasons for the exception in the first place!&lt;br /&gt;&lt;br /&gt;For this reason we should use a &lt;span style="font-weight: bold;"&gt;separate&lt;/span&gt; object, which I call a &lt;span style="font-family:courier new;"&gt;Hospital&lt;/span&gt; object. This &lt;span style="font-family:courier new;"&gt;Hospital&lt;/span&gt; object holds a uid-reference to the erroneous object, and can include fields like &lt;span style="font-family:courier new;"&gt;retryCount&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;maxRetries&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Here's a snippet of what this &lt;span style="font-family:courier new;"&gt;Hospital&lt;/span&gt; object might possibly look like:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public class Hospital implements Serializable {&lt;br /&gt;    private String id;&lt;br /&gt;    private String poisonObjectId;&lt;br /&gt;    private Integer retryCount;&lt;br /&gt;    private Integer maxRetries;&lt;br /&gt;    private Integer routingId;&lt;br /&gt;&lt;br /&gt;    public Hospital() {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Getters and setters beyond this line&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Although a try-catch block in your event-containers will work, I have used an Aspect that intercepts any exception from a (polling) event-container:&lt;br /&gt;&lt;pre&gt;&lt;code&gt; &lt;br /&gt;@Pointcut("@annotation(org.openspaces.events.adapter.SpaceDataEvent)")&lt;br /&gt;private void spaceDataEvent() { }&lt;br /&gt;&lt;br /&gt;@Around("spaceDataEvent()")&lt;br /&gt;public Object exceptionHandling(ProceedingJoinPoint pjp)&lt;br /&gt;   throws EventContainerRetryException {&lt;br /&gt; Object o = null ;&lt;br /&gt; try {&lt;br /&gt;           o = pjp.proceed();&lt;br /&gt; } catch (Throwable e) {&lt;br /&gt;           eventContainerExceptionHandler.handleException(&lt;br /&gt;               (BaseObject)pjp.getArgs()[0],&lt;br /&gt;               e&lt;br /&gt;           );&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; return o ;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;In the aspect we use an exception handler, that is invoked whenever any exception occurs. This handler takes care of finding and writing the hospital object, incrementing the retry-count, etc:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;   &lt;br /&gt;public void handleException(BaseObject baseObject, Throwable e)&lt;br /&gt;   throws EventContainerRetryException&lt;br /&gt;{&lt;br /&gt; Hospital template = new Hospital();&lt;br /&gt; template.setPoisonObjectId(baseObject.getId());&lt;br /&gt; Hospital hospital = hospitalGigaSpace.read(template);&lt;br /&gt;  &lt;br /&gt; if ( hospital == null ) {&lt;br /&gt;     hospital = new Hospital();&lt;br /&gt;     hospital.setPoisonObjectId(baseObject.getId());&lt;br /&gt;     // Set other fields&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; if ( hospital.getMaxRetries().equals(hospital.getRetryCount()) ) {&lt;br /&gt;     // Maybe you want to do something generic here to avoid the event&lt;br /&gt;     // from being triggered again, for example setting a status flag.&lt;br /&gt; } else {&lt;br /&gt;     // Increase the retry count on the hospital object&lt;br /&gt;     hospital.setRetryCount(hospital.getRetryCount() + 1) ;&lt;br /&gt;     // Write the hospital object back, if you want with a lease-time&lt;br /&gt;     hospitalGigaSpace.write(hospital, 120000);&lt;br /&gt;     // Rethrow the initial exception caused in the event container&lt;br /&gt;     // This will cause its transaction to be rolled back&lt;/code&gt;.&lt;br /&gt;     throw new EventContainerRetryException(e) ;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;What is important to realize is that the operations on the  &lt;span style="font-family:courier new;"&gt;hospitalGigaSpace&lt;/span&gt; bean should work under a different transactional context from the event container: the polling container transaction must be rolled back while the operations on the hospital object must succeed.&lt;br /&gt;&lt;br /&gt;BTW, in a next release of GigaSpaces a generic exception handler will be implemented, which can be used instead of try-catch blocks or AOP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/582168471268695449-4588651481764791528?l=jeroenremmerswaal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeroenremmerswaal.blogspot.com/feeds/4588651481764791528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/08/gigaspaces-solution-to-poison-message.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/4588651481764791528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/4588651481764791528'/><link rel='alternate' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/08/gigaspaces-solution-to-poison-message.html' title='A GigaSpaces solution to the Poison Message problem'/><author><name>Jeroen Remmerswaal</name><uri>http://www.blogger.com/profile/11044980846839086813</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_eorWw3Ob4YI/SWMWHQ5qELI/AAAAAAAAA1U/N73TvFgl6O4/S220/picture.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-582168471268695449.post-6508789209123164170</id><published>2009-06-20T00:55:00.000-07:00</published><updated>2009-06-20T01:25:49.819-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Busy days...</title><content type='html'>It's been extremely busy lately, travelling around a lot, here are some highlights of the recent two weeks...&lt;br /&gt;&lt;br /&gt;A week ago I spent a full week in New York, giving a 5-day training (Basic and Advanced) at the GigaSpaces offices just opposite Grand Central Station. A great location, and a great team, that travelled down from Connecticut, New York, San Fransisco, even somewhere in Georgia ;). As I've encountered before, this kind of training is very exhausting for the trainer (and students!), but it gives great energy too when the concepts start to 'live'.&lt;br /&gt;&lt;br /&gt;Yesterday I gave a one-hour presentation at the &lt;a href="http://www.blogger.com/www.profict.nl"&gt;Profict Summer Camp&lt;/a&gt; to explain the vision of GigaSpaces with respect to Cloud Computing. We finished with good weather and a BBQ. The other speakers were &lt;a href="http://jeromebernard.sys-con.com/"&gt;Jerome Barnard&lt;/a&gt;, who is working on an open-source project named ElasticGrid, and &lt;a href="http://twitter.com/benoitc" a=""&gt;Benoît Chesnau&lt;/a&gt; who is member of the Apache CouchDB project. Both two very interesting guys that work on challenging projects that share the GigaSpaces vision with respect to more dynamic application design that is not influenced by the 'magic' dimensions 'scalability', 'performance' and 'high availability/reliability'. Thanks Profict for inviting me to this well-organized session at your really great offices!&lt;br /&gt;&lt;br /&gt;Coming Monday I will host a GigaSpaces-workshop for 18 people of &lt;a href="http://www.the-future-group.com/"&gt;The Future Group&lt;/a&gt;, where I will show them the highlights of the GigaSpaces product in-4-hours. Apparently it's a mixture of Java and .NET people, so this is going to be a lot of fun.&lt;br /&gt;&lt;br /&gt;Only a few more days to go before GigaSpaces 7.0 is released. We're working hard on our side to complete the first release of the Eclipse Plugin, so it can be announced with the GA of GigaSpaces. We've completed the roadmap of the plugin, and it's going to be nicely stuffed with great features, such as managing (Deploy and Undeploy) Processing Units, managing (starting, stopping) Service Grid Components, etc, etc. All from your Eclipse IDE. We'll make sure we'll host an update-site, and will provide a way to give feedback, to make it even better.&lt;br /&gt;&lt;br /&gt;Till next time!&lt;br /&gt;Jeroen&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/582168471268695449-6508789209123164170?l=jeroenremmerswaal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeroenremmerswaal.blogspot.com/feeds/6508789209123164170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/06/busy-days.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/6508789209123164170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/6508789209123164170'/><link rel='alternate' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/06/busy-days.html' title='Busy days...'/><author><name>Jeroen Remmerswaal</name><uri>http://www.blogger.com/profile/11044980846839086813</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_eorWw3Ob4YI/SWMWHQ5qELI/AAAAAAAAA1U/N73TvFgl6O4/S220/picture.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-582168471268695449.post-7742820848861942415</id><published>2009-04-23T13:11:00.000-07:00</published><updated>2009-04-24T07:50:04.208-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Eclipse Plugin for GigaSpaces</title><content type='html'>One of my colleagues - Robin van Breukelen - is a graduation student at the Hogeschool Arnhem Nijmegen (www.han.nl). For his graduation project, he is currently working on the implementation of a plugin for Eclipse, that will allow you to manage the GigaSpaces runtime from your IDE. The goal is to give developers an even friendlier developer-experience to GigaSpaces.&lt;br /&gt;&lt;br /&gt;Some of the key-functionality that we already delivered is the following:&lt;ul&gt;&lt;li&gt;View the Grid Service Agents (GSA's), Managers (GSM's), Containers (GSC's) and Lookup Services.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Starting and stopping the above components, either embedded in the IDE, or externally as separate processes.&lt;/li&gt;&lt;li&gt;View the Processing Units and Spaces.&lt;/li&gt;&lt;li&gt;Deploying and undeploying Processing Units.&lt;/li&gt;&lt;li&gt;Launching Processing Units embedded in the IDE, through dedicated launch configurations for this.&lt;/li&gt;&lt;li&gt;Managing more than one GigaSpaces installation through the Eclipse-preferences.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; In essence it means we're rebuilding part of the GigaSpaces Management UI, however, since we're using the new &lt;a href="http://www.gigaspaces.com/wiki/display/XAP7/Admin+API"&gt;Admin API&lt;/a&gt; of GigaSpaces 7.0, this is quite trivial. This API allows you to retrieve information on running components, and administer these. Building the Eclipse Widgets actually turns out to be the hard part.&lt;br /&gt;&lt;br /&gt;We've abstracted the GigaSpaces installation from the view that is being rendered, so support for new versions of the product will be very easy to incorporate.&lt;br /&gt;&lt;br /&gt;Here is an image of the Eclipse view:&lt;br /&gt;&lt;img src="file:///D:/DATA/TEMP/moz-screenshot.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_eorWw3Ob4YI/SfHQhXeiK0I/AAAAAAAAA18/CcpYYEjMi0s/s1600-h/EclipsePlugin-contextmenu2.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 305px;" src="http://3.bp.blogspot.com/_eorWw3Ob4YI/SfHQhXeiK0I/AAAAAAAAA18/CcpYYEjMi0s/s320/EclipsePlugin-contextmenu2.JPG" alt="" id="BLOGGER_PHOTO_ID_5328269105812351810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is what the Preferences window for GigaSpaces installations looks like:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eorWw3Ob4YI/SfHQvKHeo_I/AAAAAAAAA2E/oAyDFngwz40/s1600-h/EclipsePlugin-preferences.gif"&gt;&lt;img style="cursor: pointer; width: 320px; height: 259px;" src="http://2.bp.blogspot.com/_eorWw3Ob4YI/SfHQvKHeo_I/AAAAAAAAA2E/oAyDFngwz40/s320/EclipsePlugin-preferences.gif" alt="" id="BLOGGER_PHOTO_ID_5328269342744159218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And a specialized Run Configuration for Processing Units:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_eorWw3Ob4YI/SfHRJLK3zSI/AAAAAAAAA2U/GWjvZSm7KEE/s1600-h/EclipsePlugin-runconfig.gif"&gt;&lt;img style="cursor: pointer; width: 320px; height: 257px;" src="http://3.bp.blogspot.com/_eorWw3Ob4YI/SfHRJLK3zSI/AAAAAAAAA2U/GWjvZSm7KEE/s320/EclipsePlugin-runconfig.gif" alt="" id="BLOGGER_PHOTO_ID_5328269789703425314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am very enthusiastic about these new developments - and although we're only in the fourth Sprint of the development cycle Robin has already created some impressive work. Once the projects has reached a mature stage, we will start releasing the components to the public.&lt;br /&gt;&lt;br /&gt;In fact, there is more stuff coming that will be even more compelling - stay tuned!&lt;br /&gt;&lt;br /&gt;Jeroen&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/582168471268695449-7742820848861942415?l=jeroenremmerswaal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeroenremmerswaal.blogspot.com/feeds/7742820848861942415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/04/eclipse-plugin-for-gigaspaces.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/7742820848861942415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/7742820848861942415'/><link rel='alternate' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/04/eclipse-plugin-for-gigaspaces.html' title='Eclipse Plugin for GigaSpaces'/><author><name>Jeroen Remmerswaal</name><uri>http://www.blogger.com/profile/11044980846839086813</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_eorWw3Ob4YI/SWMWHQ5qELI/AAAAAAAAA1U/N73TvFgl6O4/S220/picture.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_eorWw3Ob4YI/SfHQhXeiK0I/AAAAAAAAA18/CcpYYEjMi0s/s72-c/EclipsePlugin-contextmenu2.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-582168471268695449.post-8423369633708149751</id><published>2009-01-11T06:28:00.001-08:00</published><updated>2009-01-11T06:29:33.839-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GigaSpaces'/><title type='text'>Training in Pune, India</title><content type='html'>I just returned from a short trip to India, where I gave a 3-day GigaSpaces training for a financial company with a development branch in Pune.&lt;br /&gt;&lt;br /&gt;Having worked in India before, it surprised me how easily memories can slip away. It was a good refresher, and I made an oath for 2009 to not complain about the traffic jams in the Netherlands for the next few months, and also to eat more Indian food :).&lt;br /&gt;&lt;br /&gt;In my class there were 7 bright and nice people. All of them had some or a little more exposure to GigaSpaces as the company is already a customer. During the three days we ploughed through a hectic schedule based around the e-Auction Use Case. The e-Auction use case is a fictitious, but very common example on how success can turn into failure by using a traditional tier-based architecture. By nature such architectures are very hard to scale, especially if you want to combine scalability with aspects such as performance and fault-tolerance. At some point (and sometimes this can happen very early!) these aspects start to bite eachother, making it ever-more difficult to walk the fine line of balancing throughput with reliability and scalability aspects, and at the same time maintain ease of implementation and deployment.&lt;br /&gt;&lt;br /&gt;In the use-case we demonstrate how to create a architecture using GigaSpaces that can scale beyond the regular life-expectancy of the application or beyond any foreseen or unforeseen success- and growth-rate, while at the same time being extremely fault-tolerant and performant. To explain this in a matter of three days we normally cover the following subjects:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GigaSpaces Basics, such as product walkthrough, topologies.&lt;/li&gt;&lt;li&gt;Basic API's for storing and retrieving data into the GigaSpaces In Memory &lt;span style="font-weight: bold;"&gt;Data Grid&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Processing Units&lt;/span&gt;, which is the beating heart of GigaSpaces.&lt;/li&gt;&lt;li&gt;Concepts and semantics for creating a &lt;span style="font-weight: bold;"&gt;Messaging Grid.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Task Execution and Remoting, allowing for &lt;span style="font-weight: bold;"&gt;Grid Computing&lt;/span&gt; paradigms such as Map/Reduce, Master/Worker.&lt;/li&gt;&lt;li&gt;SLA's which will let GigaSpaces scale on demand, or recover from failures.&lt;/li&gt;&lt;li&gt;Web Application Support.&lt;/li&gt;&lt;li&gt;Mirror-Service Support, which allows for reliable, but asynchronous persistency to a disk.&lt;/li&gt;&lt;li&gt;Since GigaSpaces is very reliant on Spring, we usually also include a short topic on Spring.&lt;/li&gt;&lt;/ul&gt;All of the above is lab-driven, lots of coding, and very hands-on. The training was a lot of fun to do, and my overall stay has been perfect: well-accomodated, great great food and some wonderful people. Here's a nice snap:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_eorWw3Ob4YI/SWIMO4Ds3AI/AAAAAAAAA1I/8OjmZRF2t60/s1600-h/DSCN2409.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_eorWw3Ob4YI/SWIMO4Ds3AI/AAAAAAAAA1I/8OjmZRF2t60/s320/DSCN2409.jpg" alt="" id="BLOGGER_PHOTO_ID_5287802362191993858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;I believe the team in Pune is ready to take on action! Good luck guys!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/582168471268695449-8423369633708149751?l=jeroenremmerswaal.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jeroenremmerswaal.blogspot.com/feeds/8423369633708149751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/01/training-in-pune-india.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/8423369633708149751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/582168471268695449/posts/default/8423369633708149751'/><link rel='alternate' type='text/html' href='http://jeroenremmerswaal.blogspot.com/2009/01/training-in-pune-india.html' title='Training in Pune, India'/><author><name>Jeroen Remmerswaal</name><uri>http://www.blogger.com/profile/11044980846839086813</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_eorWw3Ob4YI/SWMWHQ5qELI/AAAAAAAAA1U/N73TvFgl6O4/S220/picture.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_eorWw3Ob4YI/SWIMO4Ds3AI/AAAAAAAAA1I/8OjmZRF2t60/s72-c/DSCN2409.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
