<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="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" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4528430083629090473</atom:id><lastBuildDate>Thu, 09 Feb 2012 14:40:37 +0000</lastBuildDate><category>mobile</category><category>google io sessions</category><category>Double</category><category>google app engine</category><category>libstdc</category><category>url mappings</category><category>gwt 2.1</category><category>proxy</category><category>roo</category><category>documentation</category><category>debugging</category><category>html5</category><category>bug</category><category>gwt project layout</category><category>htmlunit</category><category>gwt</category><category>maven</category><category>crawl</category><category>interfaces</category><category>gin</category><category>proxy servlet</category><category>xsi</category><category>open street map</category><category>mvp</category><category>iphone</category><category>css</category><category>guice</category><category>webkit</category><category>NaN</category><category>git</category><category>osm</category><category>mocking</category><category>spring</category><category>2.2</category><category>search eml</category><category>servlet</category><category>spotlight</category><category>gwtp</category><category>productivity</category><category>injection</category><category>mockito</category><category>sop</category><category>touch</category><category>i18n</category><category>play framework</category><category>mac os x focus follows mouse</category><category>branching</category><category>generators</category><category>gwt ie9 ie8</category><category>gwt bug jvm apple</category><category>java</category><category>split points</category><category>ajax</category><category>security</category><category>di</category><category>java performance</category><category>jdo</category><category>css resource bundles</category><category>datastore</category><category>css3</category><category>regular expression</category><category>uihandler</category><category>gae</category><category>rest</category><category>gae/j</category><category>overlay types</category><category>android</category><category>maven gwt plugin</category><category>tutorials</category><category>mobile development</category><category>netbeans rcp 6.5.1 about box branding</category><category>jpa</category><category>play</category><category>2.3</category><category>design</category><category>version control</category><category>testing</category><category>web.xml</category><category>generation</category><category>mercurial</category><category>java.lang.NoClassDefFoundError: javax/swing/GroupLayout$Group Netbeans 6.5</category><category>json</category><category>web design</category><category>ioc</category><title>ars-codia</title><description>about the art of writing code, often java, often build systems, but also everything else</description><link>http://ars-codia.raphaelbauer.com/</link><managingEditor>noreply@blogger.com (Raphael)</managingEditor><generator>Blogger</generator><openSearch:totalResults>98</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/rss+xml" href="http://feeds.feedburner.com/Ars-codia" /><feedburner:info uri="ars-codia" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-1964640906066204911</guid><pubDate>Tue, 24 Jan 2012 10:34:00 +0000</pubDate><atom:updated>2012-01-26T04:19:59.629-08:00</atom:updated><title>Android 4 GWT and SOP</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QPzZFMZSaOM/Tx6IMsaxbwI/AAAAAAAAASo/UGpdcby7cMA/s1600/general_android_screenshot.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="400" width="267" src="http://4.bp.blogspot.com/-QPzZFMZSaOM/Tx6IMsaxbwI/AAAAAAAAASo/UGpdcby7cMA/s400/general_android_screenshot.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
My company and me just released the first version of our GWT mobile iOS / Android App crossover project. It's a cross plattform gwtp App using our own AppRig mobile framework (to be released at some point).&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://market.android.com/search?q=kunstwegen"&gt;https://market.android.com/search?q=kunstwegen&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I already talked about Android and its browser. I think Android's webkit is really lightyears ahead of iPhone's webkit in terms of stability and feature support.&lt;br /&gt;
&lt;br /&gt;
We had to overcome several problems to make it run without any Problems on Android devices from 2.0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Just recently I tried the App on Android 4 and - boom - our app doesn't work there. The reason was that Android 4 throws a SOP on the filesystem.&lt;br /&gt;
&lt;br /&gt;
Not sure if this is a bug or feature, but you have to add an xs linker&lt;br /&gt;
linker to make it run...&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1669528.js"&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hope that helps anybody - took us a while to figure this out...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-1964640906066204911?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/android-4-gwt-and-sop.html</link><author>noreply@blogger.com (Raphael)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-QPzZFMZSaOM/Tx6IMsaxbwI/AAAAAAAAASo/UGpdcby7cMA/s72-c/general_android_screenshot.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-7322176181854811824</guid><pubDate>Mon, 23 Jan 2012 23:53:00 +0000</pubDate><atom:updated>2012-01-23T15:53:53.936-08:00</atom:updated><title>Android Big Bug Browser</title><description>Did I already mention that Android has a really bad browser?&lt;br /&gt;
&lt;br /&gt;
I mean seriously. WebKit is known to be one of the best html engines out there. Safari is built on that, Netflix uses it for their platform dependent development. And it boasts a great mobile Webkit used on iPhone / iOS.&lt;br /&gt;
&lt;br /&gt;
And Google did something smart: They are using the very same WebKit for their Android. &lt;br /&gt;
&lt;br /&gt;
But.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Android's browser has so many bugs and runs absolutely unstable. I experienced a lot of bugs in 2.3 series (strange layout issues as well as muti touch issues). Even more bugs on Android 3 (Some websites just crash the browser reliably wtf?). And - just recently - I tried Android 4.0.3 - only to discover that they introduced a same origin policy for file:// . Is that a feature or again a bug?&lt;br /&gt;
&lt;br /&gt;
I really don't know.&lt;br /&gt;
&lt;br /&gt;
iOS on the other hand? Rock solid for years now. It's such a huge difference.&lt;br /&gt;
&lt;br /&gt;
What the heck is going on?&lt;br /&gt;
&lt;br /&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/4528430083629090473-7322176181854811824?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/android-big-bug-browser.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-52875589671518209</guid><pubDate>Mon, 23 Jan 2012 23:40:00 +0000</pubDate><atom:updated>2012-01-23T15:40:11.982-08:00</atom:updated><title>Lion tweaks for developers</title><description>I just upgraded my dev machine from Snow Leopard to Lion.&lt;br /&gt;
&lt;br /&gt;
Hmm. The good news is that Lion is pretty similar to Snow Leopard / Leopard. The only difference is that Apple tries to mimic iOS on a Mac via Mac App store / Launchpad and a huge amount of mouse gestures.&lt;br /&gt;
&lt;br /&gt;
It think that's crap and introduces a lot of stuff that's not needed on a dev machine.&lt;br /&gt;
&lt;br /&gt;
But it's simple to make Lion a great dev machine:&lt;br /&gt;
- Make sure you format your disk using a filesystem that preserves upper / lowercase of filenames&lt;br /&gt;
- Install macports (mercurial, git etc)&lt;br /&gt;
- Install Java (simply open "Java preferences" and click on install)&lt;br /&gt;
- Show all files in Finder: defaults write com.apple.Finder AppleShowAllFiles YES&lt;br /&gt;
- Disable dashboard: defaults write com.apple.dashboard mcx-disabled -boolean YES&lt;br /&gt;
- Spaces and expose is now called Mission control. Not much changed, but you should deactivate the automated rearrangement of spaces according to usage&lt;br /&gt;
- Apple changed the scrolling direction up down becomes now down up. I get the point it's now like dragging on a TouchDevice - but still - I changed it back to the old value.&lt;br /&gt;
- Mac also hides the scroll bars automatically. Wtf? If you are coding: Turn it on ;)&lt;br /&gt;
- XCode comes now via the Mac App Store (But only as installer...). &lt;br /&gt;
- The two finger wipe left / wipe right gesture completely screws up nice browsing. I turned it off.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whole upgrade took around 2hrs. Back for good... ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-52875589671518209?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/lion-tweaks-for-developers.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-4234979970576739837</guid><pubDate>Sun, 22 Jan 2012 19:40:00 +0000</pubDate><atom:updated>2012-01-23T01:11:16.406-08:00</atom:updated><title>GWT Firefox 9 Plugin</title><description>Alan Leung just released a new xpi for Firefox. What a pleasant surprise. GWT dev mode is superfast. Never saw it that fast and stable. Much better than on Safari or Chrome right now (from a Mac perspective).&lt;br /&gt;
&lt;br /&gt;
Thanks Alan!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.mediafire.com/?831pp1kk5p8kgjd"&gt;http://www.mediafire.com/?831pp1kk5p8kgjd&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-4234979970576739837?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/gwt-firefox-9-plugin.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-1541894412304131304</guid><pubDate>Sat, 21 Jan 2012 20:08:00 +0000</pubDate><atom:updated>2012-01-21T12:08:00.353-08:00</atom:updated><title>Languages and fun</title><description>That's a hilarious video: &lt;a href="https://www.destroyallsoftware.com/talks/wat"&gt;https://www.destroyallsoftware.com/talks/wat&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-1541894412304131304?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/languages-and-fun.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-4926515662985084789</guid><pubDate>Thu, 19 Jan 2012 17:25:00 +0000</pubDate><atom:updated>2012-01-19T13:38:29.042-08:00</atom:updated><title>i18n and design</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-RFR9h5rgQRA/TxhSQqLRU8I/AAAAAAAAASU/C6ePPTQ0ymk/s1600/Bildschirmfoto%2B2012-01-19%2Bum%2B18.25.58.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="174" src="http://2.bp.blogspot.com/-RFR9h5rgQRA/TxhSQqLRU8I/AAAAAAAAASU/C6ePPTQ0ymk/s200/Bildschirmfoto%2B2012-01-19%2Bum%2B18.25.58.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ever wondered why Google layouts forms in a way that they are horizontally stacked? Hmm. It's simple... the reason is i18n - right-to-left left-to-right in particular.&lt;br /&gt;
&lt;br /&gt;
Great post about Google's internal i18n guidelines:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://googlewebmastercentral.blogspot.com/2011/09/internationalization.html"&gt; http://googlewebmastercentral.blogspot.com/2011/09/internationalization.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-4926515662985084789?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/i18n-and-design.html</link><author>noreply@blogger.com (Raphael)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-RFR9h5rgQRA/TxhSQqLRU8I/AAAAAAAAASU/C6ePPTQ0ymk/s72-c/Bildschirmfoto%2B2012-01-19%2Bum%2B18.25.58.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-5427800849026207906</guid><pubDate>Thu, 19 Jan 2012 13:00:00 +0000</pubDate><atom:updated>2012-01-19T07:18:57.162-08:00</atom:updated><title>Play! eclipse drop-in - for even better eclipse support</title><description>I just recently learned that Play Framework features a simple drop-in for eclipse. Well - actually I new that such thing existed, but I thought it's too complicated to install. But just the contrary. &lt;br /&gt;
&lt;br /&gt;
Installation is really simple - everything is already bundled with your play distribution. It's a jar (at support/eclipse) that you simply copy into the eclipse/dropin folder.&lt;br /&gt;
&lt;br /&gt;
After installing the droping you get:&lt;br /&gt;
- syntax highlighting of application.conf&lt;br /&gt;
- syntax highlighting in html views (but eventually the html editor from Eclipse WTP is better)&lt;br /&gt;
and best:&lt;br /&gt;
- syntax highlighting and simple jumping from your routes file to the implementing classes and methods. That really speeds things up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you did not yet install the droping you should do it now :) It's really a productivity boost and simple :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More:&lt;br /&gt;
&lt;a href="http://www.playframework.org/documentation/1.2.4/ide"&gt;http://www.playframework.org/documentation/1.2.4/ide&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-5427800849026207906?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2012/01/play-eclipse-dropin-for-even-better.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-6715313951176860460</guid><pubDate>Fri, 30 Dec 2011 10:29:00 +0000</pubDate><atom:updated>2012-01-15T12:39:36.931-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gwt</category><title>Why Google Web Toolkit is a fantastic idea - Part 3: The future of GWT</title><description>&lt;object width="250" height="40" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="gsSong2851821119" name="gsSong2851821119"&gt;&lt;param name="movie" value="http://grooveshark.com/songWidget.swf" /&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=28518211&amp;style=metal&amp;p=0" /&gt;&lt;object type="application/x-shockwave-flash" data="http://grooveshark.com/songWidget.swf" width="250" height="40"&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=28518211&amp;style=metal&amp;p=0" /&gt;&lt;span&gt;Still Alive by &lt;a href="http://grooveshark.com/artist/Social+Distortion/1446" title="Social Distortion"&gt;Social Distortion&lt;/a&gt; on Grooveshark&lt;/span&gt;&lt;/object&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;And the times have changed my friend&lt;br /&gt;
I’ll be here to the bitter end&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Social Distortion - Still alive&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Intro&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic.html"&gt;Part 1&lt;/a&gt; Showed you a lot of examples where GWT is actually used&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_22.html"&gt;Part 2&lt;/a&gt; outlined use cases and pros / cons of GWT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This Part 3 will talk about the future of GWT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GWT - a solid basis for my web apps&lt;/b&gt;&lt;br /&gt;
We are using GWT in various setups since GWT 1.6 internally. From really small projects up to bigger projects where around 50 people are working in several teams on the very same GWT project.&lt;br /&gt;
&lt;br /&gt;
GWT never let me down. I especially like that GWT is super flexible, allowing regular HTML and CSS markup since UI Binder came into being. It is a fantastic technology and does a great job transforming Java developers into Javascript Ninjas. It provides type safety, a super great ecosystem and a first class tool chain (Eclipse, Maven, Java libs, Jenkins etc). This makes it possible to develop "fat client Ajax clients" with a lot of people Jenkins.&lt;br /&gt;
&lt;br /&gt;
Google calls this "Web apps". And GWT is perfect to develop those web apps. I cannot imagine 50 people working on the same javascript-only codebase. But - I am sure this is working... &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Google plus, closure and doubts about Google's support for GWT&lt;/b&gt;&lt;br /&gt;
...and it is working. In Mid 2011 it became a bit quiet regarding GWT (at least I felt that way). There were severe problems with the dev mode regarding the latest Macbrowser generation that nobody at GWT seemed to notice [4]. And it became a bit too quiet at the GWT mailing list. Then Google Plus was released. And it used: Closure [3]. Damn.&lt;br /&gt;
&lt;br /&gt;
That hit. But it became even worse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What's that dart thing all about?&lt;/b&gt;&lt;br /&gt;
Some weeks later Google announced Google Dart. A new kind of language and a possible replacement for Javascript [2]. &lt;br /&gt;
&lt;br /&gt;
So there is stood. Some years of GWT experience. And no idea where we'll go.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;I like change - when I am in control &lt;/b&gt;&lt;br /&gt;
To be honest: Technology changes. The way we used to write Java code 5 years ago is completely different to what we do now. Javascript will change. The way we use the web will change. I am PRO change. I like change. I even like some kind of insecurity because it keeps us moving. But still - I wanted to know what's going on. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Regarding Dart and GWT&lt;/b&gt;&lt;br /&gt;
I think Dart is not a good idea. I especially don't like the mixed static / dynamic type system. Not something I would use. I also don't like yet another coding syntax. What's the point? So my bet is: Dart is academic and will be dead soon. Or - it will be an intermediate step to translate stuff into Javascript.&lt;br /&gt;
&lt;br /&gt;
It's also interesting to read Oliver's post a the webkit mailing list when Google asked if Dart could be implemented by Webkit:&lt;br /&gt;
Oliver says:&lt;br /&gt;
&lt;i&gt;This is an academic exercise as it doesn't match webkit's goal of being a standards compliant engine, and also has dubious advantage even when supported.&lt;/i&gt; [1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Regarding Closure and GWT&lt;/b&gt;&lt;br /&gt;
I think Closure is just great. For javascript coders. But if you want to turn Java developers into Javascript ninjas you can't give them closure. Give them GWT and they will be happy. I guess this is what happened inside Google. Some teams just prefer the Java side of things - those teams use GWT for their projects. Others are great Javascript coders - Closure is a natural fit. Dart? Yea. Still no idea where the place for that is... I don't think Closure will replace GWT or the other way round. Both make sense for a company like Google.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Why GWT's future looks bright - evidence&lt;/b&gt;&lt;br /&gt;
I began collecting intelligence about GWT. What the heck was Google's plan with GWT? &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Evidence from Dr Fibonacci aka David Chandler (Google GWT team)&lt;/b&gt;&lt;br /&gt;
David Chandler told me that GWT is used in a huge amount of projects internally (at a time when only the AdSense client was visible outside). Convincing. I wrote about our telephone call briefly here [9].&lt;br /&gt;
David also outlined this in written form via his blog (check out the comments) [8]:&lt;br /&gt;
&lt;i&gt;Hi Raymond, it’s much too early to discern what may happen. Google uses GWT in over a thousand projects internally, whereas Dart is brand new. Google continues to invest in GWT and will continue to support it for a long time to come because it is used so widely within the company. So no, Google is certainly not putting all its eggs in the Dart basket.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Evidence from Eric Clayberg (GWT Google team)&lt;/b&gt;&lt;br /&gt;
The reply of Eric Clayberg to this G+ post [5] sates that &lt;i&gt;I can assure you that GWT is not "dead" at all. Not even close! Quite the contrary&lt;/i&gt;. Aha.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Evidence from Bruce Johnson (Google)&lt;/b&gt;&lt;br /&gt;
Bruce Johnson writes at the GWT blog says that GWT will be supported a long time and that GWT and Dart are close allies in the fight for web apps [6].&lt;br /&gt;
This leaked Google doc highlights that GWT and JScompiler are on a merger and can be easily integrated into Dart in the future. While this is cool - it also highlights that GWT will stay for a long time if Dart fails. And even if it does not fail there is migration path in terms of tools. &lt;br /&gt;
&lt;i&gt;What is the future of the JSCompiler and GWT?&lt;br /&gt;
JSCompiler and GWT were already on a merger path.  This effort gives us a&lt;br /&gt;
direction for that unification around the Dash language.  We will actively&lt;br /&gt;
support teams for a long time on the current generation of JSCompiler and&lt;br /&gt;
GWT and provide fantastic co-existence and migration tools to Dash.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;
- GWT is the very best web app (aka best ajax fat client) dev tool for for Java developers.&lt;br /&gt;
- GWT is here to stay for a long time.&lt;br /&gt;
- Hooray!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="https://lists.webkit.org/pipermail/webkit-dev/2011-December/018822.html"&gt;https://lists.webkit.org/pipermail/webkit-dev/2011-December/018822.html&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="http://en.wikipedia.org/wiki/Dart_(programming_language)"&gt;http://en.wikipedia.org/wiki/Dart_(programming_language)&lt;/a&gt;&lt;br /&gt;
[3] &lt;a href="http://code.google.com/closure/"&gt;http://code.google.com/closure/&lt;/a&gt;&lt;br /&gt;
[4] &lt;a href="http://ars-codia.raphaelbauer.com/2011/07/mac-safari-505-does-not-work-with-gwt.html"&gt;http://ars-codia.raphaelbauer.com/2011/07/mac-safari-505-does-not-work-with-gwt.html&lt;/a&gt;&lt;br /&gt;
[5] &lt;a href="https://plus.google.com/u/0/112745976227102540584/posts/MjZgFK6gjLq"&gt;https://plus.google.com/u/0/112745976227102540584/posts/MjZgFK6gjLq&lt;/a&gt;&lt;br /&gt;
[6] &lt;a href="http://googlewebtoolkit.blogspot.com/2011/11/gwt-and-dart.html"&gt;http://googlewebtoolkit.blogspot.com/2011/11/gwt-and-dart.html&lt;/a&gt;&lt;br /&gt;
[7] &lt;a href="https://gist.github.com/1208618"&gt;https://gist.github.com/1208618&lt;/a&gt;&lt;br /&gt;
[8] &lt;a href="http://turbomanage.wordpress.com/2011/10/10/first-thoughts-on-dart/"&gt;http://turbomanage.wordpress.com/2011/10/10/first-thoughts-on-dart/&lt;/a&gt;&lt;br /&gt;
[9] &lt;a href="http://ars-machina.raphaelbauer.com/2010/12/why-future-of-google-web-toolkit-looks.html"&gt;http://ars-machina.raphaelbauer.com/2010/12/why-future-of-google-web-toolkit-looks.html&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-6715313951176860460?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_30.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-1408310490683262728</guid><pubDate>Thu, 22 Dec 2011 20:20:00 +0000</pubDate><atom:updated>2012-01-15T12:51:26.539-08:00</atom:updated><title>Why Google Web Toolkit is a fantastic idea - Part 2: Use cases for GWT</title><description>&lt;object width="250" height="40" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="gsSong1934562723" name="gsSong1934562723"&gt;&lt;param name="movie" value="http://grooveshark.com/songWidget.swf" /&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=19345627&amp;style=metal&amp;p=0" /&gt;&lt;object type="application/x-shockwave-flash" data="http://grooveshark.com/songWidget.swf" width="250" height="40"&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=19345627&amp;style=metal&amp;p=0" /&gt;&lt;span&gt;Reach for the Sky by &lt;a href="http://grooveshark.com/artist/Social+Distortion/1446" title="Social Distortion"&gt;Social Distortion&lt;/a&gt; on Grooveshark&lt;/span&gt;&lt;/object&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reach for the sky because tomorrow may never come.&lt;br /&gt;
&lt;b&gt;Social Distortion - Reach for the sky&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic.html"&gt;Part 1: Who is using GWT?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_22.html"&gt;Part 2: Use cases for GWT&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_30.html"&gt;Part 3: The future of GWT&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
There are Pros and Cons for anything. You won't here me saying: "GWT is the best thing in the whole wild world. Please marry GWT". En contraire. GWT is a great technology. But you have to know when it makes sense to use GWT. And when not.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GWT is a toolkit.&lt;/b&gt;&lt;br /&gt;
Means 100% degrees of freedom. But also means 100% complexity if you don't know what you are doing. GWT is just a cross compiler from Java into Javascript. At the end everything you write becomes Javascript. With all limitations of Javascript. You can reuse large parts of the Java eco system including a lot of libraries and the standard Java libraries. Still. You have to know what libraries to use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Based on Java and it's ecosystem&lt;/b&gt;&lt;br /&gt;
Is Java as syntax an advantage? Well. Guess we can discuss that for a very long time. But at least we can agree that Java's ecosystem is a huge advantage. Maven as build- and also as library management tool. JUnit as Unit testing framework. Bug checking software like findbug and checkstyle. And most prominently: IDE's like Eclipse, Netbeans, IntelliJ. And even more important: By basing GWT on Java we automatically have statically typed types - allowing all IDE's to use code completion and error checking while you type.&lt;br /&gt;
&lt;br /&gt;
While Java might be strange at some places (anonymous inner types making stuff a bit complicated to read) - it is well worth all cons because of the great ecosystem. No other language I know can deliver that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Big projects - tested code - productive teams&lt;/b&gt;&lt;br /&gt;
If you imagine 10 teams working on a Javascript based fat client it sounds strange. At least to me. I know that Javascript is great. I also know that there are great Javasscript hackers out there. &lt;br /&gt;
&lt;br /&gt;
But my personal experience with Javascript and affiliated languages is that it becomes a mess when more than 1 person works on it. JQuery is great to enhance a html site. But a whole fat client written in Javscript? No way. You have to test your stuff. You want to reuse code. You want to use real tooling. And you don't want to have a loosely coupled mix of server side html technology and javascript + page reloads.&lt;br /&gt;
&lt;br /&gt;
Using GWT you can make your team productive for free. You are automatically use proven tools from the Java world that drive the biggest projects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Once codebase to rule them all...&lt;/b&gt;&lt;br /&gt;
A productivity boost also is the usage of the same language on client and server side. NodeJS and a javascript client for instance. Or - GWT on the client side and Play! on the server side. Play! is a great and agile framework for the development of web applications. The great thing are fast turnarounds, concise error reports and a fully integrated testing stack. If you combine both - Play and GWT you get a really productive experience for your programmers. All is Java. Same tooling everywhere. I outlined an exemplary setup in &lt;a href="http://ars-codia.raphaelbauer.com/2011/10/gwt-project-layout-part-3-integrating.html"&gt;Part 3&lt;/a&gt; of the series.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;... and go "app" mobile&lt;/b&gt;&lt;br /&gt;
By designing a stateful Html client you already have almost everything to get you whole app offline. There is a clearly defined point where the client talks to the server. And even better - you can take that client (including all compiled source, css, html) and repackage it via eg. &lt;a href="http://code.google.com/p/gwt-phonegap/"&gt;gwt-phonegap&lt;/a&gt; and publish it on popular stores. We did this successfully for the Android store and Apple's App store. There are even some great widget libraries that allow you to use widgets that really look "mobile" for your plattform. &lt;a href="http://code.google.com/p/mgwt/"&gt;M-GWT&lt;/a&gt; is an example, but there are others, too.&lt;br /&gt;
&lt;br /&gt;
If you think about what it would cost to maintain two or more codebases (iPhone, Android and a web application) it becomes clear that GWT really really rocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Points to be aware of&lt;/b&gt;&lt;br /&gt;
If you are using a "separate" client and server logic you will lose some productivity that integrated approaches will deliver (RoR, Play!...). You need clearly defined endpoints, you cannot simply use models inside your views. &lt;br /&gt;
&lt;br /&gt;
The good thing is: If you design your app like a service. With the server being just the endpoint to deliver your data (JSON, RCP etc) it will be much easier to test your server and omit spaghetti code. It's a classcial trade-off. But if you want to write a reasonable big application I would want to rely on a nicely tested service.&lt;br /&gt;
&lt;br /&gt;
The other thing to consider is SEO. GWT is javascript. If your site is Javascript your html will be empty and there will be nothing for a search crawler to index. But Google released a &lt;a href="http://code.google.com/web/ajaxcrawling/"&gt;hashtag crawling approach&lt;/a&gt; that solves this. And the cool thing is that Bing supports that approach, too. I wrote about it briefly &lt;a href="http://ars-machina.raphaelbauer.com/2011/06/html5-hashtags-seo-and-next-1000-years.html"&gt;here&lt;/a&gt;. Downside is, that you need a headless browser on your server. You must consider this while planning your app.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GWT cool things&lt;/b&gt;&lt;br /&gt;
A simple listing:&lt;br /&gt;
- Code splitting: GWT automatically splits your code into small pieces that will be loaded automatically&lt;br /&gt;
- Code optimization: GWT optimizes your Javascript code.&lt;br /&gt;
- Debugging: You can debug your code using your favorite Java IDE.&lt;br /&gt;
- Tooling support: Use Java's toolchain (described in more detail above)&lt;br /&gt;
- Great ecosystem: Gin (dependency injection), GWTP (MVP framework), GWTQuery (jQuery clone that's even faser than the original jQuery), resty-gwt for connecting to restful APIs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example projects where GWT rocks&lt;/b&gt;&lt;br /&gt;
GWT in my opinion excels when it comes to "web apps". The definition if a web app is really hard. Think of GMail, think of Google Docs, think of Facebook. Think of LinkedIn. These are all huge sites that do feel more like a Desktop Application than like a bunch of html pages being loaded. You just entered the world of stateless web clients.&lt;br /&gt;
&lt;br /&gt;
Google uses this notion in many of their projects. Pros are:  Great user experience. Faster response times. Great developing experience. Independent of server technology. Rendering outsource to client.&lt;br /&gt;
&lt;br /&gt;
GWT is one of the technologies that is especially great when used in such a scenario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Part 1 already showed you &lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic.html"&gt;a lot of examples&lt;/a&gt; for those kind of web apps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Continue with Part 3 and learn why the future of GWT looks bright.&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_30.html"&gt;http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_30.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-1408310490683262728?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_22.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-5659309576775132356</guid><pubDate>Wed, 07 Dec 2011 10:24:00 +0000</pubDate><atom:updated>2011-12-07T02:29:34.931-08:00</atom:updated><title>GWT and strange gwt-unitCache directory</title><description>You can use GWT using the built in Jetty as webserver. &lt;br /&gt;
&lt;br /&gt;
But you can also combine any webserver, GWT (configured by maven) and the dev code mode. That's what we do - we use Play! as webserver and GWT and it's dev mode on top. I only can recommend the setup.&lt;br /&gt;
&lt;br /&gt;
However, since GWT 2.4 we are getting a strange gwt-unitCache that is generated into our deployment directory. gwt-unitCache contains a lot of files we do not need. It is configurable somehow, but it did not work out for us. Check out &lt;a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=6397"&gt;http://code.google.com/p/google-web-toolkit/issues/detail?id=6397&lt;/a&gt; for more infos.&lt;br /&gt;
&lt;br /&gt;
So one simple solution is to delete the directory after running install.&lt;br /&gt;
&lt;br /&gt;
Using Maven it is really simple:&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/google-web-toolkit/issues/detail?id=6397&lt;br /&gt;
&lt;br /&gt;
That's the plugin config:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;maven-clean-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;2.4.1&amp;lt;/version&amp;gt;&lt;br /&gt;
    &amp;lt;configuration&amp;gt;&lt;br /&gt;
      &amp;lt;filesets&amp;gt;&lt;br /&gt;
        &amp;lt;fileset&amp;gt;&lt;br /&gt;
          &amp;lt;directory&amp;gt;../YOUR_DEPLOYMENT_DIRECTORY&amp;lt;/directory&amp;gt;&lt;br /&gt;
          &amp;lt;includes&amp;gt;&lt;br /&gt;
            &amp;lt;directory&amp;gt;gwt-unitCache/**&amp;lt;/directory&amp;gt;&lt;br /&gt;
          &amp;lt;/includes&amp;gt;&lt;br /&gt;
          &amp;lt;followSymlinks&amp;gt;false&amp;lt;/followSymlinks&amp;gt;&lt;br /&gt;
        &amp;lt;/fileset&amp;gt;&lt;br /&gt;
      &amp;lt;/filesets&amp;gt;&lt;br /&gt;
    &amp;lt;/configuration&amp;gt;&lt;br /&gt;
    &amp;lt;executions&amp;gt;&lt;br /&gt;
      &amp;lt;execution&amp;gt;&lt;br /&gt;
        &amp;lt;id&amp;gt;gwt-unitCache&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;phase&amp;gt;install&amp;lt;/phase&amp;gt;&lt;br /&gt;
        &amp;lt;goals&amp;gt;&lt;br /&gt;
          &amp;lt;goal&amp;gt;clean&amp;lt;/goal&amp;gt;&lt;br /&gt;
        &amp;lt;/goals&amp;gt;&lt;br /&gt;
      &amp;lt;/execution&amp;gt;&lt;br /&gt;
    &amp;lt;/executions&amp;gt;&lt;br /&gt;
  &amp;lt;/plugin&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-5659309576775132356?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/12/gwt-and-strange-gwt-unitcache-directory.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-4663581560256047153</guid><pubDate>Tue, 06 Dec 2011 09:14:00 +0000</pubDate><atom:updated>2012-01-19T05:52:49.609-08:00</atom:updated><title>GWT snipplets: Centering vertically and horizontally</title><description>Sometimes you want to center stuff horizontally and vertically.&lt;br /&gt;
&lt;br /&gt;
This is really simple using GWT's HorizontalPanel and it's Alignment Constants.&lt;br /&gt;
Here is the ui binder based code:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;g:HorizontalPanel width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot;&amp;gt;

&amp;lt;g:cell horizontalAlignment=&amp;quot;ALIGN_CENTER&amp;quot; verticalAlignment=&amp;quot;ALIGN_MIDDLE&amp;quot;&amp;gt;

&amp;lt;g:HTMLPanel&amp;gt;
&amp;lt;p ui:field=&amp;quot;label&amp;quot; class=&amp;quot;{style.text}&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;/g:HTMLPanel&amp;gt;
&amp;lt;/g:cell&amp;gt;


&amp;lt;/g:HorizontalPanel&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-4663581560256047153?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/12/gwt-snipplets-centering-vertically-and.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-5155001916769986994</guid><pubDate>Mon, 05 Dec 2011 07:45:00 +0000</pubDate><atom:updated>2012-02-09T06:40:37.387-08:00</atom:updated><title>Why Google Web Toolkit is a fantastic idea - Part 1: Who is using GWT</title><description>&lt;object width="250" height="40" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="gsSong2842886057" name="gsSong2842886057"&gt;&lt;param name="movie" value="http://grooveshark.com/songWidget.swf" /&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=28428860&amp;style=metal&amp;p=0" /&gt;&lt;object type="application/x-shockwave-flash" data="http://grooveshark.com/songWidget.swf" width="250" height="40"&gt;&lt;param name="wmode" value="window" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=28428860&amp;style=metal&amp;p=0" /&gt;&lt;span&gt;Machine Gun Blues by &lt;a href="http://grooveshark.com/artist/Social+Distortion/1446" title="Social Distortion"&gt;Social Distortion&lt;/a&gt; on Grooveshark&lt;/span&gt;&lt;/object&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;I just left your town, took all your loot, &lt;br /&gt;
bought a pink carnation and a pinstripe suit, &lt;br /&gt;
a hopped-up V8 Ford and some two-tone shoes &lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Social Distortion - Machine Gun Blues&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Intro&lt;/b&gt;&lt;br /&gt;
This series of blogposts will convince you that GWT - Google Web Toolkit is fantastic. It is not only fantastic but is fun to use and will save your company a lot of money.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic.html"&gt;Part 1: Who is using GWT?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_22.html"&gt;Part 2: Use cases for GWT&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic_30.html"&gt;Part 3: The future of GWT&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Who is using GWT?&lt;/b&gt;&lt;br /&gt;
The first question when seeing a relatively new technology is: Who is using it? Is it stable? Can my new project be made with GWT? Is GWT a good long term investment?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GWT at Google&lt;/b&gt;&lt;br /&gt;
GWT is developed by Google. So let's check which projects at Google are using GWT:&lt;br /&gt;
&lt;br /&gt;
AdSense and AdWords: &lt;a href="http://www.google.com/adsense/"&gt;http://www.google.com/adsense/&lt;/a&gt;&lt;br /&gt;
Just to be clear: Google is making almost all of its profits from AdSense / AdWords. And they are using GWT for their single most important application. Means there is at least some trust in GWT's capabilities - to be modest ;)&lt;br /&gt;
&lt;br /&gt;
Google Offers: &lt;a href="https://www.google.com/offers"&gt;https://www.google.com/offers&lt;/a&gt;&lt;br /&gt;
Google Currents Producer: &lt;a href="https://www.google.com/producer"&gt;https://www.google.com/producer&lt;/a&gt;&lt;br /&gt;
Google Flights: &lt;a href="http://www.google.com/flights"&gt;http://www.google.com/flights&lt;/a&gt;&lt;br /&gt;
Google Hotelfinder &lt;a href="http://www.google.com/hotelfinder"&gt;http://www.google.com/hotelfinder&lt;/a&gt;&lt;br /&gt;
Google Moderator: &lt;a href="http://www.google.com/moderator/"&gt;http://www.google.com/moderator/&lt;/a&gt;&lt;br /&gt;
Google Groups: &lt;a href="http://www.google.com/groups"&gt;http://www.google.com/groups&lt;/a&gt;&lt;br /&gt;
Google Takeout:   &lt;a href="https://www.google.com/takeout/"&gt;https://www.google.com/takeout/&lt;/a&gt;&lt;br /&gt;
Google Pagespeed:  &lt;a href="https://developers.google.com/pagespeed/"&gt;https://developers.google.com/pagespeed/&lt;/a&gt;&lt;br /&gt;
Google WebFonts:  &lt;a href="http://www.google.com/webfonts"&gt;http://www.google.com/webfonts&lt;/a&gt;&lt;br /&gt;
Google Blooger Admin:  &lt;a href="http://www.google.com/blogger"&gt;http://www.google.com/blogger&lt;/a&gt;&lt;br /&gt;
Google Code Api Project: &lt;a href="https://code.google.com/apis/console"&gt;https://code.google.com/apis/console&lt;/a&gt;&lt;br /&gt;
Google Apps Script (for UI) &lt;br /&gt;
Google Apps Script Editor&lt;br /&gt;
Google Fusiontables: &lt;a href="https://www.google.com/fusiontables/DataSource?dsrcid=2049253"&gt;https://www.google.com/fusiontables/DataSource?dsrcid=2049253&lt;/a&gt;&lt;br /&gt;
Google Checkout Store Gadget (in Chrome WebStore)&lt;br /&gt;
Google Webmaster Tools: &lt;a href="https://www.google.com/webmasters/tools/home"&gt;https://www.google.com/webmasters/tools/home&lt;/a&gt;&lt;br /&gt;
Orkut (Google's Brazilian Social Net): &lt;a href="http://www.orkut.com/"&gt;http://www.orkut.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GWT abroad&lt;/b&gt;&lt;br /&gt;
There are also a lot of projects and companies that began using GWT. Some of them:&lt;br /&gt;
PlayN - The basis of Angry Birds for Chrome - &lt;a href="http://code.google.com/p/playn/"&gt;http://code.google.com/p/playn/&lt;/a&gt;&lt;br /&gt;
Gerrit: http://code.google.com/p/gerrit&lt;br /&gt;
Google Wave. "follow" popup in Google Buzz (discontinued)&lt;br /&gt;
&lt;a href="https://www.rara.com/ "&gt;https://www.rara.com/ &lt;/a&gt;&lt;br /&gt;
JBoss JBPM Console: jbpm console.&lt;br /&gt;
&lt;a href="http://www.ovirt.org/"&gt;http://www.ovirt.org/&lt;/a&gt;&lt;br /&gt;
Angry Birds Chrome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;
There are two interesting things.&lt;br /&gt;
1. GWT is used A LOT by Google. And this is for sure only the beginning. GWT is here to stay for a long time. And GWT works for projects of any size and for projects with any priority.&lt;br /&gt;
&lt;br /&gt;
2. You do not recognize GWT. GWT is invisible. And that is a strong point and a thing to understand when talking about GWT. You can layout, design, do whatever you want to do with your GWT app. It's just a toolkit. Well. A great toolkit to be precise. But think of Google Flights or Google Deals - don't they just look great? Well - I do think so.&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/4528430083629090473-5155001916769986994?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/12/why-google-web-toolkit-is-fantastic.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-6344136714589556351</guid><pubDate>Thu, 17 Nov 2011 07:46:00 +0000</pubDate><atom:updated>2011-12-07T02:23:50.916-08:00</atom:updated><title>URL encoding howto</title><description>Just recently I came across the question how to represent the following url correctly:&lt;br /&gt;
http://mydomain/user@otherdomain/bucket of tears (@ and spaces not yet encoded).&lt;br /&gt;
&lt;br /&gt;
I had a case where a 3rd party library translated this into&lt;br /&gt;
http://mydomain/user@otherdomain/bucket+of+tears&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But wasn't replacing space with + -- used for query parameters? After some investigation I found out that the correct path is: http://mydomain/user@otherdomain/bucket%20of%20tears&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the way I found two great posts you should not miss if you do anything with URLs:&lt;br /&gt;
Stéphane Épardaud from Lunatech: &lt;a href="http://www.lunatech-research.com/archives/2009/02/03/what-every-web-developer-must-know-about-url-encoding"&gt;http://www.lunatech-research.com/archives/2009/02/03/what-every-web-developer-must-know-about-url-encoding&lt;/a&gt;&lt;br /&gt;
KLORTHO: &lt;a href="http://sinophibe.blogspot.com/2011/07/proper-url-encoding-and-decoding.html"&gt;http://sinophibe.blogspot.com/2011/07/proper-url-encoding-and-decoding.html&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-6344136714589556351?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/11/url-encoding-howto.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-6196300494361853175</guid><pubDate>Tue, 15 Nov 2011 12:20:00 +0000</pubDate><atom:updated>2011-11-15T04:35:08.424-08:00</atom:updated><title>How to write a custom Callback Filter for RestyGWT</title><description>RestyGWT [1] is one of the coolest libraries when you want to connect a GWT client with a RestFul interface.&lt;br /&gt;
&lt;br /&gt;
This post will explain how to implement your own dispatcher and callback as RestyGWT filter.&lt;br /&gt;
&lt;br /&gt;
First of all: Why would you want to implement your own dispatcher and callback?&lt;br /&gt;
- Do caching on the client side - only execute real calls to the server if the result is not cached.&lt;br /&gt;
- Do automated transmitting of XSRF tokens &lt;br /&gt;
- Do handle security errors - eg forcing a redirect to a login url when RestyGWT gets a Authentification error.&lt;br /&gt;
&lt;br /&gt;
So there are a lot of reasons why it makes sense to put some logic in between sending and contacting the server. That's what the dispatcher is supposed to do.&lt;br /&gt;
&lt;br /&gt;
RestyGWT allows us to apply a filter chain (so you can apply more than one "check" to the dispatcher) what is pretty cool. Using a filter you can chain a XSRF token sender, caching and other filters. &lt;br /&gt;
&lt;br /&gt;
In my case I wanted to make sure my GWT client gets redirected to "/login" when a 403 status response is received. Theoretically, You can do the checking in the MethodCallback, but a custo callback is better as it allows you to use one central position to do so.&lt;br /&gt;
&lt;br /&gt;
For that we need three things:&lt;br /&gt;
1. A custom methodcallback, that checks for a 403 (Forbidden).&lt;br /&gt;
2. A filter that sets the callback&lt;br /&gt;
3. A bit of configuration (done via GIN)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. The ForbiddenDispatcherCallback looks like that:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;
public class ForbiddenDispatcherCallback implements RequestCallback {
 protected RequestCallback requestCallback;

 public ForbiddenDispatcherCallback(Method method) {

  this.requestCallback = method.builder.getCallback();
 }

 @Override
 public void onResponseReceived(Request request, Response response) {
  
  if (response.getStatusCode() == Response.SC_FORBIDDEN) {
   
   //make a hard redirect to login page
   Window.Location.assign(&amp;quot;/login&amp;quot;);
   
  } else {
   
   requestCallback.onResponseReceived(request, response);
   
  }

 }

 @Override
 public void onError(Request request, Throwable exception) {

  requestCallback.onError(request, exception);

 }

}


&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. The The dispatcher filter simply continues the chain, but adds our ForbiddenDispatcherCallback in between.&lt;/b&gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;pre class="brush:xml"&gt;
public class ForbiddenDispatcherFilter implements DispatcherFilter {

    
 @Override
 public boolean filter(Method method, RequestBuilder builder) {
  
  builder.setCallback(new ForbiddenDispatcherCallback(method));

  return true;
 }

}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Configuration is really simple if you use Gin. Important is:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;      final FilterawareDispatcher dispatcher = new DefaultFilterawareDispatcher(); 
        
        restServiceProxy.setDispatcher(dispatcher);   
        dispatcher.addFilter(new ForbiddenDispatcherFilter());

&lt;/pre&gt;&lt;br /&gt;
The complete configuration looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;public class ServiceModule extends AbstractGinModule {

    String URL_PREFIX_RUNNING_ON_SERVER = "/api/v1/";

    @Override
    protected void configure() {
    }

    @Provides
    @Singleton
    public ApiService provideApiService() {

        ApiService apiService = GWT.create(ApiService.class);
        RestServiceProxy restServiceProxy = ((RestServiceProxy) apiService); 
   
        restServiceProxy.setResource(new Resource(URL_PREFIX_RUNNING_ON_SERVER));
        
        final FilterawareDispatcher dispatcher = new DefaultFilterawareDispatcher(); 
        
        restServiceProxy.setDispatcher(dispatcher);   
        dispatcher.addFilter(new ForbiddenDispatcherFilter());

        
        return apiService;
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And that's it. This we just wrote a filter for RestyGWT that does a hard redirect when it receives a 403. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Thanks to Hiram and the RestyGWT committers. And pansen for providing the filter chaining feature :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="https://github.com/chirino/resty-gwt"&gt;https://github.com/chirino/resty-gwt&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/4528430083629090473-6196300494361853175?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/11/how-to-write-custom-callback-filter-for.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-1808540281695745149</guid><pubDate>Fri, 11 Nov 2011 10:11:00 +0000</pubDate><atom:updated>2011-11-11T03:40:47.001-08:00</atom:updated><title>How to implement a secure authentification system for Play on App Engine</title><description>The problem:&lt;br /&gt;
A lot of our apps are running on Google App Engine (GAE). Unfortunately GAE only supports https via their appspot domain [1]. That will change in the future, but right now it is not possible plus it will be expensive once it's in place. &lt;br /&gt;
&lt;br /&gt;
In practise - that means that when a user comes to http://www.sciplanet.com/login and wants to login - all password stuff goes over the line unencrypted. That's totally not acceptable.&lt;br /&gt;
&lt;br /&gt;
So let's fix that.&lt;br /&gt;
A little constraint: The user should (almost) always use and see in his browser bar http://www.scisurfer.com . For marketing issues, because of the brand. Because of the short name. Telling all users to use https://sciplanet-hq.appspot.com would be not that great idea I guess.&lt;br /&gt;
&lt;br /&gt;
So what we are doing is:&lt;br /&gt;
- When a user wants to login at scisurfer.com/login she gets redirected to https://sciplanet-hq.appspot.com/login that handles everything in a secure way. &lt;br /&gt;
- A session is granted for https://sciplanet-hq.appspot.com&lt;br /&gt;
&lt;br /&gt;
That's nothing special apart from the not magic redirect.&lt;br /&gt;
&lt;br /&gt;
The next thing to solve is to transfer the session from http://sciplanet-hq.appspot.com to http://www.sciplanet.com . We cannot simply hack the cookie because of security constraints implemented by browsers (what is a good thing by the way).&lt;br /&gt;
So the solution is: When we are at https://sciplanet-hq.appspot.com/login and everything is fine we are storing a token in memcache that lives for one minute. We then redirect to http://www.sciplanet.com/login/token_auth?token=TOKEN . If the token is valid for the user and in memcache we put the user into the session and the session is authentificated on http://www.sciplanet.com .&lt;br /&gt;
&lt;br /&gt;
All api calls, and everything else on http://www.sciplanet.com now works as expected, but no password was ever transmitted over the line unencrypted. &lt;a href="http://en.wikipedia.org/wiki/Mission_Accomplished"&gt;Mission accomplished&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/en/f/ff/Bush_mission_accomplished.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="276" width="282" src="http://upload.wikimedia.org/wikipedia/en/f/ff/Bush_mission_accomplished.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
We are talking by the way about signed user sessions of Play. &lt;br /&gt;
&lt;br /&gt;
I extended the library I am maintaining at &lt;a href="http://code.google.com/p/play-siena-user/"&gt;http://code.google.com/p/play-siena-user/&lt;/a&gt; with the necessary code.&lt;br /&gt;
&lt;br /&gt;
Simply put the following two variables into your application.conf:&lt;br /&gt;
playsienauser.regularUrl=http://www.sciplanet.com&lt;br /&gt;
playsienauser.secureUrl=https://sciplanet-hq.appspot.com&lt;br /&gt;
&lt;br /&gt;
and all session signing on both domains is done for you :)&lt;br /&gt;
&lt;br /&gt;
Feedback always appreciated! Drop me a line :)&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://code.google.com/appengine/kb/general.html#httpsapps"&gt;http://code.google.com/appengine/kb/general.html#httpsapps&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-1808540281695745149?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/11/how-to-implement-secure.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-995897510508048560</guid><pubDate>Wed, 19 Oct 2011 08:38:00 +0000</pubDate><atom:updated>2011-10-19T01:38:06.929-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rest</category><category domain="http://www.blogger.com/atom/ns#">gwt</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>GWT project layout - Part 3: Integrating GWT frontend and restful Play backend</title><description>Part 3 extends the setup described in Part 2 (Maven and GWT) [3] to the server side.&lt;br /&gt;
&lt;br /&gt;
We are following the best-practise of using Maven for building our GWT application. Maven is really cool, because it allows for:&lt;br /&gt;
- simple management of libraries&lt;br /&gt;
- simple upgrading of libraries / switching to a new GWT version&lt;br /&gt;
- simple testing of application&lt;br /&gt;
- nice integration into continuous build process (jenkins and such)&lt;br /&gt;
&lt;br /&gt;
Nice. Now we got a GWT client running on the client side. But what about the server side?&lt;br /&gt;
GWT offers 2 RPC mechanisms that are based on Java servlets. While these RPC mechanisms are great in principle I do not like them because they are 100% proprietary [1].&lt;br /&gt;
&lt;br /&gt;
When it comes to http and communication the coolest non-proprietary "technology" is REST. Well - REST IS http I guess ;) So why not use POST GET DELETE PUT and a json generation machine on the server and a rest-eating GWT client to exchange data?&lt;br /&gt;
&lt;br /&gt;
Killer combination if you ask me. There is a great REST library for GWT called resty-gwt [2]. It makes parsing and defining REST endpoints a super-simple task.&lt;br /&gt;
&lt;br /&gt;
I was looking around quite a while for finding a suitable server technology. I simply did not like Java servlets and J2EE. If you have to restart your server to see the actual changes you just implemented you end up being not productive. GWT's development mode is quite fast, but then always having to restart your server? Nay.&lt;br /&gt;
&lt;br /&gt;
I tried a lot of backend technologies and stacks (Rails, Grails, Roo, etcpp), but I ended up using Play! Play is a mainly Java framework, so you can use your favorite IDE to write code. It is stateless - meaning you can change code, hit reload and see the new results - fast turnarounds - yea! And almost all of the framework is statically typed (it's Java after all). Plus it features a nice mechanism to define routes and convert objects into Json representations. Nice.&lt;br /&gt;
&lt;br /&gt;
Key benefits of Play are:&lt;br /&gt;
- Play has superfast server turn- arounds. Change something, reload and boom you can continue developing. Yea!&lt;br /&gt;
- Simple definition of restful and human readable routes&lt;br /&gt;
- Simple conversion of Objects to Json&lt;br /&gt;
&lt;br /&gt;
General benefits of the GWT + REST + Play approach:&lt;br /&gt;
- Simple switch of frontend and backend technology. GWT will be dead at some point, Play will be dead at some point, but http will stick around for some time to come...&lt;br /&gt;
- You design your application as a service, what is incredibly useful when you want to test or extend your application. It is just way cleaner having nice url schemes to identify and alter data (than eg RPCs).&lt;br /&gt;
&lt;br /&gt;
I recently held a presentation about the concept. And I also implemented a fully working demo project.&lt;br /&gt;
&lt;br /&gt;
Check it out and free to try it and send feedback :)&lt;br /&gt;
&lt;br /&gt;
Presentation is at: &lt;a href="http://goo.gl/E1KJ8 "&gt;http://goo.gl/E1KJ8 &lt;/a&gt;&lt;br /&gt;
Demo project is at: &lt;a href="http://goo.gl/XeUEE "&gt;http://goo.gl/XeUEE &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html"&gt;http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="https://github.com/chirino/resty-gwt"&gt;https://github.com/chirino/resty-gwt&lt;/a&gt;&lt;br /&gt;
[3] &lt;a href="http://ars-codia.raphaelbauer.com/2011/01/gwt-project-layout-part-2-large.html"&gt;http://ars-codia.raphaelbauer.com/2011/01/gwt-project-layout-part-2-large.html&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-995897510508048560?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/10/gwt-project-layout-part-3-integrating.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-6312041450693294203</guid><pubDate>Mon, 17 Oct 2011 15:36:00 +0000</pubDate><atom:updated>2011-10-17T08:49:14.011-07:00</atom:updated><title>Styling GWT's Splitlayoutpanel</title><description>Styling GWT's SplitLayoutPanel is quite simple using the UiBinder facility.&lt;br /&gt;
&lt;br /&gt;
In your ui.xml simply set an @external .gwt-SplitLayoutPanel-HDragger and style it accordingly. @external turns off selector obfuscation, so that  .gwt-SplitLayoutPanel-HDragger stays .gwt-SplitLayoutPanel-HDragger.&lt;br /&gt;
&lt;br /&gt;
As the Splitpanel's properties are sometimes hardcoded we need  !important.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ui:style&amp;gt;&lt;br /&gt;
@external .gwt-SplitLayoutPanel-HDragger;&lt;br /&gt;
&lt;br /&gt;
.gwt-SplitLayoutPanel-HDragger { &lt;br /&gt;
width: 5px !important;&lt;br /&gt;
background: grey;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/ui:style&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-6312041450693294203?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/10/styling-gwts-splitlayoutpanel.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-718527498854869261</guid><pubDate>Wed, 12 Oct 2011 15:35:00 +0000</pubDate><atom:updated>2011-10-19T04:06:33.580-07:00</atom:updated><title>GWT and invisible LayoutPanels</title><description>Sometimes these funny LayoutPanels are invisible. &lt;br /&gt;
&lt;br /&gt;
Just stumbled upon that several times while porting old code.  &lt;br /&gt;
The solution is simple: LayoutPanels need RequiresResize in their parent widgets. If one widget in the hierarchy does not implement it properly you'll get strange results... &lt;br /&gt;
&lt;br /&gt;
For instance invisible or only partly visible LayoutPanel. LayoutPanel under a SimplePanel is such a case. &lt;br /&gt;
LayoutPanel under LayoutPanel works just fine.  &lt;br /&gt;
&lt;br /&gt;
The same is true for a LayoutPanel under a RootPanel - does not work. LayoutPanel under a RootLayoutPanel works.  &lt;br /&gt;
&lt;br /&gt;
Thanks to Hilbrand Bouwkamp for pointing that out: &lt;a href="http://stackoverflow.com/questions/6740617/gwt-layoutpanel-size"&gt;http://stackoverflow.com/questions/6740617/gwt-layoutpanel-size&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-718527498854869261?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/10/gwt-and-invisible-layoutpanels.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-1746032186351623233</guid><pubDate>Mon, 22 Aug 2011 14:02:00 +0000</pubDate><atom:updated>2011-08-22T07:02:29.189-07:00</atom:updated><title>Android cheat sheet</title><description>Storing log files: &lt;br /&gt;
./adb logcat -d &gt; myfile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Starting emulator with bigger partition size: &lt;br /&gt;
./emulator -avd testing -partition-size 1000 -scale 0.8&lt;br /&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/4528430083629090473-1746032186351623233?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/08/android-cheat-sheet.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-4789311858970475445</guid><pubDate>Mon, 22 Aug 2011 13:36:00 +0000</pubDate><atom:updated>2011-08-22T06:36:25.191-07:00</atom:updated><title>Android emulator partition size</title><description>When you need more partition size this command line comes to the rescue:&lt;br /&gt;
&lt;br /&gt;
./emulator -avd testing -partition-size 1000 -scale 0.8&lt;br /&gt;
&lt;br /&gt;
gives you 1 gig of size for the app you want to test...&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-4789311858970475445?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/08/android-emulator-partition-size.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-1123544653798423589</guid><pubDate>Tue, 16 Aug 2011 14:21:00 +0000</pubDate><atom:updated>2011-08-16T07:21:28.653-07:00</atom:updated><title>Wow - iOS 5 gets garbage collection</title><description>Now this is really interesting.&lt;br /&gt;
&lt;br /&gt;
Objective C aka iOS aka Mac OS X gets a garbage collection (sort of). They call it Automatic Reference Counting - and it's driven by the compiler [2]. Cool. LLVM seems to drive this change and I can only welcome it :)&lt;br /&gt;
&lt;br /&gt;
Managing references yourself is great. Theoretically. But in reality it's number one reason for bugs and slow performance of your apps. The compiler / Garbage collector can do that way better than you in almost all cases.&lt;br /&gt;
&lt;br /&gt;
Apple says that:&lt;br /&gt;
Automatic Reference Counting&lt;br /&gt;
&lt;br /&gt;
Automatic Reference Counting (ARC) for Objective-C makes memory management the job of the compiler. By enabling ARC with the new Apple LLVM compiler, you will never need to type retain or release again, dramatically simplifying the development process, while reducing crashes and memory leaks. The compiler has a complete understanding of your objects, and releases each object the instant it is no longer used, so apps run as fast as ever, with predictable, smooth performance. [1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://developer.apple.com/technologies/ios5/"&gt;http://developer.apple.com/technologies/ios5/&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Reference_counting"&gt;http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Reference_counting&lt;/a&gt;&lt;br /&gt;
&lt;br /&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/4528430083629090473-1123544653798423589?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/08/wow-ios-5-gets-garbage-collection.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-4765037252804827068</guid><pubDate>Wed, 27 Jul 2011 14:55:00 +0000</pubDate><atom:updated>2011-07-28T01:24:12.848-07:00</atom:updated><title>Mac Safari 5.0.5 does not work with GWT developer plugin</title><description>&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tm6cqpJvsT4?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/tm6cqpJvsT4?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
In short: Aaaaaahhhhhhhh!!!!!!!!!!!&lt;br /&gt;
&lt;br /&gt;
Seems that the latest Safari update is incompatible with GWT developer plugin. Sure - there is still Firefox and Chrome. But Chrome is too slow and therefore absolutely unproductive - and Firefox has no Webkit engine. Especially if you are working on a Mac and a lot in mobile (often webkit) development you are f*****.&lt;br /&gt;
&lt;br /&gt;
Personally - I cannot really understand why Google's GWT team did not tell "us" this in advance. Plus - I thought that all Googlers are using Macs - so - aren't they hit by this equally hard?&lt;br /&gt;
If so many teams at Google are using GWT internally - isn't that a huge problem for Google?&lt;br /&gt;
&lt;br /&gt;
Or - is GWT in decline and nobody gives a damn if a popular browser on a popular platform is supported?&lt;br /&gt;
&lt;br /&gt;
I don't know for sure. Activity around integration of mobile features let me think that GWT is under active development. But again - if you are developing for mobile platforms and want to have a more or less reliable dev platform you need Safari. And Safari dev support is broken for now - strange.&lt;br /&gt;
&lt;br /&gt;
There is a way round as described in [1].&lt;br /&gt;
Grab an old version of Safari 4 [2] or 5 [3] - grab Pacifist [4] and simply extract Safari.app to a location you like. It works like a charm. &lt;br /&gt;
&lt;br /&gt;
But that is only a workaround. Be sure not to use the old Safari in the real world as it contains severe security problems.&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://groups.google.com/group/google-web-toolkit/browse_thread/thread/b8827956a9b13bfb"&gt;http://groups.google.com/group/google-web-toolkit/browse_thread/thread/b8827956a9b13bfb&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="http://support.apple.com/downloads/Safari_4_0_3"&gt;http://support.apple.com/downloads/Safari_4_0_3&lt;/a&gt;&lt;br /&gt;
[3] &lt;a href="http://appldnld.apple.com.edgesuite.net/content.info.apple.com/Safari5/041-0564.20110413.Fi9pb/Safari5.0.5SnowLeopard.dmg"&gt;http://appldnld.apple.com.edgesuite.net/content.info.apple.com/Safari5/041-0564.20110413.Fi9pb/Safari5.0.5SnowLeopard.dmg&lt;/a&gt;&lt;br /&gt;
[4] &lt;a href="http://support.apple.com/downloads/Safari_4_0_3"&gt;http://support.apple.com/downloads/Safari_4_0_3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-4765037252804827068?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/07/mac-safari-505-does-not-work-with-gwt.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-108806635497221209</guid><pubDate>Tue, 26 Jul 2011 10:32:00 +0000</pubDate><atom:updated>2011-07-26T03:38:35.767-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gae</category><title>Backups of Google App Engine Data</title><description>First of all the following advice only works for data stored as entities in the gae datastore. It does not work for data stored in the blobstore [1].&lt;br /&gt;
&lt;br /&gt;
First of all you need to do two things:&lt;br /&gt;
1. Download and install the latest GAE Python SDK (YES - even if you are using GO or Java).&lt;br /&gt;
2. Make sure you have a handler that provides the remote_api as endpoint (A servlet in web.xml in java called com.google.apphosting.utils.remoteapi.RemoteApiServlet).&lt;br /&gt;
&lt;br /&gt;
Then you are ready to download your data.&lt;br /&gt;
A full dump / restore as (as far as I can tell) proprietary sql goes like this:&lt;br /&gt;
&lt;pre class="brush:bash"&gt;appcfg.py download_data --filename=FULLDATA.sqllite --url=http://liveum-server.appspot.com/remote_api
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class="brush:bash"&gt;appcfg.py upload_data --filename=FULLDATA.sqllite --url=http://liveum-server.appspot.com/remote_api
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
But - at some point you want to change data, so it makes sense to backup and import data as yaml / csv. That's also easy to accomplish.&lt;br /&gt;
&lt;br /&gt;
First of all you have to generate a definition file for your entities.&lt;br /&gt;
&lt;pre class="brush:bash"&gt;appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url=http://liveum-server.appspot.com/remote_api
&lt;/pre&gt;&lt;br /&gt;
This generates a file called bulkloader.yaml that contains all necessary information to download / upload and transform it from / to a format you can save on disk.&lt;br /&gt;
&lt;br /&gt;
In the generated bulkloader.yaml you can find a lot of "TODO"s. Make sure to correct them. Mainly by selecting "csv or "yaml" as connctor.&lt;br /&gt;
&lt;br /&gt;
If something is wrong the command line tool will tell you :)&lt;br /&gt;
&lt;br /&gt;
Downloading and uploading is then as simple as:&lt;br /&gt;
&lt;br /&gt;
Downloading:&lt;br /&gt;
&lt;pre class="brush:bash"&gt;appcfg.py download_data --application=MY_APP_ID --kind=MY_KIND --url=http://MY_URL.appspot.com/remote_api --filename=MY_FILENAME --config_file=bulkloader.yaml
&lt;/pre&gt;Uploading&lt;br /&gt;
&lt;pre class="brush:bash"&gt;appcfg.py upload_data --application=MY_APP_UD --url=http://MY_URL.appspot.com/remote_api --filename=MY_FILENAME --config_file=bulkloader.yaml
&lt;/pre&gt;&lt;br /&gt;
Please note that you have to specify which Kind (entity type) you want to backup. So - make sure to iterate over all you entity types using a custom script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That's it... You can find more at Google's tutorial [2]&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://stackoverflow.com/questions/2593756/is-there-a-way-to-backup-everything-in-an-app-engine-blobstore"&gt;http://stackoverflow.com/questions/2593756/is-there-a-way-to-backup-everything-in-an-app-engine-blobstore&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="http://code.google.com/appengine/docs/python/tools/uploadingdata.html"&gt;http://code.google.com/appengine/docs/python/tools/uploadingdata.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-108806635497221209?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/07/backups-of-google-app-engine-data.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-3663511961736442548</guid><pubDate>Thu, 14 Jul 2011 11:02:00 +0000</pubDate><atom:updated>2011-07-14T04:02:51.321-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">play framework</category><title>Play framework selenium tests and Result of expression 'this.getCurrentWindow' [undefined] is not a function.</title><description>I am currently checking out Play Framework, and so far my experiences are 100% positive. Finally a rapid web application development platform worth the name.&lt;br /&gt;
&lt;br /&gt;
After trying out the (excellent) test support I frequently ran into the following exception when running selenium tests:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:bash"&gt;Result of expression 'this.getCurrentWindow' [undefined] is not a function.
&lt;/pre&gt;&lt;br /&gt;
The funny thing was that selenium tests ran sometimes. Sometimes not. Sometimes they failed.&lt;br /&gt;
&lt;br /&gt;
And the problem was:&lt;br /&gt;
I used http://127.0.0.1:9000/@tests instead of http://localhost:9000/@tests&lt;br /&gt;
&lt;br /&gt;
So. Using localhost works 100% (and play also tells you to use localhost on the command line). My failure :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-3663511961736442548?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/07/play-framework-selenium-tests-and.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4528430083629090473.post-8561976072359945918</guid><pubDate>Wed, 06 Jul 2011 12:57:00 +0000</pubDate><atom:updated>2011-07-06T06:08:02.447-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mercurial</category><category domain="http://www.blogger.com/atom/ns#">version control</category><category domain="http://www.blogger.com/atom/ns#">branching</category><title>Mercurial branching workflow</title><description>&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gYISxUsDqoA?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/gYISxUsDqoA?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Todd:&lt;/b&gt; What's up?&lt;br /&gt;
&lt;i&gt;silence&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Todd:&lt;/b&gt; No one?&lt;br /&gt;
&lt;i&gt;silence&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Todd:&lt;/b&gt; Self five for the big dog!&lt;br /&gt;
(idea stolen from nicog)&lt;br /&gt;
&lt;br /&gt;
Some time ago I blogged about a great working git branching workflow [1 and 2]. I've used this workflow for a larger project for almost 1 year now. And I am very happy. It just works.&lt;br /&gt;
&lt;br /&gt;
The basics:&lt;br /&gt;
- Have a master branch (master)&lt;br /&gt;
- Have a develop branch (develop / or in mercurial maybe better: default)&lt;br /&gt;
- Have feature branches (feature-*)&lt;br /&gt;
&lt;br /&gt;
Worflow:&lt;br /&gt;
- Features branches branch from develop and merged back into develop&lt;br /&gt;
- The develop branch is merged back into master at a given time (eg end of a sprit)&lt;br /&gt;
&lt;br /&gt;
Please check out [2] for details.&lt;br /&gt;
&lt;br /&gt;
Right now I am starting a new project and our new DVCS will be mercurial. I don't want to go into the details - but it will be mercurial. Period. In fact I don't care. Both mercurial and git are super capable. They are great and just so much better than every non-DVCS.&lt;br /&gt;
&lt;br /&gt;
Ok. So let's see how to convert that workflow to mercurial.&lt;br /&gt;
&lt;br /&gt;
First of all I am going to use so called mercurial named branches. No. You don't have to clone your repository to another directory to branch. Many people say that - but it is not true. You can easily switch inplace. And that is everything you need to know. &lt;br /&gt;
&lt;br /&gt;
My cheatsheet:&lt;br /&gt;
&lt;br /&gt;
Basics of inplace namend branches (nothing special in fact):&lt;br /&gt;
&lt;pre class="brush:bash"&gt;# list branches:
hg branches
# create new branch locally
hg branch BRANCHNAME
# dont forget to commit something before pushing
hg commit -m"commitmessage"
# then you want to publish your branch so that your colleagues can work and see 
# your great branch
hg push --new-branch
# and your branch is online
&lt;/pre&gt;&lt;br /&gt;
Merging your branches:&lt;br /&gt;
&lt;pre class="brush:bash"&gt;# get another branch
hg up master
# and now merge your funny changes
hg merge FEATURE_BRANCH_NAME
# and commit your stuff
hg commit -m"my funny merge"
# and push your changes
hg push
&lt;/pre&gt;&lt;br /&gt;
Cleaning up after your:&lt;br /&gt;
&lt;pre class="brush:bash"&gt;# change to old branch
hg up -C MY_OLD_FEATURE
# mark it as deleted
hg commit --close-branch -m 'close branch - not longer needed'
# push changes to your "central" repository (bitbucket eg)
hg push  # the branch will not longer be listed there
&lt;/pre&gt;&lt;br /&gt;
More on cleaning:&lt;br /&gt;
&lt;a href="http://mercurial.selenic.com/wiki/PruningDeadBranches"&gt;http://mercurial.selenic.com/wiki/PruningDeadBranches&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href="http://ars-codia.raphaelbauer.com/2011/01/git-branching-workflow.html"&gt;http://ars-codia.raphaelbauer.com/2011/01/git-branching-workflow.html&lt;/a&gt;&lt;br /&gt;
[2] &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;http://nvie.com/posts/a-successful-git-branching-model/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4528430083629090473-8561976072359945918?l=ars-codia.raphaelbauer.com' alt='' /&gt;&lt;/div&gt;</description><link>http://ars-codia.raphaelbauer.com/2011/07/mercurial-branching-workflow.html</link><author>noreply@blogger.com (Raphael)</author><thr:total>0</thr:total></item></channel></rss>

