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

<channel>
	<title>try {} catch () &#187; GWT</title>
	<atom:link href="http://blog.gerardin.info/archives/tag/gwt/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.gerardin.info</link>
	<description>Java, Agile, the Web and other nice things</description>
	<lastBuildDate>Tue, 14 Jun 2011 09:48:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>GWT Designer now available for free!</title>
		<link>http://blog.gerardin.info/archives/754</link>
		<comments>http://blog.gerardin.info/archives/754#comments</comments>
		<pubDate>Tue, 21 Sep 2010 10:50:52 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[designer]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[instantiations]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=754</guid>
		<description><![CDATA[In case you missed it, Google announced last week that the tools from the rcently acquired company Instantiations were now available for free! This is a great news because it includes GWT Designer, the famous (and only so far) graphical designer for GWT&#8230; It&#8217;s the perfect complement to the Google plugin for Eclipse. Google Web [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gerardin.info/wp-content/uploads/2009/04/gwt-logo.png" class="liimagelink"><img class="alignleft size-full wp-image-140" style="border: 0pt none; margin: 8px;" title="Logo GWT" src="http://blog.gerardin.info/wp-content/uploads/2009/04/gwt-logo.png" alt="" width="100" height="100" /></a>In case you missed it, Google announced last week that the tools from the rcently acquired company Instantiations were now available for free!</p>
<p>This is a great news because it includes GWT Designer, the famous (and only so far) graphical designer for GWT&#8230; It&#8217;s the perfect complement to the Google plugin for Eclipse.</p>
<p><a href="http://googlewebtoolkit.blogspot.com/2010/09/google-relaunches-instantiations.html" class="liexternal">Google Web Toolkit Blog: Google Relaunches Instantiations Developer Tools &#8211; Now Available for Free</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/754/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Slides from my GWT2 presentation at YaJUG</title>
		<link>http://blog.gerardin.info/archives/734</link>
		<comments>http://blog.gerardin.info/archives/734#comments</comments>
		<pubDate>Sun, 16 May 2010 05:54:52 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[GWT 2.0]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=734</guid>
		<description><![CDATA[YaJUG gwt2 View more presentations from Olivier Gérardin.]]></description>
			<content:encoded><![CDATA[<div style="width:425px" id="__ss_4113542"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/ogerardin/ya-jug-gwt2" title="Ya jug gwt2" class="liexternal">YaJUG gwt2</a></strong><object id="__sse4113542" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=yajuggwt2-100516004958-phpapp01&#038;stripped_title=ya-jug-gwt2" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4113542" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=yajuggwt2-100516004958-phpapp01&#038;stripped_title=ya-jug-gwt2" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/" class="liexternal">presentations</a> from <a href="http://www.slideshare.net/ogerardin" class="liexternal">Olivier Gérardin</a>.</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/734/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GWT: using JSON as history token?</title>
		<link>http://blog.gerardin.info/archives/725</link>
		<comments>http://blog.gerardin.info/archives/725#comments</comments>
		<pubDate>Fri, 09 Apr 2010 18:01:54 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=725</guid>
		<description><![CDATA[As you might know, GWT provides a handy and elegant mechanism to manage back and forward buttons (and bookmarking) through the use of the &#8220;anchor&#8221; part of the URL, that is the part after the # sign. Basically, whatever you put after the # will not trigger a page reload, but can be intercepted by [...]]]></description>
			<content:encoded><![CDATA[<p>As you might know, GWT provides a handy and elegant mechanism to manage back and forward buttons (and bookmarking) through the use of the &#8220;anchor&#8221; part of the URL, that is the part after the # sign. Basically, whatever you put after the # will not trigger a page reload, but can be intercepted by JavaScript.</p>
<p>Using it in GWT is very straightforward:</p>
<ul>
<li>register a listener to be notified when the context changes (user pressed back or forward or jumped in history) with History.addHistoryListener(listener)</li>
<li>when you want to create a browser history savepoint, call History.newItem(token)</li>
</ul>
<p>The only thing is, GWT will not generate the token for you, because it has no way of knowing what must be included in the so-called application state. So when you want to manage history with GWT, you should always ask yourself the following questions:</p>
<ol>
<li>What must be saved? (just the active window? the selected item? etc.)</li>
<li>How will you encode this in a String?</li>
</ol>
<p>Depending on how complex is your answer to question 1, the answer to question 2 can be very trivial. For example, if all you want to save is the active tab in a multi-tab app, then the contents of the history token can be just an identifier of this tab. Generating it is easy, and so is parsing.</p>
<p>But what if you have more complex data, such as a list of items you want to restore, plus the currently selected item, plus the active view, etc.? I&#8217;ve been looking for a generic way to build a history token in such a case for a while. At first I considered a simple list of key/value pairs, such as:</p>
<blockquote><p>key0=value0; key1=value1</p></blockquote>
<p>This will certainly work in simple cases; you could write a parser and serializer that takes or generates a Map&lt;String, String&gt; without too much trouble. But then inevitably will come the need to embed another map (or a list) in the map&#8230; then the simple case is not so simple anymore.</p>
<p>Anyway, you could imagine handling recursivity with a format like :</p>
<blockquote><p>key0=(item00, item01), key1={key10=value10, key12=(item120, item121)}</p></blockquote>
<p>which would be parsed as:</p>
<ul>
<li>map
<ul>
<li>key0 -&gt; list
<ul>
<li>&#8220;item00&#8243;</li>
<li>&#8220;item01&#8243;</li>
</ul>
</li>
<li>key1 -&gt; map
<ul>
<li>key10 -&gt; &#8220;value10&#8243;</li>
<li>key12 -&gt; list
<ul>
<li>&#8220;item120&#8243;</li>
<li>&#8220;item121&#8243;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>you get the picture.</p>
<p>I was set to write a parser for this type of format, and not very happy to have to do so, when it struck me how close this format was to JSON&#8230; what if a map was a JSON object, a list a JSON array ? My previous example would then generate the following JSON string:</p>
<blockquote><p>{&#8220;key0&#8243;:["item00"," item01"], &#8220;key1&#8243;:{&#8220;key10&#8243;:&#8221;value10&#8243;, &#8220;key12&#8243;:["item120"," item121"]}</p></blockquote>
<p>Given that GWT comes with a JSON parser/serializer, if I can represent my application state as a Map&lt;String, Object&gt; where objects are instances of String, List&lt;Object&gt; or Map&lt;String, Object&gt;, it would be very easy to build a JSON representation of it. Would that work?</p>
<p>The short answer: yes, but there are caveats.</p>
<p>First, since most of the special characters are URL-encoded, it&#8217;s not pretty. Actually it&#8217;s really ugly. This is what it looks like on an example:</p>
<blockquote><p>MyPage.html#%7B%22active%22:%222d22aa%22,%20%22selected%22:%222dff8%22,%20%22workFolder%22:%5B%222be34%22,%222dff8%22,%22414a4%22%5D%7D</p></blockquote>
<p>Scary, isn&#8217;t it? But, unless you believe every user pays attention to what&#8217;s going on in the address bar, it doesn&#8217;t really matter.</p>
<p>Second, it&#8217;s pretty verbose. The URL can&#8217;t grow in length indefinitely, and this burns a lot of precious characters.</p>
<p>Third, it&#8217;s not secure, if you use GWT&#8217;s native JSON parser that is, because as stated in the Javadoc: &#8220;<em>For efficiency, this method [parse] is implemented using the JavaScript  <code>eval()</code> function, which can execute arbitrary script. DO  NOT  pass an untrusted string into this method</em>.&#8221;.</p>
<p>The last one is a showstopper for public web sites, unless you reimplement your own JSON parser in GWT. So yes, it works, but no, don&#8217;t use it. And if you do anyway, don&#8217;t blame me.</p>
<p>If you want some detail here&#8217;s how I have done it. I&#8217;m in the context of a HMVC app; each controller has a getState() method which is supposed to return a Map representing its state to be saved, and a restoreState() method that takes a Map of the state to be restored. By default getState() returns an empty map, and restoreMap() does nothing, so subclasses are free to override those methods to provide something to save/restore (which might recursively include the state of subcontrollers).</p>
<p>The topmost controller is responsible for handling save state requests; it uses getState() to obtain the global application state, then converts it to a JSON representation, and calls History.newItem().</p>
<p>Conversely, when a history change is detected, the token is parsed as JSON and then converted to a Map. The result is passed to restoreState(), which takes what it needs from the map, does what is needed to restore the state, and recursively calls restoreState() on subcontrollers. How neat is that?</p>
<p>Here&#8217;s the code I use to convert my object graph that represents the app state to and from JSON:</p>
<pre lang="java">
    /**
     * Serialize the specified object as a JSONValue. The object to serialize must be an instance of:
     * - String
     * - Map<String, O>
     * - List<O>
     *
<p/>
     * where O has the same constraints.
     */
    public static JSONValue serializeAsJson(Object object) {
        if (object instanceof Map) {
            Map<String, Object> map = (Map<String, Object>) object;
            JSONObject jsonObject = new JSONObject();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                JSONValue convertedValue = serializeAsJson(value);
                jsonObject.put(key, convertedValue);
            }
            return jsonObject;
        }
        else if (object instanceof List) {
            List list = (List) object;
            JSONArray jsonArray = new JSONArray();
            for (int i = 0; i < list.size(); i++) {
                Object entry = list.get(i);
                JSONValue convertedValue = serializeAsJson(entry);
                jsonArray.set(i, convertedValue);
            }
            return jsonArray;
        }
        else if (object instanceof String) {
            return new JSONString((String) object);
        }
        else {
            throw new RuntimeException("Unsupported state type: " + object.getClass());
        }
    }

    /**
     * Parse a JSONValue as follows:
     * -if the value is a JSONObject, parse into a Map<String, Object>
     * -if the value is a JSONArray, parse into a List<Object>
     * -if the value is a JSONString, parse into a String
     * -otherwise fail
     */
    public static Object parseObject(JSONValue jsonValue) {
        if (jsonValue.isObject() != null) {
            return parseMap(jsonValue.isObject());
        }
        else if (jsonValue.isArray() != null) {
            return parseList(jsonValue.isArray());
        }
        else if (jsonValue.isString() != null) {
            return jsonValue.isString().stringValue();
        }
        else {
            throw new RuntimeException("Failed to parse JSON: " + jsonValue.toString());
        }
    }

    /**
     * Parse the specified JSONObject into a Map<String, Object>. The JSONValue associated to
     * a key is parsed recursively using {@link #parseObject(JSONValue)}
     */
    public static Map<String, Object> parseMap(JSONObject jsonObject) {
        Map<String, Object> result = new HashMap<String, Object>();
        for (String key : jsonObject.keySet()) {
            JSONValue jsonValue = jsonObject.get(key);
            Object convertedValue = parseObject(jsonValue);
            result.put(key, convertedValue);
        }
        return result;
    }

    /**
     * Parse the specified JSONArray into a List<Object>. The JSONValues contained in the array are
     * parsed recursively using {@link #parseObject(JSONValue)}
     */
    public static Object parseList(JSONArray array) {
        List<Object> result = new ArrayList<Object>();
        for (int i = 0; i < array.size(); i++) {
            JSONValue jsonValue = array.get(i);
            Object convertedValue = parseObject(jsonValue);
            result.add(convertedValue);
        }
        return result;
    }
</pre>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/725/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google and Palm: the ideal scenario</title>
		<link>http://blog.gerardin.info/archives/721</link>
		<comments>http://blog.gerardin.info/archives/721#comments</comments>
		<pubDate>Mon, 22 Mar 2010 13:42:14 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[palm]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=721</guid>
		<description><![CDATA[It was suggested by Phil kearny (ex Apple employee) that Google should buy Palm&#8230; Let&#8217;s dream a little bit: Google buys Palm A GWT wrapper is developper for Mojo (Palm&#8217;s Javascript SDK). GWT becomes the official SDK for webOS dalvik is ported to webOS. All the apps from the Android marketplace are now available for [...]]]></description>
			<content:encoded><![CDATA[<p>It was <a href="http://gizmodo.com/5491521/why-google-should-buy-palm?skyline=true&amp;s=i" target="_blank" class="liexternal">suggested by Phil kearny</a> (ex Apple employee) that Google should buy Palm&#8230;</p>
<p>Let&#8217;s dream a little bit:</p>
<ol>
<li>Google buys Palm</li>
<li>A GWT wrapper is developper for Mojo (Palm&#8217;s Javascript SDK). GWT becomes the official SDK for webOS</li>
<li>dalvik is ported to webOS. All the apps from the Android marketplace are now available for webOS devices</li>
<li>Android and webOS merge. Android 3.0 runs both dalvik apps and Mojo/JavaScript/GWT apps</li>
<li>Google releases the most amazing smartphone ever, the Nexus Ultimate. The iPhone is now a thing of the past.</li>
<li>Apple open sources the iPhone SDK, allows Flash on their mobile devices, opens up the AppStore for all apps, and goes back to what they do best: desktop and laptop computers, with a reliable UNIX-based OS.</li>
</ol>
<p>PS: after I wrote this post, I found that some <a href="http://www.wired.com/gadgetlab/2010/03/rumor-palm-may-ditch-webos-for-android/" target="_blank" class="liexternal">rumors</a> were spreading about Palm moving to Android&#8230; I promise I&#8217;m not the one who wrote the fake &#8220;anonymously sourced, unconfirmed memo&#8221; <img src='http://blog.gerardin.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/721/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Slides from my presentation at confoo.ca</title>
		<link>http://blog.gerardin.info/archives/711</link>
		<comments>http://blog.gerardin.info/archives/711#comments</comments>
		<pubDate>Fri, 12 Mar 2010 20:01:51 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[confoo]]></category>
		<category><![CDATA[slides]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=711</guid>
		<description><![CDATA[GWT = easy AJAX View more presentations from Olivier Gérardin.]]></description>
			<content:encoded><![CDATA[<div style="width:425px" id="__ss_3411461"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/ogerardin/gwt-easy-ajax" title="GWT = easy AJAX" class="liexternal">GWT = easy AJAX</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=confoo-cagwt-100312105300-phpapp02&#038;rel=0&#038;stripped_title=gwt-easy-ajax" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=confoo-cagwt-100312105300-phpapp02&#038;rel=0&#038;stripped_title=gwt-easy-ajax" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/" class="liexternal">presentations</a> from <a href="http://www.slideshare.net/ogerardin" class="liexternal">Olivier Gérardin</a>.</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/711/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EricDaugherty.com: Does Write Once Run Anwhere Work?</title>
		<link>http://blog.gerardin.info/archives/691</link>
		<comments>http://blog.gerardin.info/archives/691#comments</comments>
		<pubDate>Wed, 17 Feb 2010 14:04:56 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[WORA]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=691</guid>
		<description><![CDATA[Eric Daugherty: Realistically, I think tools like GWT are the future. As a Flex developer, I enjoy the ability to quickly and easily create rich applications that will render the same on ever user&#38;apos;s machine. But I would prefer that the Flex applications would compile to HTML and JavaScript, so they could be run native [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gerardin.info/wp-content/uploads/2009/05/java_logo.png" class="liimagelink"><img class="size-full wp-image-214 alignleft" style="border: 0pt none; margin-left: 10px; margin-right: 10px;" title="java_logo" src="http://blog.gerardin.info/wp-content/uploads/2009/05/java_logo.png" alt="" width="65" height="119" /></a>Eric Daugherty:</p>
<p><em>Realistically, I think tools like GWT are the future.  As a Flex developer, I enjoy the ability to quickly and easily create rich applications that will render the same on ever user&amp;apos;s machine.  But I would prefer that the Flex applications would compile to HTML and JavaScript, so they could be run native in the browser.</em></p>
<p>via <a href="http://blog.ericdaugherty.com/2010/02/does-write-once-run-anwhere-work.html" class="liexternal">EricDaugherty.com: Does Write Once Run Anwhere Work?</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/691/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GWT and JavaScript Date hell</title>
		<link>http://blog.gerardin.info/archives/674</link>
		<comments>http://blog.gerardin.info/archives/674#comments</comments>
		<pubDate>Wed, 03 Feb 2010 13:40:34 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Date]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=674</guid>
		<description><![CDATA[You&#8217;d think that in 2010, date processing is something that is easily done in Java (and hence GWT), in a consistent cross-platform way. And you&#8217;d be wrong. When I&#8217;m talking date processing, I mean simple calendar date (not time) operations, like: get today&#8217;s date, add a number of days, compute the number of days between [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gerardin.info/wp-content/uploads/2010/02/calendar1.jpg" class="liimagelink"><img class="alignleft size-thumbnail wp-image-679" style="margin: 10px;" title="calendar" src="http://blog.gerardin.info/wp-content/uploads/2010/02/calendar1-150x150.jpg" alt="" width="150" height="150" /></a>You&#8217;d think that in 2010, date processing is something that is easily done in Java (and hence GWT), in a consistent cross-platform way. And you&#8217;d be wrong.</p>
<p>When I&#8217;m talking date processing, I mean simple calendar date (not time) operations, like: get today&#8217;s date, add a number of days, compute the number of days between two dates, etc. The original sin, so to speak, is that Java doesn&#8217;t have a class to represent a day; Java&#8217;s Date class is actually more like a timestamp: it encapsulates a moment in time (with a millisecond precision) stored as the number of milliseconds to/from the moment called &#8220;epoch&#8221;, which is arbitrarily fixed at January 1, 1970, 00:00:00 GMT.</p>
<p>The methods related to date components (day of month, month, year, etc.) have all been deprecated since the apparition of the Calendar class (JDK 1.1). The trouble is, Calendar isn&#8217;t available in GWT&#8217;s JRE emulation library. So what do most programmers do? They use the deprecated methods of class Date. For example to create a Date that corresponds to a given day, they would use new Date(y, m, d). Well it&#8217;s deprecated, but it works, right?</p>
<p>Wrong. When instantiating a Date object using these deprecated methods, each JavaScript implementation tries to do its best to guess the correct timestamp, based on things such as the current time zone and whether Daylight Savings Time was effective at that time, and of course these rules vary by OS, JavaScript implementation and depend on the client&#8217;s regional settings. I&#8217;m not going into details now, but the bottom line is: you can&#8217;t expect to get a consistent behaviour.</p>
<p>Actually, if you might not notice this problem if all you do is manipulate local dates that were created on the client-side; the problem really becomes a nightmare when you mix locally instanciated dates with serialized dates from the server.</p>
<p>We&#8217;ve spent an incredible amount of energy and time to work around this issue, which is made worse by GXT&#8217;s DateWrapper and DateTextField. The awkward but kind-of working solution that we use now is to subtract Date.getTimezoneOffset() from Date.getTime() in order to &#8220;cancel out&#8221; the client&#8217;s time zone and DST. Not pretty.</p>
<p>If I had to do my current project again, I would definitely stay away from the Date type on the client side. As primitive as it may sound, if I have to manipulate dates without a time part, I would stick to using a (day, month, year) triplet and do as little date calculations on the client-side as possible.</p>
<p>You&#8217;ve been warned!</p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/674/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>GWT sighting in Palm&#8217;s webOS Mojo SDK</title>
		<link>http://blog.gerardin.info/archives/665</link>
		<comments>http://blog.gerardin.info/archives/665#comments</comments>
		<pubDate>Tue, 05 Jan 2010 21:39:08 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[palm]]></category>
		<category><![CDATA[webOS]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=665</guid>
		<description><![CDATA[While exploring the code samples that come with Palm&#8217;s SDK for webOS (named Mojo), I was pleasantly surprised to see that one of the samples (MojoMsgSample) uses GWT and the Google App Engine for the &#8220;cloud&#8221; part of the sample! It&#8217;s a basic publish/subscribe app, but still it&#8217;s nice to find oneself in known territory&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>While exploring the code samples that come with <a href="http://developer.palm.com/index.php?option=com_content&amp;view=article&amp;id=1642" target="_blank" class="liexternal">Palm&#8217;s SDK for webOS</a> (named Mojo), I was pleasantly surprised to see that one of the samples (MojoMsgSample) uses GWT and the Google App Engine for the &#8220;cloud&#8221; part of the sample! It&#8217;s a basic publish/subscribe app, but still it&#8217;s nice to find oneself in known territory&#8230;</p>
<p>BTW, has anyone attempted to wrap the Mojo SDK in GWT? I&#8217;d be thrilled to be able to write webOS apps in GWT <img src='http://blog.gerardin.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/665/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The future of mobile apps is web apps</title>
		<link>http://blog.gerardin.info/archives/656</link>
		<comments>http://blog.gerardin.info/archives/656#comments</comments>
		<pubDate>Wed, 23 Dec 2009 16:59:59 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=656</guid>
		<description><![CDATA[This conclusion comes from examining the following facts: modern smartphones are equipped with a recent, state-of-the-art, JavaScript/CSS capable web browser modern smartphones are most often associated with a &#8220;always connected&#8221; data plan What this means is that if you need to develop a mobile application that should run on several mobile platforms, you have basically [...]]]></description>
			<content:encoded><![CDATA[<p>This conclusion comes from examining the following facts:</p>
<ul>
<li>modern smartphones are equipped with a recent, state-of-the-art, JavaScript/CSS capable web browser</li>
<li>modern smartphones are most often associated with a &#8220;always connected&#8221; data plan</li>
</ul>
<p>What this means is that if you need to develop a mobile application that should run on several mobile platforms, you have basically two possibilities:</p>
<ul>
<li>learn each different platform and associated SDK, develop and maintain a different version for each of them, not to mention you&#8217;ll have to manage distribution/deployment</li>
<li>write a single web app that will run on all platforms, and be always up-to-date</li>
</ul>
<p>Easy choice isn&#8217;t it? Now I should also add a third fact that will undoubtedly contribute to this trend:</p>
<ul>
<li>GWT and GAE make it ridiculously easy to build web apps (including for mobiles)</li>
</ul>
<p>For example, my new Palm Pre doesn&#8217;t come with a facebook app. Why bother? it&#8217;s just a link to the mobile version of facebook.com. Maybe it&#8217;s not as rich as a native app, but it&#8217;s damn close, and the line will get thinner and thinner as HTML5 spreads.</p>
<p>Actually, the Palm Pre is a very good example of this convergence, since the standard SDK uses JavaScript as the development language. So basically, each app on the Pre is a web app!</p>
<p>You can read <a href="http://googlemobile.blogspot.com/2009/12/iterative-web-app-feature-rich-and-fast.html" target="_blank" class="liexternal">Alex Nicolaou&#8217;s blog post</a> on the Google mobile blog for another view on this subject.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/656/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s official: GWT 2.0.0 (with SpeedTracer)</title>
		<link>http://blog.gerardin.info/archives/617</link>
		<comments>http://blog.gerardin.info/archives/617#comments</comments>
		<pubDate>Wed, 09 Dec 2009 13:36:58 +0000</pubDate>
		<dc:creator>Olivier Gérardin</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[GWT 2.0]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://blog.gerardin.info/?p=617</guid>
		<description><![CDATA[Finally, as anticipated Google set the &#8220;release&#8221; tag on GWT 2.0 and announced it at its Campfire One event yesterday. In addition to the well-known major new features (development mode, Code splitting, UiBinder, ResourceBundle), Google comes with a new tool named Speedtracer to measure the performance of Ajax applications inside the browser. SpeedTracer is only available for Chrome [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gerardin.info/archives/125/gwt-logo" rel="attachment wp-att-140" class="liimagelink"><img class="alignleft size-full wp-image-140" style="margin-left: 8px; margin-right: 8px; border: 0px solid black;" title="Logo GWT" src="http://blog.gerardin.info/wp-content/uploads/2009/04/gwt-logo.png" alt="Logo GWT" width="100" height="100" /></a>Finally, as anticipated Google set the &#8220;release&#8221; tag on GWT 2.0 and announced it at its Campfire One event yesterday. In addition to the well-known major new features (development mode, Code splitting, UiBinder, ResourceBundle), Google comes with a new tool named <a href="http://code.google.com/webtoolkit/speedtracer/" target="_blank" class="liexternal">Speedtracer </a>to measure the performance of Ajax applications inside the browser. SpeedTracer is only available for Chrome at the moment, unfortunately only on platforms where extensions are supported, <del>which means not on Mac currently</del> <em>(actually it does work on Macs, see comments to this post)</em>&#8230;</p>
<p><img class="aligncenter" title="SpeedTracer interface" src="http://code.google.com/webtoolkit/speedtracer/images/SpeedTracer-SluggishnessDetail.png" alt="" width="416" height="412" /></p>
<p>The online docs have been updated and are still IMHO a model of how online documentation for a project should be done: clear, concise, well structured, complete yet progressive, with examples&#8230; it&#8217;s almost fun to read. I wish every project had docs like this.</p>
<p><a href="http://code.google.com/webtoolkit/download.html" target="_blank" class="liexternal">Download GWT, SpeedTracer or the Eclipse plugin</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gerardin.info/archives/617/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

