whoisip
HTML source viewer


HTML source viewer

Write webpage URL To view source code of any webpage
mspn.in/main.php (do not add http://)

Source code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<!--
generated in 0.406 seconds
98380 bytes batcached for 300 seconds
-->
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title> TurboManage</title>

<link rel="stylesheet" href="http://s0.wp.com/wp-content/themes/pub/andreas09/style.css?m=1407955129g" type="text/css" media="screen" />
<link rel="stylesheet" href="http://s0.wp.com/wp-content/themes/pub/andreas09/red2.css?m=1315885645g" type="text/css" media="screen" />
<link rel="pingback" href="http://turbomanage.wordpress.com/xmlrpc.php" />

<meta name="google-site-verification" content="SMaTn12echKkEhampbc4YC7xRDJCVPieTYIWqV106v8" />
<link rel="alternate" type="application/rss+xml" title="TurboManage &raquo; Feed" href="http://turbomanage.wordpress.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="TurboManage &raquo; Comments Feed" href="http://turbomanage.wordpress.com/comments/feed/" />
<script type="text/javascript">
/* <![CDATA[ */
function addLoadEvent(func){var oldonload=window.onload;if(typeof window.onload!='function'){window.onload=func;}else{window.onload=function(){oldonload();func();}}}
/* ]]> */
</script>
<link rel='stylesheet' id='all-css-0' href='http://s1.wp.com/_static/??-eJx9kN1uAiEQhV+odDTaqhdNnwXZkWUdGMLMZuPbF6r9MRquOIecbzgDLNk4TopJIc4m0+xDEpAYCC+58IRO792rE3mB5xiFMwpMqNm6s/l2D/Ejsf8D2HsceFZzYiJeYAmDx+4bjgvW+5ittkTEIVgkjDXWw2J+/6GaHGvBW7cAiTVURH5Fb5BHNsTOauB0Z8yJbCg9tGBbvkoPNfXP9qDMotfRIKMtDb6d/ZYJy3Wpp/KB1bF+ocC4BU98tNQCn/FjvV3td5v9YfM2fQFyCNDf' type='text/css' media='all' />
<link rel='stylesheet' id='print-css-0' href='http://s0.wp.com/wp-content/mu-plugins/global-print/global-print.css?m=1387483371g' type='text/css' media='print' />
<script type='text/javascript'>
/* <![CDATA[ */
var LoggedOutFollow = {"invalid_email":"Your subscription did not succeed, please try again with a valid email address."};
/* ]]> */
</script>
<script type='text/javascript' src='http://s2.wp.com/_static/??-eJyFjd0KQiEQhF8oj55DQTfRs5husuZf7prU02dQF1EUDMzCfLMjexGYTGgWSPqhc4N6fdrkaSV/ASKiq5phiphesMmJIfGDLZk4ApF28CV9n8J0Qeh/MQ9ctDmJCoS3j6+HkJ0ooTlMJMftwObG4phDyF12tA54dPZxN6+V2mznRS3+Dt5/YKg='></script>
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://turbomanage.wordpress.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://s1.wp.com/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress.com" />
<link rel='shortlink' href='http://wp.me/1qLI' />

<!-- Jetpack Open Graph Tags -->
<meta property="og:type" content="website" />
<meta property="og:title" content="TurboManage" />
<meta property="og:description" content="David Chandler&#039;s Journal of Java Web and Mobile Development" />
<meta property="og:url" content="http://turbomanage.wordpress.com/" />
<meta property="og:site_name" content="TurboManage" />
<meta property="og:image" content="https://s0.wp.com/i/blank.jpg" />
<meta name="twitter:site" content="@wordpressdotcom" />
<meta property="fb:app_id" content="249643311490" />
<link rel="shortcut icon" type="image/x-icon" href="http://s2.wp.com/i/favicon.ico?m=1405977958g" sizes="16x16 24x24 32x32 48x48" />
<link rel="icon" type="image/x-icon" href="http://s2.wp.com/i/favicon.ico?m=1405977958g" sizes="16x16 24x24 32x32 48x48" />
<link rel="apple-touch-icon-precomposed" href="http://s0.wp.com/i/webclip.png?m=1391188133g" />
<link rel='openid.server' href='http://turbomanage.wordpress.com/?openidserver=1' />
<link rel='openid.delegate' href='http://turbomanage.wordpress.com/' />
<link rel="search" type="application/opensearchdescription+xml" href="http://turbomanage.wordpress.com/osd.xml" title="TurboManage" />
<link rel="search" type="application/opensearchdescription+xml" href="http://wordpress.com/opensearch.xml" title="WordPress.com" />
<meta name="application-name" content="TurboManage" /><meta name="msapplication-window" content="width=device-width;height=device-height" /><meta name="msapplication-tooltip" content="David Chandler&#039;s Journal of Java Web and Mobile Development" /><meta name="msapplication-task" content="name=Subscribe;action-uri=http://turbomanage.wordpress.com/feed/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="msapplication-task" content="name=Sign up for a free blog;action-uri=http://wordpress.com/signup/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="msapplication-task" content="name=WordPress.com Support;action-uri=http://support.wordpress.com/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="msapplication-task" content="name=WordPress.com Forums;action-uri=http://forums.wordpress.com/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="title" content="TurboManage on WordPress.com" />
<meta name="description" content="David Chandler&#039;s Journal of Java Web and Mobile Development (by David Chandler)" />
<style type="text/css" id="syntaxhighlighteranchor"></style>

</head>

<body class="home blog mp6 typekit-enabled highlander-enabled highlander-light">

<div id="container">
<div id="sitename">
<h1><a href="http://turbomanage.wordpress.com/">TurboManage</a></h1>
<h2>David Chandler&#039;s Journal of Java Web and Mobile Development</h2>
</div>

<div id="mainmenu">
<ul class="level1">
<li class="current_page_item"><a href="http://turbomanage.wordpress.com/">Home</a></li>
<li class="page_item page-item-309"><a href="http://turbomanage.wordpress.com/dmc/">DMC</a></li>
<li class="page_item page-item-293"><a href="http://turbomanage.wordpress.com/gae/">GAE</a></li>
<li class="page_item page-item-277"><a href="http://turbomanage.wordpress.com/gwt/">GWT</a></li>
<li class="page_item page-item-447"><a href="http://turbomanage.wordpress.com/jdo/">JDO</a></li>
<li class="page_item page-item-295"><a href="http://turbomanage.wordpress.com/jsf/">JSF</a></li>
<li class="page_item page-item-218"><a href="http://turbomanage.wordpress.com/mvp/">MVP</a></li>
<li class="page_item page-item-319 page_item_has_children"><a href="http://turbomanage.wordpress.com/phi/">Phi</a></li>
<li class="page_item page-item-34 page_item_has_children"><a href="http://turbomanage.wordpress.com/writings/">PUB</a></li>
<li class="page_item page-item-132"><a href="http://turbomanage.wordpress.com/slr/">SLR</a></li>
<li class="page_item page-item-4651"><a href="http://turbomanage.wordpress.com/training/">Training</a></li>
</ul>
</div>

<div id="wrap">
<div id="leftside">

<ul>

<li id="gravatar-2" class="widget widget_gravatar"><h2 class="widgettitle">David M. Chandler</h2>
<p><img alt='' src='http://0.gravatar.com/avatar/614e792082e78cd852d0b60ae0f28bef?s=128&#038;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D128&#038;r=G' class='avatar avatar-128 grav-widget-none' height='128' width='128' /></p>
<p><a rel="author" href="https://profiles.google.com/102717421433762219474"> <img src="https://ssl.gstatic.com/images/icons/gplus-32.png" align="left" style="vertical-align:top;padding-right:5px;"></a><br />
Web app developer since 1994 and former Developer Advocate with Google now residing in Peru. I am currently offering public and private developer training courses in the US and Latin America as well as working on Android, GWT, and App Engine projects.</p>
</li>
<li><h2>Subscribe</h2>
<ul>
<li class="feed"><a href="http://turbomanage.wordpress.com/feed/">Entries (RSS)</a></li>
<li class="feed"><a href="http://turbomanage.wordpress.com/comments/feed/">Comments (RSS)</a></li>
</ul>
</li>
<li id="blog_subscription-3" class="widget widget_blog_subscription"><h2 class="widgettitle"><label for="subscribe-field">Email Subscription</label></h2>

<form action="https://subscribe.wordpress.com" method="post" accept-charset="utf-8" id="subscribe-blog">
<p>Enter your email address to subscribe to this blog and receive notifications of new posts by email.</p>
<p>Join 226 other followers</p>
<p><input type="text" name="email" style="width: 95%; padding: 1px 2px" placeholder="Enter your email address" value="" id="subscribe-field"/></p>

<p>
<input type="hidden" name="action" value="subscribe"/>
<input type="hidden" name="blog_id" value="341230"/>
<input type="hidden" name="source" value="http://turbomanage.wordpress.com/"/>
<input type="hidden" name="sub-type" value="widget"/>
<input type="hidden" name="redirect_fragment" value="blog_subscription-3" />
<input type="hidden" id="_wpnonce" name="_wpnonce" value="47665a72d0" /> <input type="submit" value="Sign me up!" />
</p>
</form>

</li>
<li id="calendar-2" class="widget widget_calendar"><h2 class="widgettitle">Sleepless Nights&#8230;</h2>
<div id="calendar_wrap"><table id="wp-calendar">
<caption>September 2014</caption>
<thead>
<tr>
<th scope="col" title="Sunday">S</th>
<th scope="col" title="Monday">M</th>
<th scope="col" title="Tuesday">T</th>
<th scope="col" title="Wednesday">W</th>
<th scope="col" title="Thursday">T</th>
<th scope="col" title="Friday">F</th>
<th scope="col" title="Saturday">S</th>
</tr>
</thead>

<tfoot>
<tr>
<td colspan="3" id="prev"><a href="http://turbomanage.wordpress.com/2014/07/">&laquo; Jul</a></td>
<td class="pad">&nbsp;</td>
<td colspan="3" id="next" class="pad">&nbsp;</td>
</tr>
</tfoot>

<tbody>
<tr>
<td colspan="1" class="pad">&nbsp;</td><td>1</td><td id="today">2</td><td>3</td><td>4</td><td>5</td><td>6</td>
</tr>
<tr>
<td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td><td>13</td>
</tr>
<tr>
<td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td>
</tr>
<tr>
<td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td>
</tr>
<tr>
<td>28</td><td>29</td><td>30</td>
<td class="pad" colspan="4">&nbsp;</td>
</tr>
</tbody>
</table></div></li>
<li id="blog-stats-2" class="widget widget_blog-stats"><h2 class="widgettitle">Blog Stats</h2>
<ul>
<li>655,070 hits</li>
</ul>
</li>
</ul>
</div>
<!-- Right Sidebar Template -->
<div id="rightside">
<ul>
<li><form method="get" id="searchform" action="http://turbomanage.wordpress.com/">
<div><input id="searchbox" type="text" value="" name="s"/>
<input type="submit" id="searchbutton" value="Search"/>
</div>
</form>
</li>
<li id="categories-1" class="widget widget_categories"><h2 class="widgettitle">Categories</h2>
<ul>
<li class="cat-item cat-item-641922"><a href="http://turbomanage.wordpress.com/category/android/" >Android</a> (18)
</li>
<li class="cat-item cat-item-6022068"><a href="http://turbomanage.wordpress.com/category/appengine/" >AppEngine</a> (53)
</li>
<li class="cat-item cat-item-277901"><a href="http://turbomanage.wordpress.com/category/art-of-programming/" >Art of Programming</a> (4)
</li>
<li class="cat-item cat-item-277875"><a href="http://turbomanage.wordpress.com/category/business-of-software/" >Business of Software</a> (11)
</li>
<li class="cat-item cat-item-14133"><a href="http://turbomanage.wordpress.com/category/coldfusion/" >ColdFusion</a> (4)
</li>
<li class="cat-item cat-item-325481"><a href="http://turbomanage.wordpress.com/category/dart/" >Dart</a> (10)
</li>
<li class="cat-item cat-item-18466"><a href="http://turbomanage.wordpress.com/category/eclipse/" >Eclipse</a> (11)
</li>
<li class="cat-item cat-item-657"><a href="http://turbomanage.wordpress.com/category/economics/" >Economics</a> (3)
</li>
<li class="cat-item cat-item-277879"><a href="http://turbomanage.wordpress.com/category/ergonomics/" >Ergonomics</a> (5)
</li>
<li class="cat-item cat-item-28767541"><a href="http://turbomanage.wordpress.com/category/gin-guice/" >GIN / Guice</a> (13)
</li>
<li class="cat-item cat-item-204985"><a href="http://turbomanage.wordpress.com/category/google-web-toolkit/" >Google Web Toolkit</a> (79)
</li>
<li class="cat-item cat-item-6387356"><a href="http://turbomanage.wordpress.com/category/headsmack/" >Headsmack</a> (11)
</li>
<li class="cat-item cat-item-114384"><a href="http://turbomanage.wordpress.com/category/intellij/" >IntelliJ</a> (1)
</li>
<li class="cat-item cat-item-4403413"><a href="http://turbomanage.wordpress.com/category/java-data-objects/" >Java Data Objects</a> (4)
</li>
<li class="cat-item cat-item-25512"><a href="http://turbomanage.wordpress.com/category/javaserver-faces/" >JavaServer Faces</a> (16)
</li>
<li class="cat-item cat-item-2194995"><a href="http://turbomanage.wordpress.com/category/model-view-presenter/" >Model-View-Presenter</a> (23)
</li>
<li class="cat-item cat-item-219374"><a href="http://turbomanage.wordpress.com/category/pc-tech/" >PC Tech</a> (17)
</li>
<li class="cat-item cat-item-436"><a href="http://turbomanage.wordpress.com/category/photography/" >Photography</a> (3)
</li>
<li class="cat-item cat-item-279765"><a href="http://turbomanage.wordpress.com/category/web-app-security/" >Web App Security</a> (8)
</li>
</ul>
</li>
<li id="recent-posts-2" class="widget widget_recent_entries"> <h2 class="widgettitle">Recent Posts</h2>
<ul>
<li>
<a href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/">Painless REST+JSON API with Jersey and&nbsp;RestyGWT</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/">Debug an Android annotation processor with gradle and IntelliJ (or&nbsp;Eclipse)</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/">GWT, App Engine, maven, and&#8230;&nbsp;IntelliJ!</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/">Android Camp in the&nbsp;Rockies</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/">Ruh-roh, I think my brain is&nbsp;re-wiring</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/">storm-gen has moved</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/">Open for business in&nbsp;Peru</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/">A long pause</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/">Android + Cloud with Mobile Backend&nbsp;Starter</a>
</li>
<li>
<a href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/">Android demo tips: behind the scenes at Google&nbsp;I/O</a>
</li>
</ul>
</li>
<li id="image-3" class="widget widget_image"><h2 class="widgettitle">Support the EFF</h2>
<div style="overflow:hidden;"><a href="http://www.eff.org"><img src="https://www.eff.org/sites/default/files/EFF-badge-1c.png" alt="Electronic Frontier Foundation Member 2103" class="alignnone" width="150" height="150" /></a></div>
</li>
</ul>
</div>

<div id="content">

<div class="post-4769 post type-post status-publish format-standard hentry category-appengine category-google-web-toolkit" id="post-4769">
<h2><a href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/" rel="bookmark">Painless REST+JSON API with Jersey and&nbsp;RestyGWT</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on July 23, 2014</p>
<div class="entry">
<p>It&#8217;s been a while since I&#8217;ve been active in GWT programming, but I recently picked up an old GWT + App Engine project and dusted it off. This time around, I need a service layer that will work with native mobile apps as well as the GWT desktop app: in other words, a REST+JSON API.</p>
<h2>The server side</h2>
<p>I decided to use <a href="http://jersey.java.net">Jersey</a> on the server, which makes it incredibly easy to create REST services, especially in combination with the fabulous <a title="Objectify App Engine" href="http://code.google.com/p/objectify-appengine/">objectify-appengine</a>. Here&#8217;s one of my services:</p>
<pre class="brush: java; title: ; notranslate" title="">
@Path(&amp;amp;quot;api/user&amp;amp;quot;)
@Produces(MediaType.APPLICATION_JSON)
public class UserDao extends ObjectifyDao&amp;amp;lt;User&amp;amp;gt;
{
@GET
@Path(&amp;amp;quot;me&amp;amp;quot;)
public User getMe() {
return AuthFilter.getUser(); // long live ThreadLocal!
}
}
</pre>
<p>All the other standard CRUD methods (list, get, delete, etc.) are inherited from a generic DAO. A servlet filter verifies user authentication, XSRF tokens, etc. At only one class per entity, I find this much more agreeable than the four classes per entity I used to write with gwt-dispatch (Action, Result, Handler, DAO).</p>
<h2>The GWT REST+JSON client</h2>
<p>On the client side, GWT developers have long needed something which combines:</p>
<ol>
<li>The convenience of GWT-RPC (automatic serialization of pretty much everything)</li>
<li>JSON data format</li>
<li>Simple verb-based service APIs</li>
<li>Benefits of the command pattern such as request caching and batching</li>
<li>Minimal boilerplate</li>
</ol>
<p><a title="RestyGWT" href="http://resty-gwt.github.io/">RestyGWT</a> delivers on all counts.</p>
<p>The interface is actually simpler than GWT-RPC because you don&#8217;t have to define a synchronous and asynchronous method, only async (although you can reuse the server interface and call it using DirectRestService if it helps you sleep better). Here&#8217;s a sample interface using RestyGWT. This is a generic CRUD API which I simply extend for each entity class.</p>
<pre class="brush: java; title: ; notranslate" title="">
public interface RestApi&amp;amp;lt;T&amp;amp;gt; extends RestService {

@GET
@Path(&amp;amp;quot;own&amp;amp;quot;)
public void getForOwner(MethodCallback&amp;amp;lt;T&amp;amp;gt; callback);

@GET
@Path(&amp;amp;quot;get&amp;amp;quot;)
public void get(@QueryParam(&amp;amp;quot;id&amp;amp;quot;)Long id, MethodCallback&amp;amp;lt;T&amp;amp;gt; callback);

@GET
@Path(&amp;amp;quot;all&amp;amp;quot;)
public void listAll(MethodCallback&amp;amp;lt;ListResponse&amp;amp;lt;T&amp;amp;gt;&amp;amp;gt; callback);

@POST
@Path(&amp;amp;quot;save&amp;amp;quot;)
public void save(T obj, MethodCallback&amp;amp;lt;T&amp;amp;gt; callback);

...
}
</pre>
<p>Here&#8217;s a sample service API and the GWT code that calls it:</p>
<pre class="brush: java; title: ; notranslate" title="">
public class UserPrefsService
{
private static final UserPrefsRestService service = GWT.create(UserPrefsRestService.class);

@Path(&amp;amp;quot;/api/userPrefs&amp;amp;quot;)
public interface UserPrefsRestService extends RestApi&amp;amp;lt;UserPrefs&amp;amp;gt; {
// just in case you missed it, all the CRUD methods are inherited
}

private UserPrefs prefs;

public void loadUserPrefs()
{
service.getForOwner(new AppCallback&amp;amp;lt;UserPrefs&amp;amp;gt;() {
@Override
public void handleSuccess(UserPrefs result) {
prefs = result;
App.getEventBus().fireEvent(new UserPrefsLoadedEvent(prefs));
}
});
}
}
</pre>
<p>I really like the benefits of the Command pattern from the old gwt-dispatch framework such as the ability to do caching and queuing centrally. The downside of the Command pattern is the proliferation of classes associated with turning every API method into two or more classes (in the case of gwt-dispatch, an Action and Result class for every service method). GWT&#8217;s RequestFactory (the GWT team&#8217;s &#8220;final answer&#8221; to RPC after GWT-RPC and deRPC) used generators to remove some of the boilerplate, but I wasn&#8217;t in love with having to call someSingleton.getRequestFactory().someRequest().create(BeanProxy.class) each and every time I wanted a new Bean. And it uses a proprietary data format, not REST+JSON.</p>
<p>This is where RestyGWT really shines. It lets you define simple API interfaces using methods, but uses a Command pattern dispatcher under the covers with an ingenious filter mechanism for adding capabilities like XSRF protection, caching, and retries. The magic is possible thanks to RestyGWT&#8217;s generator classes which transform your annotated service methods into MethodRequest classes that get sent by a dispatcher. To add caching capability to all your APIs, for example, just put this in your GWT onModuleLoad():</p>
<pre class="brush: java; title: ; notranslate" title="">
DispatcherFactory factory = new DispatcherFactory();
org.fusesource.restygwt.client.Defaults.setDispatcher(factory.cachingDispatcher());
</pre>
<p>For a look at some of the other dispatcher options, have a look at the <a title="RestyGWT User Guide" href="http://resty-gwt.github.io/documentation/restygwt-user-guide.html">RestyGWT User Guide</a> and the example <a title="DispatchFactory" href="https://github.com/resty-gwt/resty-gwt/blob/master/restygwt/src/main/java/org/fusesource/restygwt/example/client/dispatcher/DispatcherFactory.java">DispatchFactory</a> class.</p>
<h2>Tips for success with Jersey + RestyGWT</h2>
<p>Just a couple final notes to ease your migration to Jersey + RestyGWT.</p>
<p>If you&#8217;re using RestyGWT with Jersey + Jackson on the server, you&#8217;ll want to set the default date format to avoid Date serialization errors. Put this in your GWT&#8217;s onModuleLoad():</p>
<pre class="brush: java; title: ; notranslate" title="">
Defaults.setDateFormat(null);
</pre>
<p>Similarly, recent versions of Jersey complain about &#8220;self-referencing cycles&#8221; or some such with Objectify&#8217;s Ref properties, so you&#8217;ll probably want to annotate those in your server-side entities with @JsonIgnore. If you need the id of a related object, use a differently named getter instead. Jersey will create a corresponding JSON property. Example of an Objectified entity on the server:</p>
<pre class="brush: java; title: ; notranslate" title="">
package com.my.server.domain;

@Entity
public class UserPrefs {
@Id
private long id;
@JsonIgnore
private Ref&amp;amp;lt;User&amp;amp;gt; ownerKey;
...
public long getOwnerId() {
return ownerKey.get().getId();
}
}
</pre>
<p>Then on the client you can reference the ownerId property:</p>
<pre class="brush: java; title: ; notranslate" title="">
package com.my.client.domain;

public class UserPrefs
{
public Long id;
public long ownerId;
...
}
</pre>
<p>I would prefer to use the same object representation on client and server, but RestyGWT makes using DTOs about as painless as possible. The client-side object is a class not an interface, so you can create a new instance anywhere you need it vs. having to GWT.create(BeanProxy.class). I could probably hack Jersey and maybe objectify-appengine to automatically replace all Refs with a long id, but honestly, it&#8217;s easy enough just to copy the server entities and replace Refs with long ids on the client.</p>
<p>Also, here&#8217;s a pair of classes you may find useful for sending any type of list from server to client. For security purposes, a JSON response should always return a root object, not an array directly. The ListWrapper (server) and ListResponse (client) serve as this root object, having a single field containing the list.</p>
<pre class="brush: java; title: ; notranslate" title="">
package com.my.server.domain;

/**
* Wraps a List&amp;amp;lt;T&amp;amp;gt; in a JSON root object.
*/
public class ListWrapper&amp;amp;lt;T&amp;amp;gt; {
private List&amp;amp;lt;T&amp;amp;gt; list;

public ListWrapper(List&amp;amp;lt;T&amp;amp;gt; list) {
this.list = list;
}
public List&amp;amp;lt;T&amp;amp;gt; getList() {
return list;
}
}
</pre>
<p>Use it like this in one of your Jersey-annotated methods:</p>
<pre class="brush: java; title: ; notranslate" title="">
@Path(&amp;amp;quot;all&amp;amp;quot;)
@GET
public ListWrapper&amp;amp;lt;Subscription&amp;amp;gt; findAll() {
User user = AuthFilter.getUser();
List&amp;amp;lt;Subscription&amp;amp;gt; userAll = this.listByOwner(user);
return new ListWrapper&amp;amp;lt;Subscription&amp;amp;gt;(userAll);
}
</pre>
<p>Using ListWrapper this way has the additional advantage of causing Objectify to fetch any lazily loaded properties such as Refs used in the getOwnerId() method above while producing the JSON. If you were to return the List directly, this would not occur!</p>
<p>Here&#8217;s the corresponding representation on the client:</p>
<pre class="brush: java; title: ; notranslate" title="">
package com.my.client.domain;

public class ListResponse&amp;amp;lt;T&amp;amp;gt; {

public List&amp;amp;lt;T&amp;amp;gt; list;

}
</pre>
<p>See the RestApi example earlier for how it&#8217;s used.</p>
<h2>Summary</h2>
<p>Jersey and RestyGWT in combination make a powerful and easy way to create a REST API for your GWT client and mobile apps, combining all the benefits of a request dispatcher with straightforward service interfaces and minimal boilerplate.</p>
<p>Happy coding!</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4769"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4769"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4769"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4769-540588d14ca05' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4769&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4769-540588d14ca05' data-name='like-post-frame-341230-4769-540588d14ca05'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in <a href="http://turbomanage.wordpress.com/category/appengine/" rel="category tag">AppEngine</a>, <a href="http://turbomanage.wordpress.com/category/google-web-toolkit/" rel="category tag">Google Web Toolkit</a> | <a href="http://turbomanage.wordpress.com/2014/07/23/painless-restjson-api-with-jersey-and-restygwt/#comments" title="Comment on Painless REST+JSON API with Jersey and&nbsp;RestyGWT">9 Comments &#187;</a></p>
</div>


<div class="post-4748 post type-post status-publish format-standard hentry category-android category-intellij" id="post-4748">
<h2><a href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/" rel="bookmark">Debug an Android annotation processor with gradle and IntelliJ (or&nbsp;Eclipse)</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on June 9, 2014</p>
<div class="entry">
<p>Alex Gherschon and I have recently added maven support to <a title="storm-gen on github" href="https://github.com/turbomanage/storm-gen">storm-gen</a> (note: I plan to push to Maven Central this week). You can now build and install storm-gen to your local maven repository with</p>
<pre class="brush: bash; title: ; notranslate" title="">
git clone https://github.com/turbomanage/storm-gen.git
cd storm-gen/storm-apt
mvn clean install
</pre>
<p>Since gradle can pull in maven artifacts, you can then include storm-gen in your gradle build file like this:</p>
<pre class="brush: groovy; title: ; notranslate" title="">
apply plugin: 'android'
apply plugin: 'android-apt'


android {
compileSdkVersion 19
buildToolsVersion &quot;19.0.3&quot;

defaultConfig {
minSdkVersion 10
targetSdkVersion 19
versionCode 1
versionName &quot;1.0&quot;
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}

dependencies {
compile 'com.android.support:appcompat-v7:+'
compile 'log4j:log4j:1.2.17'
compile 'javax.persistence:persistence-api:1.0'
compile 'com.turbomanage.storm:storm-api:0.98'
apt 'com.turbomanage.storm:storm-impl:0.98'
}
</pre>
<p>Now here&#8217;s the fun part. Previously, in order to debug and set breakpoints in the annotation processor itself, I used Eclipse RCP and ran it as an Eclipse plugin. Fortunately, there&#8217;s now an easier way using Java remote debugging. There are several variations on this technique (<a title="Configuring an annotation processor in IntelliJ" href="http://www.pingtimeout.fr/2012/10/debugging-annotation-processor-in-every.html">configuring an annotation processor directly in IntelliJ</a> or <a title="Debugging a gradle script" href="http://blogs.steeplesoft.com/posts/2013/09/10/gradle-tip-attaching-a-debugger/">debugging a gradle script</a>). Unfortunately, Android Studio rejected my adding the Xdebug JVM args directly to the gradle script. However, I found this workaround. It is not fully integrated with AS, but does allow me to debug the annotation processor on demand by running the gradle script.</p>
<p>Add these lines to your ~/.gradle/gradle.properties:</p>
<pre class="brush: plain; title: ; notranslate" title="">
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
</pre>
<p>Then do something that causes the gradle daemon to start.</p>
<pre class="brush: bash; title: ; notranslate" title="">
gradle --daemon
</pre>
<p>Now you can go into IntelliJ or Android Studio and attach a remote debugger. I use IntelliJ because AS won&#8217;t import the storm-gen maven projects and the whole point of this exercise is to set breakpoints in the storm-gen annotation processor. The screenshot shows configuring a remote debugger in IntelliJ. Just accept the defaults and make sure the port number matches your gradle.properties. It should also work in Eclipse.</p>
<div id="attachment_4761" style="width: 310px" class="wp-caption aligncenter"><a href="https://turbomanage.files.wordpress.com/2014/06/remote-debug.png"><img class="size-medium wp-image-4761" src="http://turbomanage.files.wordpress.com/2014/06/remote-debug.png?w=300&#038;h=181" alt="remote debug config" width="300" height="181" /></a><p class="wp-caption-text">Configure a remote debugger in IntelliJ</p></div>
<p>The remote debugger should attach to the running gradle daemon. You can then tickle the annotation processor by running a build. For example, this runs the storm-gen tests on an already-running emulator or connected device:</p>
<pre class="brush: bash; title: ; notranslate" title="">
cd storm-test
gradle clean connectedCheck
</pre>
<p>When the annotation processor runs, your breakpoint in IntelliJ (or Eclipse) should fire.</p>
<p>One caution with this technique is that Android Studio will also use the gradle daemon because it&#8217;s now configured in your gradle.properties. But if you launched the daemon from the command line, AS will try to launch it again and you&#8217;ll see an error message about the port already in use. In that case, simply kill the running gradle process and AS should be happy.</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4748"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4748"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4748"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4748-540588d154085' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4748&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4748-540588d154085' data-name='like-post-frame-341230-4748-540588d154085'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in <a href="http://turbomanage.wordpress.com/category/android/" rel="category tag">Android</a>, <a href="http://turbomanage.wordpress.com/category/intellij/" rel="category tag">IntelliJ</a> | <a href="http://turbomanage.wordpress.com/2014/06/09/debug-an-annotation-processor-with-intellij-and-gradle/#comments" title="Comment on Debug an Android annotation processor with gradle and IntelliJ (or&nbsp;Eclipse)">1 Comment &#187;</a></p>
</div>


<div class="post-4704 post type-post status-publish format-standard hentry category-appengine category-eclipse category-google-web-toolkit" id="post-4704">
<h2><a href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/" rel="bookmark">GWT, App Engine, maven, and&#8230;&nbsp;IntelliJ!</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on June 5, 2014</p>
<div class="entry">
<p>I&#8217;ve been putting off migrating to Android Studio for a while now because I&#8217;m frankly loathe to learn a new IDE. I&#8217;ve used Eclipse for a decade and grew to become very productive in it. But a completely different team at Google may have just well forced me into it.</p>
<p>When I joined the GWT Developer Relations team in 2010, I worked closely with the Google Plugin for Eclipse team to get maven support into GPE. With their excellent work, we eventually achieved the holy grail: you could import a POM containing maven-gae-plugin and gwt-maven-plugin into Eclipse and all the GWT + GAE stuff from GPE like launching dev mode would just work (well, if you had the right supporting plugins like m2e-wtp). So the other day, I picked up a POM that worked in those days and tried it out on Kepler + GPE + m2e-wtp. Amazingly enough, the GWT stuff still works. Google now supports its own appengine-maven-plugin, so I swapped out the old GAE plugin for the new. It&#8217;s <a href="https://developers.google.com/appengine/docs/java/webtoolsplatform">supposed to work</a> with GPE and WTP, but so far no dice. It will be great when they get the kinks worked out. Funny thing is, I remember seeing exactly the same problem with GAE-maven integration way back in my GWT days. Only then, I could just walk over to Rajeev&#8217;s desk and he would fix it <span class='wp-smiley emoji emoji-smile' title=':-)'>:-)</span></p>
<p>In the mean time, imagine my surprise to discover that I could just import the POM into IntelliJ (full edition) and everything works. The maven project imported, I can launch GWT dev mode, set breakpoints and debug, etc. It&#8217;s funny to me that JetBrains can keep up to date with Google App Engine better than the GPE team, but that&#8217;s how big companies move sometimes&#8230;.</p>
<p>So I&#8217;m off to learning new keyboard shortcuts (I could use the Eclipse keymap, but I had customized Eclipse, too. It&#8217;s easier than I thought to learn new tricks). And I have to say, the performance of IntelliJ is impressive. A couple of my teammates way back at Intuit will no doubt be glad to hear that I finally came around to maven + IntelliJ, not to mention some of my Android DevRel mates. We&#8217;ll see how this goes, but so far, I&#8217;m impressed.</p>
<p>&nbsp;</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4704"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4704"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4704"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4704-540588d1580d5' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4704&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4704-540588d1580d5' data-name='like-post-frame-341230-4704-540588d1580d5'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in <a href="http://turbomanage.wordpress.com/category/appengine/" rel="category tag">AppEngine</a>, <a href="http://turbomanage.wordpress.com/category/eclipse/" rel="category tag">Eclipse</a>, <a href="http://turbomanage.wordpress.com/category/google-web-toolkit/" rel="category tag">Google Web Toolkit</a> | <a href="http://turbomanage.wordpress.com/2014/06/05/gwt-app-engine-maven-and-intellij/#comments" title="Comment on GWT, App Engine, maven, and&#8230;&nbsp;IntelliJ!">1 Comment &#187;</a></p>
</div>


<div class="post-4689 post type-post status-publish format-standard hentry" id="post-4689">
<h2><a href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/" rel="bookmark">Android Camp in the&nbsp;Rockies</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on April 29, 2014</p>
<div class="entry">
<div id="attachment_4691" style="width: 310px" class="wp-caption alignright"><a href="http://turbomanage.files.wordpress.com/2014/04/androidinrockies.jpg"><img class="size-medium wp-image-4691" src="http://turbomanage.files.wordpress.com/2014/04/androidinrockies.jpg?w=300&#038;h=200" alt="Photo of Android green robot in RMNP" width="300" height="200" /></a><p class="wp-caption-text">Join me in the Rockies Aug 25-29</p></div>
<p>Calling all mountain lovers who&#8217;ve been thinking about learning Android development&#8230;</p>
<p>Ever feel like you&#8217;re just a bit too ADD to spend all week in a nondescript classroom and pay big bucks to stay in a downtown hotel where there&#8217;s not much to do? Does your brain hurt after working exercise after tedious exercise using courseware that adds little value over the API docs? Do you gain weight eating on the expense account without much exercise?</p>
<p>Me too. Besides these problems, in my past training experience I&#8217;ve found that many students find it difficult to maintain concentrated technical attention 8 hours at a time (yeah, it happens in the workplace, too). For myself, I find that I frequently want take a walk, preferably somewhere more refreshing than the parking lot or around the downtown block.</p>
<p>So I started looking around for venues in more refreshing places. I thought of Denver, Boulder, and Colorado Springs (see the pattern?). But then I realized that as long as my mind would still be <strong>in</strong> the mountains, I might as well put my body there, too.</p>
<p>So this is a bit of an experiment. I&#8217;m offering a 5-day Android bootcamp with lodging and meals included in one of the most refreshing spots on earth, <a href="http://ymcarockies.org/">YMCA of the Rockies Estes Park Center</a>. We have about 3 solid days of material, so we can cover it in 3, 4, or 5 days, and work around the weather for hiking. In the evenings, you can head into the bustling town of Estes Park or hang out in the meeting room to work on an app project with others in the group. We&#8217;ll have some special activities, too, like a BBQ or ice cream social. Because most schools in the US now start in early Aug, the last two weeks see a thinning out of the crowds. Which makes it a great time to visit RMNP, especially if you want to access the high trails free of snow.</p>
<p>Over the five days, we will learn the basics of Android development with an emphasis on enterprise apps. If you finish with a lab early or need a short break, you can play mini-golf or go elk-spotting in the woods at the center. During longer breaks, you can grab a buddy and go for a hike in Rocky Mountain National Park. I know the trails quite well and look forward to sharing them with you if you&#8217;re so inclined. If you&#8217;re really nice, I&#8217;ll talk you to the spot where I took the photo above. Bring your tripod for HDR <span class='wp-smiley emoji emoji-smile' title=':-)'>:-)</span></p>
<p>For further description, syllabus, cost, etc., see the full event listing on EventBrite below.</p>
<p>See you in Colorado!</p>
<p><a href="http://www.eventbrite.com/e/android-bootcamp-in-the-rockies-aug-25-29-tickets-11406211285?aff=wordpress2" target="_blank"><img src="https://www.eventbrite.com/custombutton?eid=11406211285" alt="Eventbrite - Android Bootcamp in the Rockies Aug 18-22" /></a></p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4689"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4689"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4689"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4689-540588d15cb03' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4689&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4689-540588d15cb03' data-name='like-post-frame-341230-4689-540588d15cb03'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in Uncategorized | <a href="http://turbomanage.wordpress.com/2014/04/29/android-in-the-rockies/#respond" title="Comment on Android Camp in the&nbsp;Rockies">Leave a Comment &#187;</a></p>
</div>


<div class="post-4655 post type-post status-publish format-standard hentry" id="post-4655">
<h2><a href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/" rel="bookmark">Ruh-roh, I think my brain is&nbsp;re-wiring</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on April 26, 2014</p>
<div class="entry">
<p>Spanish is starting to sound natural to me. This is very, very good news. But English&#8230; I can hardly spit this out: I&#8217;ve been making spelling mistakes. With increasing frequency, Gmail or Google Docs has put a red squiggly under a word after I&#8217;ve moved on the next one. At first I questioned why the spellchecker didn&#8217;t have certain words in the dictionary. But as it&#8217;s kept happening, I&#8217;m afraid there might be a better explanation. Spelling mistakes are very much a new thing for me (go ahead and laugh&#8211;please remember that I was very disappointed when I came runner up in the 3rd or 4th grade spelling bee). The other night, it took me until the next morning to remember the instinctive spelling of &#8220;legitimate.&#8221; For a long time, I sat staring at the red squiggly. I tried all kinds of things that didn&#8217;t make the squiggly go away and only the next day while I was walking downtown or maybe sitting in the kitchen, the word suddenly sort of appeared in my brain and it was obvious again.</p>
<p>Spelling isn&#8217;t all that&#8217;s wrong, however. I routinely find, upon re-reading what I&#8217;ve written, that left a word out or put in one the wrong order. This is very troubling! I have rarely needed to double-check my writing for grammar and spelling mistakes. No the purpose of revision is to smooth any rough edges [ok, this is getting ridiculous--the errors in the second sentence were for fun, but I really did forget the comma after "No" just now]. There are two possible explanations for this phenomenon. One is that I&#8217;m getting old. Of course, I know better than that. The second is that as I learn Spanish, my brain is somehow re-wiring. If that truly is the case, then I am left in complete awe of the Creator of the human mind. The capacity for learning our first language is a miracle, especially when you consider that two year olds do it. But the capacity to learn a second language at age 43, well&#8230; it blows my mind.</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4655"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4655"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4655"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4655-540588d160e55' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4655&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4655-540588d160e55' data-name='like-post-frame-341230-4655-540588d160e55'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in Uncategorized | <a href="http://turbomanage.wordpress.com/2014/04/26/ruh-roh-i-think-my-brain-is-re-wiring/#comments" title="Comment on Ruh-roh, I think my brain is&nbsp;re-wiring">4 Comments &#187;</a></p>
</div>


<div class="post-4471 post type-post status-publish format-standard hentry" id="post-4471">
<h2><a href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/" rel="bookmark">storm-gen has moved</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on March 20, 2014</p>
<div class="entry">
<p>In order to more easily support pull requests, I&#8217;ve moved storm-gen, the annotation-based open source ORM for Android SQLite, to Github. You can now find it here:</p>
<p><a href="https://github.com/turbomanage/storm-gen">https://github.com/turbomanage/storm-gen</a></p>
<p>I&#8217;ve migrated all open issues to the Github tracker and, following six months of language school in Peru, have recently resumed work on the framework. Thanks to Alex G, we&#8217;re about to add support for maven, gradle, and Android Studio. I&#8217;m also adding more operators and the long-awaited .order() method to FilterBuilder.</p>
<p>Also, there is now a <a href="https://plus.google.com/u/0/communities/111849422096213317275">G+ community</a> for feature discussion and a <a href="http://stackoverflow.com/questions/tagged/storm-gen">StackOverflow tag</a>.</p>
<p>Enjoy!</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4471"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4471"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4471"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4471-540588d16416f' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4471&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4471-540588d16416f' data-name='like-post-frame-341230-4471-540588d16416f'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in Uncategorized | <a href="http://turbomanage.wordpress.com/2014/03/20/storm-gen-has-moved/#respond" title="Comment on storm-gen has moved">Leave a Comment &#187;</a></p>
</div>


<div class="post-4385 post type-post status-publish format-standard hentry category-business-of-software" id="post-4385">
<h2><a href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/" rel="bookmark">Open for business in&nbsp;Peru</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on February 18, 2014</p>
<div class="entry">
<p>This is my last week in language school (at least until I need a refresher course) and with it come some big changes. My family has settled in to life in Arequipa, at least to the extent that can be expected after five months in a foreign country speaking a new language. I have received my work visa and have started a Peruvian company to focus on training / consulting for software developers.</p>
<p>My first client / partner is Lima-based <a href="http://tektonlabs.com">Tekton Labs</a>, which has hired me to provide technical training and architectural guidance to the cloud and mobile development teams. I am looking forward to working with the team for several reasons:</p>
<ol>
<li>Tekton has a talented team and strongly believes in personal development. This is very important because, while there are a few good computer science programs in the country, there is no substitute for continuing education in our field.</li>
<li>The company has a mature, agile software development process (Scrum), which in my view is a prerequisite for taking on large projects.</li>
<li>Tekton has a sizable portfolio of work for large enterprises, but still offers significantly lower prices than US-based companies.</li>
</ol>
<p>In the US, some of the most coveted jobs in programming are with Internet and software companies. In Peru, on the other hand, they are in finance and telecommunications because they typically pay the best ($500 &#8211; $2,000 / mo. + benefits). Unfortunately, this means there are few cloud and mobile jobs here; however, there ARE talented developers with the necessary training as well as self-taught hackers just like in the US. My aim is to help provide further training for these developers and to connect them with US-based companies like startups who may have great ideas, but can&#8217;t afford US-based labor. Over the next year or two, I&#8217;ll keep you posted on how it&#8217;s going. In the mean time, if you have an idea which might be a fit for a Peruvian development team, ping me on G+ and let&#8217;s talk.</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4385"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4385"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4385"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4385-540588d167e07' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4385&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4385-540588d167e07' data-name='like-post-frame-341230-4385-540588d167e07'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in <a href="http://turbomanage.wordpress.com/category/business-of-software/" rel="category tag">Business of Software</a> | <a href="http://turbomanage.wordpress.com/2014/02/18/open-for-business-in-peru-2/#comments" title="Comment on Open for business in&nbsp;Peru">3 Comments &#187;</a></p>
</div>


<div class="post-4361 post type-post status-publish format-standard hentry" id="post-4361">
<h2><a href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/" rel="bookmark">A long pause</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on October 21, 2013</p>
<div class="entry">
<p><a href="http://turbomanage.files.wordpress.com/2013/10/img_5806_dxo.jpg"><img class="alignright size-medium wp-image-4378" alt="IMG_5806_DxO" src="http://turbomanage.files.wordpress.com/2013/10/img_5806_dxo.jpg?w=300&#038;h=199" width="300" height="199" /></a>Hello faithful readers! I apologize for my long absence on these pages. I have not fallen off the edge of cyberspace, just below the equator. In the preceding months, my family has sold most of our earthly possessions (save the small electronic ones :-)) and moved to Peru. We are currently attending language school in fulfillment of a lifetime goal to become fluent in Spanish. I am currently on unpaid leave with status to be determined after language school. Until then, I have precious little time for coding, but hope to squeeze in some work on storm-gen shortly and to continue writing about Android, App Engine, GWT, and other topics as time permits.</p>
<p>At some point, I&#8217;d also like to write more about how technology has facilitated our move, but suffice it to say that a scanner, Google Drive, Google Play Books, the Kindle app, and a host of phones and tablets make possible a near weightless existence, which is extremely helpful when conducting an international move. Thankfully, Internet connectivity (both mobile and fixed) is quite good in the major cities of Peru, so our &#8220;everything in the cloud&#8221; strategy has worked well thus far, although my wife doesn&#8217;t think the kitchen made the move very well in the cloud.</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4361"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4361"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4361"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4361-540588d16bdcb' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4361&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4361-540588d16bdcb' data-name='like-post-frame-341230-4361-540588d16bdcb'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in Uncategorized | <a href="http://turbomanage.wordpress.com/2013/10/21/a-long-pause/#comments" title="Comment on A long pause">6 Comments &#187;</a></p>
</div>


<div class="post-4299 post type-post status-publish format-standard hentry category-android category-appengine" id="post-4299">
<h2><a href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/" rel="bookmark">Android + Cloud with Mobile Backend&nbsp;Starter</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on May 21, 2013</p>
<div class="entry">
<p>The Google Cloud Solutions team has made it easier than ever to create a cloud backend for your Android application. Brad Abrams and I presented it last week at Google I/O, and Brad has published a gigantic step-by-step blog post with copious screenshots on how we built our sample app, Geek Serendipity. Here&#8217;s all the related content in one handy list:</p>
<ul>
<li><a title="Building Geek Serendipity" href="http://bradabrams.com/2013/05/google-io-2013-session-overview-from-nothing-to-nirvana-in-minutes-cloud-backend-for-your-android-application-building-geek-serendipity/">Building Geek Serendipity</a> (BradAbrams.com)</li>
<li><a title="Google I/O session" href="https://developers.google.com/events/io/sessions/333508149">From Nothing to Nirvana in Minutes: Cloud Backend for Your Android Application</a> (I/O talk)</li>
<li><a style="font-size:13px;" title="Geek Serendipity source" href="https://github.com/bradabrams/GeekSerendipity-io13">Geek Serendipity source</a><span style="font-size:13px;"> (github)</span></li>
<li><a title="Geek Serendipity app" href="https://play.google.com/store/apps/details?id=com.turbomanage.sample.geekwatch">Geek Serendipity app</a> in Google Play Store</li>
<li><a title="Android demo tips: behind the scenes at Google I/O" href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/">Android demo tips: behind the scenes at Google I/O</a> (lessons learned)</li>
</ul>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4299"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4299"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4299"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4299-540588d16f531' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4299&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4299-540588d16f531' data-name='like-post-frame-341230-4299-540588d16f531'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in <a href="http://turbomanage.wordpress.com/category/android/" rel="category tag">Android</a>, <a href="http://turbomanage.wordpress.com/category/appengine/" rel="category tag">AppEngine</a> | <a href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/#comments" title="Comment on Android + Cloud with Mobile Backend&nbsp;Starter">8 Comments &#187;</a></p>
</div>


<div class="post-4293 post type-post status-publish format-standard hentry category-android category-eclipse category-headsmack" id="post-4293">
<h2><a href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/" rel="bookmark">Android demo tips: behind the scenes at Google&nbsp;I/O</a></h2>
<p class="date">Posted by <a href="http://turbomanage.wordpress.com/">David Chandler</a> on May 20, 2013</p>
<div class="entry">
<p>Last week at Google I/O, Brad Abrams and I decided to go for the gold and give a talk on <a title="From Nothing to Nirvana in Minutes: Building a Cloud Backend for Your Android Application" href="https://developers.google.com/events/io/sessions/333508149">building a cloud backend for your Android app</a>, complete with live coding on stage. For a more interesting example, we chose to build a sample app which relies on location services and Google Cloud Messaging. It all seemed like a good idea at the time. For the benefit of other Android presenters, I wanted to give a behind-the-scenes view of how we overcame some significant challenges to pull off the demos. Also, I will explain the anomalies we saw.</p>
<p><strong>Device display.</strong> The easiest way to show an app is using an emulator, but Maps V2 API is part of Google Play Services, which doesn&#8217;t currently run on the Android emulator, so we needed physical devices. <a title="Droid@Screen" href="http://droid-at-screen.ribomation.com/">Droid@Screen</a> works, but it updates slowly and requires the USB cable, which we needed for hardwired Ethernet. Some devices support HDMI out (Galaxy Nexus, N10) which can be used with a <a title="BlackMagic Design Intensity Shuttle Thunderbolt" href="http://www.amazon.com/gp/product/B007ZDHDRS/">BlackMagic</a> or similar HDMI capture box to show the device display on your Mac screen. Note that this requires a Mac with two Thunderbolt ports (hello Retina! BlackMagic in, Mac display adapter out). We could not use this because the phone&#8217;s HDMI connector is shared with the USB connector, which we needed for hardwired Ethernet. Fortunately, we had a Wolfvision projector camera available and a 4-port video switcher to show our Macs or the camera. For best results with a projector, set the phone display brightness to max.</p>
<p><strong>The network.</strong> Gather 5000+ geeks in a massive concrete structure, give them all a new wifi device, and then try to get a working Internet connection&#8230; Despite Google&#8217;s stellar efforts, getting wireless Internet at Moscone Center remains very challenging. 3G / 4G / LTE is inhibited by the concrete and steel, and even 5GHz wifi suffered from RF interference or sheer demand. Thus, we knew in advance that we would need hardwired Internet. This was no problem for our laptops, but we also needed 2 phones for the demos to show continuous queries in action. Fortunately, Galaxy Nexus phones support wired connections using a USB OTG adapter paired with a USB to Ethernet adapter, and it just worked. So far so good.</p>
<p><strong>Deferred launch.</strong> Because we were coding live in Eclipse, we deployed the code to the phones in real time via the USB cable. When you run an Android app in Eclipse, the default action is to install and run the app. But this  created a problem for the simple version of our demo app, which needed an Internet connection on launch to send a location update immediately. We had to disconnect the USB cable, walk the phone over to the camera, plug in the hardwired Ethernet, and only then launch the app via the home screen. Fortunately, Eclipse has a way to support this. In the project&#8217;s run configuration on the Android tab, simply select &#8220;Do nothing&#8221; for the launch action. This installs the app, but doesn&#8217;t launch it.</p>
<p><strong>Live coding.</strong> Speaking of live coding, we have all seen those demos with lots of tedious cut and paste operations from a text file to the IDE. As a presenter, I want something visible in the IDE to prompt me for the fully manually steps as well as an easy way to paste in blocks of code. Eclipse snippets are just the thing. You can show them off to the side of your main editor window, then double-click on a snippet to paste it in. I used snippet titles without code to prompt me for the manual steps. Another challenge of live coding is that you might make a mistake at an early stage of the demo which ruins a later stage. In order to facilitate recovery, we created snapshots of working demo code at six different stages during our presentation. It would have been nice to preinstall these app versions on the devices; however, they all use the same package name and the Android installer doesn&#8217;t allow more than one at the same time. Hence the need for adb install and the deferred launch technique. Also we had to uninstall the prior version of the app on the device before each coding stage. Furthermore, Eclipse doesn&#8217;t let you create multiple projects with the same name. There is a workaround, but it kind of spoils the magic of our talk and I&#8217;ve already spilled enough secrets&#8230; let&#8217;s just say Eclipse workspaces and &#8220;Copy project&#8221; are a beautiful thing.</p>
<p><strong>Location services.</strong> This is the one that snagged us in the first demo. It turns out that location services are not in fact magic, but require GPS (in Moscone?!) or wifi, which we turned off just before speaking to eliminate the possibility of conflict with the hardwired Ethernet. Fortunately, we were able to get a good enough wifi signal in a later demo to show location. On desktop devices, geolocation works with a hard-wired connection, so I&#8217;m not yet sure whether this is a bug or a feature on mobile&#8230; it is admittedly an uncommon use case.</p>
<p><strong>The unanticipated.</strong> After recovering from the first demo glitch by turning on wifi, I demonstrated that location services worked, but it never sent the location to the server. It turns out the code was working as intended&#8211;I had already enabled authentication for my next segment, but the app from the previous segment which I revisited did not have auth turned on. Finally, the last demo showed two markers when it should have showed only one. The second marker turned out be a fellow Googler in the audience who had helped dogfood an early version of the demo app. So once again, the code worked as intended, just not as I intended at the moment. But&#8230; this is the stuff live demos are made of. I still prefer live demos with a few glitches to an hour full of slides <span class='wp-smiley emoji emoji-smile' title=':-)'>:-)</span></p>
<p>So now you know what Brad and I were busily doing while the other was talking and why talks of this complexity are pretty much impossible without two people and a lot of presentation gear. It was a teeny bit intimidating knowing that our session was part of the Google I/O live stream with thousands of viewers, but in the end, it came off (almost) without glitches and our gracious audience was wowed by the Mobile Backend Starter project. Mission accomplished!</p>
<p>See my <a title="Google Cloud + Android with Mobile Backend Starter" href="http://turbomanage.wordpress.com/2013/05/21/google-cloud-android-with-mobile-backend-starter/">next post</a> for a complete list of resources on Mobile Backend Starter.</p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-google-plus-1"><a rel="nofollow" class="share-google-plus-1 sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/?share=google-plus-1" title="Click to share on Google+" id="sharing-google-4293"><span>Google</span></a></li><li class="share-twitter"><a rel="nofollow" class="share-twitter sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/?share=twitter" title="Click to share on Twitter" id="sharing-twitter-4293"><span>Twitter</span></a></li><li class="share-linkedin"><a rel="nofollow" class="share-linkedin sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/?share=linkedin" title="Click to share on LinkedIn" id="sharing-linkedin-4293"><span>LinkedIn</span></a></li><li class="share-email"><a rel="nofollow" class="share-email sd-button share-icon" href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/?share=email" title="Click to email this to a friend"><span>Email</span></a></li><li class="share-end"></li></ul></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-341230-4293-540588d174488' data-src='//widgets.wp.com/likes/#blog_id=341230&amp;post_id=4293&amp;origin=turbomanage.wordpress.com&amp;obj_id=341230-4293-540588d174488' data-name='like-post-frame-341230-4293-540588d174488'><h3 class='sd-title'>Like this:</h3><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height:55px'><span class='button'><span>Like</span></span> <span class="loading">Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div>

<p class="category">Posted in <a href="http://turbomanage.wordpress.com/category/android/" rel="category tag">Android</a>, <a href="http://turbomanage.wordpress.com/category/eclipse/" rel="category tag">Eclipse</a>, <a href="http://turbomanage.wordpress.com/category/headsmack/" rel="category tag">Headsmack</a> | <a href="http://turbomanage.wordpress.com/2013/05/20/android-demo-tips-behind-the-scenes-at-google-io/#comments" title="Comment on Android demo tips: behind the scenes at Google&nbsp;I/O">10 Comments &#187;</a></p>
</div>

<div class="bottomnavigation">
<div class="alignleft"><a href="http://turbomanage.wordpress.com/page/2/" >&laquo; Previous Entries</a></div>
<div class="alignright"></div>
</div>

</div>

</div>
<div class="clearingdiv">&nbsp;</div>
</div>

<div id="footer">
<a href="https://wordpress.com/?ref=footer_blog">Blog at WordPress.com</a>. | <a href="https://wordpress.com/themes/andreas09/" title="Learn more about this theme">The Andreas09 Theme</a>.</div>

<script type='text/javascript' src='//0.gravatar.com/js/gprofiles.js?ver=201436x'></script>
<script type='text/javascript'>
/* <![CDATA[ */
var WPGroHo = {"my_hash":""};
/* ]]> */
</script>
<script type='text/javascript' src='http://s2.wp.com/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1380573781g'></script>

<script>
//initialize and attach hovercards to all gravatars
jQuery( document ).ready( function( $ ) {
if ( typeof Gravatar.init !== "function" ) {
return;
}

Gravatar.profile_cb = function( hash, id ) {
WPGroHo.syncProfileData( hash, id );
};
Gravatar.my_hash = WPGroHo.my_hash;
Gravatar.init( 'body', '#wp-admin-bar-my-account' );
});
</script>

<div style="display:none">
<div class="grofile-hash-map-614e792082e78cd852d0b60ae0f28bef">
</div>
</div>

<div id="bit" class="loggedout-follow-normal">
<a class="bsub" href="javascript:void(0)"><span id='bsub-text'>Follow</span></a>
<div id="bitsubscribe">

<h3><label for="loggedout-follow-field">Follow &ldquo;TurboManage&rdquo;</label></h3>

<form action="https://subscribe.wordpress.com" method="post" accept-charset="utf-8" id="loggedout-follow">
<p>Get every new post delivered to your Inbox.</p>

<p id="loggedout-follow-error" style="display: none;"></p>

<p class="bit-follow-count">Join 226 other followers</p>
<p><input type="email" name="email" value="Enter your email address" onfocus='this.value=(this.value=="Enter your email address") ? "" : this.value;' onblur='this.value=(this.value=="") ? "Enter email address" : this.value;' id="loggedout-follow-field"/></p>

<input type="hidden" name="action" value="subscribe"/>
<input type="hidden" name="blog_id" value="341230"/>
<input type="hidden" name="source" value="http://turbomanage.wordpress.com/"/>
<input type="hidden" name="sub-type" value="loggedout-follow"/>

<input type="hidden" id="_wpnonce" name="_wpnonce" value="47665a72d0" /><input type="hidden" name="_wp_http_referer" value="/" />
<p id='bsub-subscribe-button'><input type="submit" value="Sign me up" /></p>
</form>
<div id='bsub-credit'><a href="https://wordpress.com/?ref=lof">Powered by WordPress.com</a></div>
</div><!-- #bitsubscribe -->
</div><!-- #bit -->

<script type="text/javascript">
WPCOM_sharing_counts = {"http:\/\/turbomanage.wordpress.com\/2014\/07\/23\/painless-restjson-api-with-jersey-and-restygwt\/":4769,"http:\/\/turbomanage.wordpress.com\/2014\/06\/09\/debug-an-annotation-processor-with-intellij-and-gradle\/":4748,"http:\/\/turbomanage.wordpress.com\/2014\/06\/05\/gwt-app-engine-maven-and-intellij\/":4704,"http:\/\/turbomanage.wordpress.com\/2014\/04\/29\/android-in-the-rockies\/":4689,"http:\/\/turbomanage.wordpress.com\/2014\/04\/26\/ruh-roh-i-think-my-brain-is-re-wiring\/":4655,"http:\/\/turbomanage.wordpress.com\/2014\/03\/20\/storm-gen-has-moved\/":4471,"http:\/\/turbomanage.wordpress.com\/2014\/02\/18\/open-for-business-in-peru-2\/":4385,"http:\/\/turbomanage.wordpress.com\/2013\/10\/21\/a-long-pause\/":4361,"http:\/\/turbomanage.wordpress.com\/2013\/05\/21\/google-cloud-android-with-mobile-backend-starter\/":4299,"http:\/\/turbomanage.wordpress.com\/2013\/05\/20\/android-demo-tips-behind-the-scenes-at-google-io\/":4293} </script>
<script type="text/javascript">
jQuery(document).on( 'ready post-load', function(){
jQuery( 'a.share-google-plus-1' ).on( 'click', function() {
window.open( jQuery(this).attr( 'href' ), 'wpcomgoogle-plus-1', 'menubar=1,resizable=1,width=480,height=550' );
return false;
});
});
</script>
<script type="text/javascript">
jQuery(document).on( 'ready post-load', function(){
jQuery( 'a.share-twitter' ).on( 'click', function() {
window.open( jQuery(this).attr( 'href' ), 'wpcomtwitter', 'menubar=1,resizable=1,width=600,height=350' );
return false;
});
});
</script>
<script type="text/javascript">
jQuery(document).on( 'ready post-load', function(){
jQuery( 'a.share-linkedin' ).on( 'click', function() {
window.open( jQuery(this).attr( 'href' ), 'wpcomlinkedin', 'menubar=1,resizable=1,width=580,height=450' );
return false;
});
});
</script>
<div id="sharing_email" style="display: none;">
<form action="/" method="post">
<label for="target_email">Send to Email Address</label>
<input type="email" name="target_email" id="target_email" value="" />


<label for="source_name">Your Name</label>
<input type="text" name="source_name" id="source_name" value="" />

<label for="source_email">Your Email Address</label>
<input type="email" name="source_email" id="source_email" value="" />


<div class="recaptcha" id="sharing_recaptcha"></div><input type="hidden" name="recaptcha_public_key" id="recaptcha_public_key" value="6LcYW8MSAAAAADBAuEH9yaPcF7lWh11Iq62ZKtoo" />
<img style="float: right; display: none" class="loading" src="http://s2.wp.com/wp-content/mu-plugins/post-flair/sharing/images/loading.gif?m=1315610318g" alt="loading" width="16" height="16" />
<input type="submit" value="Send Email" class="sharing_send" />
<a href="#cancel" class="sharing_cancel">Cancel</a>

<div class="errors errors-1" style="display: none;">
Post was not sent - check your email addresses! </div>

<div class="errors errors-2" style="display: none;">
Email check failed, please try again </div>

<div class="errors errors-3" style="display: none;">
Sorry, your blog cannot share posts by email. </div>
</form>
</div>
<iframe src='http://widgets.wp.com/likes/master.html?ver=20140922#ver=20140922&amp;mp6=1' scrolling='no' id='likes-master' name='likes-master' style='display:none;'></iframe>
<div id='likes-other-gravatars'><div class="likes-text"><span>%d</span> bloggers like this:</div><ul class="wpl-avatars sd-like-gravatars"></ul></div>
<script type="text/javascript">
//<![CDATA[
var jetpackLikesWidgetQueue = [];
var jetpackLikesWidgetBatch = [];
var jetpackLikesMasterReady = false;

function JetpackLikespostMessage( message, target ) {
if ( "string" === typeof message ){
try{
message = JSON.parse( message );
}
catch(e) {
return;
}
}

pm( {
target: target,
type: 'likesMessage',
data: message,
origin: '*'
} );
}

function JetpackLikesBatchHandler() {
var requests = [];
jQuery( 'div.jetpack-likes-widget-unloaded' ).each( function( i ) {
if ( jetpackLikesWidgetBatch.indexOf( this.id ) > -1 )
return;
jetpackLikesWidgetBatch.push( this.id );
var regex = /like-(post|comment)-wrapper-(\d+)-(\d+)-(\w+)/;
var match = regex.exec( this.id );
if ( ! match || match.length != 5 )
return;

var info = {
blog_id: match[2],
width: this.width
};

if ( 'post' == match[1] ) {
info.post_id = match[3];
} else if ( 'comment' == match[1] ) {
info.comment_id = match[3];
}

info.obj_id = match[4];

requests.push( info );
});

if ( requests.length > 0 ) {
JetpackLikespostMessage( { event: 'initialBatch', requests: requests }, window.frames['likes-master'] );
}
}

function JetpackLikesMessageListener( event ) {
if ( "undefined" == typeof event.event )
return;

if ( 'masterReady' == event.event ) {
jQuery( document ).ready( function() {
jetpackLikesMasterReady = true;

var stylesData = {
event: 'injectStyles'
};

if ( jQuery( 'iframe.admin-bar-likes-widget' ).length > 0 ) {
JetpackLikespostMessage( { event: 'adminBarEnabled' }, window.frames[ 'likes-master' ] );

stylesData.adminBarStyles = {
background: jQuery( '#wpadminbar .quicklinks li#wp-admin-bar-wpl-like > a' ).css( 'background' ),
isRtl: ( 'rtl' == jQuery( '#wpadminbar' ).css( 'direction' ) )
};
}

if ( !window.addEventListener )
jQuery( '#wp-admin-bar-admin-bar-likes-widget' ).hide();

stylesData.textStyles = {
color: jQuery( '.sd-text-color').css( 'color' ),
fontFamily: jQuery( '.sd-text-color' ).css( 'font-family' ),
fontSize: jQuery( '.sd-text-color' ).css( 'font-size' ),
direction: jQuery( '.sd-text-color' ).css( 'direction' ),
fontWeight: jQuery( '.sd-text-color' ).css( 'font-weight' ),
fontStyle: jQuery( '.sd-text-color' ).css( 'font-style' ),
textDecoration: jQuery( '.sd-text-color' ).css('text-decoration')
};

stylesData.linkStyles = {
color: jQuery( '.sd-link-color' ).css('color'),
fontFamily: jQuery( '.sd-link-color' ).css('font-family'),
fontSize: jQuery( '.sd-link-color' ).css('font-size'),
textDecoration: jQuery( '.sd-link-color' ).css('text-decoration'),
fontWeight: jQuery( '.sd-link-color' ).css( 'font-weight' ),
fontStyle: jQuery( '.sd-link-color' ).css( 'font-style' )
};

JetpackLikespostMessage( stylesData, window.frames[ 'likes-master' ] );

JetpackLikesBatchHandler();

jQuery( document ).on( 'inview', 'div.jetpack-likes-widget-unloaded', function() {
jetpackLikesWidgetQueue.push( this.id );
});
});
}

if ( 'showLikeWidget' == event.event ) {
jQuery( '#' + event.id + ' .post-likes-widget-placeholder' ).fadeOut( 'fast', function() {
jQuery( '#' + event.id + ' .post-likes-widget' ).fadeIn( 'fast', function() {
JetpackLikespostMessage( { event: 'likeWidgetDisplayed', blog_id: event.blog_id, post_id: event.post_id, obj_id: event.obj_id }, window.frames['likes-master'] );
});
});
}

if ( 'clickReblogFlair' == event.event ) {
wpcom_reblog.toggle_reblog_box_flair( event.obj_id );
}

if ( 'showOtherGravatars' == event.event ) {
var $container = jQuery( '#likes-other-gravatars' );
var $list = $container.find( 'ul' );

$container.hide();
$list.html( '' );

$container.find( '.likes-text span' ).text( event.total );

jQuery.each( event.likers, function( i, liker ) {
$list.append( '<li class="' + liker.css_class + '"><a href="' + liker.profile_URL + '" class="wpl-liker" rel="nofollow" target="_parent"><img src="' + liker.avatar_URL + '" alt="' + liker.name + '" width="30" height="30" style="padding-right: 3px;" /></a></li>');
} );

var offset = jQuery( "[name='" + event.parent + "']" ).offset();

$container.css( 'left', offset.left + event.position.left - 10 + 'px' );
$container.css( 'top', offset.top + event.position.top - 33 + 'px' );

var rowLength = Math.floor( event.width / 37 );
var height = ( Math.ceil( event.likers.length / rowLength ) * 37 ) + 13;
if ( height > 204 ) {
height = 204;
}

$container.css( 'height', height + 'px' );
$container.css( 'width', rowLength * 37 - 7 + 'px' );

$list.css( 'width', rowLength * 37 + 'px' );

$container.fadeIn( 'slow' );

var scrollbarWidth = $list[0].offsetWidth - $list[0].clientWidth;
if ( scrollbarWidth > 0 ) {
$container.width( $container.width() + scrollbarWidth );
$list.width( $list.width() + scrollbarWidth );
}
}
}

pm.bind( 'likesMessage', function(e) { JetpackLikesMessageListener(e); } );

jQuery( document ).click( function( e ) {
var $container = jQuery( '#likes-other-gravatars' );

if ( $container.has( e.target ).length === 0 ) {
$container.fadeOut( 'slow' );
}
});

function JetpackLikesWidgetQueueHandler() {
var wrapperID;
if ( ! jetpackLikesMasterReady ) {
setTimeout( JetpackLikesWidgetQueueHandler, 500 );
return;
}

if ( jetpackLikesWidgetQueue.length > 0 ) {
// We may have a widget that needs creating now
var found = false;
while( jetpackLikesWidgetQueue.length > 0 ) {
// Grab the first member of the queue that isn't already loading.
wrapperID = jetpackLikesWidgetQueue.splice( 0, 1 )[0];
if ( jQuery( '#' + wrapperID ).hasClass( 'jetpack-likes-widget-unloaded' ) ) {
found = true;
break;
}
}
if ( ! found ) {
setTimeout( JetpackLikesWidgetQueueHandler, 500 );
return;
}
} else if ( jQuery( 'div.jetpack-likes-widget-unloaded' ).length > 0 ) {
// Grab any unloaded widgets for a batch request
JetpackLikesBatchHandler();

// Get the next unloaded widget
wrapperID = jQuery( 'div.jetpack-likes-widget-unloaded' ).first()[0].id;
if ( ! wrapperID ) {
// Everything is currently loaded
setTimeout( JetpackLikesWidgetQueueHandler, 500 );
return;
}
}

if ( 'undefined' === typeof wrapperID ) {
setTimeout( JetpackLikesWidgetQueueHandler, 500 );
return;
}

var $wrapper = jQuery( '#' + wrapperID );
$wrapper.find( 'iframe' ).remove();

if ( $wrapper.hasClass( 'slim-likes-widget' ) ) {
$wrapper.find( '.post-likes-widget-placeholder' ).after( "<iframe class='post-likes-widget jetpack-likes-widget' name='" + $wrapper.data( 'name' ) + "' height='22px' width='68px' frameBorder='0' scrolling='no' src='" + $wrapper.data( 'src' ) + "'></iframe>" );
} else {
$wrapper.find( '.post-likes-widget-placeholder' ).after( "<iframe class='post-likes-widget jetpack-likes-widget' name='" + $wrapper.data( 'name' ) + "' height='55px' width='100%' frameBorder='0' src='" + $wrapper.data( 'src' ) + "'></iframe>" );
}

$wrapper.removeClass( 'jetpack-likes-widget-unloaded' ).addClass( 'jetpack-likes-widget-loading' );

$wrapper.find( 'iframe' ).load( function( e ) {
var $iframe = jQuery( e.target );
$wrapper.removeClass( 'jetpack-likes-widget-loading' ).addClass( 'jetpack-likes-widget-loaded' );

JetpackLikespostMessage( { event: 'loadLikeWidget', name: $iframe.attr( 'name' ), width: $iframe.width() }, window.frames[ 'likes-master' ] );

if ( $wrapper.hasClass( 'slim-likes-widget' ) ) {
$wrapper.find( 'iframe' ).Jetpack( 'resizeable' );
}
});
setTimeout( JetpackLikesWidgetQueueHandler, 250 );
}
JetpackLikesWidgetQueueHandler();
//]]>
</script>
<script type='text/javascript' src='http://s2.wp.com/_static/??-eJzTLy/QTc7PK0nNK9EvyClNz8wr1i+uzCtJrMjITM/IAeKS1CJMEWP94uSizIISoOIM5/yiVL2sYh19yo1yKiotzvBKLEukpnlOicUZ1DTPvSg/v6ySmiYG5CRm5gENtM+1NTS2NDc3MzI1MswCACc2n7o='></script>
<script type='text/javascript'>
(function(){
var corecss = document.createElement('link');
var themecss = document.createElement('link');
var corecssurl = "http://s0.wp.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?m=1395343499g&amp;ver=3.0.83c";
if ( corecss.setAttribute ) {
corecss.setAttribute( "rel", "stylesheet" );
corecss.setAttribute( "type", "text/css" );
corecss.setAttribute( "href", corecssurl );
} else {
corecss.rel = "stylesheet";
corecss.href = corecssurl;
}
document.getElementsByTagName("head")[0].insertBefore( corecss, document.getElementById("syntaxhighlighteranchor") );
var themecssurl = "http://s0.wp.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?m=1363304414g&amp;ver=3.0.83c";
if ( themecss.setAttribute ) {
themecss.setAttribute( "rel", "stylesheet" );
themecss.setAttribute( "type", "text/css" );
themecss.setAttribute( "href", themecssurl );
} else {
themecss.rel = "stylesheet";
themecss.href = themecssurl;
}
//document.getElementById("syntaxhighlighteranchor").appendChild(themecss);
document.getElementsByTagName("head")[0].insertBefore( themecss, document.getElementById("syntaxhighlighteranchor") );
})();
SyntaxHighlighter.config.strings.expandSource = '+ expand source';
SyntaxHighlighter.config.strings.help = '?';
SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
SyntaxHighlighter.defaults['pad-line-numbers'] = false;
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
</script>
<script type='text/javascript'>
/* <![CDATA[ */
var recaptcha_options = {"lang":"en"};
/* ]]> */
</script>
<script type='text/javascript' src='http://s2.wp.com/_static/??/wp-content/js/devicepx.js,/wp-content/mu-plugins/post-flair/sharing/sharing.js?m=1399919068j'></script>
<script type="text/javascript">
// <![CDATA[
(function() {
try{
if ( window.external &&'msIsSiteMode' in window.external) {
if (window.external.msIsSiteMode()) {
var jl = document.createElement('script');
jl.type='text/javascript';
jl.async=true;
jl.src='/wp-content/plugins/ie-sitemode/custom-jumplist.php';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jl, s);
}
}
}catch(e){}
})();
// ]]>
</script><script src="//stats.wp.com/w.js?23" type="text/javascript"></script>
<script type="text/javascript">
st_go({'blog':'341230','v':'wpcom','tz':'-5','user_id':'0','subd':'turbomanage'});
ex_go({'crypt':'UE40eW5QN0p8M2Y/RE1LVmwrVi5vQS5fVFtfdHBbPyw1VXIrU3hWLHhmcmw0bWUwNiVnR3N1V2dDZTM4MGFxVndRQl1HNkJtOEQ0dVBbbk9jP2g4T29lWFFNTDRyXTZBYXo0THRYZCZ4Lm10Qj1zQXExbGY4PUEyNFFxRExMWUo3UElfM3ZraldEazlzc29KNWQxSGFzenZ5R2dQQ2R8ZEZ4flB0N3gzb0lVTU9JOGVCSEQ9eXNMU2pYMkVNdEhDenNsSVJFR0xDcFlUbz18fj1KTDdiay1FY3RmWSVpN11KT0UxTGxbb29TTURCdkt6KzJRLWxwckN0dmg/VlBGOWZmZytzazRvQitZfFdSbCZHVDhdLjJ1TzFQMUoscDlpVWNkPzlSU0lZbF1fUFNKeXFwM1lEQ1lOazY5ZDR1aVZ4PzM3KzE='});
addLoadEvent(function(){linktracker_init('341230',0);});
</script>
<noscript><img src="http://pixel.wp.com/b.gif?v=noscript" style="height:0px;width:0px;overflow:hidden" alt="" /></noscript>
<script>
if ( 'object' === typeof wpcom_mobile_user_agent_info ) {

wpcom_mobile_user_agent_info.init();
var mobileStatsQueryString = "";

if( false !== wpcom_mobile_user_agent_info.matchedPlatformName )
mobileStatsQueryString += "&x_" + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName;

if( false !== wpcom_mobile_user_agent_info.matchedUserAgentName )
mobileStatsQueryString += "&x_" + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName;

if( wpcom_mobile_user_agent_info.isIPad() )
mobileStatsQueryString += "&x_" + 'ipad_views' + '=' + 'views';

if( "" != mobileStatsQueryString ) {
new Image().src = document.location.protocol + '//pixel.wp.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random();
}

}
</script>
</body>

</html>