<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkEGRXszfCp7ImA9WhRQEkk.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175</id><updated>2011-12-06T22:50:24.584-08:00</updated><category term="website report" /><category term="solr" /><category term="discussion" /><category term="plug-ins" /><category term="openid" /><category term="news" /><category term="web" /><category term="direct message" /><category term="web crawler" /><category term="eclipseLink" /><category term="gwt" /><category term="great mind" /><category term="mobile application" /><category term="java interview" /><category term="open source" /><category term="api" /><category term="dynamic type language" /><category term="linkedin" /><category term="javscript" /><category term="microblogging" /><category term="db2" /><category term="real time analytics" /><category term="chrome" /><category term="JDeveloper" /><category term="liferay" /><category term="iphone" /><category term="RSS" /><category term="web 2.0" /><category term="etapix" /><category term="sun" /><category term="portal" /><category term="cio" /><category term="eclipse" /><category term="line" /><category term="website traffic analyser" /><category term="opera" /><category term="safari" /><category term="startups" /><category term="woopra" /><category term="IBM" /><category term="facebook" /><category term="visualization" /><category term="enterprise search" /><category term="java" /><category term="mysql" /><category term="Apache Foundation" /><category term="networking" /><category term="portlet" /><category term="interview" /><category term="android" /><category term="Software Patent" /><category term="static type language" /><category term="jpa" /><category term="IE8" /><category term="saas" /><category term="Internet Explorer" /><category term="ria" /><category term="confession" /><category term="web browser" /><category term="bit.ly" /><category term="plugins" /><category term="revenue" /><category term="google" /><category term="jsr168" /><category term="ruby" /><category term="google app engine" /><category term="technology" /><category term="Adobe Flex" /><category term="j2se" /><category term="business intelligence for web site" /><category term="web applications" /><category term="skype" /><category term="event" /><category term="youtube" /><category term="conference" /><category term="Oracle" /><category term="java me" /><category term="London Startups Group" /><category term="paas" /><category term="armel nene" /><category term="file indexer" /><category term="social networking" /><category term="ATOM" /><category term="rest web services" /><category term="iaas" /><category term="job interview" /><category term="java developer" /><category term="london" /><category term="start-ups" /><category term="wave" /><category term="database" /><category term="tinyurl" /><category term="apache" /><category term="javafx" /><category term="google analytics" /><category term="Adobe Flash" /><category term="cloud computing" /><category term="php" /><category term="programming" /><category term="tutorial" /><category term="lucene" /><category term="mobile market" /><category term="web services" /><category term="bebo" /><category term="chart" /><category term="netbeans" /><category term="jmeter" /><category term="time" /><category term="JavaFx Composer plugin" /><category term="container" /><category term="twitter" /><category term="free analytics" /><category term="server" /><category term="annotated" /><category term="RAD" /><category term="nutch" /><title>Armel Nene</title><subtitle type="html">This is my blog about technology, development and entrepreneurship. In the next few months, I shift my focus to providing more JAVA tutorials including J2SE, SWING, J2EE, AJAX, JSF, Portlets, GWT, Spring, JPA and JAVAFX</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://armelnene.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ArmelNene" /><feedburner:info uri="armelnene" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0MDSHg_eCp7ImA9Wx9bFk4.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-132992156248239008</id><published>2011-02-20T15:23:00.000-08:00</published><updated>2011-02-25T02:57:59.640-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-25T02:57:59.640-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="discussion" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="paas" /><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="London Startups Group" /><category scheme="http://www.blogger.com/atom/ns#" term="linkedin" /><category scheme="http://www.blogger.com/atom/ns#" term="iaas" /><category scheme="http://www.blogger.com/atom/ns#" term="saas" /><category scheme="http://www.blogger.com/atom/ns#" term="cio" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud computing" /><title>Cloud computing vs Open Source - Most CIO cannot tell the difference</title><content type="html">&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 1pt;"&gt;&lt;/span&gt;   &lt;br /&gt;
&lt;div class="MsoNormal"&gt;Few weeks ago, I posted a discussion &lt;a href="http://lnkd.in/yPr3MV"&gt;here&lt;/a&gt; in a CIO forum on LinkedIn and frankly some of the comments are very interesting to say the least. Now I decided to bring some technical guys to the discussion table. My argument was and still is as follow&lt;/div&gt;&lt;div class="MsoQuote"&gt;“I have been reading many threads about Cloud computing and I came to conclude that most CIO (maybe because of their business background) do not know the difference or real benefits of Cloud computing or Open Source software.&lt;br /&gt;
&lt;br /&gt;
Hi, I am not expecting everyone to agree with me but here is my argument. Most CIOs are interested in Cloud computing because of cost. COST!!? That's very interesting because to my humble opinion, this only applies to IaaS (Infrastructure as a Service). If you do not want to spend money on hardware and be left with redundant system then IaaS is a good approach but that's about it. I work with Cloud computing (specifically SaaS) and this next one might hurt my business but it has to be said; SaaS is not cost saving when you comparing it Open Source alternatives that you can host on your IaaS system…. &lt;a href="http://lnkd.in/yPr3MV"&gt;Read more here&lt;/a&gt;”&lt;/div&gt;&lt;div class="MsoNormal"&gt;I am not sure that they understood the argument. I was not expecting anybody too agree with me and I wanted CIOs in the group to share their insight not sound like a copy of a Gartner report. Before making any conclusion, keep in mind that I am talking here about Software as a Service (SaaS), as defined &lt;a href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;here&lt;/a&gt;. In network architecture design, the external network&amp;nbsp; is represented by the “cloud” symbol therefore I would have to agree Wikipedia’s definition of cloud.&amp;nbsp; It is a software served over an external network regardless of a private network (private cloud) or public network (public cloud). YES – the internet was built on cloud technology. If you use any software over the internet; be it email, search, video or social network, the system is hosted by an external party which you do not have control over. The name cloud is just a marketing gimmick because hosted applications have been around for more than 20 years since Compuserve and Internet Relay Chat (IRC &amp;amp; BBS). So you see, “cloud” is definitely not new. Therefore software delivered over the internet such as Google apps and Salesforce can be also deployed using Open Source alternative. Cloud promises the following: scalability, peace of mind as it maintained by the providers and lower cost. CIO, I will tell you that your software, that it is deployed in the cloud or not will not be able to scale beyond the hardware and network capacity. I have another question for CIOs:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Do CIOs care or know where all their applications are running?&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;That question is usually left to the technical team to decide within the budgets of the project and any other company politics. The biggest failures of IT projects is due to the fact that the CIO (or “the business” as it is usually referred as) do not know what they are trying to achieve (lack or misunderstandings of requirements) therefore it goes past the delivery and budget.&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;So where does Open Source fits in, one might ask? Open Source software allows a business to take best of breed software and customised them to their own needs for free (as in free beer). If you do not want to support the Open Source software you can get support services but the software is hosted on your own system including your private cloud (Infrastructure as a Service). Let’s put it in to context; if a company requires a CRM system - they can download vTiger, customise it and either support it themselves or buy support. The same goes for an ERP system like Apache Ofbiz and MySQL for database. I am in favour of SaaS offering, after all I run a SaaS-based company. Nevertheless, CIOs do not confuse SaaS as being cheap, if you want something that has a low cost of ownership, then I suggest you go for an Open Source alternative if it exists. So why do I say that most CIO cannot tell the difference; SaaS is not cheap and does not have a lower cost of ownership when comparing it to Open Source alternatives. And by the way, you do not need to have an army of developers to build and customise your Open Source software. Do you really want the SaaS provider on a shared system to have access to your LDAP system? What happens when you want to integrate or port your existing data to your new fancy cloud based system? CIOs should not try to lie to me. I attended many meetings and conferences to know that most of them just want to please the board. What are the differences between cloud and virtualisation? What happens to your existing hardware once you moved your applications to cloud, have you thought of using them for virtualisation? So please do not make uneducated comments as “&lt;span class="comment-body"&gt;I don't know a single CIO who can't tell the difference between Cloud Computing &amp;amp; Open Source - maybe I move in different circles.&lt;/span&gt;” I am not talking about dictionary or Gartner definitions.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="comment-body"&gt;CIOs, after reading this and before replying you should go and sit down with your technical team and ask them the difference, only after that you can provide a good educated comment. If you want to be on the “cloud” train then you are free to do so but if SaaS is not part of cloud offerings, please feel free to enlighten me as I am always willing to learn something new. &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span class="comment-body"&gt;Who should make the decisions to go cloud or not? You are the CIOs, you tell me. Is it the developer, the architect, the project manager or the almighty CIOs from his ivory tower? There is no trickery here, every fool can define a word – just do this; think of a word then Google using the following “what is ‘the word’” then voila your definition. If you need someone to school you up then drop me an email. Based on the comments on LinkedIn, all I can say is WOW. Leave the technical aspect to the technical guys and you can focus on playing golf.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&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/7746035232350865175-132992156248239008?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t6kEb-U98sCmWdEirHfpueW57No/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t6kEb-U98sCmWdEirHfpueW57No/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/t6kEb-U98sCmWdEirHfpueW57No/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t6kEb-U98sCmWdEirHfpueW57No/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/P0TwLPIBhAM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/132992156248239008/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2011/02/cloud-computing-vs-open-source-most-cio.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/132992156248239008?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/132992156248239008?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/P0TwLPIBhAM/cloud-computing-vs-open-source-most-cio.html" title="Cloud computing vs Open Source - Most CIO cannot tell the difference" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2011/02/cloud-computing-vs-open-source-most-cio.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcGQ3c4eip7ImA9WxFSEE8.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-8747045884187239813</id><published>2010-04-11T16:20:00.001-07:00</published><updated>2010-04-11T16:20:22.932-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-11T16:20:22.932-07:00</app:edited><title>Apple vs Geeks - is this the end of a love affair?</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;This isn't &lt;a href='http://mashable.com/2010/04/10/steve-jobs-adobe/'&gt;news&lt;/a&gt; anymore but I wanted to wait for more light on the subject before I made any comments. &lt;img height='128' width='192' src='http://i207.photobucket.com/albums/bb109/josecarlo1129/apple_flash.jpg' style='max-width: 800px;'/&gt;Apple vs Adobe is actually an understatement. Actually, this is no surprise as Apple has always been a control freak. I mean, just take a look around you. How many PCs do you see running Apple MacOS which has not been branded by Apple Inc? Anybody trying to build a PC which runs their OS gets &lt;a href='http://news.cnet.com/8301-13860_3-9991572-56.html' target='_blank'&gt;sued&lt;/a&gt;. Seriously, Microsoft may be evil but they have created an economy which in Steve Jobs world would have never existed. History is about to repeat itself; Apple Inc introduces a great idea/ products but would eventually become a niche player (well, only time will tell!!!). &lt;br/&gt;&lt;br/&gt;I don't actually believe that real geeks use MacOS; Linux or if you work for a company this would MS Windows. Let's face it, Apple PCs (or Book, G5 or whatever) look very good on the receptionist desk and that's about it. Steve doesn't want you to innovate, he wants you to follow him to whatever **** he introduces (ipad anybody?). &lt;br/&gt;&lt;br/&gt;Let me get back to the subject. Being software developer and I have invested time and money to build knowledge and skills. I cannot possibly learn every single programming language and therefore would welcome any tools that help me to cross-compile my code. I am not even a flash developer and seriously I don't care less about what they do. But the new Apple mobile SDK TOS affects more than just Adobe, take a look at the &lt;a href='http://phonegap.com/' target='_blank'&gt;Open Source PhoneGap&lt;/a&gt; where you develop native mobile applications by programming using (the most popular language???) HTML + JavaScript. Thanks to the control freaks at Apple Inc, now this would not be possible. This is the same as saying that when you go on holiday to another country, you cannot use a translator to communicate and that you better go learn whatever language they speak in that country or STAY OUT!!! &lt;br/&gt;&lt;br/&gt;First they didn't want Flash and Java to run on the iPhone. To be fair to them, those virtual apps kills the phone performance (so they say.). Therefore if you wanted to run any other program on their platform, you needed to translate it into a native app. EVEN THAT'S NOT LEGALLY POSSIBLE ANYMORE!!!! This is a big **** YOU to all the other programming languages. Can you imagine if Oracle said that Groovy, JRuby or Jython were not allowed to run on the JVM anymore? Or Microsoft saying Java app are not allowed to run on any MS platform through an intermediary (JVM)? Well, this is exactly what Apple Inc. is doing?&lt;br/&gt;&lt;br/&gt;This is the best part; THERE IS NOTHING YOU OR I CAN DO ABOUT IT!!! Right now, the iPhone is the market leader for new generation of smartphones ( there are not the market leader in smartphone, that crown goes to Nokia) supported by its ecosystem of developer providing more than 150k apps in the App Store.&lt;br/&gt;&lt;br/&gt;Look there is no way I am going to learn Objective-C unless I am getting paid for it. All we can do that is hope for Android, RIM and Windows Phone 7 to gain a large enough market share and we would see history repeat itself again. I am definitely not saying that you should boycott their products but if you are looking to build a company and make profit developing software for mobile devices, maybe you should think twice about venturing on the iPhone (off course, unless you know Objective-C).&lt;br/&gt;&lt;br/&gt;Feel free to let me know your thoughts and I am sure that the Apple fanatics would not hold their thoughts on this one.&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/7746035232350865175-8747045884187239813?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XnGstcXkCDVlTh-EFAORUw9zjq8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XnGstcXkCDVlTh-EFAORUw9zjq8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XnGstcXkCDVlTh-EFAORUw9zjq8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XnGstcXkCDVlTh-EFAORUw9zjq8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/9j9bbENK7Jw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/8747045884187239813/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2010/04/apple-vs-geeks-is-this-end-of-love.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8747045884187239813?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8747045884187239813?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/9j9bbENK7Jw/apple-vs-geeks-is-this-end-of-love.html" title="Apple vs Geeks - is this the end of a love affair?" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>6</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2010/04/apple-vs-geeks-is-this-end-of-love.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cNRHo4eip7ImA9WxBUEk8.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-5150467403568857188</id><published>2010-02-26T15:59:00.001-08:00</published><updated>2010-02-26T16:04:55.432-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-26T16:04:55.432-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ATOM" /><category scheme="http://www.blogger.com/atom/ns#" term="social networking" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Patent" /><category scheme="http://www.blogger.com/atom/ns#" term="RSS" /><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="bebo" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="youtube" /><category scheme="http://www.blogger.com/atom/ns#" term="networking" /><title>Facebook Patents RSS-like Technology - Is That a Joke?</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://images.huffingtonpost.com/gen/110479/thumbs/s-FACEBOOK-POKE-JAIL-large.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://images.huffingtonpost.com/gen/110479/thumbs/s-FACEBOOK-POKE-JAIL-large.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;First thing first, Facebook did not patent RSS but their news feed on their site!!! I have to admit, this is a quite neat feature and what would be the point of&amp;nbsp; a social (networking) site if you did not know what your entourage were upto. So Facebook included a friends activity log (news stream) to make it easy for people to find out. Thats a good feature but it's by no means an innovative technology. DZone, a developer social "networking" site provides a log about news that users have posted, commented on and rated. This is to show that there's nothing innovative about that feature but a convenience.&lt;br /&gt;
&lt;br /&gt;
I have been very busy lately and did not have time to check my Google Reader but I did today. And voila! I see the news flash from Mashable - &lt;a href="http://mashable.com/2010/02/25/facebook-news-feed-patent/" target="_blank"&gt;Facebook Secures Patent for News Feed&lt;/a&gt;. My first reaction, based on the title before I even read the article, was WOW!!! Facebook managed to patent RSS or ATOM or anything else on that scale. Then came the joke when I started to read the article specially the abstract of the patent:&lt;br /&gt;
&lt;blockquote&gt;“A method for displaying a news feed in a social network environment is described. The method includes generating news items regarding activities associated with a user of a social network environment and attaching an informational link associated with at least one of the activities, to at least one of the news items, as well as limiting access to the news items to a predetermined set of viewers and assigning an order to the news items. The method further may further include displaying the news items in the assigned order to at least one viewing user of the predetermined set of viewers and dynamically limiting the number of news items displayed.”&lt;/blockquote&gt;&lt;br /&gt;
I don't know about you genius guys but I could not make much sense of the abstract but I did pickup a few keywords such as:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;News Feed&lt;/li&gt;
&lt;li&gt;Social Networking&lt;/li&gt;
&lt;/ul&gt;That's it! Everything else is just pure jibberish. I can summarized their abstract as follow:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;We know about RSS/ ATOM which are real news feed. RSS provides real-time (depending on how often you poll) updates; can that be classified as a site master activity update. It also includes links and media about the site or users generating the feeds. That's a cool feature and we copied the idea and implemented in our site, now we are the biggest community site in the western hemisphere&lt;/i&gt; &lt;i&gt;so we are telling not to use any RSS or derivated technology when building a community site (social networking).&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Let's face it, I feel sorry for the smaller community sites but I do not think that patent will affect Twitter or Google but watch out MySpace. I did not even know you could patent someone else already patented technology. This is not a new way of doing something but more like patenting the environment where the technology is applied. To be very geeky about this, Facebook News Feed are just a bunch of SQL queries displaying latest records on a User Interface. I did not know you could even dare trying to patent that. To be frank, I am not sure that they could have patented that in Europe. I am looking forward to seeing how to will now exercise their new POWER. What would happen to Ning, BuddyPress and Elg, those are software and platform used to create social site but what about Youtube and UStream. Anyway site operating within the US and implementing the patent features of Facebook will have to pay them. But outside the US territoty, those company would be free to operate. How to you control access to the Internet without censoring like China and Iran?&lt;br /&gt;
&lt;br /&gt;
Anyway, this is just my opinion but you are welcomed to share yours with the rest of us. For now, why not read about RSS &lt;a href="http://en.wikipedia.org/wiki/RSS" target="_blank"&gt;here&lt;/a&gt; and see exatly what I am talking about.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=2af6b620-10a2-8111-aea5-48700ff888bc" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-5150467403568857188?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QOorc3SyXxFTk9ZBmm0qjWwcxwY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QOorc3SyXxFTk9ZBmm0qjWwcxwY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QOorc3SyXxFTk9ZBmm0qjWwcxwY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QOorc3SyXxFTk9ZBmm0qjWwcxwY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/8Jdt2YChI3E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/5150467403568857188/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2010/02/facebook-patents-rss-like-technology-is.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/5150467403568857188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/5150467403568857188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/8Jdt2YChI3E/facebook-patents-rss-like-technology-is.html" title="Facebook Patents RSS-like Technology - Is That a Joke?" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2010/02/facebook-patents-rss-like-technology-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cNQHg_eip7ImA9WxBXGU4.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-2011825434986048458</id><published>2010-01-31T03:58:00.001-08:00</published><updated>2010-01-31T03:58:11.642-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-31T03:58:11.642-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="plugins" /><category scheme="http://www.blogger.com/atom/ns#" term="sun" /><category scheme="http://www.blogger.com/atom/ns#" term="etapix" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="JDeveloper" /><category scheme="http://www.blogger.com/atom/ns#" term="Oracle" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="IBM" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache Foundation" /><category scheme="http://www.blogger.com/atom/ns#" term="plug-ins" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><title>Will Oracle really make NetBeans the BEST IDE for Java</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img src='http://www.noulakaz.net/weblog/wp-content/uploads/2009/04/20090420-oracle-buys-sun.jpg' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;Not yet!!! But according to their webcast they want to make &lt;a href='http://oracle.com.edgesuite.net/ivt/4000/8104/9236/12627/lobby_external_flash_clean_480x360/default.htm' target='_blank'&gt;NetBeans the best Java IDE&lt;/a&gt;. This is a statement not to be taken lightly. Oracle are now investing in three IDEs which are all established in different ways. JDeveloper is Oracle's IDE of choice, I am currently using it in my current project as I am developing for Oracle WebCenter. Oracle is also a strategic developer and board member of the &lt;a href='http://www.oracle.com/technology/tech/eclipse/index.html' target='_blank'&gt;Eclipse foundation&lt;/a&gt;. I do not understand what exactly is a strategic developer but I know that JDeveloper is their strategic IDE. Now, introducing NetBeans, Oracle has inherited NetBeans as part of Sun acquisitions (and a ton of products and services). Until now, Oracle has never made any plug-ins for the NetBeans platform but now they promise to make it the best IDE for Java, how will they make that happen?&lt;br/&gt;&lt;br/&gt;I am a NetBeans evangelist and as the rest of the community, it was good news to actually know where it stands in the "Oracle" vision. So Oracle will never drop JDeveloper therefore the real fight is between Eclipse and NetBeans (as it always has been). In the first step of making NetBeans the best IDE, Oracle shold immediately start porting all their Eclipse plug-ins to NetBeans. Eclipse has strength in its alliance which also includes IBM (fierce rival to Oracle). Something has to give and Eclipse will not never close shop because Oracle has left them which is not as worse as lack of investment in the NetBeans community. It would also be a foolish decision to give NetBeans to the Apache Foundation (no disrespect here but it seems that public funds do not grow on trees).&lt;br/&gt;&lt;br/&gt;There is something funny about Oracle "choice" statement. Did anybody tried to develop for WebCenter using NetBeans or Eclipse? That's a nightmare!!! There is no choice given, they literally forced us to use JDeveloper (Do you require any Oracle support?) in our company which is the largest in its field in Europe (I am avoiding to mention the company name but you should get it from my twitter stream).&lt;br/&gt;&lt;br/&gt;Eclipse and NetBeans are direct competitors with Eclipse being the de facto IDE for Java, dropping Eclipse support would close doors to millions of developers and dropping NetBeans will disaster for many paying customers (Sun's partners).  I am not sure what is going to happen in the NetBeans/ Eclipse and JDeveloper saga but something has to give.&lt;br/&gt;&lt;br/&gt;Let me know what you think.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=cbee6e0c-fff5-88c2-aab0-5031bb1dbd58' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-2011825434986048458?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DlQG4HmZBYsTiGQXvP-qHdFfgUM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DlQG4HmZBYsTiGQXvP-qHdFfgUM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DlQG4HmZBYsTiGQXvP-qHdFfgUM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DlQG4HmZBYsTiGQXvP-qHdFfgUM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/BmihanlcO-w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/2011825434986048458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2010/01/will-oracle-really-make-netbeans-best.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/2011825434986048458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/2011825434986048458?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/BmihanlcO-w/will-oracle-really-make-netbeans-best.html" title="Will Oracle really make NetBeans the BEST IDE for Java" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>7</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2010/01/will-oracle-really-make-netbeans-best.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQGRX0yfSp7ImA9WxBRF0w.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-2633843173549521185</id><published>2010-01-05T10:48:00.001-08:00</published><updated>2010-01-05T10:48:44.395-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-05T10:48:44.395-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="woopra" /><category scheme="http://www.blogger.com/atom/ns#" term="website traffic analyser" /><category scheme="http://www.blogger.com/atom/ns#" term="free analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence for web site" /><category scheme="http://www.blogger.com/atom/ns#" term="website report" /><category scheme="http://www.blogger.com/atom/ns#" term="google analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="real time analytics" /><title>Google Analytics vs Woopra</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;As you can see by reading my blog that I am not the type to compare and endorse products as I think the products owners surely must have a marketing department for that. Anyway, as a blogger, I like to be aware about how well my entries are doing. For awhile, I have been using Google Analytics (so as the top 100+ websites) as it is free and provides me with enough information on the state of my blog, corporate and client's sites. The problem with Google Analytics is that it gives me late news (same as BBC, CNN, TF1 and Sky News and every other news @ 10 channels). I have been working in Business Intelligence for past three years and let me tell you that old news is what caused the current economy downturn. You should not based future goals on outdated data (information), you need to have information at your fingertips on demand and this is where &lt;a href='http://www.woopra.com/' target='_blank'&gt;Woopra &lt;/a&gt;fits in.&lt;br/&gt;&lt;br/&gt;&lt;a href='http://www.woopra.com/' target='_blank'&gt;Woopra&lt;/a&gt; is not free but they do provide a free version (basic) which is enough for most website. I believe if you need more than what they provide, I am sure that you could afford the fee. Anyway, what I really like with this software is its real-time ability and I think that it is something that the folks at Google can easily implement. So I decided to give it a try (last night) and see what was the "big" deal:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;This is what we call real-time data, the fact that I could see where my visitors (to my blog) where coming from, what they were currently looking at (which article) and then where they went next in real-time. This is not a breathrough but the fact that it was available for free made it even better.&lt;/li&gt;&lt;li&gt;Visitors tagging; they are so many sites which is used to tag content on the internet (Digg, Delicious, DZone, Reddit and etc...) so that you can share and easily found what you were looking at before. Ok, Woopra tagging cannot be shared but you can tag a visitor so that you can "spy" on his activity: how many times did it visit the site, which articles is he more interested in, track the comments and more. This is an important feature in profiling your audiences.&lt;/li&gt;&lt;li&gt;Real-time chat; this is a good feature and I think that is indispensable for those running an E-Commerce site. Users are not forced to install any software, no plugins, nothing in order to chat with the site's owner (Any security concern, contact Woopra). I tried it on my blog and to be frank, I haven't been successful initiating a chat with visitors on my blog (they all refused the request :( ) but I can see it being successful on E-commerce site. Another aspect of this feature is the ability for the site owner to start the chat. So you can see what the user doing and which page he's currently looking at and therefore offer your help. I call it the virtual shop assistant. Users can also start a conversation so it's two-way.&lt;/li&gt;&lt;/ul&gt;I know I did not go into details about &lt;a href='https://www.google.com/analytics/' target='_blank'&gt;Google Analytics &lt;/a&gt;but you can register for free and see for yourself. Google Analytics seems out of date, Twitter is real-time, Google and Bing are implementing real-time features; don't you think that you need to be able to track your website performance in realtime too.&lt;a href='http://www.flickr.com/photos/21841907@N05/4248023115'&gt;&lt;img src='http://farm3.static.flickr.com/2768/4248023115_9d7988e4ef.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Another thing, how come Woopra shows some countries as EU when UK, France, Italy, Greece, Germany, Ireland, Spain, Belgium and Poland are shown as their respective countries. What does the European Union means in that case? Also, it is a shame that Woopra is not a web based application (the current web version is so weak you might aswell use Google Analytics ;). &lt;br/&gt;&lt;br/&gt;Anyway, if you have use it before or have a different view, feel free to leave your comments.&lt;br/&gt;&lt;br/&gt;&lt;span class='status'&gt;N265Q9AKMDFZ&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=3830e394-2500-8cd3-9c55-cb02fb4c6d18' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-2633843173549521185?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Vu7G_brZtKxKmVLicJ9zWe78rKk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vu7G_brZtKxKmVLicJ9zWe78rKk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Vu7G_brZtKxKmVLicJ9zWe78rKk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vu7G_brZtKxKmVLicJ9zWe78rKk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/JAlAteL_ObM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/2633843173549521185/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2010/01/google-analytics-vs-woopra.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/2633843173549521185?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/2633843173549521185?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/JAlAteL_ObM/google-analytics-vs-woopra.html" title="Google Analytics vs Woopra" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2768/4248023115_9d7988e4ef_t.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2010/01/google-analytics-vs-woopra.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUHRn8zcSp7ImA9WxBRFU4.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-104985193890012283</id><published>2009-12-31T07:00:00.001-08:00</published><updated>2010-01-03T08:30:37.189-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-03T08:30:37.189-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="plugins" /><category scheme="http://www.blogger.com/atom/ns#" term="ria" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="youtube" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="web applications" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><category scheme="http://www.blogger.com/atom/ns#" term="google app engine" /><category scheme="http://www.blogger.com/atom/ns#" term="wave" /><title>Happy New Year Techies!!!</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I just wanted to say happy new year to the community, without you guys, we would still be living in the dark ages. Here are a few that I am looking forward to in the new year:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Oracle Sun merger:- The untold future of NetBeans, MySQL, Swing and every open source that Sun has been working on in the past. What would happen to Sun Open Source (SOS!!!) Movement.&lt;/li&gt;
&lt;li&gt;Looking forward to JavaFX1.3 release, Authoring tool and improved Composer plugin.&lt;/li&gt;
&lt;li&gt;Android uprise against iPhone (not because I can easily write Android based application) and hopefully with Visual XML builder to build Android UI. JavaFX running on Android, anybody????&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Looking forward to seeing real-world JavaFX application and possibly a showcase linked to the JavaFX.com site.&lt;/li&gt;
&lt;li&gt;Java EE 6 support in Google App Engine&lt;/li&gt;
&lt;li&gt;Google Wave open to the public and how well it does against Twitter and Facebook&lt;/li&gt;
&lt;li&gt;Java Store open to Europe (well this is where I am based and want to sell applications not just provide free).&lt;/li&gt;
&lt;li&gt;My new video blog ( well that's me trying to be more Armel 2.0 - the sequel) to better engage with the community.&lt;/li&gt;
&lt;li&gt;looking forward to networking with fellow developers and techies.&lt;/li&gt;
&lt;li&gt;looking forward to the new buzzwords (old technology, new name)&lt;/li&gt;
&lt;/ol&gt;Well, 2009 is was good year for Java and tech scene. I hope that you all enjoyed the year as much as I did. Why not share what wish list with me (comment box). Subscribe to follow my blog as I will try to bring more interesting articles in the new year.&lt;br /&gt;
&lt;br /&gt;
Happy 2010 New Year, wish you all; success, properity, fame (yup) and fortune. Don't forget, if you need a server-side, UI, Android or JavaFx developer, just mail me.&lt;br /&gt;
&lt;br /&gt;
&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zdU-YUSzkUI&amp;hl=en_GB&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zdU-YUSzkUI&amp;hl=en_GB&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;img height="267" src="http://fc01.deviantart.net/fs50/f/2009/339/0/a/2010_by_LuXo_Art.jpg" style="max-width: 800px;" width="453" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=63052a8a-3e32-838f-a42b-2b85ed972685" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-104985193890012283?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Nu6sOXibPhzcGxt9lXAbYBmXLcQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nu6sOXibPhzcGxt9lXAbYBmXLcQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Nu6sOXibPhzcGxt9lXAbYBmXLcQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nu6sOXibPhzcGxt9lXAbYBmXLcQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/f1eky2cUAoA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/104985193890012283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/12/happy-new-year-techies.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/104985193890012283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/104985193890012283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/f1eky2cUAoA/happy-new-year-techies.html" title="Happy New Year Techies!!!" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>3</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/12/happy-new-year-techies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcMSXY_eCp7ImA9WxBSFU4.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-2470613226431775672</id><published>2009-12-22T16:50:00.001-08:00</published><updated>2009-12-22T17:01:28.840-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-22T17:01:28.840-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="openid" /><category scheme="http://www.blogger.com/atom/ns#" term="javscript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="j2se" /><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="google app engine" /><title>Dummies Guide to GWT and OpenID - with example code</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Once (?) in awhile, we developers browse the web for some quick and dirty solutions to some of our coding problems (sometimes not even problems, right?). This is another of those days, everything was going fine on this project I am currently working on. This is not a social networking sites but a site for sharing and comunicating (how I missed the days of the chatrooms) similar in many aspect to Digg and DZone but which also allows users to communicate in realtime and leave comments. So the back-end was sort of completed but so now time to focus on the user registration. &lt;br /&gt;
&lt;br /&gt;
The sites needed to be open and avoid repeatitive tasks such registering users. The way forward was to implement some authentication to allow users to register with some sort of universally accessible ID (or sort of). Facebook Connect, OpenSocial and Google Accounts have their advantages but to me personally; the disadvantages outweight the pros. These are some of the disadvantages of those platform:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Facebook is a popular site hence is its platform, Facebook Connect, in mostly Europe and America but not everybody in Europe and America have a Facebook account.&lt;/li&gt;
&lt;li&gt;OpenSocial, when it comes to single logon, has more advantages than Facebook. I supposed that if we do take into consideration all the OpenSocial sites, we might have apossible larger user based than supporting Facebook alone. Even that was too limited.&lt;/li&gt;
&lt;li&gt;Google Accounts, one thing Google does not advertise its user base. I could be wrong but do anybody actually knows how many people uses the various Google services (excluding search). Google has the same disadvantages as Facebook.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
Enter &lt;a href="http://openid.net/" target="_blank"&gt;OpenID. OpenID&lt;/a&gt; has been around longer than most Internet-based decentralised authentication platform. The beauty of this platform is that it also supported by most (if not all) large site on the Internet. From AOL, BBC, CNN to YAHOO and ZIMBRA, as I said most sites (based on the alphabet) support OpenID, check the &lt;a href="http://openiddirectory.com/" target="_blank"&gt;OpenID Directory&lt;/a&gt;. It was recently announced that OpenID has reached 1Billion enabled accounts (&lt;a href="http://www.webmonkey.com/blog/OpenID%3A_Over_One_Billion_%28Potentially%29_Served" target="_blank"&gt;read here&lt;/a&gt;). Based on those figures, I decided that OpenID for now was the authentication choice for this application. I will not be discussing any security issues in this entry, there are plenty of resources available on the Internet for that.&lt;br /&gt;
&lt;br /&gt;
OK, so I am a Java developer and I am developing the front-end using GWT and Java on the server-side. I searched on the Internet for solutions on how to implement the authentication as GWT RPC are different to normal servlet call. I spent more time reading about the OpenID specification and implementations examples on the Internet. I have to admit that some of tutorials that I found on the Internet were somehow confusing and not helpful at all. Therefore I decided to write my own Dummies Guide to GWT and OpenID.&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Dummies Guide to GWT and OpenID&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
&lt;br /&gt;
First of all, it is important to know how OpenID works (please check the &lt;a href="http://www.openid.net/" target="_blank"&gt;OpenID&lt;/a&gt; site for more info).&lt;br /&gt;
&lt;br /&gt;
In a nutshell, OpenID allows you to authenticate with website (supporting the standard) with just an URL and voila. Your URL has to be hosted by an OpenID provider in order for it to work. For example, my blog is hosted by Google on blogspot.com. Google supports OpenID authentication therefore if a reader wanted to leave a comment on my blog, he does not have to have a Google Account as he can log-in with his Yahoo or AOL or Facebook or Wordpress or any other OpenID provider sites, and then leave a comment, that simple.&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;GWT to OpenID and back&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
&lt;br /&gt;
There are two ways to authenticate a user with an OpenID provider and GWT supports both. When authenticating a user, the relaying site (the site the user is trying to access) redirects to user to the OpenID provider (i.e. Google) login page.&lt;br /&gt;
&lt;img height="391" src="http://i.zdnet.com/blogs/openid-1.jpg" style="max-width: 800px;" width="624" /&gt;&lt;br /&gt;
&lt;br /&gt;
The problem will be with the GWT RPC mechanism. GWT RPC calls are asynchronous and you cannot make any redirections. Therefore we need a way to execute the redirection from the client side, here is the code (I use &lt;a href="http://code.google.com/p/openid4java/" target="_blank"&gt;OpenID for Java&lt;/a&gt; to handle the openID discovery from the RPC servlet), I then used USER object (just a simple POJO which only stores the redirection URL and the parameters) to be sent back and forth between the front-end and back-end.&lt;br /&gt;
&lt;br /&gt;
#######################################################&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;public&amp;nbsp;User&amp;nbsp;authenticateOpenId(String&amp;nbsp;provider_url)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConsumerManager&amp;nbsp;manager&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ConsumerManager();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;This&amp;nbsp;is&amp;nbsp;the&amp;nbsp;URL&amp;nbsp;where&amp;nbsp;the&amp;nbsp;OpenID&amp;nbsp;provider&amp;nbsp;will&amp;nbsp;redirect&amp;nbsp;the&amp;nbsp;user&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;once&amp;nbsp;logged&amp;nbsp;in.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;returnToUrl&amp;nbsp;=&amp;nbsp;"&lt;a class="smarterwiki-linkify" href="http://localhost:8084/GwtOpenId"&gt;http://localhost:8084/GwtOpenId&lt;/a&gt;";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;the&amp;nbsp;provider&amp;nbsp;URL&amp;nbsp;will&amp;nbsp;be&amp;nbsp;used&amp;nbsp;to&amp;nbsp;identify&amp;nbsp;the&amp;nbsp;user&amp;nbsp;OpenID&amp;nbsp;provider&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;discoveries&amp;nbsp;=&amp;nbsp;manager.discover(provider_url);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DiscoveryInformation&amp;nbsp;discovered&amp;nbsp;=&amp;nbsp;manager.associate(discoveries);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;OpenID&amp;nbsp;4&amp;nbsp;Java&amp;nbsp;needs&amp;nbsp;to&amp;nbsp;&amp;nbsp;have&amp;nbsp;an&amp;nbsp;HttpServletRequest&amp;nbsp;object,&amp;nbsp;GWT&amp;nbsp;sevlet&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;have&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;convenient&amp;nbsp;methods&amp;nbsp;to&amp;nbsp;retrieve&amp;nbsp;the&amp;nbsp;HttpServletRequest&amp;nbsp;object&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;and&amp;nbsp;manipulate&amp;nbsp;its&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;parameters&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.getThreadLocalRequest().setAttribute("openid-disc",&amp;nbsp;discovered);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.getThreadLocalRequest().setAttribute("openid.mode",&amp;nbsp;"popup");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthRequest&amp;nbsp;authReq&amp;nbsp;=&amp;nbsp;manager.authenticate(discovered,&amp;nbsp;returnToUrl);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FetchRequest&amp;nbsp;fetch&amp;nbsp;=&amp;nbsp;FetchRequest.createFetchRequest();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;I&amp;nbsp;want&amp;nbsp;to&amp;nbsp;exchange&amp;nbsp;the&amp;nbsp;following&amp;nbsp;attributes&amp;nbsp;from&amp;nbsp;the&amp;nbsp;OpenID&amp;nbsp;provider&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;remember&amp;nbsp;that&amp;nbsp;teh&amp;nbsp;attribute&amp;nbsp;will&amp;nbsp;be&amp;nbsp;returned&amp;nbsp;only&amp;nbsp;if&amp;nbsp;it&amp;nbsp;exits&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetch.addAttribute("email","&lt;a class="smarterwiki-linkify" href="http://schema.openid.net/contact/email"&gt;http://schema.openid.net/contact/email&lt;/a&gt;",true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authReq.addExtension(fetch);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Simple&amp;nbsp;POJO&amp;nbsp;to&amp;nbsp;persist&amp;nbsp;the&amp;nbsp;data&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;User&amp;nbsp;user&amp;nbsp;=&amp;nbsp;new&amp;nbsp;User();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;In&amp;nbsp;a&amp;nbsp;normal&amp;nbsp;servlet&amp;nbsp;development,&amp;nbsp;the&amp;nbsp;following&amp;nbsp;statement&amp;nbsp;would&amp;nbsp;make&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;a&amp;nbsp;redirect&amp;nbsp;call&amp;nbsp;but&amp;nbsp;this&amp;nbsp;would&amp;nbsp;not&amp;nbsp;work&amp;nbsp;when&amp;nbsp;using&amp;nbsp;GWT&amp;nbsp;RPC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!discovered.isVersion2()){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user.setRedirect(authReq.getDestinationUrl(true));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;fakes&amp;nbsp;the&amp;nbsp;redirect&amp;nbsp;by&amp;nbsp;sending&amp;nbsp;the&amp;nbsp;POJO&amp;nbsp;with&amp;nbsp;the&amp;nbsp;required&amp;nbsp;parameters&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;to&amp;nbsp;make&amp;nbsp;a&amp;nbsp;client-side&amp;nbsp;redirect&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;user;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user.setParams(authReq.getParameterMap());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user.setRedirect(authReq.getDestinationUrl(false));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;fakes&amp;nbsp;the&amp;nbsp;redirect&amp;nbsp;by&amp;nbsp;sending&amp;nbsp;the&amp;nbsp;POJO&amp;nbsp;with&amp;nbsp;the&amp;nbsp;required&amp;nbsp;parameters&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;to&amp;nbsp;make&amp;nbsp;a&amp;nbsp;client-side&amp;nbsp;redirect&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;user;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(MessageException&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Logger.getLogger(GWTServiceImpl.class.getName()).log(Level.SEVERE,&amp;nbsp;null,&amp;nbsp;ex);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(DiscoveryException&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Logger.getLogger(GWTServiceImpl.class.getName()).log(Level.SEVERE,&amp;nbsp;null,&amp;nbsp;ex);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(ConsumerException&amp;nbsp;ex)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Logger.getLogger(GWTServiceImpl.class.getName()).log(Level.SEVERE,&amp;nbsp;null,&amp;nbsp;ex);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
#############################################################&lt;br /&gt;
&lt;br /&gt;
The above codes will format the request in order for the front-end to execute a redirect and allow the user to authenticate with his OpenID provider. Now here is the front-end code which executes the authentication and reads the data back.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#################################################################&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt; //&amp;nbsp;This&amp;nbsp;is&amp;nbsp;an&amp;nbsp;extract&amp;nbsp;from&amp;nbsp;the&amp;nbsp;openidEntryPoint.java&lt;br /&gt;
&lt;br /&gt;
//&amp;nbsp;This&amp;nbsp;is&amp;nbsp;where&amp;nbsp;the&amp;nbsp;magic&amp;nbsp;happens&amp;nbsp;-&amp;nbsp;This&amp;nbsp;code&amp;nbsp;is&amp;nbsp;only&amp;nbsp;usefull&amp;nbsp;when&amp;nbsp;the&amp;nbsp;OpenID&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;provider&lt;br /&gt;
//&amp;nbsp;redirects&amp;nbsp;the&amp;nbsp;user&amp;nbsp;back&amp;nbsp;to&amp;nbsp;your&amp;nbsp;site&amp;nbsp;-&amp;nbsp;please&amp;nbsp;visit&amp;nbsp;openid.net&amp;nbsp;for&amp;nbsp;valid&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;parameters.&lt;br /&gt;
//&amp;nbsp;The&amp;nbsp;"if"&amp;nbsp;statement&amp;nbsp;checks&amp;nbsp;to&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;it&amp;nbsp;is&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;response&amp;nbsp;from&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;the&amp;nbsp;OpenID&lt;br /&gt;
//&amp;nbsp;provider&amp;nbsp;-&amp;nbsp;You&amp;nbsp;can&amp;nbsp;do&amp;nbsp;anything&amp;nbsp;you&amp;nbsp;want&amp;nbsp;with&amp;nbsp;the&amp;nbsp;results&amp;nbsp;here&amp;nbsp;such&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;as&amp;nbsp;verifying&amp;nbsp;the&lt;br /&gt;
//&amp;nbsp;response&amp;nbsp;with&amp;nbsp;the&amp;nbsp;server-side&amp;nbsp;code&lt;br /&gt;
if(Window.Location.getParameter("openid.rpnonce")&amp;nbsp;!=&amp;nbsp;null){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;s&amp;nbsp;=&amp;nbsp;Window.Location.getParameter("openid.mode");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;executes&amp;nbsp;this&amp;nbsp;if&amp;nbsp;the&amp;nbsp;user&amp;nbsp;cancels&amp;nbsp;the&amp;nbsp;authentication&amp;nbsp;process&amp;nbsp;and&amp;nbsp;the&amp;nbsp;OpenID&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;providers&amp;nbsp;returns&amp;nbsp;to&amp;nbsp;the&amp;nbsp;your&amp;nbsp;site&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(s.equals("cancel")){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign.setText("Server&amp;nbsp;returned&amp;nbsp;openid.mode=cancel");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;openIdUrl.setText("You&amp;nbsp;need&amp;nbsp;to&amp;nbsp;Accept&amp;nbsp;not&amp;nbsp;Cancel");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Here,&amp;nbsp;I&amp;nbsp;am&amp;nbsp;assuming&amp;nbsp;that&amp;nbsp;everything&amp;nbsp;is&amp;nbsp;fine&amp;nbsp;and&amp;nbsp;that&amp;nbsp;the&amp;nbsp;user&amp;nbsp;has&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;been&amp;nbsp;sucessfully&amp;nbsp;logged&amp;nbsp;in&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sign.setText("You&amp;nbsp;have&amp;nbsp;successfully&amp;nbsp;signed&amp;nbsp;in");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vp.setVisible(false);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
}&lt;br /&gt;
RootPanel.get().add(contentPanel);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private&amp;nbsp;class&amp;nbsp;UserAsyncCallback&amp;nbsp;implements&amp;nbsp;AsyncCallback&amp;lt;User&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;onFailure(Throwable&amp;nbsp;caught)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Window.alert(caught.getLocalizedMessage());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;onSuccess(User&amp;nbsp;result)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(result&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Window.open(result.getRedirect(),&amp;nbsp;"_blank",&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;&amp;nbsp;"height=200,width=400,left=100,"&amp;nbsp;+&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"top=100,resizable=no,scrollbars=no,&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;toolbar=no,status=yes");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;this&amp;nbsp;the&amp;nbsp;most&amp;nbsp;important&amp;nbsp;line&amp;nbsp;in&amp;nbsp;order&amp;nbsp;to&amp;nbsp;make&amp;nbsp;the&amp;nbsp;authentication.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;&amp;nbsp;Here,&amp;nbsp;I&amp;nbsp;am&amp;nbsp;redirecting&amp;nbsp;the&amp;nbsp;user&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;from&amp;nbsp;the&amp;nbsp;client&amp;nbsp;side&amp;nbsp;to&amp;nbsp;the&amp;nbsp;OpenID&amp;nbsp;provider&amp;nbsp;URL&amp;nbsp;with&amp;nbsp;the&amp;nbsp;discovery&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="color: black;"&gt;&amp;nbsp;data&amp;nbsp;generated&amp;nbsp;from&amp;nbsp;the&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;RPC&amp;nbsp;call&amp;nbsp;to&amp;nbsp;the&amp;nbsp;servlet.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Window.Location.assign(result.getRedirect());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Window.alert("Ooops!!!&amp;nbsp;Couldn't&amp;nbsp;find&amp;nbsp;your&amp;nbsp;provider");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
#######################################################################################################&lt;br /&gt;
&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
I have attached the full NetBeans project with dependencies. The code is provided as-is and use at your own risk ;). Here is a screenshot of the working application:&lt;br /&gt;
&lt;br /&gt;
Step1: Authenticate on the site (enter the URL)&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4206902391/" title="moz-screenshot-6 by nene world, on Flickr"&gt;&lt;img alt="moz-screenshot-6" height="271" src="http://farm3.static.flickr.com/2551/4206902391_876b1bbe5e.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Step2: Redirect to OpenID provider (Google is my provider :) ), authenticate with your provider&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4207644210/" title="moz-screenshot-7 by nene world, on Flickr"&gt;&lt;img alt="moz-screenshot-7" height="230" src="http://farm3.static.flickr.com/2643/4207644210_3ed4305a68.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Step3: Allow the application to access your OpenID details and redirect back to the original site&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4206885115/" title="moz-screenshot-8 by nene world, on Flickr"&gt;&lt;img alt="moz-screenshot-8" height="230" src="http://farm3.static.flickr.com/2795/4206885115_14234926b2.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Step4: final step, check the parameters from the provider and proceeds accordingly&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4206885159/" title="moz-screenshot-9 by nene world, on Flickr"&gt;&lt;img alt="moz-screenshot-9" height="279" src="http://farm3.static.flickr.com/2519/4206885159_ee43d5718f.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Take a look at the URL in each of the above step to see the OpenID data. OK, so my code actually works (yuppie), now you know that it is possible form GWT to OpenID and it's not as complicated as many other sites are trying to show. The code is just for authentication but once authenticated, you can retrieve any parameters that you need. In this example, the query is sent through the browser URL (GET) but you can change it to be encoded in a form submit action. Iwrote some of the code to allow the user to authenticate via a popup window, the code is not complete and maybe someone else might want to have a go. My only problem is getting the redirect back to the original window but apart from that it works.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://cid-55ee1481ce36f98f.skydrive.live.com/self.aspx/Tutorial/GwtOpenId.7z" target="_blank"&gt;Download the source code&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I hope you guys enjoyed it and Happy Coding.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=e3a0b81a-7545-8c67-9a1c-89bc12c0bfb4" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-2470613226431775672?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/StedkNwPLoJu-GvGAoz8brpj6EM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/StedkNwPLoJu-GvGAoz8brpj6EM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/StedkNwPLoJu-GvGAoz8brpj6EM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/StedkNwPLoJu-GvGAoz8brpj6EM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/zNhR4eSmzLU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/2470613226431775672/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/12/dummies-guide-to-gwt-and-openid-with.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/2470613226431775672?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/2470613226431775672?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/zNhR4eSmzLU/dummies-guide-to-gwt-and-openid-with.html" title="Dummies Guide to GWT and OpenID - with example code" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2551/4206902391_876b1bbe5e_t.jpg" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/12/dummies-guide-to-gwt-and-openid-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUMSH09eyp7ImA9WxBSE04.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-205296371327316487</id><published>2009-12-17T14:54:00.001-08:00</published><updated>2009-12-20T10:04:49.363-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-20T10:04:49.363-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="plugins" /><category scheme="http://www.blogger.com/atom/ns#" term="Adobe Flash" /><category scheme="http://www.blogger.com/atom/ns#" term="safari" /><category scheme="http://www.blogger.com/atom/ns#" term="chrome" /><category scheme="http://www.blogger.com/atom/ns#" term="opera" /><category scheme="http://www.blogger.com/atom/ns#" term="web browser" /><category scheme="http://www.blogger.com/atom/ns#" term="youtube" /><category scheme="http://www.blogger.com/atom/ns#" term="IE8" /><category scheme="http://www.blogger.com/atom/ns#" term="Internet Explorer" /><category scheme="http://www.blogger.com/atom/ns#" term="plug-ins" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><title>Firefox IE8 Chrome Opera Safari - best browser for Java?</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Initially, I was not going to write up about browsers until I had to download all the known web browsers to test a project front-end. I already had Firefox, IE8 and Chrome installed therefore all I had to do was to download and install Opera and Safari. There might be other browsers outthere but this what I am working with for the moment. So what's the problem? You might ask. Well, I decided to see how simple it would be for a normal user without much computer experience to view a Java-enabled application embedded in a web app or simple HTML page.&lt;br /&gt;
&lt;br /&gt;
Before I go on about what I think, first let me give you an idea of the PC I am currently using:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Dell PC with a dual 22" screen (customised version of Inspiron 530)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;4Gb of RAM&lt;/li&gt;
&lt;li&gt;Intel Pentium Dual 1.80GHz (looking to upgrade this after xmas)&lt;/li&gt;
&lt;li&gt;Windows Vista Ultimate (how rubbish is that?)&lt;/li&gt;
&lt;li&gt;Java RE version 1.6.0_17&lt;/li&gt;
&lt;li&gt;and a few other hardware and software.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;So as you can see, my personal PC is quite simple in settings. Ok, for some reasons, I decided to launch all the browsers at once and load the JavaFx homepage (http://www.javafx.com) and all I wanted to do was to compare which one loaded the fastest. Here are my findings, in brief:&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Firefox&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
This is probably the best browser outthere but lately it has been crashing on me. And btw, it does not cope well with Google Wave. Anyway, here is what Firefox gave (see screenshot):&lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2644/4193869276_1c43c12a9a.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see on the above screenshot, the JavaFx homepage loads in its entirety. To be quite honest, the page was loaded without any fuss but bear in mind, I already had Java installed. The "Demos &amp;amp; Samples" box in blue requires Java to be installed as it a JavaFx applet. As I already have the JRE installed, the browser did not ask me for any plug-ins ( I could be wrong feel free to share your experience).&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Internet Explorer 8&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2744/4193869504_76c6223511.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
I am not a great fan of IE in general, but for this simple test; IE8 loaded the page faster than Firefox. Also, it did not ask me to install a specific plugin in order to load the JavaFx portion of the page. IE handles Google Wave much better than Firefox, so this is the browser I use to interact on the Wave. &lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Google Chrome&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2495/4193869682_28e9ee3899.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
Google Chrome, like Firefox and IE, did not cause any problem and it was the fastest at loading the JavaFx page including the Java applet. So far, it is the best performing browser but it is not my personal choice so I rarely use it. Also, I like the fact that Chrome scales the page to fit nicely in its window.&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Opera&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2511/4193110665_4818060883.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see in the above screenshot, it seems as if the applet was not fully loaded. Indeed, Opera has loaded some portions of the JavaFx applet but I do not know what is happening here now. This page has been the same since I loaded the browser until now. Again, Opera did not ask me for any plugins to be installed nor did it ask for anything else. I suppose this is not an issue from Sun ;) but something that the Opera team should look at. I know Opera can find the JRE on my system (see screenshot below) but it seems not to be a big fan of Java. In the screenshot below, you can see the JavaFx splash screen but this is all you will see and nothing else. Off-subject, I really like the user interface and I might start using it for a bit longer just to see if it can convert me. &lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2496/4193869896_0d54ce2f97.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Safari&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2535/4193110893_061d5db47c.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
Ha! what the hell happened here. I have my JRE installed, the previous four browsers did not ask me to install Java (again!!!). The demo applet did not even load, this is Safari running on Windows machine not Mac. So I did what it has asked me for the thousandth time. I clicked on the provided link, takes me to the Java RE download page and I did all the required and look!!!!&lt;br /&gt;
&lt;img alt='' src='http://farm3.static.flickr.com/2590/4193110911_9e48deb95c.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
Java!!!!! This is the confirmation that I already have the software installed so what's the big idea? The Apple team are not doing a good job to support Java but I can browse to Youtube and watch video without installing Flash player (it recognises that it's already installed). Well I do not think I will be using this browser again anytime soon.&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;&lt;b&gt;Final words&lt;/b&gt;&lt;/big&gt;&lt;br /&gt;
When it comes to browser to support, you have to test your application on multiple browser ( and OS platform too) to make sure it will not affect the expected user experience that we are so accustomed to. &lt;br /&gt;
&lt;br /&gt;
I do not know why Opera and Safari have issues with the JavaFx site, it could be anything from the site designers to the respective browsers' team. I believe that Java is probably the best Cloud computing platform currently outthere (when it comes to high performance applications) and that browser providers should make sure that at least they do support the platform.&lt;br /&gt;
&lt;br /&gt;
I have a question:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Who should be to blame if Java or any other plugins such Flash is not supported in the browser? The plug-ins developer or the browser developer?&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
I believe the plug-ins developer should be to blame as they can be a million plug-ins on the net and you cannot possibly cater for all of them. But on the other hand, as in Java 's case, the plug-in is supported without any major issues by the top 3 which accounts for &lt;a href='http://www.w3schools.com/browsers/browsers_stats.asp' target='_blank'&gt;93.9% percent of the market&lt;/a&gt; (based on November 2009), should you as the plugin developer care? I say yes at least for the Mac users' sake. We can overlook opera for now but I am sure that all the Apple fans still use Safari as their prefered browser. Do not try to leave them out, they brought us the iPhone.&lt;br /&gt;
&lt;br /&gt;
Anyway, based on my simple test, I think the best browser for Java applet is (in order of best performance):&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Google Chrome&lt;/li&gt;
&lt;li&gt;Internet Explorer (make sure you do support this browser as a priority)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Mozilla Firefox (this should also be supported right after IE)&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;The other two browsers are not included as they did not even successfully launch the applet. I am not saying that you guys are going to have the exact same issue as me and therefore looking forward to your comments.&lt;br /&gt;
&lt;br /&gt;
&lt;img width='567' height='409' alt='' src='http://farm3.static.flickr.com/2567/4193111397_fa22878d42.jpg' title=''/&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=06e89755-f438-8cc9-a077-af469c481169' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-205296371327316487?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xp2D-dyO6vdWu1NcKUHgDpfLfv8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xp2D-dyO6vdWu1NcKUHgDpfLfv8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xp2D-dyO6vdWu1NcKUHgDpfLfv8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xp2D-dyO6vdWu1NcKUHgDpfLfv8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/kwcV8faxrng" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/205296371327316487/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/12/firefox-ie8-chrome-opera-safari-best.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/205296371327316487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/205296371327316487?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/kwcV8faxrng/firefox-ie8-chrome-opera-safari-best.html" title="Firefox IE8 Chrome Opera Safari - best browser for Java?" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2644/4193869276_1c43c12a9a_t.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/12/firefox-ie8-chrome-opera-safari-best.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IHR3Y8fyp7ImA9WxBTGUs.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-8494824973098053702</id><published>2009-12-16T04:12:00.001-08:00</published><updated>2009-12-16T04:12:16.877-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-16T04:12:16.877-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaFx Composer plugin" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="sun" /><category scheme="http://www.blogger.com/atom/ns#" term="ria" /><category scheme="http://www.blogger.com/atom/ns#" term="RAD" /><category scheme="http://www.blogger.com/atom/ns#" term="Adobe Flash" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="Adobe Flex" /><title>JavaFX Composer RAD Tool - First Review</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Just over a week ago, Sun announced a RAD tool for JavaFx built on the Matisse framework, I believe. I was very critical of JavaFx for its lack of tool for building UI and I think this is a step in the right direction. The tool was made available through the NetBeans Update Center on the 14/12/2009. OK, so I have installed the plugin and here are my views; not just on the tools but also on other stuff I think would benefit the JavaFx community:&lt;br/&gt;&lt;br/&gt;When comparing something, it only makes sense when we use a benchmark; here my benchmark will be Adobe Flash Builder (formerly known as Flex Builder). Over the years, Adobe had made it easy for the designer to build impressive user interface with minimal coding. Sun, in the other hand, made it easier for developers to build application, yes I am aware of some nice UI in Java but they still do not compare to the eye candy of Flash/ Flex.&lt;br/&gt;&lt;br/&gt;I am going to look at the tools; Flash Builder and JavaFx Composer plugin, from a developer perspective.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;&lt;big&gt;Components:&lt;/big&gt;&lt;/b&gt;&lt;br/&gt;A key feature of RAD tools is the amount of components they make available to developers without having to write too many codes. I understand the plugin is at a "preview" stage, whatever that mean (alpha?), but there are alot of missing components; as an example, this release version was meant to be a "preview" of what to look forward to but I cannot drag a "combox" from the components palette into my form, no data grid, no chart, no menu bar, no date components and can't even draw a rectangle which is possible but only through coding. I hope the JavaFx team add all the components available in JavaFx plugin to the Composer. &lt;br/&gt;&lt;br/&gt;&lt;a title='moz-screenshot-2 by nene world, on Flickr' href='http://www.flickr.com/photos/21841907@N05/4190189872/'&gt;&lt;img width='500' height='245' alt='moz-screenshot-2' src='http://farm3.static.flickr.com/2553/4190189872_6bb23523e5.jpg'/&gt;&lt;/a&gt;NetBeans JavaFx UI Composer&lt;br/&gt;&lt;br/&gt;&lt;a title='moz-screenshot-4 by nene world, on Flickr' href='http://www.flickr.com/photos/21841907@N05/4189429727/'&gt;&lt;img width='231' height='500' alt='moz-screenshot-4' src='http://farm3.static.flickr.com/2587/4189429727_b9155da035.jpg'/&gt;&lt;/a&gt;Adobe Flex/ Flash Builder&lt;br/&gt;&lt;br/&gt;&lt;b&gt;&lt;big&gt;Round-trip code update&lt;/big&gt;&lt;/b&gt;&lt;br/&gt;One thing I dislike with Java IDE's (or most of them) is the inability to change the generated code without requiring you to write more code. The Adobe team actually made a good job in giving more freedom to the developer. In Flash Builder, you can design your UI through drag-n-drop but also customise it directly through the XML file (MXML). This feature was not available in NetBeans Matisse, I could be wrong, but and again Matisse was not really used in large project (no comments, thanks), at least not were I worked. Why all the fuss, you might ask? Try to create a simple interface and add a "rectangle" object to it which you will use as a toolbar and tell me how simple that was.&lt;br/&gt;&lt;br/&gt;The coding style in JavaFx is very similar to Flex/ Flash ActionScript (so why the "V"oid instead of void, but that's another issue) and very easy to learn. So far, I found it easier to actually code the canvas then using the Composer plugin. Another thing, when inspecting object properties; not all properties are available, for example: the gradient properties are not available, which will require you to write more lines of code.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;UI Preview Panel&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;Again, a feature which Adobe Flex/ Flash builder excels at (I feel like I am starting to sound like an Adobe salesman) is the synchronize preview of codes. This is not a due to JavaFx Composer plugin but this seems as a bug as sometimes, you might have to restart the IDE in order for the UI Preview panel to start working again. Hopefully the introduction of the RAD (or not so much RAD) tool, will fix this issue.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;You might feel that I was on a JavaFx bashing quest but this is not the case. JavaFx might not have a large components set (well what about all the SWING components available which you can use? You might not be able to "skin" them to your application look and feel but they still availabe to you) but I still think it has a good future. If you take a look at the screenshot below which was built with Adobe Flex, it took me less than five (5) minutes to build. Now time to synchronize your watches and tell me how fast it will take you to build the same interface using JavaFx Composer plugin. It will probably take me less than five (5) minutes if I was designing it with Matisse. My point is; a RAD tool is supposed to promote productivity and YES!!! I have realized this is a "PREVIEW" release but can you actually use it? I know I will still be coding JavaFx for the foreseable future and I would love it to succeed. If you are going to call a tool "a RAD tool for building Form-based JavaFx UI" then I suggest that you provide most of the form components.&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;Should JavaFx UI RAD tools be based on XML like Android and Adobe Flash Builder?&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;a title='moz-screenshot-5 by nene world, on Flickr' href='http://www.flickr.com/photos/21841907@N05/4190189850/'&gt;&lt;img width='500' height='360' alt='moz-screenshot-5' src='http://farm5.static.flickr.com/4048/4190189850_9f23a84d97.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;5 components I like to have on JavaFx&lt;/b&gt;&lt;/big&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Menu and tool bar (come on guys, this was there in previous release)&lt;/li&gt;&lt;li&gt;Grids (even just a simple table will do. For now I use JTable)&lt;/li&gt;&lt;li&gt;Date picker, Rich Text and Navigator components&lt;br/&gt;&lt;/li&gt;&lt;li&gt;HTML panel (something that display HTML and can also be used as iFrames)&lt;/li&gt;&lt;li&gt;Panels similar to JInternalFrame (this will be useful in portlet-like applications)&lt;/li&gt;&lt;/ol&gt;I know it's not really 5 things but they will make a difference. Thanks for reading and tell me what you think about JavaFx and its UI Composer.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=7df463a9-04d5-8386-949e-d107d0409638' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-8494824973098053702?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ATBQZIW6seb262pmZT_eeupY5VY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ATBQZIW6seb262pmZT_eeupY5VY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ATBQZIW6seb262pmZT_eeupY5VY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ATBQZIW6seb262pmZT_eeupY5VY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/sjds2qveX9M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/8494824973098053702/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/12/javafx-composer-rad-tool-first-review.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8494824973098053702?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8494824973098053702?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/sjds2qveX9M/javafx-composer-rad-tool-first-review.html" title="JavaFX Composer RAD Tool - First Review" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2553/4190189872_6bb23523e5_t.jpg" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/12/javafx-composer-rad-tool-first-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAGRnk9fyp7ImA9WxNaF0g.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-8181301710418306921</id><published>2009-12-02T03:59:00.001-08:00</published><updated>2009-12-02T04:25:27.767-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-02T04:25:27.767-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javscript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="ria" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="javafx" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><title>JavaFX vs GWT - A developer dilemma in building a RIA application</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;For the past few days, I have been working on a simple proof of concept; a web based stock streaming application with a community theme to it. I set myself to building the backend first. As you can guess, I am developing in Java and here are some of the requirements that I have to meet, at least:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;The application shall allow the user to query a stock (quotes) either using the stock ticker or the company name and display the following: stream stock price with basic info, stock historical price; tabular view and financial chart analysis.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;The ability to rate, comments and share stock information.&lt;/li&gt;
&lt;li&gt;provide a real-time chat features for users of the application to interact together.&lt;/li&gt;
&lt;li&gt;single sign-on integration with OpenSocial, OpenID and Facebook connect.&lt;/li&gt;
&lt;/ol&gt;The above are some basic features in order for people to actually use the site. As you can see, they are mostly front-end requirements. Here is another important requirement:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The application will be hosted on a Cloud-based service, the application shall keep to a minimum the load on the server as CPU and memory use will be charged per request.&lt;/li&gt;
&lt;/ul&gt;I believe that last requirement was the key decision factor. I needed something that will make use of the user resources instead of stressing the server. Something that would execute on the browser, client-side. Being a Java developer, it is only normal for me to look for something that I can grasp easily and freely available on the market. I looked at a few RIA frameworks and tools but I needed something that can integrate within my development environment without the need switch between IDEs.&lt;br /&gt;
&lt;br /&gt;
I had a look at JavaFX and GWT. Having worked on GWT in the past, I found that I could implement most of the requirements. GWT has a rich api and components sets (widgets). I could use the Google search, map, visualization... to build the front-end and implement the client side code.&lt;br /&gt;
&lt;br /&gt;
It took me about two days to implement the basic front-end and back-end features; mostly concentrating requirements 1 and the last. But then I hit a brick wall, something that all Javascript developers already knew but I just came across:&lt;br /&gt;
&lt;br /&gt;
The application is a mashup of different services from around the net. Some of those services were available for free and others were not available at all but I will still be connecting and parsing the relevant data to displayed on the screen. As requirement "1" was working fine, there was a disaster about to happen. Here is the basic architecture:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;when a user queries a stock, the data is sent to the back-end services.&lt;/li&gt;
&lt;li&gt;the back-end services queries a third-party web service which I do not have control over. ZERO.&lt;/li&gt;
&lt;li&gt;when the third-party web service returns, the data is then parsed into a format understood by the front-end and sent to the front-end services to display. &lt;/li&gt;
&lt;/ul&gt;The services was working fine until I had about 12 stocks displayed on my screen for testing purpose. The data was being streamed with a 1 minute interval. After about 30minutes later (and 360 requests = 12 *1 pm * 36m), I have noticed that the stock data was not being updated anymore and some screens were blank. No errors were logged and some other queries were still working such as the historical data. As I could not see the errrors from my debugging session, I therefore decided to query the third-party service manually through Firefox and IE and VOILA! The service provider had put a temporary &lt;b&gt;ban on my IP&lt;/b&gt; address for making too many requests, it says. This was a major blocker as it seems that I could not access my primary data anymore. This left me questioning the feasibility of the project. &lt;br /&gt;
&lt;blockquote&gt;If a single user gets banned for tracking 12 stocks, what would happen when 100 or more users start watching their stocks?&lt;br /&gt;
&lt;/blockquote&gt;OK, so I did not give up, at least not without a fight!&lt;br /&gt;
&lt;br /&gt;
I looked at the problem from another perspective, the third-party view. How do they track my request as I do not have to register or sign-in? The obvious answer is my IP. So I thought, instead of making the request to their services from the back-end, I should send the request directly from the front-end. If each users make the same request, the third-party services would register different IP addresses for each one of them. Correct indeed but one big problem:&lt;br /&gt;
&lt;br /&gt;
The front-end code is written in GWT which is then compiled to Javascript. Being a Java developer, I was not aware of the limitation of using AJAX in a mashup such as mine. After making the necessary changes, I then run the app just to get hit with another blocker - SOP (&lt;a href='http://en.wikipedia.org/wiki/Same_origin_policy' target='_blank'&gt;Javascript Same Origin Policy&lt;/a&gt;). What's in a monkey name was this all about? So after researching it - Google and Wikipedia, I knew what I was dealing with and I am sure all Javascript developers already knew that but not me :(. I never give up, it is not part of my nature, therefore I decided to look for ways around it and came across a &lt;a href='http://code.google.com/webtoolkit/tutorials/1.6/Xsite.html' target='_blank'&gt;tutorial on GWT &lt;/a&gt;site that shows you how to implement a workaround. Did the tutorial, implemented some basic methods and that worked fine but implementing the third-party service, did not work :(. The problem was simple, the workaround needs to be in JSON format which I coded but the third-party service needs to be able to send the request back to a "callback" method. This is it!!! Remember that I mentioned that I had ZERO control over the thrid-party service and therefore I could not implement this feature.&lt;br /&gt;
&lt;br /&gt;
Remember, I never give up; when there's a will there's a way. So I hit a major blocker due to the technology, in this case it was Javascript. I know that if I was working on a pure java front-end GUI, this would have never occurred and Flex allows you to query other third-party services but I have no knowledge of ActionScript. I decided to go for JavaFX just because it is Java and allows me to connect and get my data (actually it's not mine). My options were Webstart, Applet and JavaFX. First of all, it has to be part of the site so my real options were Applet and JavaFX. Applet do not have a rich set of tools such as Map, Chart and everything else that JavaFX provides and I do not want to waste time coding them.&lt;br /&gt;
&lt;br /&gt;
So same adventure but different episode; I am currently looking to implement the JavaFX UI so stay tune for the sequel and screenshot. I could have never anticipated those problems with the third-party and then Javascript but believe me it was a good experience and my Javascript just went +1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=9fac04a4-ac46-8036-8976-c55cd0770c6c' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-8181301710418306921?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/L1r93b4rh10Zox34Hj1N2C_sBD8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L1r93b4rh10Zox34Hj1N2C_sBD8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/L1r93b4rh10Zox34Hj1N2C_sBD8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L1r93b4rh10Zox34Hj1N2C_sBD8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/gwJf3PfZg8o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/8181301710418306921/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/12/javafx-vs-gwt-developer-dilemma-in.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8181301710418306921?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8181301710418306921?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/gwJf3PfZg8o/javafx-vs-gwt-developer-dilemma-in.html" title="JavaFX vs GWT - A developer dilemma in building a RIA application" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>5</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/12/javafx-vs-gwt-developer-dilemma-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4DRX84cCp7ImA9WxNbGEQ.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-153190513670248022</id><published>2009-11-22T04:29:00.001-08:00</published><updated>2009-11-22T04:29:34.138-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-22T04:29:34.138-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="server" /><category scheme="http://www.blogger.com/atom/ns#" term="annotated" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="time" /><category scheme="http://www.blogger.com/atom/ns#" term="portlet" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="chart" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr168" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="visualization" /><category scheme="http://www.blogger.com/atom/ns#" term="j2se" /><category scheme="http://www.blogger.com/atom/ns#" term="line" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>GWT Visualization Example - Annotated Time Line Chart Tutorial</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;If you are a server-side Java developer such as myself, I am sure you want an easy way to create AJAX based application but pure JavaScript (ECMAScript) is not your strong skills. The beauty of JavaScript is that it runs on any web server, no need for a servlet container or anything of that sort.&lt;br/&gt;&lt;br/&gt;So, I have been writing AJAX based UI using the GWT framework for the past year and half. I am still not a web developer but I understand enough CSS to spice up my site. Anyway, I am writing this tutorial because I think that the GWT Visualization team, even tough they did a good job, over complicates the creation of charts in their tutorial. I was trying to create an Annotated Time Line chart so I looked up my previous code I wrote for the GWT Portlet JSR-168, &lt;a href='http://armelnene.blogspot.com/2009/08/building-portlet-10-jsr168-with-gwt-17.html'&gt;see here&lt;/a&gt;. I also decided to run a search (don't be evil, Google is your friend) to try to find different examples and hopefully some nice custom charts. First of all, based on the search result; I thought that some of examples, including Google's own, were confusing and over complex. Most examples uses AJAXLoader to load the Visualization API, but you shouldn't have to use this. This is the simplest way to create a GWT Annotated Time Line Chart.&lt;br/&gt;&lt;br/&gt;&lt;a title='gwt annotated time line chart by nene world, on Flickr' href='http://www.flickr.com/photos/21841907@N05/4124677046/'&gt;&lt;img width='500' height='179' alt='gwt annotated time line chart' src='http://farm3.static.flickr.com/2753/4124677046_69aa7a07b3.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;1. Using your favorite development tool with support for GWT framework, create a new Java web application, you can export the compiled JavaScript later to a non-based web application, if you use an IDEW you should code-completion support.&lt;br/&gt;&lt;br/&gt;2. Make you sure you have included the &lt;a href='http://code.google.com/docreader/#p=gwt-google-apis&amp;amp;s=gwt-google-apis&amp;amp;t=Visualization'&gt;GWT Visualization API&lt;/a&gt; module in your classpath.&lt;br/&gt;&lt;br/&gt;3. In your project source code root directory, you should &amp;lt;AppNamexxxx&amp;gt;.gwt.xml file. make sure to add teh following line to it in order to make the  module available to your application.&lt;br/&gt;&lt;br/&gt;&amp;lt;inherits name="com.google.gwt.visualization.Visualization"/&amp;gt;&lt;br/&gt;&lt;br/&gt;4. In order to keep this tutorial short and straight to point, I have included the chart creation code in my &amp;lt;AppNamexxxx&amp;gt;EntryPoint.java class&lt;br/&gt;&lt;br/&gt;&lt;hr/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;public class MainEntryPoint implements EntryPoint&lt;br/&gt;{&lt;br/&gt;    &lt;br/&gt;    &lt;br/&gt;    /**&lt;br/&gt;    * Creates a new instance of MainEntryPoint&lt;br/&gt;    */&lt;br/&gt;    public MainEntryPoint()&lt;br/&gt;    {&lt;br/&gt;        &lt;br/&gt;        &lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    &lt;br/&gt;    &lt;br/&gt;    /**&lt;br/&gt;    * The entry point method, called automatically by loading a module&lt;br/&gt;    * that declares an implementing class as an entry-point&lt;br/&gt;    */&lt;br/&gt;    public void onModuleLoad()&lt;br/&gt;    {&lt;br/&gt;        &lt;br/&gt;        Runnable onLoadCallback = new Runnable()&lt;br/&gt;        {&lt;br/&gt;            &lt;br/&gt;            &lt;br/&gt;            public void run()&lt;br/&gt;            {&lt;br/&gt;                &lt;br/&gt;                DataTable data = createHistoryTable(result);&lt;br/&gt;                AnnotatedTimeLine.Options options = AnnotatedTimeLine.Options.create();&lt;br/&gt;                options.setDisplayAnnotations(true);&lt;br/&gt;                options.setDisplayZoomButtons(true);&lt;br/&gt;                options.setScaleType(AnnotatedTimeLine.ScaleType.ALLFIXED);&lt;br/&gt;                options.setLegendPosition(AnnotatedTimeLine.AnnotatedLegendPosition.SAME_ROW);&lt;br/&gt;                AnnotatedTimeLine atl = new AnnotatedTimeLine(data, options, "600px", "200px");&lt;br/&gt;                RootPanel.get().add(atl);&lt;br/&gt;                &lt;br/&gt;            }&lt;br/&gt;            &lt;br/&gt;            &lt;br/&gt;            &lt;br/&gt;        }       &lt;br/&gt;        ;&lt;br/&gt;        VisualizationUtils.loadVisualizationApi(onLoadCallback, AnnotatedTimeLine.PACKAGE);&lt;br/&gt;        &lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    &lt;br/&gt;    &lt;br/&gt;    // This method will create the Data used by the chart&lt;br/&gt;    private DataTable createHistoryTable()&lt;br/&gt;    {&lt;br/&gt;        &lt;br/&gt;        DataTable data = DataTable.create();&lt;br/&gt;        data.addColumn(AbstractDataTable.ColumnType.DATE, "Date");&lt;br/&gt;        data.addColumn(AbstractDataTable.ColumnType.NUMBER, "Price");&lt;br/&gt;        data.addColumn(AbstractDataTable.ColumnType.NUMBER, "Low");&lt;br/&gt;        data.addColumn(AbstractDataTable.ColumnType.NUMBER, "High");&lt;br/&gt;        data.addRows(5);&lt;br/&gt;                   &lt;br/&gt;            DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd");&lt;br/&gt;            data.setValue(0, 0, dtf.parse("2009-11-21"));&lt;br/&gt;            data.setValue(0, 1, 100);&lt;br/&gt;            data.setValue(0, 2, 120);&lt;br/&gt;            data.setValue(0, 3, 90);&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;            data.setValue(1, 0, dtf.parse("2009-11-22"));&lt;br/&gt;            data.setValue(1, 1, 90);&lt;br/&gt;            data.setValue(1, 2, 110);&lt;br/&gt;            data.setValue(1, 3, 100);&lt;/span&gt;&lt;/code&gt;&lt;br/&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;            data.setValue(2, 0, dtf.parse("2009-11-23"));&lt;br/&gt;            data.setValue(2, 1, 100);&lt;br/&gt;            data.setValue(2, 2, 180);&lt;br/&gt;            data.setValue(2, 3, 80);&lt;/span&gt;&lt;/code&gt;&lt;br/&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;            data.setValue(3, 0, dtf.parse("2009-11-20"));&lt;br/&gt;            data.setValue(3, 1, 130);&lt;br/&gt;            data.setValue(3, 2, 100);&lt;br/&gt;            data.setValue(3, 3, 130);&lt;/span&gt;&lt;/code&gt;&lt;br/&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;           &lt;br/&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;&lt;br/&gt;            data.setValue(4, 0, dtf.parse("2009-11-19"));&lt;br/&gt;            data.setValue(4, 1, 130);&lt;br/&gt;            data.setValue(4, 2, 170);&lt;br/&gt;            data.setValue(4, 3, 150);&lt;/span&gt;&lt;/code&gt;&lt;br/&gt;&lt;code&gt;&lt;span style='color: rgb(0, 0, 0);'&gt;            &lt;br/&gt;        }&lt;br/&gt;        return data;   &lt;br/&gt;    }   &lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;/code&gt;&lt;hr class='jump'/&gt;&lt;br/&gt;Don't forget to import all the necessary classes and voila!&lt;br/&gt;&lt;br/&gt;I hope this will save you some time in creating your charts.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; &lt;br/&gt;                &lt;img width='9' height='9' alt='' src='kleider/blue-sand/images/main_leftdown.gif'/&gt;&lt;br/&gt;                &lt;br/&gt;                &lt;img width='9' height='9' alt='' src='kleider/blue-sand/images/main_rightdown.gif'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=dac6eeb3-a389-8071-ae90-15f66dc00b1d' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-153190513670248022?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2qwN7SYV6mrv5_wp2dsenITMJWg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2qwN7SYV6mrv5_wp2dsenITMJWg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2qwN7SYV6mrv5_wp2dsenITMJWg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2qwN7SYV6mrv5_wp2dsenITMJWg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/ZAXS0-09DCs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/153190513670248022/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/11/gwt-visualization-example-annotated.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/153190513670248022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/153190513670248022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/ZAXS0-09DCs/gwt-visualization-example-annotated.html" title="GWT Visualization Example - Annotated Time Line Chart Tutorial" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2753/4124677046_69aa7a07b3_t.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/11/gwt-visualization-example-annotated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMARn4-eCp7ImA9WxNbEEg.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-7527436741047599252</id><published>2009-11-12T12:40:00.000-08:00</published><updated>2009-11-12T12:40:47.050-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-12T12:40:47.050-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="jpa" /><category scheme="http://www.blogger.com/atom/ns#" term="rest web services" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="jmeter" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipseLink" /><category scheme="http://www.blogger.com/atom/ns#" term="web services" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="web applications" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>Develop High Transaction Web Applications with Java MySQL &amp; NetBeans</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;This entry is a brief tutorial on how to develop high transactional web application. I will be looking at how to develop a high transactional application while maintaining data integrityFor the purpose of keeping this entry simple, I will be using some RAD tools, the NetBeans IDE, to generate most of the code. &lt;br /&gt;
&lt;br /&gt;
In order to follow the tutorial, you will need the following:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://netbeans.org/"&gt;NetBeans IDE 6.7+&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://java.sun.com/"&gt;Java JDK 1.6+&lt;/a&gt; (my version is 1.6.0_17)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.mysql.com/downloads/"&gt;MySQL 5.1+&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.mysql.com/doc/sakila/en/sakila.html"&gt;MySQL Sakila database&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tomcat.apache.org/"&gt;Apache Tomcat 6.x&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;An understanding of &lt;a href="http://www.javapassion.com/j2ee/jpatransaction.pdf"&gt;JPA&lt;/a&gt; transactions and &lt;a href="https://metro.dev.java.net/"&gt;ReSTful&lt;/a&gt; web services&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;This is my definition of High Transaction Applications:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;A high transaction application is one that can serve multiple simultaneous requests from clients and keep them secure from each other. The application has only two purposes: read or write data to/from a repository either JMS or DB. The transactions have to meet the &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt; criteria in order to be deployed in the real world.&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
Ok, the above is my definition and you are free to redefine it. I am going to build a web application that will be an n-tier application:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Database back-end (MySQL)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Entity classes&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;ReSTful Web Services to allow other developers to integrate the application with theirs&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;A web based front-end&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;For the simplicity of the article, I will not implement any security such as user or application level security (authentication and database table privileges). This tutorial is mostly geared toward the newbies but I am sure that more advanced developers would benefit too.&lt;br /&gt;
&lt;br /&gt;
Let's get coding.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Make sure that you have loaded the MySQL Sakila database into your MySQL database. You can download the Sakila database from the NetBeans plugin centre (&lt;a href="http://davidvancouvering.blogspot.com/2008/08/sakila-sample-database-plugin-now.html"&gt;see here&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Create a new web application and name whatever you like. I have named mine "WebApplication". I will now refer the application as WebApplication. Make sure to choose Tomcat as your deployment server&lt;/li&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm3.static.flickr.com/2731/4099041220_b0ccec7f10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://farm3.static.flickr.com/2731/4099041220_b0ccec7f10.jpg" width="320" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;li&gt;Add the MySQL driver "mysql-connector-java-5.0.7-bin" to the WebApplication libraries. NetBeans will work and connect to the DB even without the driver but once you deploy your application to a server, the application will not be able to connect to the DB and throw a ClassNotFoundException com.mysql.jdbc.driver.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;We are going to develop the back-end first. NetBeans makes it very easy for us to create Entity classes from database. I would recommend newbies to learn how to manually create Entity classes and configure the persistence.xml file. This tutorial makes use of JPA but one should ignore the drawbacks of JPA/ ORM frameworks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;Right click on the project name and choose Entity Classes from Database... On the next screen choose the "filmActor" table and click on the Add button. Make sure that "Include Related Tables" box is checked underneath the Selected Tables panel. The screenshot does not show the "filmActor" table as I have previously generated the Entity class but I am sure you get the idea. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm3.static.flickr.com/2553/4099041336_6f83fd88d5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://farm3.static.flickr.com/2553/4099041336_6f83fd88d5.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;If you are required to create a Persistence Unit, click on the persistence button -&amp;gt; you can accept the default name -&amp;gt; choose your Persistence Library -&amp;gt; choose your database connection -&amp;gt; choose "None" for Table Generation Strategy -&amp;gt; click Finish&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://farm3.static.flickr.com/2719/4099041434_5dfa14e24d.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;After choosing the table to generate the Entity from click next -&amp;gt; fill Package name -&amp;gt; tick Generate Name Query... -&amp;gt; click Finish&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;img src="http://farm3.static.flickr.com/2757/4099041520_bfd2a7ce85.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
NetBeans generates all the Entity classes based on the database table that you have chosen. The next thing that we want to do is generate a set of ReSTful web services from the generated Entity classes. Again, NetBeans facilitates the work for us (it is important that you also know how to create the classes manually or you will not know how to debug them if there is any problem in the future).&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;Right click on the project name "WebApplication" -&amp;gt; RESTful Web Services from Entity Classes... -&amp;gt; Choose the Entity Classes that you would like to generate the WS for and click add or add all -&amp;gt; click next -&amp;gt; on the following screen, accept the default values and click Finish&lt;br /&gt;
&lt;img height="198" src="http://farm3.static.flickr.com/2716/4099041610_dec56967a8.jpg" style="max-width: 800px;" width="277" /&gt;&lt;img height="198" src="http://farm3.static.flickr.com/2594/4099041710_3b56a3d37b.jpg" style="max-width: 800px;" width="276" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;You can go ahead and test your ReSTFul Web Services by right clicking on the name of the application and click on Test RESTful Web Services &lt;br /&gt;
&lt;img height="257" src="http://farm3.static.flickr.com/2557/4098286767_b540c13506.jpg" style="max-width: 800px;" width="339" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;The previous step will launch your web browser within which you can test your web services (click on the node on the left and see the queries on the right)&lt;br /&gt;
&lt;br /&gt;
&lt;img height="287" src="http://farm3.static.flickr.com/2643/4098286919_75b36958d9.jpg" style="max-width: 800px;" width="385" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Back in the NetBeans IDE; right click on the project name "WebApplication" -&amp;gt; click on JSF Pages from Entity Classes... (The JSF pages will not use the web services as there are packaged together with the Entity Classes. This will improve performances and still allow external applications to integrate). Choose the Entity Classes that you would like to generate the pages for -&amp;gt; click next. On the final screen, fill in the package name for the JPA Controller and JSF Classes -&amp;gt; click finish&lt;br /&gt;
&lt;br /&gt;
&lt;img height="240" src="http://farm3.static.flickr.com/2741/4098287001_f485a858bf.jpg" style="max-width: 800px;" width="350" /&gt;&lt;img height="234" src="http://farm3.static.flickr.com/2612/4099042192_0f84d14662.jpg" style="max-width: 800px;" width="340" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NetBeans will generate the necessary files to create a CRUD application with a user interface. I suggest that you familiarize yourself with the generated code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Expand the Configuration folder under your project name "WebApplication" and the web.xml file. At around line 38, change the content of the welcome-file-list to look as follow&lt;br /&gt;
&lt;br /&gt;
&lt;div class="MsoListParagraphCxSpFirst"&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoListParagraphCxSpMiddle"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;faces/welcomeJSF.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoListParagraphCxSpLast"&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;
&lt;/div&gt;&lt;welcome-file-list&gt;&lt;welcome-file&gt;&lt;/welcome-file&gt;This will make the generate JSF page to be the landing page for the application when requested. Make sure that you do have a "welcomeJSF.jsp" file before making the change.&lt;br /&gt;
&lt;br /&gt;
&lt;/welcome-file-list&gt; &lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Right click on the application name -&amp;gt; Run. The application should load in your web browser. Now go on, play around with the application. And why not create a client to send request to the web services? (not today)&lt;br /&gt;
&lt;img height="225" src="http://farm3.static.flickr.com/2628/4099042284_6bd3f70d0c.jpg" style="max-width: 800px;" width="328" /&gt;&lt;img height="223" src="http://farm3.static.flickr.com/2793/4098287281_454b0c31c4.jpg" style="max-width: 800px;" width="328" /&gt;&lt;br /&gt;
&lt;/li&gt;&lt;br /&gt;
&lt;/ol&gt;
You can load test your application by using &lt;a href="http://jakarta.apache.org/jmeter/"&gt;Apache JMeter&lt;/a&gt;. It is easy to run and configure. If you want to take a look at how JPA implements the ACID features, browse to your controller classes. &lt;a href="http://www.javapassion.com/j2ee/jpatransaction.pdf"&gt;Here&lt;/a&gt; is a short introduction to JPA transaction. 

Hope you enjoyed and if you need any clarification, just leave me a comment and try to get back to you ASAP (if time permits).

&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=fa137127-9e46-8867-8382-5f2988781628" /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-7527436741047599252?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/L_zqFE41w_9jm51zXctTMt_U0wk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L_zqFE41w_9jm51zXctTMt_U0wk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/L_zqFE41w_9jm51zXctTMt_U0wk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L_zqFE41w_9jm51zXctTMt_U0wk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/v415Ri4Z82Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/7527436741047599252/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/11/develop-high-transaction-web.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/7527436741047599252?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/7527436741047599252?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/v415Ri4Z82Q/develop-high-transaction-web.html" title="Develop High Transaction Web Applications with Java MySQL &amp;amp; NetBeans" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2731/4099041220_b0ccec7f10_t.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/11/develop-high-transaction-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04GQ3o_fyp7ImA9WxNUF0Q.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-32257287500758446</id><published>2009-11-09T11:05:00.000-08:00</published><updated>2009-11-09T11:45:22.447-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-09T11:45:22.447-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="file indexer" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="solr" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise search" /><category scheme="http://www.blogger.com/atom/ns#" term="liferay" /><category scheme="http://www.blogger.com/atom/ns#" term="lucene" /><category scheme="http://www.blogger.com/atom/ns#" term="j2se" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="web crawler" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="nutch" /><category scheme="http://www.blogger.com/atom/ns#" term="web applications" /><title>Develop Your Own Google with Apache Lucene (Java Nutch Solr)</title><content type="html">&lt;a href="http://lucene.apache.org/"&gt;Apache Lucene&lt;/a&gt; is Open Source API that allows a Java developer (.Net libraries available) to write indexing and full-text search capable applications. I have been writing applications based on Lucene for the last 3 years and some of the applications have been deployed at large corporations. I know there are other libraries available to developers who wish to write indexing engine but this blog will solely focus on Apache Lucene. I will not compare it to other API.&lt;br /&gt;
&lt;br /&gt;
Lucene is a very mature API and can be found in NetBeans IDE, Liferay, JackRabbit among others. IBM has written a very good document about the &lt;a href="http://www.ibm.com/developerworks/library/wa-lucene/"&gt;Lucene architecture&lt;/a&gt;, therefore I will not delve into it here.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.ibm.com/developerworks/library/wa-lucene/indexing_architecture.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.ibm.com/developerworks/library/wa-lucene/indexing_architecture.gif" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Lucene, alone, is pretty much useless as any other API. Let's now introduce &lt;a href="http://lucene.apache.org/nutch/"&gt;Nutch&lt;/a&gt;. Nutch is a web crawler built-on top of Lucene to provide file crawling capabilities. Nutch was designed to handle large amount of data from the internet (http). Due to its plugin architecture, it was later extended to provide local network crawling such as FTP, databases and Microsoft Windows Shares (I am the author of the &lt;a href="https://issues.apache.org/jira/browse/NUTCH-427"&gt;protocol-smb plugin&lt;/a&gt; and co-author of the &lt;a href="http://issues.apache.org/jira/browse/NUTCH-422"&gt;index-extra plugin&lt;/a&gt; found on the Nutch site). We had extended Nutch and turned it into an Enterprise Search application but most of the source codes were locked behind closed doors (company politics).Anyway, Nutch has evolved to become but still very complex in its inner working. The initial Nutch was developed to process data in a batch but there are ways to turn it real-time but that's for another day. Ok, so Nutch is good for crawling and indexing of data but it does not handle search directly. There is a web application available with Nutch but it is quite poor so let's now introduce the Solr.&lt;br /&gt;
&lt;br /&gt;
Solr is a powerful web-based search server built-on top of Lucene. The application was developed by CNET Networks and donated to the Apache Foundation. I believe, not too sure so I might need some references here, Solr was powering the search feature on their site but it is definitely used internally by the company. Late 2009, &lt;a href="http://www.lucidimagination.com/index.php?option=com_mojo&amp;amp;Itemid=90&amp;amp;p=20"&gt;Lucid Imaginations&lt;/a&gt; receives $7.5 million in funding to provide commercial services built around Solr (and Lucene possibly?). Here is a very good &lt;a href="http://people.apache.org/%7Esgoeschl/presentations/solr/index.html"&gt;presentation about Solr&lt;/a&gt;. Solr is a very good indexing engine. The keyword here is "indexing engine". It does not have any support for crawling data therefore requiring the developer to create applications that will feed it the data to index. I do believe that it is a good feature of the application as it gives the ability to integrate with various systems as long as they can post data over HTTP. &lt;br /&gt;
&lt;br /&gt;
Nutch is a good crawler but it does not provide an enterprise-grade search interface to its data. Solr, in the other hand, is powerful indexer and has an enterprise grade search interface but it does not know how to gather data in its own. I am sure by now it has become obvious how we can integrate them both together. &lt;br /&gt;
&lt;br /&gt;
We want Nutch to gather the data, by-pass its indexing cycle and feed the data directly to Solr. Lucid Imagination has a good tutorial about it &lt;a href="http://www.lucidimagination.com/blog/2009/03/09/nutch-solr/"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.lucidimagination.com/blog/wp-content/uploads/2009/03/solr-nutch-setup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://www.lucidimagination.com/blog/wp-content/uploads/2009/03/solr-nutch-setup.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
After reading the tutorial from Lucid Imagination, you will notice that Nutch is run by executing some bash files. This is something I strongly disagree with. If Nutch is based on Java (an OS independent language), why do we need to execute some UNIX/LINUX shell script. Also, the fact we need to install CygWin on MS Windows platform to be able to run is a big negative for me. I wrote a simple Java application that will launch Nutch and send the indexing to Solr but as you can see in the source code, you still need a UNIX like environment to run successfully. You can write a platform independent version by looking up Nutch API and calling the methods directly.&lt;br /&gt;
&lt;br /&gt;
Well, I hope that this entry help you understand how to use Nutch and Solr built-on top of Apache Lucene. If you need any clarification, leave comments and I will try to gave ASAP if time permits.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;package com.etapix.nutchsolr;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Armel Nene
 */
public class Indexer {

    public static void main(String args[]) {
        if (args.length &amp;lt; 3) {
            System.out.println("Usage:" +
                    "\ncrawlName        -   This will be used to store crawler files in CrawlName directory" +
                    "\nurlFolder        -   The path to the folder containing the URL to crawl" +
                    "\nsolrUrl          -   The URL to the Solr server");
            return;
        }
        String crawlerName = args[0];
        String urlFolder = args[1];
        String solrUrl = args[2];
        String inject = "bash bin/nutch2.sh inject " + crawlerName + "/crawldb " + urlFolder;
        String generate = "bash bin/nutch2.sh generate " + crawlerName + "/crawldb " + crawlerName + "/segments -topN 10 -numFetchers 5";
        String export = crawlerName + "/segments/";

        String invertLinks = "bash bin/nutch2.sh invertlinks " + crawlerName + "/linkdb -dir " + crawlerName + "/segments";
        String indexSolr = "bash bin/nutch2.sh solrindex " + solrUrl + " " + crawlerName + "/crawldb " + crawlerName + "/linkdb " + crawlerName + "/segments/*";
        try {
            System.out.println("Injecting URLs in crawldb");
//            int state = 0;
            InputStream in = Runtime.getRuntime().exec(inject).getInputStream();
            System.out.println(convertStreamToString(in));


//            state = Runtime.getRuntime().exec(inject).waitFor();
//            System.out.println("process completed: " + state);

            for (int i = 0; i &amp;lt; 3; i++) {
                System.out.println("Generating segments");
                in = Runtime.getRuntime().exec(generate).getInputStream();
                System.out.println(convertStreamToString(in));

                System.out.println("Setting environment variable $SEGMENT");
//            String segs = convertStreamToString(Runtime.getRuntime().exec("ls -tr " + crawlerName + "/segments|tail -1").getInputStream());

                String segments = export + lastFileModified(export).getName();
                System.out.println("$segments: " + segments);
//            in = Runtime.getRuntime().exec(export + segs).getInputStream();
            System.out.println(convertStreamToString(in));

                String fetch = "bash bin/nutch2.sh fetch " + segments + " -noParsing";
                String parse = "bash bin/nutch2.sh parse " + segments;
                String update = "bash bin/nutch2.sh updatedb " + crawlerName + "/crawldb " + segments + " -filter -normalize";

                System.out.println("fetch segments");
                in = Runtime.getRuntime().exec(fetch).getInputStream();
                System.out.println(convertStreamToString(in));

                System.out.println("Parse segments");
                in = Runtime.getRuntime().exec(parse).getInputStream();
                System.out.println(convertStreamToString(in));

                System.out.println("Update crawldb");
                in = Runtime.getRuntime().exec(update).getInputStream();
                System.out.println(convertStreamToString(in));
            }
            System.out.println("Inverting links");
            in = Runtime.getRuntime().exec(invertLinks).getInputStream();
            System.out.println(convertStreamToString(in));

            System.out.println("Indexing contents to Solr " + solrUrl);
            in = Runtime.getRuntime().exec(indexSolr).getInputStream();
            System.out.println(convertStreamToString(in));

        } catch (Exception ex) {
            Logger.getLogger(Indexer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static String convertStreamToString(InputStream is) {
        /*
         * To convert the InputStream to String we use the BufferedReader.readLine()
         * method. We iterate until the BufferedReader return null which means
         * there's no more data to read. Each line will appended to a StringBuilder
         * and returned as String.
         */
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        System.out.println("Now converting inputstream to text");
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("Finish converting to text");
        return sb.toString();
    }

    public static File lastFileModified(String dir) {
        File fl = new File(dir);
        File[] files = fl.listFiles(new FileFilter() {

            public boolean accept(File file) {
                return file.isDirectory();
            }
        });
        long lastMod = Long.MIN_VALUE;
        File choice = null;
        for (File file : files) {
            if (file.lastModified() &amp;gt; lastMod) {
                choice = file;
                lastMod = file.lastModified();
            }
        }
        return choice;
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-32257287500758446?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/S3sbLk1JdpugDceyWkvQhjQ2eXk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S3sbLk1JdpugDceyWkvQhjQ2eXk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/S3sbLk1JdpugDceyWkvQhjQ2eXk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S3sbLk1JdpugDceyWkvQhjQ2eXk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/kuih6TFe1ig" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/32257287500758446/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/11/develop-your-own-google-with-apache.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/32257287500758446?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/32257287500758446?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/kuih6TFe1ig/develop-your-own-google-with-apache.html" title="Develop Your Own Google with Apache Lucene (Java Nutch Solr)" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>2</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/11/develop-your-own-google-with-apache.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUMQ3g7fyp7ImA9WxNUFU0.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-7459083436474996022</id><published>2009-11-06T03:17:00.000-08:00</published><updated>2009-11-06T03:18:02.607-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T03:18:02.607-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="java me" /><category scheme="http://www.blogger.com/atom/ns#" term="job interview" /><category scheme="http://www.blogger.com/atom/ns#" term="interview" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="portlet" /><category scheme="http://www.blogger.com/atom/ns#" term="portal" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="java interview" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr168" /><title>Java Interview: tips for the interviewer</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;This is a brief entry about how an interviewer should conduct a Java based interview. I have been on both side of the table and this is only based on my own observations.  I think most interviews that I attended in the past, and possibly some I have conducted myself, focus on the basic concept. I accept that developers should be aware of the language principles, but how can an interviewer test more advanced principles?&lt;br/&gt;&lt;br/&gt;The interview time have to be split into:  &lt;br/&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Theoretical concepts&lt;p&gt; This 1st phase is about asking the common questions about OOP concepts, differences between interfaces and abstract classes, differences between List and Set, multithreading and so on. If it is required to store answers, do provide a written paper and avoid multiple choice questions. In my experience, open-ended questions allow the developer to express his knowledge better. Multiple choice questions provide unnecessary hints to question answers. Even if I did forget a terminology or a definition by looking at the various answers provided, I can pick the right answer 9/10 times. Theories are central to practices but make sure can be related to the role you are recruiting for.An important point when interviewing a developer, if you have a developer present during the interview, avoid asking domain specific question unless it is something common. I had some interview with senior and lead developers asking questions about a programming problem they have recently encountered and were able to fix after spending months working on it, how am I supposed to know about that unless I have encountered the same issues in the past.&lt;/p&gt;&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;&lt;li&gt;Practical test&lt;p&gt;&lt;br/&gt;In order to test a developer capability for the role, it is a must that he/she undertakes a practical test. You do not need to give the developer code with bugs for him/ her to fix, I believe this approach is not very useful. I would suggest that all interviewers prepare the developer to take a practical test using their favourite tools (provide two of the most common open source IDE) and provide them with a simple problem domain. In my experience, I had to write some simple factorial algorithm (a single recursive method) to a domain centric web service application (no DB, store data in memory instead) and to more advance concepts. If application multithreading is part of the main day to day job, then ask the developer to write a simple application that shows that.&lt;br/&gt;This practice exposes several features of the developer; from its reasoning by writing simple algorithm to coding practice (commenting and Java best practices) and problem solving.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br/&gt;&lt;br/&gt;After all, I believe that programming is more about logical reasoning and coding. The more senior we get in our profession, the harder it is to answer simple questions with straightforward answers; we get carried away and provide a complex answer to something so simple. We cannot talk baby talk anymore; our tongue is full of jargon. All developers should follow the KISS principle when answering theoretical questions but ultimately they should excel in the practical test. If they are good enough, they should use a text editor to write their codes and compile it through the shell (JVM command line).&lt;br/&gt;Another thing that all interviewers should know; developers have very good memories and therefore can memorise more than 115 interview questions; I would recommend you to focus more on a practical test. &lt;br/&gt;&lt;br/&gt;This was a brief entry for interviewers. The web is full of tips and questions for the interviewees and I do not see any point in duplicating them here.  As usual, this is based on my experience and belief, you are always welcome to comment. Also, support my blog by visiting my advertisers (by clicking on the link on the right) they might have something that you might need.&lt;br/&gt;&lt;br/&gt;&lt;div class='youtube-video'&gt;&lt;object width='425' height='355'&gt;&lt;param value='http://www.youtube.com/v/Th83gShthDQ&amp;amp;feature=youtube_gdata' name='movie'&gt; &lt;/param&gt;&lt;param value='transparent' name='wmode'&gt; &lt;/param&gt;&lt;embed width='425' height='355' wmode='transparent' type='application/x-shockwave-flash' src='http://www.youtube.com/v/Th83gShthDQ&amp;amp;feature=youtube_gdata'&gt; &lt;/embed&gt;   &lt;/object&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=0e42ed06-3d5f-838f-8a17-bd5b6c94f126' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-7459083436474996022?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NvhPocjOkMALoM3X8Ias9KCUNIE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NvhPocjOkMALoM3X8Ias9KCUNIE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NvhPocjOkMALoM3X8Ias9KCUNIE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NvhPocjOkMALoM3X8Ias9KCUNIE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/hXExtwK41tw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/7459083436474996022/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/11/java-interview-tips-for-interviewer.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/7459083436474996022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/7459083436474996022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/hXExtwK41tw/java-interview-tips-for-interviewer.html" title="Java Interview: tips for the interviewer" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>6</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/11/java-interview-tips-for-interviewer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIBR3YyeCp7ImA9WxNUFU0.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-8790540597813842116</id><published>2009-11-04T11:22:00.000-08:00</published><updated>2009-11-06T01:42:36.890-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T01:42:36.890-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="sun" /><category scheme="http://www.blogger.com/atom/ns#" term="java me" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="web applications" /><title>10 things all JAVA developers should know</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Since JAVA (I know it's not an acronym, but it stands out like that) was officially introduced in 1995, it has changed the way most of us look at the Operating System. Bill Gate (how ironic) once said that it was not about the hardware but the software which will be the future. A decade or more later, the fifth employee of SUN, John Gage said "The Network is the Computer". Fast-forwarding to the 21st century and John seemed to be right. Anyway, JAVA was built not to depend on an Operating System and deployed through the network. JAVA through its applet technology gave birth to Rich Network Application aka Rich Internet Application (RIA). JAVA is not perfect; or we would not have various releases and more on the way, but JAVA has given birth to a wide range of programming language (just Google it to find out more). &lt;br /&gt;
&lt;br /&gt;
Without further ado, I am going to get back to subject. This is a brief article on what I believe that every Java developers should know regardless of their experience. I do not personally believe that someone with 5 years experience is not as good as someone with 10 years experience. We all develop our own methods of working but as a developer you need to stay abreast of your technology. So, here are my top 10 not in order of importance (or?):&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Remember the basic of JAVA language and OOP paradigm.&lt;/b&gt;&lt;br /&gt;
Most experience developers seem to forget the theory behind the language. I am not saying that they are not good at their job but can they explain to junior developers why they have used interfaces instead of abstract classes or why implement a pattern over another one? As a programmer, you become very arrogant as you believe that you write the best code but in the real world, people work in teams with different skill set and experiences. It is important that you can backup your actions/ codes. A very simple question such as; when should I use a String object instead of a StringBuilder/ StringBuffer? You might take this question lightly but can you actually tell someone else the difference?&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know your technology stack&lt;/b&gt;&lt;br /&gt;
All developers have to know their technology stack. What does it mean? JAVA is not like other languages; JAVA has subsets such J2ME and superset such as Java EE. We have our own area of expertise but it is important to know the differences between the various sets of JAVA. Some basic questions such as the differences between SWING, Applet, Servlets, EJBs and JAVAFX will boost your confidence. Most developers do not know how to tweak the JVM and the differences between the JRE and the SDK environment. Do you know why you need the SDK to be installed to run Tomcat but you only need the JRE to run an application?&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Experiment with various Java EE framework&lt;/b&gt;&lt;br /&gt;
I am not asking you to be an expert in every single Java EE framework but it will make the difference if you are familiar with Spring and EJB. That should actually be the de facto framework that should be on every developers CV. Developers should know the difference between Java EE 5 (soon 6) and Spring. Hibernate is also brilliant and it's used for data access but all developers should have moved to JPA by now. Hibernate also comply with JPA therefore there is no more excuses.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know a scripting language&lt;/b&gt;&lt;br /&gt;
JAVA can be heavyweight for some simple tasks which can be implemented using a simple dynamic language such as Python, Perl(?) and others. I would also recommend to developers to learn shell scripting on their target OS.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know how to develop web services&lt;/b&gt;&lt;br /&gt;
The network is the computer, therefore it is important to know the different web services framework available. Data are integrated through web services and opening your services to the "cloud". SWING developers will probably not develop web services but I am sure that they will be connecting to data through web services clients. Understanding the difference between the standardised SOAP and non-standardised ReST will help you choose which is best to implement your services.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know how and when to multithread your application&lt;/b&gt;&lt;br /&gt;
I have to put that in there. Developers should know when and why to multithread an application, thread inter-communication and monitoring. All developers, junior or not, should know how to write a multi-threaded application.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Database development using JDBC and JPA&lt;/b&gt;&lt;br /&gt;
This should be a development law. All developers should know how to write SQL queries and how to create databases. All enterprise applications store data in some sort of relational database systems and it is therefore imperative that this knowledge should be of second nature. Java EE 5 introduced JPA (JDO was there before) but it is not applicable to all situation. Hence, knowing the difference and when to implement one instead of the other is important.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know a client side scripting language and what is AJAX&lt;/b&gt;&lt;br /&gt;
The network is the computer and Internet is the deployment platform. Java EE and its various framework are server side executiong which can put extra "load" on the server. If you are looking to move a cloud based system where the providers charges you per resources used, it might be wise to move some of the execution to the client side. AJAX has been buzzing the scene for the last 3 years and more. This is not a technology but a new way of doing something that already existed. There are numerous JAVA AJAX framework such as GWT and DWR which makes it easy to develop AJAX based application which are compiled to JavaScript. Developers should also know what is the AJAX theories.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know your competitors and do not take part on "what is the best IDE" discussion&lt;/b&gt;&lt;br /&gt;
JAVA is not the only language that can do what it does. I think that JAVA is more mature and complete as opposed to other languages. Knowing the difference between JAVA and .NET or JAVA and Ruby is a good asset to have. You also need to know when and why to use one instead of the other. Please please please, do not get into "my IDE is better than x because..." discussion as it is good for the JAVA community to have multiple IDEs and framework available to use. Every tools have their place as for example JDeveloper is better than x if you are going to solely develop on an Oracle stack and etc...&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Know ANT (MAVEN?), TOMCAT and any other mainstrean application server&lt;/b&gt;&lt;br /&gt;
ANT is the de facto build script for JAVA and its IDE-based development. Maven is becoming popular and soon can be as popular as ANT (not sure of its popularity in the financial sector). TOMCAT&amp;nbsp; should be immortalised as the based servlet container that all developers should be familiar with.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;There are alot more to add but this is just some of the basics that I think all developers should have in their repertoire. Feel free to add to this list in the comments box. If I could had another one to this, would be; all developers not just JAVA, should know how to search the web and Google is your best friends (&lt;b&gt;now support my advertisers by clicking on the links on the right ;)&lt;/b&gt; ). I hope you enjoyed the entry and feel free to comments good or bad!!! are welcome.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=b9c1ff80-d8bf-8d06-b98a-0f39584cac93" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-8790540597813842116?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/r4aEN1ubEl2FyQ1noAGNTTOihK0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r4aEN1ubEl2FyQ1noAGNTTOihK0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/r4aEN1ubEl2FyQ1noAGNTTOihK0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r4aEN1ubEl2FyQ1noAGNTTOihK0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/unCr-yh1JOU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/8790540597813842116/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/11/10-things-all-java-developers-should.html#comment-form" title="20 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8790540597813842116?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8790540597813842116?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/unCr-yh1JOU/10-things-all-java-developers-should.html" title="10 things all JAVA developers should know" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>20</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/11/10-things-all-java-developers-should.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MDRHw-fSp7ImA9WxNUFU0.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-5002987934585856733</id><published>2009-11-01T07:58:00.001-08:00</published><updated>2009-11-06T04:11:15.255-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T04:11:15.255-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="web applications" /><category scheme="http://www.blogger.com/atom/ns#" term="google app engine" /><title>ReST Web Services on Google App Engine using NetBeans 6.7</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;When Google announced early this year &lt;a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html"&gt;the availability of the Java language&lt;/a&gt; on their cloud system “App Engine”, this was turning point for Java on the web. The reason I am saying that is due to a simple questions; how many hosting providers support Java? And providing free hosting for that purpose... This was a good move in the direction of the JAVA community and the vast list of all the languages that run on the JVM.&amp;nbsp; But App Engine does not support the full range of the J2EE API. If you are looking to build any EJB, SOAP services or anything that access the file system, then the App Engine is not for you as it does not support it. To make matter worst, some URL connections are not supported by the Google cloud services. I am looking forward to the day when JBoss Seam will be supported entirely by their services without having to hack the code. Alright, it is not that bad; Google App engine supports a number of Java EE frameworks such as Spring. &lt;br /&gt;
&lt;br /&gt;
Alright people, this was a long introduction but I believe it is worth it. You cannot create web services such as SOAP in the Google App Engine therefore, in this short article, I will show you how to develop a ReST based web services that works with the App Engine using NetBeans and Jersey API. Actually, NetBeans comes with Jersey support out the box. Now, let’s get started.&lt;br /&gt;
In order to follow the instructions, you will need the following:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.netbeans.org/"&gt;NetBeans 6.7+&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/appengine/"&gt;Google App Engine SDK&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://kenai.com/projects/nbappengine/pages/Home"&gt;Google App Engine Plugin for NetBeans&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I would expect you to know to be familiar with JAVA EE development and Google App Engine development. Once you have all the software and components installed, now we can start.&lt;br /&gt;
&lt;br /&gt;
1.&amp;nbsp;&amp;nbsp;&amp;nbsp; Create a database structure to store your data. I used MySQL Workbench to design my DB structure (Google App Engine does not used MySQL and does not have plan to support it in the future). This schema is to help you understand the relationship between your entities. You can use any UML tools to design your objects’ relationship. There is a reason I chose to design DB in MySQL, the application generates SQL script which I will upload to MySQL DB. I will show you in the next step the main benefits.&lt;br /&gt;
&amp;nbsp; &lt;img src="http://farm3.static.flickr.com/2567/4064537510_e727865913.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
2.&amp;nbsp;&amp;nbsp;&amp;nbsp; Based on your DB schema, create a database. You can use any database you want. I used MySQL to initially store my entities.&lt;br /&gt;
&lt;img src="http://farm3.static.flickr.com/2788/4064537588_6734278dee.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
3.&amp;nbsp;&amp;nbsp;&amp;nbsp; Launch your NetBeans application and create new Web Application.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static.flickr.com/2437/4063900977_9d60c50348.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
3.1&amp;nbsp;&amp;nbsp;&amp;nbsp; Choose Google App Engine as deployment server, click here to see how to register the &lt;a href="http://kenai.com/projects/nbappengine/pages/Home"&gt;App Engine in NetBeans&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://farm3.static.flickr.com/2453/4063789929_3ebd4dfc0f.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
4.&amp;nbsp;&amp;nbsp;&amp;nbsp; Now click on: File -&amp;gt; New File. In the popup window, choose Web Services in the Categories panel and RESTFul Web Services from Database and click next.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static.flickr.com/2450/4064537714_7d2582350c.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
5.&amp;nbsp;&amp;nbsp;&amp;nbsp; Choose your the database that you want to generate your Entity classes from and click next. ( in the screenshot I am using the sample DB which came with the NetBeans and JAVA DB server. This is just for illustration purposes only as I have previously generated my Entity Classes from the DB schema I generated in step 1).&lt;br /&gt;
&lt;img src="http://farm3.static.flickr.com/2453/4063790071_010b7cd81d.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
6.&amp;nbsp;&amp;nbsp;&amp;nbsp; Check your Class Names and how they relate to the database. Make any changes that you require in this screen, and then click next.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static.flickr.com/2436/4063790153_56d68713ee.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
7.&amp;nbsp;&amp;nbsp;&amp;nbsp; In the next screen, just accept the default values and click finish.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;img src="http://farm3.static.flickr.com/2756/4064537918_f0ae6b77f2.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
Well we have done the hard parts. There is another step that missed out due to the fact that I already written the application. When generating Entities from Database, if you do not have a persistence unit available, it will ask to generate one. &lt;a href="http://hendrosteven.wordpress.com/2008/03/06/simple-jpa-application-with-netbeans/"&gt;Here is more information on how to create a persistence unit with NetBeans&lt;/a&gt;. Make sure to make sure to choose “Create” as the table generation strategy.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static.flickr.com/2602/4063790275_21d2c97e37.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By Now, you should be aware that we have create a back-end application store which we can call using normal http post, get, delete and create. NetBeans RestFull methods allows to use XML or JSON to send data to the services. The responses MIME can be anything you like as long as the application server supports it.&lt;br /&gt;
WARNING: JERSEY XML processing is not supported by Google App Engine as it uses JAXB. JAXB accesses API which is forbidden by the App Engine stack. If testing the application on the App engine, use the JSON MIME for your data.&lt;br /&gt;
Ok so we have generate the classes and methods require to expose our back-end to other application. As it is, this will not work on Google App Engine so we need to make a final change, this time we need to change the persistence.xml file manually. In the project window under the name of your project, click on Configuration files -&amp;gt; persistence.xml and open the file in the editor. Once the file is open in the editor, click on the XML tab and make the necessary changes to make it look like the screenshot.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static.flickr.com/2569/4064538104_f7ec400596.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
Here is the content of persistence.xml; modify to reflect your entities and make sure the name of the provider is the same as mine and the properties are exactly the same.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;persistence-unit name="ReSTWebApplicationPU" transaction-type="RESOURCE_LOCAL"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;provider&amp;gt;org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider&amp;lt;/provider&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class&amp;gt;com.test.api.Userlogs&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class&amp;gt;com.test.api.Customer&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class&amp;gt;com.test.api.User&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class&amp;gt;com.test.api.Business&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class&amp;gt;com.test.api.Reviews&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;exclude-unlisted-classes&amp;gt;false&amp;lt;/exclude-unlisted-classes&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;properties&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="datanucleus.NontransactionalRead" value="true"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="datanucleus.NontransactionalWrite" value="true"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="datanucleus.ConnectionURL" value="appengine"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/persistence&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we are ready to run the application and test it in our local environment. Right click your project name in the projects window and click Test RestFul web services, your favourite web browser with page that shows your resources. You can test your services by clicking on the nodes and or drilling through the nodes.&lt;br /&gt;
&amp;nbsp;&lt;img src="http://farm3.static.flickr.com/2432/4064538174_3a5e15bfa6.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;
&lt;br /&gt;
You can also use the Firefox RESTClient Plugin to test your app. Also, Google App Engine does not fully support JPA and might throw some exception about not supporting “integer type object for primary key”. If you do experience this issue, change the type of your key.&lt;br /&gt;
This is it for now, looking forward to your feedback, good or bad, they are all welcome. Also, if you need JAVA EE help, contact me directly. Also join me on facebook. Hope the guide or tutorial or whatever you call it, was good enough to help you with something.&lt;br /&gt;
&lt;br /&gt;
Please support my blog and its advertisers by clicking on the interesting products/ services on the right (Google ads).&amp;nbsp; Cheers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=a137649b-bd51-898a-9750-dca82f99b723" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-5002987934585856733?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tjAE6ByBrWm0MH1UnKlX1DuBdRE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tjAE6ByBrWm0MH1UnKlX1DuBdRE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tjAE6ByBrWm0MH1UnKlX1DuBdRE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tjAE6ByBrWm0MH1UnKlX1DuBdRE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/PUQTeZa65Uw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/5002987934585856733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/11/rest-web-services-on-google-app-engine_01.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/5002987934585856733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/5002987934585856733?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/PUQTeZa65Uw/rest-web-services-on-google-app-engine_01.html" title="ReST Web Services on Google App Engine using NetBeans 6.7" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2567/4064537510_e727865913_t.jpg" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/11/rest-web-services-on-google-app-engine_01.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MCRXg6fyp7ImA9WxNVGEw.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-3137253249655009383</id><published>2009-10-29T05:30:00.000-07:00</published><updated>2009-10-29T05:31:04.617-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T05:31:04.617-07:00</app:edited><title>Google Wave Preview invites: 8 left</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hi guys,&lt;br/&gt;&lt;br/&gt;I have some extra invites left for the Google Wave Preview and would like to give them away. In order to get the invites, I would need you join London Startups 2.0 group on Facebook http://bit.ly/rKL51 and invites some friends to join too. I am looking to improve the group and would be happy if you you answer the short (10 questions &amp;lt; 5mins) survey available here http://bit.ly/410fsS. Once you have join the group and answered the survey, please let me know by sending a message directly Facebook.&lt;br/&gt;&lt;br/&gt;This is not a scam as you can see the screenshot of my Google Wave Preview account here. The invites will be sent out this weekend.&lt;br/&gt; &lt;br/&gt;&lt;img src='http://lh6.ggpht.com/_MRIyatz9Kww/SumJNrUWHjI/AAAAAAAAADk/5o43Fy8umE8/s640/google-wave-invites.jpg' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=ea733330-917f-8506-8b15-a88db19b77ac' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-3137253249655009383?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lXCYy7wLspgzcqfpC8YN9TebPnY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lXCYy7wLspgzcqfpC8YN9TebPnY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lXCYy7wLspgzcqfpC8YN9TebPnY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lXCYy7wLspgzcqfpC8YN9TebPnY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/1igsSs8nvdw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/3137253249655009383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/10/google-wave-preview-invites-8-left.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/3137253249655009383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/3137253249655009383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/1igsSs8nvdw/google-wave-preview-invites-8-left.html" title="Google Wave Preview invites: 8 left" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_MRIyatz9Kww/SumJNrUWHjI/AAAAAAAAADk/5o43Fy8umE8/s72-c/google-wave-invites.jpg" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/10/google-wave-preview-invites-8-left.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IGQXc5fyp7ImA9WxNUFU0.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-3190878269009890225</id><published>2009-10-18T09:47:00.001-07:00</published><updated>2009-11-06T04:12:00.927-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T04:12:00.927-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile market" /><category scheme="http://www.blogger.com/atom/ns#" term="java me" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile application" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="web applications" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Android Mobile Application Development - Budget My Day</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;The last weeks or so, I have been contemplating on build a mobile application. I wanted to use a technology that I was familiar with and that is also currently available in the market. So Let me describe the factors that affected this weekend project:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;The user interface of the application have to be nice &lt;i&gt;a la iphone&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;provide RAD tools, I do not have time coding in notepad.&lt;/li&gt;
&lt;li&gt;Good documentation and online support (through forums and etc..).&lt;/li&gt;
&lt;li&gt;Need to able to learn and develop a nice UI within hours.&lt;/li&gt;
&lt;li&gt;The ability to connect and display real-time maps such as Google Maps or Yahoo!Maps.&lt;/li&gt;
&lt;/ol&gt;Ok, first of all I was not trying to develop a mobile webpage, the type of thing you can do with &lt;a href="http://mobile.yahoo.com/developers"&gt;Yahoo! Blueprint&lt;/a&gt;. My aim is to later develop this weekend project into a full blown mobile application with other contents such as videos, telephone dialing and messaging features. Based on that, I realized that there are bunch of technologies there which can be separated into two categories:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Vendor neutral: &lt;a href="http://java.sun.com/javame/index.jsp"&gt;J2ME&lt;/a&gt; (&lt;a href="http://javafx.com/"&gt;JavaFX&lt;/a&gt;???) and &lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vendor (or Manufacturer): iPhone, Symbian and the list is very long.&lt;/li&gt;
&lt;/ol&gt;I therefore decided to take a vendor neutral approach. I have some experience developing J2ME based applications and I can tell that the user interface is not as great as on the iPhone or Android based phones. So what about JavaFX, let me know the next time you see a JavaFX-based phone in a shop window or in public.&lt;br /&gt;
&lt;br /&gt;
So I decided to take the Android route. I know the API were based on JAVA, making the learning curve an easy ride. One thing I don't understand is; Android has been out for awhile and still do not provide a supported version of their development plugins for NetBeans or any other IDE but Eclipse. Nevertheless, I decided to use NetBeans to the develop the "weekend project". Android emulator is nice to work but sometimes, i just had to run the application multiple times in order to see the app in the emulator.&lt;br /&gt;
&lt;br /&gt;
I believe that in order to be a good Android developer, you need to familiarize yourself with building the UI through the XML and know your widget from your layouts. Anyway, this is just the start of the project but next time I blog about, I will discuss how to connect to web services to perform user authentication and persist data. For now here is a screenshot of the search tab taken from the emulator.&lt;br /&gt;
&lt;br /&gt;
P.S. The application will be a recommendation engine that will recommend user how to go out and enjoy themselves on any budget. For example, a person with £100 budget can see what to do, where and when. For example, go on a date to cinema then to restaurant before heading out to night club. Users will be able to review and rate recommendations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4022192579"&gt;&lt;img src="http://farm3.static.flickr.com/2576/4022192579_fd6c772895.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please support my blog and its advertisers by clicking on the interesting products/ services on the right (Google ads).&amp;nbsp; Cheers.&lt;/div&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div class="zemanta-pixie"&gt;&lt;br /&gt;
&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=03accde0-8310-854d-b4e9-ba334007be29" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-3190878269009890225?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Gsr075d3qkHj5WAHbgKNfEK__U0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gsr075d3qkHj5WAHbgKNfEK__U0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Gsr075d3qkHj5WAHbgKNfEK__U0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gsr075d3qkHj5WAHbgKNfEK__U0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/xFUsgYBCIu8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/3190878269009890225/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/10/android-mobile-application-development.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/3190878269009890225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/3190878269009890225?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/xFUsgYBCIu8/android-mobile-application-development.html" title="Android Mobile Application Development - Budget My Day" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2576/4022192579_fd6c772895_t.jpg" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/10/android-mobile-application-development.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IBSX8zeCp7ImA9WxNUFU0.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-5514868913385694316</id><published>2009-10-13T11:19:00.001-07:00</published><updated>2009-11-06T04:12:38.180-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T04:12:38.180-08:00</app:edited><title>Google Wave - Wave 2 Skype Robot</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Well it is time for the Google Wave 2 Skype robot. Awhile ago, I mentioned about writing a simple robot for Google Wave which will call a number through Skype, &lt;a href="http://armelnene.blogspot.com/2009/08/next-stop-google-wave-i-have-received.html" target="_blank"&gt;see here&lt;/a&gt;. I finally had some time to burn, therefore I decided to write the simple project.&lt;br /&gt;
&lt;br /&gt;
This a very simple application that only checks the wave "blips" and provide users with an option of calling a number by prefixing with "call: ". The idea is very simple and can be applied in other context such as the following:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;a travel agent can monitor for terms of place or cities and recommend tickets or provide city information retrieve from Wikipedia.&lt;/li&gt;
&lt;li&gt;Or the robot can translate messages from one language to another (similar to the Google Wave initial demo).&lt;/li&gt;
&lt;li&gt;you can connect to any system that you want to suffice your requirements.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
The project was developed in JAVA and deployed to Google App as that is the only suppoirted domain. This is not a tutorial but you can take a look at the screenshot. Alternatively, if you a Google Wave account, why not add the robot to your wave and take it from a test drive. Feel free to leave any comme nts.&lt;br /&gt;
&lt;br /&gt;
P.S. Google Sandbox seems to block the callto protocol, leave comments to let me know if that's true on your side.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4009179938"&gt;&lt;img src="http://farm3.static.flickr.com/2435/4009179938_b738bdaaea.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.flickr.com/photos/21841907@N05/4009180318"&gt;&lt;img src="http://farm4.static.flickr.com/3499/4009180318_35e2dcd1ca.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/21841907@N05/4009179752"&gt;&lt;img src="http://farm3.static.flickr.com/2628/4009179752_606f67ae9c.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=ad12f7f6-1010-87e8-a6df-5125c3217a19" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Please support my blog and its advertisers by clicking on the interesting products/ services on the right (Google ads).&amp;nbsp; Cheers.&lt;br /&gt;
&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/7746035232350865175-5514868913385694316?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7sp7zpfAfcYg7SBPawMEl3giOmI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sp7zpfAfcYg7SBPawMEl3giOmI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7sp7zpfAfcYg7SBPawMEl3giOmI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sp7zpfAfcYg7SBPawMEl3giOmI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/er44XAD50nA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/5514868913385694316/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/10/google-wave-wave-2-skype-robot.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/5514868913385694316?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/5514868913385694316?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/er44XAD50nA/google-wave-wave-2-skype-robot.html" title="Google Wave - Wave 2 Skype Robot" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2435/4009179938_b738bdaaea_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/10/google-wave-wave-2-skype-robot.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkADQ3w-eCp7ImA9WxNXFks.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-4379096879958492100</id><published>2009-10-04T06:59:00.001-07:00</published><updated>2009-10-04T06:59:32.250-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-04T06:59:32.250-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="social networking" /><category scheme="http://www.blogger.com/atom/ns#" term="microblogging" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="direct message" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="etapix" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><title>TwittDM - Automated Twitter Mass Direct Messenger (in JAVA)</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Awhile ago, I wrote about the about an &lt;a href='http://armelnene.blogspot.com/2009/04/anatomy-of-twitter-automated-mass.html'&gt;automated  mass direct messenger&lt;/a&gt; for Twitter to allow users to contact all their followers at once, and making sure that their tweets will not be lost in the wild. Well, the wait is now over. I wrote a proof concept that I will enhance with more features as users make request.&lt;br/&gt;&lt;br/&gt;Here is a simple list of current features:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Direct Message - Users can write a single message and have sent directly to all their followers.&lt;/li&gt;&lt;li&gt;Mentions - Users can write a single message and have all their followers mentioned so that followers will read.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;Future feature&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Select message recipients - Users will be able to select which users will receive the direct messages or which users will be mentioned in their updates.&lt;/li&gt;&lt;li&gt;any feature requested by users. &lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;The application was developed using JAVA, ReST API and Twitter4J API. This is a secure interface and I am not storing users' passwords and username and authentication are handled by Twitter web services.&lt;br/&gt;&lt;br/&gt;You can find the application @ &lt;a href='http://twittdm.appspot.com/'&gt;http://twittdm.appspot.com/&lt;/a&gt;. Yup, the application is deployed on Google App engine.&lt;br/&gt;&lt;br/&gt;Feel free to let me know what you think of the app, and please do not mentioned by graphic skills because I am not a designer.&lt;br/&gt;&lt;br/&gt;All comments are welcome, and you request features by sending me a tweet.&lt;br/&gt;&lt;a href='http://www.flickr.com/photos/21841907@N05/3979528205'&gt;&lt;img width='276' height='205' src='http://farm3.static.flickr.com/2455/3979528205_20b651d7e2.jpg'/&gt;&lt;/a&gt;&lt;a href='http://www.flickr.com/photos/21841907@N05/3979528495'&gt;           &lt;img width='272' height='202' src='http://farm4.static.flickr.com/3507/3979528495_bfaceb38d9.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=e301cf86-8e44-8ff5-bd64-5183bae14785' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-4379096879958492100?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ISeIiDIksbbTq5rqgp_CnV-wPxQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ISeIiDIksbbTq5rqgp_CnV-wPxQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ISeIiDIksbbTq5rqgp_CnV-wPxQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ISeIiDIksbbTq5rqgp_CnV-wPxQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/soUJP-fZKMw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/4379096879958492100/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/10/twittdm-automated-twitter-mass-direct.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/4379096879958492100?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/4379096879958492100?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/soUJP-fZKMw/twittdm-automated-twitter-mass-direct.html" title="TwittDM - Automated Twitter Mass Direct Messenger (in JAVA)" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2455/3979528205_20b651d7e2_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/10/twittdm-automated-twitter-mass-direct.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04FQHk4fCp7ImA9WxNQEU4.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-1889664903385183190</id><published>2009-09-16T15:25:00.001-07:00</published><updated>2009-09-16T15:25:11.734-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-16T15:25:11.734-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="social networking" /><category scheme="http://www.blogger.com/atom/ns#" term="microblogging" /><category scheme="http://www.blogger.com/atom/ns#" term="web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="start-ups" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="tinyurl" /><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="bit.ly" /><category scheme="http://www.blogger.com/atom/ns#" term="startups" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="revenue" /><category scheme="http://www.blogger.com/atom/ns#" term="networking" /><title>URL Shortner Service - how to monetize?</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;In the world of microblogging where users are trying say more with less, it is important that the resource url do not take more than the actual message. Enter the "URL Shortner Services" such as Bit.ly, is.gd, TinyURL among others, to the rescue to shortened those long URLs. From a user point of view, this is not much life to shortener services once the url has been turned to a small set of characters. I personally do not believe that anybody uses url shorteners outside the microblogging realms. We all know that there is no such thing as a free service, especially if you are looking for the service to stick around for a while. Therefore one question comes to mind, how can we make monetize the service.&lt;br/&gt;&lt;br/&gt;I was at bar in Canary wharf with one of my investment friend when we were discussing several monetization ideas in regard to social networking based businesses. Obviously, Twitter was discussed but then the conversation shifted toward the third party apps built for Twitter and microblogging sites.&lt;br/&gt;&lt;br/&gt;I am sure that anybody using Twitter has come across those funny urls in twits. When you clicked a link, there is a redirection from the url hosting server to the original source. So how can we monetize this service? That same question again. Here are some ideas and you are welcome to agree or disagree.&lt;br/&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;charge microblogging site and third party developer to use the service and implement a free quota. I do not personally see how this is going to work as the microblogging site are currently in the driving seats. This option might not be viable for the url shortener service providers.&lt;/li&gt;&lt;li&gt;when a shortened url has been clicked, the hosting server should redirect them to their site and present the user with an advertisement which will be displayed for a few second or until the user clicks it off. The ads have to be targeted the user this might involve parsing the title of the original source for keywords. This solution might be a good approach but how will user react to this. It can put them off therefore the services might have to offer some incentives to the url referrer.&lt;/li&gt;&lt;li&gt;This probably the simplest way and less intrusive from a user's perspective. When a user clicks on a link, the original site should be opened into a frame which is integrated into url shortener service provider's site. The top frame of the window could display some ads.&lt;/li&gt;&lt;/ol&gt;The above are just some suggestions and they might not even be feasible or might be receive with hostility from the community but it is worth trying. Here is my final option:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Twitter should implement is own url shortener service where the destination page will be displayed within a frame simialr to option 3 above. Or twitter should open all links within a frame and advertise similar to option 3 but this time without cutting out the the third party url shortener service providers.&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;That's all folks!&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=652f45e2-ef4d-8e8d-a54e-e6b0da6e3bde' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-1889664903385183190?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HlkIg47QqfDV2N5YFk581CMcs3U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HlkIg47QqfDV2N5YFk581CMcs3U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HlkIg47QqfDV2N5YFk581CMcs3U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HlkIg47QqfDV2N5YFk581CMcs3U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/lZjEtGe6jaU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/1889664903385183190/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/09/url-shortner-service-how-to-monetize.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/1889664903385183190?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/1889664903385183190?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/lZjEtGe6jaU/url-shortner-service-how-to-monetize.html" title="URL Shortner Service - how to monetize?" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/09/url-shortner-service-how-to-monetize.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQARnc7eCp7ImA9WxNTFEk.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-8513964068281255812</id><published>2009-08-16T10:05:00.001-07:00</published><updated>2009-08-16T10:05:47.900-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-16T10:05:47.900-07:00</app:edited><title>SourceForge.net: OpenPortal: openportaljsr Project: Admin: Manage Donations</title><content type="html">&lt;a href="https://sourceforge.net/project/admin/donations.php?group_id=273850"&gt;SourceForge.net: OpenPortal: openportaljsr Project: Admin: Manage Donations&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-8513964068281255812?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hJYwN55JHd94HkQx5iFS-dDEXOk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hJYwN55JHd94HkQx5iFS-dDEXOk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hJYwN55JHd94HkQx5iFS-dDEXOk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hJYwN55JHd94HkQx5iFS-dDEXOk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/kpuyxDu4VeA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/8513964068281255812/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/08/sourceforgenet-openportal-openportaljsr.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8513964068281255812?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8513964068281255812?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/kpuyxDu4VeA/sourceforgenet-openportal-openportaljsr.html" title="SourceForge.net: OpenPortal: openportaljsr Project: Admin: Manage Donations" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/08/sourceforgenet-openportal-openportaljsr.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8NRns5cCp7ImA9WxNTFE8.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-9059814402110930687</id><published>2009-08-16T04:41:00.001-07:00</published><updated>2009-08-16T04:41:37.528-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-16T04:41:37.528-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="api" /><category scheme="http://www.blogger.com/atom/ns#" term="skype" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="java developer" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="armel nene" /><category scheme="http://www.blogger.com/atom/ns#" term="wave" /><title>Next stop... Google Wave... I have received my invite!!!</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I am sure by now, must geeks around the world have heard about &lt;a href='http://wave.google.com/'&gt;Google Wave&lt;/a&gt; and its endless capabilities. I am not sure of the last one. Anyway, I have received my invitation from Google about 2 weeks, yippie, but I did not logged in until today mainly because I was too busy on other projects of mine. &lt;br/&gt;&lt;br/&gt;When first logged, I have to admit that I was not very much impressed. I thought looked like a better version of Twitter based on the user interface. Nevertheless, I am looking to build a demo Wave application that can be embed into the Google Wave. I want to build something simple but I am not getting any inspiration. By the way, initially this blog entry was going to be a tutorial about how to build a wave app.  This is what I decided to do. I have created a wave or should i say a wavelet, which will be used to brainstorm ideas about what to build. &lt;br/&gt;&lt;br/&gt;Ooh, I have an idea. I think that I should make a tutorial which will show to build a Google Wave application that extract phone numbers from "blips" and make it possible to dial them straight  using the "callto" protocol. This will allow a participant to dial a number from the wave app to let's say their Skype phone. This should be simple enough. Now let's find the time to do it. Hopefully my next entry will be it.&lt;br/&gt;&lt;br/&gt;Until then, keep the channel open.&lt;br/&gt;&lt;br/&gt;&lt;a href='http://www.flickr.com/photos/21841907@N05/3826183272'&gt;&lt;img src='http://farm3.static.flickr.com/2565/3826183272_bf7dc0cd93.jpg'/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;My Google Wave Screenshot&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=5cc52db9-26f6-803e-a476-b4b738918c6c' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-9059814402110930687?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yZGo7n8mWCGTaMzXD-kav6ItH5s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yZGo7n8mWCGTaMzXD-kav6ItH5s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yZGo7n8mWCGTaMzXD-kav6ItH5s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yZGo7n8mWCGTaMzXD-kav6ItH5s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/uJT_dR1-PKk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/9059814402110930687/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/08/next-stop-google-wave-i-have-received.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/9059814402110930687?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/9059814402110930687?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/uJT_dR1-PKk/next-stop-google-wave-i-have-received.html" title="Next stop... Google Wave... I have received my invite!!!" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2565/3826183272_bf7dc0cd93_t.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/08/next-stop-google-wave-i-have-received.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEHRH06eyp7ImA9WxNUFkk.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-8868111852620575910</id><published>2009-08-07T09:50:00.001-07:00</published><updated>2009-11-07T16:37:15.313-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-07T16:37:15.313-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="liferay" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="visualization" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><category scheme="http://www.blogger.com/atom/ns#" term="container" /><category scheme="http://www.blogger.com/atom/ns#" term="portlet" /><category scheme="http://www.blogger.com/atom/ns#" term="portal" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr168" /><title>Building Portlet 1.0 (JSR168) with GWT 1.7 on NetBeans 6.7</title><content type="html">In this tutorial, I will build a Portlet 1.0 (JSR168) which I will then deploy on Liferay and OpenPortlet Container. Alternatively, the portlet should be able to run on any other JSR168 compliant portlet container. I like the "Hello World" tutorial that we are accustomed to but I wanted to do something different this time. I decided to build the a GWT 1.7 based portlet which also make use of the Google Visualization API for GWT.&lt;br /&gt;
In order to follow this tutorial, you will need the following:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;JAVA SDK installed, my system version is 1.6.0_14 therefore I would recommend that to be the minimum setting for the JVM.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.netbeans.org/"&gt;NetBeans 6.7&lt;/a&gt;    &lt;/li&gt;
&lt;li&gt;&lt;a href="https://gwt4nb.dev.java.net/"&gt;GWT4NB&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/"&gt;GWT 1.7&lt;/a&gt; or latest&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/googleapilibraries.html"&gt;GWT Visualization API&lt;/a&gt;    &lt;/li&gt;
&lt;li&gt;&lt;a href="http://portalpack.netbeans.org/"&gt;NetBeans Portal Pack&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.liferay.com/"&gt;Liferay&lt;/a&gt; 5.2.x&lt;/li&gt;
&lt;li&gt;&lt;a href="https://portlet-container.dev.java.net/"&gt;OpenPortal Portlet Container&lt;/a&gt;    &lt;/li&gt;
&lt;/ul&gt;This is &lt;strike&gt;not&lt;/strike&gt; a tutorial about GWT or JSR168 Portlet but a focus on how to make them both work together to provide a nice UI. Prior knowledge of building and deploying portlet applications and developing GWT applications is required.&lt;br /&gt;
Once the development environment is ready, launch NetBeans and create a new web application project with Portlet and GWT support. Follow these steps in order to create web application with Portlet and GWT support.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Create a new web project&lt;/li&gt;
&lt;li&gt;Give a project name and click next&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Choose your deployment portlet container and click next&lt;/li&gt;
&lt;/ol&gt;&lt;a href="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxeSxbXm4I/AAAAAAAAACA/0cKB3EQqsAA/s1600-h/netbeans-choose-server.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5367268532517575554" src="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxeSxbXm4I/AAAAAAAAACA/0cKB3EQqsAA/s200/netbeans-choose-server.png" style="cursor: pointer; height: 138px; width: 200px;" /&gt;&lt;/a&gt;   &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Add Google Web Toolkit (GWT) framework to your project&lt;/li&gt;
&lt;/ol&gt;&lt;a href="http://2.bp.blogspot.com/_MRIyatz9Kww/SnxdvAJ3btI/AAAAAAAAAB4/Jh6HMce1PPk/s1600-h/netbeans-gwt-framework.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5367267917995405010" src="http://2.bp.blogspot.com/_MRIyatz9Kww/SnxdvAJ3btI/AAAAAAAAAB4/Jh6HMce1PPk/s200/netbeans-gwt-framework.png" style="cursor: pointer; height: 138px; width: 200px;" /&gt;&lt;/a&gt;   &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Add Portlet Support to your project, chise any version and tick the boxes to create portlet and jsps. Fill in any required fields and click finish&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;a href="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxeT6kv7dI/AAAAAAAAACg/xmnDills41o/s1600-h/netbeans-portlet-support.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5367268552152706514" src="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxeT6kv7dI/AAAAAAAAACg/xmnDills41o/s200/netbeans-portlet-support.png" style="cursor: pointer; height: 165px; width: 200px;" /&gt;&lt;/a&gt;   &lt;br /&gt;
NetBeans then generates all the required files in order to build the application. Initially, the two frameworks; Portlet and GWT are unaware of each other. Depending on your folder structure the following will be different. Here is a screenshot of my project structure in NetBeans.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxgN2LXqzI/AAAAAAAAACo/rRx_PVocY8A/s1600-h/netbeans-project-structure.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5367270646916557618" src="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxgN2LXqzI/AAAAAAAAACo/rRx_PVocY8A/s200/netbeans-project-structure.png" style="cursor: pointer; height: 168px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;
My project is called LiferayHomePortlet as my Portlet Container is Liferay 5.2. My root package is com.etapix. This package will be used by GWT as the default package and will create the client and server packages as follow:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Com.etapix.client: this is package will have all my client side code including my xxxxEntryPoint.java class (xxxx being the name that you have chosen for your GWT)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Com.etapix.server: this package will not be used for the purpose of this tutorial&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;xxxx.gwt.xml (xxxx should be replaced with the name you are chosen will setting up the GWT framework for the project) was created in my root package "com.etapix"&lt;br /&gt;
&lt;br /&gt;
NetBeans portlet generation feature has created, among other files, three jsps file under the WEB-INF/jsp folder&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;xxxxPortlet_edit.jsp&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;xxxxPortlet_help.jsp&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;xxxxPortlet_view.jsp&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;and the java class which will be used to render the portlet are allocated in com.etapix.liferay.portlet folder as LiferayHomePortlet.java.&lt;br /&gt;
&lt;br /&gt;
In order for the portlet to display the chart from the GWT Visualization API, I have changed the  generated code from portletEntrtyPoint.java. Once the changed to the GWT file was done, change the following file:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;xxxxPortlet.java to include the following line in the "doView" method. Here is how you doView method should look like&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;response.setContentType("text/html");&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;PortletRequestDispatcher dispatcher =&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;getPortletContext().getRequestDispatcher("/WEB-INF/jsp/LiferayHomePortlet_view.jsp");&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;PrintWriter writer = response.getWriter();&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;writer.println("&amp;lt;script language='javascript' src='" + request.getContextPath() + "/com.etapix.portlet/com.etapix.portlet.nocache.js'&amp;gt;&amp;lt;/script&amp;gt;");&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;dispatcher.include(request, response);&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;xxxxPortlet_view.jsp. This is what your code should look like&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;&amp;lt;%@page contentType="text/html"%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;%@page pageEncoding="UTF-8"%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;%-- Uncomment below lines to add portlet taglibs to jsp&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;%@ page import="javax.portlet.*"%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;portlet:defineObjects /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;%PortletPreferences prefs = renderRequest.getPreferences();%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;--%&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;div id="gwt"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Once the changes are completed, build your application and deploy it to your portlet container of your choice.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 36pt;"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;This is what it looks like in Liferay Portlet container&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_MRIyatz9Kww/SnxeTGY8DGI/AAAAAAAAACI/2LvkklmWHcg/s1600-h/gwt-portlet-liferay.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5367268538144525410" src="http://3.bp.blogspot.com/_MRIyatz9Kww/SnxeTGY8DGI/AAAAAAAAACI/2LvkklmWHcg/s200/gwt-portlet-liferay.png" style="cursor: pointer; height: 151px; width: 200px;" /&gt;&lt;/a&gt;   &lt;br /&gt;
&lt;br /&gt;
this is what it looks in OpenPortal Portlet Container.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_MRIyatz9Kww/SnxeTd0UGmI/AAAAAAAAACQ/xNw8HQk-5AU/s1600-h/gwt-portlet-portal-container.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5367268544433363554" src="http://4.bp.blogspot.com/_MRIyatz9Kww/SnxeTd0UGmI/AAAAAAAAACQ/xNw8HQk-5AU/s200/gwt-portlet-portal-container.png" style="cursor: pointer; height: 152px; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;
This was my first blog tutorial as I am looking to provide more tutorials in the future. I hope you found this helpful. I have included the NetBeans project folder for your to play with.&lt;br /&gt;
&lt;a href="http://www.etapix.com/netbeans_tutorial/LiferayHomePortlet.7z"&gt;download NetBeans project&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Please support my blog and its advertisers by clicking on the interesting products/ services on the right (Google ads).&amp;nbsp; Cheers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7746035232350865175-8868111852620575910?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Dy1l6xSvgwyqKjDfJchdHAw10sQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dy1l6xSvgwyqKjDfJchdHAw10sQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Dy1l6xSvgwyqKjDfJchdHAw10sQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dy1l6xSvgwyqKjDfJchdHAw10sQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/LHlQoki3jIg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/8868111852620575910/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/08/building-portlet-10-jsr168-with-gwt-17.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8868111852620575910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/8868111852620575910?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/LHlQoki3jIg/building-portlet-10-jsr168-with-gwt-17.html" title="Building Portlet 1.0 (JSR168) with GWT 1.7 on NetBeans 6.7" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_MRIyatz9Kww/SnxeSxbXm4I/AAAAAAAAACA/0cKB3EQqsAA/s72-c/netbeans-choose-server.png" height="72" width="72" /><thr:total>9</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/08/building-portlet-10-jsr168-with-gwt-17.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUANQn87eSp7ImA9WxJVE00.&quot;"><id>tag:blogger.com,1999:blog-7746035232350865175.post-3718849163755518631</id><published>2009-06-29T12:29:00.001-07:00</published><updated>2009-06-29T12:29:53.101-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T12:29:53.101-07:00</app:edited><title>Just a quick update</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hi guys,&lt;br/&gt;&lt;br/&gt;I have been very busy on projects but as soon as I get a free time, I will be updating my blog so please stay tune. I am looking to write about the second part of the dynamic language comparison. Also, I will be less focusing on social networks site and more on the development aspect of things. After all, I am a software developer therefore I will prefer to discuss things I am really excited about such Google App Engine, JAVA, Ruby and mobile development.&lt;br/&gt;&lt;br/&gt;Stay tune and see you soon&lt;br/&gt;&lt;br/&gt;&lt;span xmlns=''&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;a onblur='try {parent.deselectBloggerImageGracefully();} catch(e) {}' href='http://2.bp.blogspot.com/_MRIyatz9Kww/SbpUz0qGNcI/AAAAAAAAABA/UaxBqBRg4-c/s1600-h/36_1_37.gif'&gt;&lt;img border='0' style='margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 59px; height: 59px;' src='http://2.bp.blogspot.com/_MRIyatz9Kww/SbpUz0qGNcI/AAAAAAAAABA/UaxBqBRg4-c/s200/36_1_37.gif' alt='' id='BLOGGER_PHOTO_ID_5312651959722194370'/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;I am not a geek... you are a nerd&lt;/i&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/7746035232350865175-3718849163755518631?l=armelnene.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Sjs7pyQYiIBgE34wVaaDQ_qPpXw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sjs7pyQYiIBgE34wVaaDQ_qPpXw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Sjs7pyQYiIBgE34wVaaDQ_qPpXw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sjs7pyQYiIBgE34wVaaDQ_qPpXw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ArmelNene/~4/C75CXEsC-5o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://armelnene.blogspot.com/feeds/3718849163755518631/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://armelnene.blogspot.com/2009/06/just-quick-update.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/3718849163755518631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7746035232350865175/posts/default/3718849163755518631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ArmelNene/~3/C75CXEsC-5o/just-quick-update.html" title="Just a quick update" /><author><name>Armel Nene</name><uri>http://www.blogger.com/profile/11347762240197736080</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://2.bp.blogspot.com/_MRIyatz9Kww/Sak9HOd61LI/AAAAAAAAAAM/1RASSiv5wwA/S220/hot+sun+on+balcony.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_MRIyatz9Kww/SbpUz0qGNcI/AAAAAAAAABA/UaxBqBRg4-c/s72-c/36_1_37.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://armelnene.blogspot.com/2009/06/just-quick-update.html</feedburner:origLink></entry></feed>

