<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CE8GQXg7fyp7ImA9WxJUFkU.&quot;"><id>tag:blogger.com,1999:blog-11300808</id><updated>2009-07-15T11:33:40.607-07:00</updated><title type="text">Google Code Blog</title><subtitle type="html">Updates from Google's open source projects.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://googlecode.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Chris DiBona</name><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>547</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/blogspot/Dcni" type="application/atom+xml" /><entry gd:etag="W/&quot;CkEMR345eip7ImA9WxJUFUQ.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-6840406311800275362</id><published>2009-07-14T09:40:00.000-07:00</published><updated>2009-07-14T09:58:06.022-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-14T09:58:06.022-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google data apis" /><category scheme="http://www.blogger.com/atom/ns#" term="google gadgets" /><category scheme="http://www.blogger.com/atom/ns#" term="calendar" /><title>Sidebar Gadgets: Coming soon to a Calendar near you</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O05tjELC3Y8/SlvfBOPtbCI/AAAAAAAAFuU/Co-x3uNz3-Y/s1600-h/dcrmm5ft_1dn86fpgw_b.png" style="text-decoration: none;"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 166px; height: 83px;" src="http://3.bp.blogspot.com/_O05tjELC3Y8/SlvfBOPtbCI/AAAAAAAAFuU/Co-x3uNz3-Y/s320/dcrmm5ft_1dn86fpgw_b.png" alt="" id="BLOGGER_PHOTO_ID_5358121393784187938" border="0" /&gt;&lt;/a&gt;We've always believed users should have open and unencumbered access to their data, and Google Calendar is no exception. Whether through iCalendar, CalDAV, or the Calendar Data API, there are a multitude of options to access Calendar from other applications. However, developers have been asking for a way to extend the Google Calendar interface itself, and we've been listening.&lt;br /&gt;&lt;br /&gt;Today, as part of &lt;a href="http://googleappsposts.blogspot.com/2009/07/introducing-google-calendar-labs.html"&gt;Google Calendar Labs&lt;/a&gt;, we're opening up Google Calendar as a gadget container.&lt;br /&gt;&lt;br /&gt;Gadget developers will already be familiar with most of this environment, complete with features such as OpenSocial for social networking and OAuth for working with third-party services. However, for the first time we're also providing an API to control and interact with the Calendar user interface. This means that even though your gadgets are running inside a sandbox, they are first-class elements of the Calendar user experience. In fact, many of the experiments we've made available through Calendar Labs were written using the publicly available gadget API.&lt;br /&gt;&lt;br /&gt;We hope you'll share our excitement in opening up the Google Calendar interface. To get you started, take a look at the &lt;a href="http://code.google.com/apis/calendar/gadgets/sidebar/"&gt;Sidebar Gadget documentation and sample code&lt;/a&gt;. If you have any questions or ideas for improvement, feel free to visit the &lt;a href="http://groups.google.com/group/google-calendar-help-dataapi"&gt;Calendar API help group&lt;/a&gt; and let us know!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Trevor Johns, Google Developer Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-6840406311800275362?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=0tKgvF4J6v4:grnjVb5POJI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=0tKgvF4J6v4:grnjVb5POJI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=0tKgvF4J6v4:grnjVb5POJI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/0tKgvF4J6v4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/6840406311800275362/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/sidebar-gadgets-coming-soon-to-calendar.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/6840406311800275362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/6840406311800275362?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/0tKgvF4J6v4/sidebar-gadgets-coming-soon-to-calendar.html" title="Sidebar Gadgets: Coming soon to a Calendar near you" /><author><name>Christine Songco</name><uri>http://www.blogger.com/profile/00623754935378912186</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09518104729529114953" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_O05tjELC3Y8/SlvfBOPtbCI/AAAAAAAAFuU/Co-x3uNz3-Y/s72-c/dcrmm5ft_1dn86fpgw_b.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/sidebar-gadgets-coming-soon-to-calendar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YBR3s-eCp7ImA9WxJUEUs.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-7746294066246099180</id><published>2009-07-08T18:49:00.000-07:00</published><updated>2009-07-09T10:39:16.550-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-09T10:39:16.550-07:00</app:edited><title>My Location on Google Maps</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_O05tjELC3Y8/SlVRkjN7PkI/AAAAAAAAFuM/2d_K1Y8S6Vc/s1600-h/my_location.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 235px;" src="http://1.bp.blogspot.com/_O05tjELC3Y8/SlVRkjN7PkI/AAAAAAAAFuM/2d_K1Y8S6Vc/s320/my_location.png" alt="" id="BLOGGER_PHOTO_ID_5356277020197862978" border="0" /&gt;&lt;/a&gt;We've blogged before about how much we like location-based services and at Google we want all developers to be able to build these cool applications. That's why we're so excited about the &lt;a href="http://www.w3.org/TR/geolocation-API/"&gt;W3C Geolocation API&lt;/a&gt;, a browser API that provides a really easy way for web applications to get the user's location.&lt;span style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today we're announcing the launch of &lt;a id="v9r5" href="http://google-latlong.blogspot.com/2009/07/blue-circle-comes-to-your-desktop.html" title="My Location on Google Maps"&gt;My Location on Google Maps&lt;/a&gt;, the first major Google web application to make use of the Geolocation API. My Location on Google Maps offers the same functionality you're probably familiar with from Google Maps for Mobile - simply click a button and your location is shown on the map with a blue dot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Until recently, providing this kind of functionality usually meant writing a native application, which is hard work if you want to deploy on lots of different platforms. What's great about the Geolocation API is that it can be used by any web application, in any web browser that supports it, in a totally cross-platform way. Both Google Chrome and &lt;a id="qk6a" href="http://www.mozilla.com/firefox/geolocation/" title="Firefox 3.5" style="color: rgb(85, 26, 139);"&gt;Firefox 3.5&lt;/a&gt; already provide geolocation in the browser, Opera 10 will soon add support and we're looking forward to other major browsers adding support soon. As an interim solution, &lt;a id="mg_n" href="http://code.google.com/apis/gears/api_geolocation.html" title="Gears also provides the Geolocation API"&gt;Gears also provides an equivalent Geolocation API&lt;/a&gt; and can be installed on other browsers such as Internet Explorer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We look forward to seeing lots more cool web applications make use of the Geolocation API!&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Steve Block, Software Engineer and Jonathan McPhie, Associate Product Manager&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-7746294066246099180?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=53bbEimno98:sMasI2qyN-w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=53bbEimno98:sMasI2qyN-w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=53bbEimno98:sMasI2qyN-w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/53bbEimno98" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/7746294066246099180/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/my-location-on-google-maps.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/7746294066246099180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/7746294066246099180?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/53bbEimno98/my-location-on-google-maps.html" title="My Location on Google Maps" /><author><name>Christine Songco</name><uri>http://www.blogger.com/profile/00623754935378912186</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09518104729529114953" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_O05tjELC3Y8/SlVRkjN7PkI/AAAAAAAAFuM/2d_K1Y8S6Vc/s72-c/my_location.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/my-location-on-google-maps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMBR3Y8eyp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-6938673538438147454</id><published>2009-07-07T15:57:00.000-07:00</published><updated>2009-07-07T15:57:36.873-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T15:57:36.873-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="contest" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="native client" /><title>Native Client Security Contest: The results are in!</title><content type="html">A few months ago, we &lt;a href="http://googlecode.blogspot.com/2009/02/announcing-native-client-security.html" id="f113" title="challenged"&gt;challenged&lt;/a&gt; you to discover exploits in the &lt;a href="http://code.google.com/p/nativeclient" id="uuvh" title="Native Client"&gt;Native Client&lt;/a&gt; system and more than 600 of you decided to take us up on our invitation. We're very pleased with the results: participants found bugs that enabled some really clever exploits, but nothing that pointed to a fundamental flaw in the design of Native Client. Our &lt;a href="http://code.google.com/contests/nativeclient-security/judges.html" id="rztc" title="judges"&gt;judges&lt;/a&gt; reviewed all entries very carefully and have selected five teams as the winners of the Native Client Security Contest.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EuCTzLdp3vE/SlPJz_DjOAI/AAAAAAAACu4/ZJRgjP4vRFY/s1600-h/NACL_contest1.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 188px;" src="http://4.bp.blogspot.com/_EuCTzLdp3vE/SlPJz_DjOAI/AAAAAAAACu4/ZJRgjP4vRFY/s320/NACL_contest1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5355846276810487810" /&gt;&lt;/a&gt;The big winner of the contest was the team "Beached As", consisting of IBM researcher Mark Dowd and independent researcher Ben Hawkes. "Beached As" reported 12 valid issues, including vulnerabilities in the validator and multiple type-confusion attacks. The team "CJETM" (Chris Rohlf, Jason Carpenter, Eric Monti — all security professionals with Matasano Security) came in second by reporting three issues with a common theme of memory related defects, including an uninitialized vtable entry, an exception condition during new(), and a double delete bug. Gabriel Campana from Sogeti ESEC R&amp;D Labs was selected as the third place, while for the fourth and fifth place we had a tie between independent researcher Daiki Fukumori and Rensselaer Polytechnic Institute student Alex Radocea. You can find a listing of all the issues the teams submitted at the &lt;a href="http://code.google.com/contests/nativeclient-security/" title="Contest Site"&gt;Native Client Security Contest site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EuCTzLdp3vE/SlPKNWbA9jI/AAAAAAAACvI/oTrqzrReOFA/s1600-h/NACL_Contest2.jpg"&gt;&lt;img style="margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 280px;" src="http://3.bp.blogspot.com/_EuCTzLdp3vE/SlPKNWbA9jI/AAAAAAAACvI/oTrqzrReOFA/s320/NACL_Contest2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5355846712579651122" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EuCTzLdp3vE/SlPKUkz9f2I/AAAAAAAACvQ/81hbkheKEB0/s1600-h/NACL_contest3.jpg"&gt;&lt;img style="margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 250px;" src="http://1.bp.blogspot.com/_EuCTzLdp3vE/SlPKUkz9f2I/AAAAAAAACvQ/81hbkheKEB0/s320/NACL_contest3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5355846836701462370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;The winners of the Native Client Security Contest, Team "Beached As"&lt;br&gt; Mark Dowd (left) and Ben Hawkes (right)&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Winning teams were attracted to the contest by the potential of the Native Client technology. Mark Dowd, member of the winning team "Beached As", commented, "When I saw the press release announcing the product, I was intrigued by some of the ideas mentioned in the article. After reviewing the architecture a little, I thought the project adopted a novel approach to solving the problem of running native code securely, and was keen to take a closer look." Curiosity about what the technology could achieve also motivated the CJETM team, according to Chris Rohlf. &lt;br /&gt;&lt;br /&gt;The real-world relevance of Native Client made this contest more interesting and challenging for participants. Contestant Alex Radocea stated, "Unlike most security challenges out there, the set of problems were not crafted. The tasks at hand were real and complex, as the real world is. I have no doubt that many unknown people eyed the code or attacked the applications and, frustratingly, found absolutely nothing wrong." Mark Dowd agreed: "Our goal was to create a convincing lead, to try and take the victory, and I think we did that. Having said that, the field was not soft. There were some tough contestants who were able to uncover a variety of interesting vulnerabilities."  &lt;br /&gt; &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_EuCTzLdp3vE/SlPNtS5nfSI/AAAAAAAACvY/QPj4ScSX9C0/s1600-h/NACL_contest4.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 272px;" src="http://2.bp.blogspot.com/_EuCTzLdp3vE/SlPNtS5nfSI/AAAAAAAACvY/QPj4ScSX9C0/s320/NACL_contest4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5355850559924960546" /&gt;&lt;/a&gt;We would like to thank all the contestants, the jury chair Ed Felten and all the security experts that judged the contest for helping us improve the security of our system. This contest helped us discover implementation errors in Native Client and some areas of our codebase we need to spend more time reviewing.  More importantly, that no major architectural flaws were found provides evidence that Native Client can be made safe enough for widespread use.  Toward that end, we're implementing additional security measures, such as an outer sandbox, but you can help by continuing to &lt;a href="http://code.google.com/p/nativeclient/issues/list" title="file bugs"&gt;file bugs&lt;/a&gt; in Native Client.  Community support and scrutiny has helped and will continue to help make Native Client more useful and more secure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Henry Bridge and Brad Chen, Native Client Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-6938673538438147454?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=VobWaiC9qO8:LX0q3VGu0qA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=VobWaiC9qO8:LX0q3VGu0qA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=VobWaiC9qO8:LX0q3VGu0qA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/VobWaiC9qO8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/6938673538438147454/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/native-client-security-contest-results.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/6938673538438147454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/6938673538438147454?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/VobWaiC9qO8/native-client-security-contest-results.html" title="Native Client Security Contest: The results are in!" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_EuCTzLdp3vE/SlPJz_DjOAI/AAAAAAAACu4/ZJRgjP4vRFY/s72-c/NACL_contest1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/native-client-security-contest-results.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cNQ3c6fSp7ImA9WxJVGU0.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-463640282189103010</id><published>2009-07-06T10:13:00.000-07:00</published><updated>2009-07-06T10:24:52.915-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-06T10:24:52.915-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="app engine" /><category scheme="http://www.blogger.com/atom/ns#" term="google chart api" /><category scheme="http://www.blogger.com/atom/ns#" term="google friend connect" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Google I/O Scavenger Hunt Winners</title><content type="html">The astute conference attendee would have noticed &lt;a title="hidden QR codes" href="http://picasaweb.google.com/stephliu/GoogleIO2009#5345901454329211650" id="euqu"&gt;hidden QR codes&lt;/a&gt; around the conference, as well as the scannable QR codes on everyone's badge.   We wanted to find a fun way for people to bond with their new phones, as well as network with other attendees, so we set about creating a scavenger hunt game using &lt;a title="Google App Engine" href="http://code.google.com/appengine" id="kka0"&gt;Google App Engine&lt;/a&gt; &amp;amp; &lt;a title="Friend Connect" href="http://code.google.com/apis/friendconnect/" id="czqe"&gt;Friend Connect&lt;/a&gt;. The app handled game logistics (a leaderboard, URL endpoints), and we printed up a bunch of custom &lt;a title="QR code" href="http://en.wikipedia.org/wiki/QR_Code" id="xedc"&gt;QR code&lt;/a&gt; stickers that pointed to game URLs.&lt;br /&gt;&lt;br /&gt;App Engine made writing the scavenger hunt app much easier than it otherwise would have been. The initial version of the app took one developer less than a day to turn out, and we continued to add functionality and tweak it as I/O approached and we tested it in real-world situations. The versioning deployment made it very easy to test and push out new versions without disrupting existing users.&lt;br /&gt;&lt;br /&gt;The overall structure of the app was very straightforward: every QR-code had a unique URL, which was embedded into the generated QR code. A URL was associated with a number of points to be awarded and a destination URL (such as the user's profile information, in the case of a user's badge QR code). Users were signed in using &lt;a title="Friend Connect" href="http://code.google.com/apis/friendconnect/" id="u-ex"&gt;Friend Connect&lt;/a&gt;, which allowed us to avoid concerns of authenticating users and managing sessions.&lt;br /&gt;&lt;br /&gt;When a user visited a URL for the first time, we recorded that fact so they couldn't try and get extra points with repeat visits, then sent them to the destination URL. We also kept a running count of the user's score against the User entity, so as to not have to count up their points on every request. Generating the leaderboard was a simple matter of querying for the users with the most points and displaying them.&lt;br /&gt;&lt;br /&gt;QR codes were generated using the &lt;a title="Chart API" href="http://code.google.com/apis/chart/" id="k8:d"&gt;Chart API&lt;/a&gt;, which simply takes a string of text and a few other parameters, and returns a fully formed QR code.&lt;br /&gt;&lt;br /&gt;The three resourceful and persistent folks below beat out the competition to rise to the top of the scavenger hunt ranks - going to great lengths, including swag bribery, to gain points. A hearty (if belated) congratulations to the winners of the Google I/O mobile scavenger hunt!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O05tjELC3Y8/SlIvtsvYg4I/AAAAAAAAFts/xuVtgr9RDh4/s1600-h/Prizes.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_O05tjELC3Y8/SlIvtsvYg4I/AAAAAAAAFts/xuVtgr9RDh4/s320/Prizes.jpg" alt="" id="BLOGGER_PHOTO_ID_5355395369047458690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1st Place - &lt;a href="http://twitter.com/abraham" id="hi_g" title="Abraham Williams"&gt;Abraham Williams&lt;/a&gt;&lt;br /&gt;2nd Place - &lt;a href="http://thereisnosingularity.blogspot.com/" id="orrp" title="Waylon Flinn"&gt;Waylon Flinn&lt;/a&gt;&lt;br /&gt;3rd Place - &lt;a href="http://www.twitter.com/larkinrichards" id="vwnr" title="Pete Richards"&gt;Pete Richards&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We hope everyone that participated learned how to use their Android phones a little better, met people they otherwise wouldn't have, and had some fun :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Stephanie Liu, Google Developer Programs&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-463640282189103010?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=SfPTrId_qmw:yWmkLrmfYyA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=SfPTrId_qmw:yWmkLrmfYyA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=SfPTrId_qmw:yWmkLrmfYyA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/SfPTrId_qmw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/463640282189103010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/google-io-scavenger-hunt-winners.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/463640282189103010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/463640282189103010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/SfPTrId_qmw/google-io-scavenger-hunt-winners.html" title="Google I/O Scavenger Hunt Winners" /><author><name>Christine Songco</name><uri>http://www.blogger.com/profile/00623754935378912186</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09518104729529114953" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_O05tjELC3Y8/SlIvtsvYg4I/AAAAAAAAFts/xuVtgr9RDh4/s72-c/Prizes.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/google-io-scavenger-hunt-winners.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QBQXk-cCp7ImA9WxJUEk4.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-1757645103469107361</id><published>2009-07-02T12:20:00.000-07:00</published><updated>2009-07-10T08:22:30.758-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-10T08:22:30.758-07:00</app:edited><title>Gmail for Mobile HTML5 Series: Using Timers Effectively</title><content type="html">&lt;span style="font-style: italic;font-size:85%;" &gt;On April 7th, Google launched a new version of Gmail for mobile for iPhone and Android-powered devices. We shared the behind-the-scenes story through &lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255); font-style: italic;font-size:85%;" &gt;&lt;a title="this blog" href="http://google-code-updates.blogspot.com/2009/04/html5-and-webkit-pave-way-for-mobile.html" id="s8ja"&gt;this blog&lt;/a&gt; &lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;and decided to share more of what we've learned in a brief series of follow-up blog posts. This week, I'll talk about two kinds of timers Javascript provides and how you can put them to good use in your own web applications.&lt;/span&gt;   &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Javascript Timer API&lt;/b&gt; &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;   Timers provide a way to schedule a function to run at some later point in time. The two functions used to create timers are: &lt;/div&gt; &lt;div&gt;   &lt;bulleted&gt; &lt;/bulleted&gt;&lt;/div&gt;  &lt;ul&gt;&lt;li&gt;&lt;code&gt;var id = setTimeout(fn, delay)&lt;/code&gt; creates a timer which calls the specified function once after the given delay. &lt;/li&gt;&lt;li&gt;&lt;code&gt;var id = setInterval(fn, delay)&lt;/code&gt; is similar, but the function is called continually until the timer is canceled. &lt;/li&gt;&lt;/ul&gt;   &lt;div&gt;    &lt;/div&gt;&lt;div&gt; Each type of timer has a corresponding &lt;code&gt;clear&lt;/code&gt; method (&lt;italics&gt;e.g.&lt;/italics&gt;, &lt;code&gt;clearTimeout(id)&lt;/code&gt;) that stops a timer while it is running. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; There are many great resources online already that document the nitty-gritty details of this API. That's not our focus here. Instead, I want to talk about specific ways in which you can put these timers to work for you in your web application. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;b&gt;Let's Do the Time Warp Again&lt;/b&gt; &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;   It's important to keep in mind that just because you ask for a timer with a certain delay doesn't mean it will fire &lt;i&gt;precisely&lt;/i&gt; that many milliseconds later. On current browsers, all Javascript code executes within a single thread. This means all your timers have to contend for execution time not only with each other, but also with all the other Javascript code in your application. If another block of code is in the middle of executing when a timer should fire, the timer will be delayed until that block of code is done. (Help is on the way: HTML5's &lt;a title="Web Workers" target="_blank" href="http://www.whatwg.org/specs/web-workers/current-work/" id="dhdi"&gt;Web Workers&lt;/a&gt; will allow web applications to spawn workers that run scripts in parallel.)&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; Let's look at a concrete example of what this means in practice. I added a timer to Gmail for mobile that is supposed to fire every 200 ms. Each time it fires, it records the time between consecutive timer ticks. Here are the results after 100 ticks: &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_O05tjELC3Y8/Sk0IOo-CNcI/AAAAAAAAFtY/nha2BROMUgI/s1600-h/setinterval.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 186px;" src="http://4.bp.blogspot.com/_O05tjELC3Y8/Sk0IOo-CNcI/AAAAAAAAFtY/nha2BROMUgI/s400/setinterval.png" alt="" id="BLOGGER_PHOTO_ID_5353944579622188482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt; The dashed blue line represents the requested timer interval, 200 ms. Notice that the median was almost 50% higher than requested, at 276 ms; the time between ticks varied from 98 ms to almost 4 seconds, with an average delay of 493 ms.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; This highlights the fact that the interval at which your timer actually fires may differ greatly from the requested delay. In fact, the time between ticks is typically highly variable. It will fluctuate based on what else is happening in your application and on the device. Don't rely on your timer being precise!&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;b&gt;Buy One Timer, Get One Free?&lt;/b&gt; &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; When I first started working on the new version of Gmail for mobile, the application used only a couple of timers. As we continued adding more and more features, the number of timers grew. We were curious about the performance implications: would 10 concurrent timers make the app feel slow? How about 100? How would the performance of many low-frequency timers compare to a single high-frequency timer? &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; To answer these questions, we conducted a few experiments. We injected some extra code into a development build of Gmail that created a lot of different timers, each of which just performed some simple calculations. Then we fired up the app on an iPhone 3G and Android G1 (both running the latest version of their respective firmware) and observed the performance. Note that although we could have just created a separate test page for this, we chose to inject the code right into our app so we could see how fast it would be to read and process mail with all those timers running. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; Here's what we learned. With low-frequency timers — timers with a delay of one second or more — we could create many timers without significantly degrading performance on either device. Even with 100 timers scheduled, our app was not noticeably less responsive. With high-frequency timers, however, the story was exactly the opposite. A few timers firing every 100-200 ms was sufficient to make our UI feel sluggish. &lt;/div&gt;&lt;br /&gt;&lt;div&gt; This led us to take a mixed approach with the timers we use in our application. For timers that have a reasonably long delay, we just freely create new timers wherever they are needed. However, for timers that need to execute many times each second, we consolidate all of the work into a single global high-frequency timer. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;b&gt;One High-Frequency Timer to Rule Them All&lt;/b&gt; &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; A global high-frequency timer strikes a balance between needing several different functions to execute frequently and application performance. The idea is simple: create a single timer in a central class that calls as many functions as required. Ours looks something like this: &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;var highFrequencyTimerId_ = window.setInterval(globalTimerCallback, 100);&lt;br /&gt;&lt;br /&gt;globalTimerCallback = function() {&lt;br /&gt;navigationManager.checkHash();&lt;br /&gt;spinnerManager.spin();&lt;br /&gt;detectWakeFromSleep_();&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; Why did we choose to hardcode the various function calls in &lt;code&gt;globalTimerCallback()&lt;/code&gt; rather than implementing a more generic callback registration interface? Keep in mind that this code is going to execute many times every second. Looping over an array of registered callbacks might be slightly "cleaner" code, but it's critical that this function execute as quickly as possible. Hardcoding the function calls also makes it really easy to keep track of all the work that is being done within the timer.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;To Die, To Sleep; To Sleep, Perchance to Tick&lt;/b&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; One neat application of a high-frequency timer is to detect when the device has been woken from sleep. When your application is put to sleep — either because the device is put into sleep mode or because the user has navigated away from the browser to another application — time, as perceived by your app, pauses. No timers fire until the user navigates back to your app and it wakes up. By keeping a close eye on the actual time that elapses between high-frequency timer ticks, you can detect when the app wakes from sleep. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; First, create a high-frequency timer, as described above. In your timer, call a function that keeps track of the time between ticks: &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;// The time, in ms, that must be "missed" before we&lt;br /&gt;// assume the app was put to sleep.&lt;br /&gt;var THRESHOLD = 10000;&lt;br /&gt;&lt;br /&gt;var lastTick_;&lt;br /&gt;detectWakeFromSleep_ = function() {&lt;br /&gt;var now = new Date().getTime();&lt;br /&gt;var delta = now - this.lastTick_;&lt;br /&gt;if (delta &gt; THRESHOLD) {&lt;br /&gt;  // The app probably just woke up after being asleep.&lt;br /&gt;  fetchUpdatedData();&lt;br /&gt;}&lt;br /&gt;lastTick_ = now;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt; Now your users will always have the latest data available when they return to your app without having to manually perform a refresh! &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;  I hope this helps you make the most of timers in your web application. Stay tuned for the next post, where we'll discuss some cool tricks to spice up the text areas on your forms.&lt;br /&gt;&lt;div&gt;&lt;em&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;i&gt;Previous posts from Gmail for Mobile HTML5 Series&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;a title="HTML5 and Webkit pave the way for mobile web applications" href="http://google-code-updates.blogspot.com/2009/04/html5-and-webkit-pave-way-for-mobile.html" id="e4x7"&gt;HTML5 and Webkit pave the way for mobile web applications&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/04/gmail-for-mobile-html5-series-using.html" id="ye:o"&gt;Using AppCache to launch offline - Part 1&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-part-2.html" id="b52e"&gt;Using AppCache to launch offline - Part 2&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-part-3.html" id="moyw"&gt;Using AppCache to launch offline - Part 3&lt;/a&gt;&lt;br /&gt;&lt;a id="vn-v" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-common.html" title="A Common API for Web Storage"&gt;A Common API for Web Storage&lt;/a&gt;&lt;br /&gt;&lt;a title="Suggestions for better performance" href="http://google-code-updates.blogspot.com/2009/06/gmail-for-mobile-html5-series.html" id="oi0j"&gt;Suggestions for better performance&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;a title="Cache pattern for offline HTML5 web application" href="http://googlecode.blogspot.com/2009/06/gmail-for-mobile-html5-series-cache.html" id="j61o"&gt;Cache pattern for offline HTML5 web application&lt;/a&gt;&lt;em&gt;&lt;em&gt;&lt;a title="Cache pattern for offline HTML5 web application" href="http://googlecode.blogspot.com/2009/06/gmail-for-mobile-html5-series-cache.html" id="j61o"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/em&gt;&lt;/em&gt;&lt;/div&gt;&lt;em&gt;&lt;em&gt;    &lt;/em&gt;&lt;/em&gt;&lt;/div&gt;&lt;em&gt;&lt;em&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Neil Thomas, Software Engineering Intern, Google Mobile&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/em&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-1757645103469107361?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=iPMCyBSNo6U:W_b_33HMXto:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=iPMCyBSNo6U:W_b_33HMXto:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=iPMCyBSNo6U:W_b_33HMXto:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/iPMCyBSNo6U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/1757645103469107361/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/gmail-for-mobile-html5-series-using.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/1757645103469107361?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/1757645103469107361?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/iPMCyBSNo6U/gmail-for-mobile-html5-series-using.html" title="Gmail for Mobile HTML5 Series: Using Timers Effectively" /><author><name>Christine Songco</name><uri>http://www.blogger.com/profile/00623754935378912186</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09518104729529114953" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_O05tjELC3Y8/Sk0IOo-CNcI/AAAAAAAAFtY/nha2BROMUgI/s72-c/setinterval.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/gmail-for-mobile-html5-series-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HRno4eCp7ImA9WxJVFEU.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-2294181633509068438</id><published>2009-07-01T14:09:00.000-07:00</published><updated>2009-07-01T14:13:57.430-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-01T14:13:57.430-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="app engine" /><category scheme="http://www.blogger.com/atom/ns#" term="all for good" /><title>Enabling Public Service: All for Good and Google App Engine</title><content type="html">&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7ZaBHgj6jYE&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7ZaBHgj6jYE&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;You may have seen the &lt;a href="http://googleblog.blogspot.com/2009/06/all-for-good-bringing-search-scale-and.html" target="_blank"&gt;post on the Google Blog&lt;/a&gt; about &lt;a href="http://www.allforgood.org/" target="_blank"&gt;All for Good&lt;/a&gt;, the new site that makes it easy to find and share volunteer activities within the United States. The site was built collaboratively by Google and several partners. We're especially proud that it was built using 100% open source Python code. All for Good's first release includes both &lt;a title="gadgets" href="http://www.allforgood.org/apps" id="jdmu"&gt;gadgets&lt;/a&gt; and a &lt;a title="free API" href="http://www.allforgood.org/docs/api.html" id="sol:"&gt;free API&lt;/a&gt;, making it even easier for casual developers to build applications and embed All for Good listings in their own apps and sites.&lt;br /&gt;&lt;br /&gt;If you're interested in seeing your software talents dedicated to community service, check out the &lt;a title="API documentation" href="http://www.allforgood.org/docs/api.html" id="sgk4"&gt;API documentation&lt;/a&gt;, our &lt;a title="Getting Started Guide" href="http://www.allforgood.org/code" id="f4b5"&gt;Getting Started Guide&lt;/a&gt; and the &lt;a title="source code to the core engine" href="http://code.google.com/p/footprint2009dev" id="y68m"&gt;complete source code for the core engine&lt;/a&gt;. We're especially looking forward to see what applications the developer community will create for mobile platforms and for Facebook. Happy Hacking!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;by Guido van Rossum, Software Engineering Team&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-2294181633509068438?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=hnbuMx_4oSM:IY8Ab_V0w1U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=hnbuMx_4oSM:IY8Ab_V0w1U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=hnbuMx_4oSM:IY8Ab_V0w1U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/hnbuMx_4oSM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/2294181633509068438/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/enabling-public-service-all-for-good.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/2294181633509068438?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/2294181633509068438?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/hnbuMx_4oSM/enabling-public-service-all-for-good.html" title="Enabling Public Service: All for Good and Google App Engine" /><author><name>Christine Songco</name><uri>http://www.blogger.com/profile/00623754935378912186</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09518104729529114953" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/enabling-public-service-all-for-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUBQH0_eSp7ImA9WxJVFEs.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-2970257333526988053</id><published>2009-07-01T10:09:00.000-07:00</published><updated>2009-07-01T10:10:51.341-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-01T10:10:51.341-07:00</app:edited><title>Follow us on @GoogleCode</title><content type="html">Google Code now has a home on Twitter - introducing &lt;a href="http://twitter.com/GoogleCode"&gt;@GoogleCode&lt;/a&gt;! Expect our tweets to be a nice mix of developer product announcements, Code Blog coverage, coding tips and tricks, interesting tech news and commentary, developer events, and more.&lt;br /&gt;&lt;br /&gt;If you have any suggestions for what you want to see, feel free to send an @reply. We can't guarantee to respond to everyone, but we'd like to hear your feedback and suggestions for @GoogleCode or our developer products.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By &lt;/span&gt;&lt;i&gt;Christine Tsai&lt;/i&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;, Google Developer Programs&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-2970257333526988053?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=epihzgVTRxs:O-t1BEm7j4g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=epihzgVTRxs:O-t1BEm7j4g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=epihzgVTRxs:O-t1BEm7j4g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/epihzgVTRxs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/2970257333526988053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/07/follow-us-on-googlecode.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/2970257333526988053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/2970257333526988053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/epihzgVTRxs/follow-us-on-googlecode.html" title="Follow us on @GoogleCode" /><author><name>Ali Pasha</name><uri>http://www.blogger.com/profile/09111985048728097364</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03532655683070876489" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/07/follow-us-on-googlecode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4FSXo_eyp7ImA9WxJVE0w.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-139002336163394174</id><published>2009-06-29T15:06:00.000-07:00</published><updated>2009-06-29T15:35:18.443-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T15:35:18.443-07:00</app:edited><title>O3D update: New capabilities and expanded compatibility</title><content type="html">We're happy to announce that today we shipped a substantial update to &lt;a href="http://code.google.com/apis/o3d" id="dhvf" title="O3D"&gt;O3D&lt;/a&gt;, an API for creating rich 3D applications in a web browser.  With today's release, we focused on addressing  a theme we heard in the requests and feedback from the community: that O3D should run as well as possible on many different types of hardware.  Toward that end, we're releasing two new additions: software rendering and &lt;a href="http://code.google.com/apis/o3d/docs/performance.html#gpuhardware" id="h.1q" title="feature requirements"&gt;feature requirements&lt;/a&gt;.  If you've already installed the O3D plugin, you should receive these additions automatically.&lt;br /&gt;&lt;br /&gt;&lt;div&gt; Software rendering allows O3D to use the main processor to render 3D images if the machine running the app doesn't have supported graphics hardware. While the hardware O3D requires to run in hardware-accelerated mode is fairly modest by today's standards (a DirectX 9, Pixel Shader 2.0 capable graphics card), there are nonetheless PCs that don't meet these requirements, and we think it's important for web apps to run on all machines, regardless of hardware. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; Because software rendering is significantly slower than hardware-accelerated rendering, we're also introducing a concept called "&lt;a id="l8bu" title="feature requests"&gt;feature requirements&lt;/a&gt;" that will help minimize how often O3D will have to fall back to software rendering. Feature requirements allow developers to state upfront that their app will require certain hardware capabilities to render properly. If the machine running the app supports those features, O3D will run it fully hardware accelerated; if however, it is lacking any of the required capabilities, O3D will drop into a software rendered mode. Anecdotally, we found that this tiering allows 45 of our 48 samples to now run in hardware-accelerated mode with less capable graphics cards. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;    Finally, while it has nothing to do with extending hardware support, we're also adding a couple other goodies: a &lt;a href="http://code.google.com/apis/o3d/docs/fullscreen.html" id="owmp" title="full-screen mode"&gt;full-screen mode&lt;/a&gt; to make O3D apps more absorbing and a &lt;a href="http://code.google.com/apis/o3d/docs/gallery.html" id="xjw6" title="Community Gallery"&gt;community gallery&lt;/a&gt; to feature cool demos that use O3D (like &lt;a href="http://blog.largeanimal.com/" id="py8e" title="Infinite Journey"&gt;Infinite Journey&lt;/a&gt;, the first game developed outside Google using O3D). If you've developed an application or sample that would be useful to the O3D community, please be sure to submit it for our team to review for inclusion in the gallery using &lt;a href="http://spreadsheets.google.com/viewform?key=rmM9ht25mcbJ0uXsFstgmCQ&amp;amp;hl=en" id="yi65" title="this form"&gt;this form&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.largeanimal.com/demo"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 610px; height: 457px;" src="https://docs.google.com/a/google.com/File?id=cg4trxrp_10gv5k75dp_b" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Henry Bridge&lt;/span&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;, Product Manager&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-139002336163394174?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=kuKyBXGcuz8:HgU9EyAJSWY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=kuKyBXGcuz8:HgU9EyAJSWY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=kuKyBXGcuz8:HgU9EyAJSWY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/kuKyBXGcuz8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/139002336163394174/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/o3d-update-new-capabilities-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/139002336163394174?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/139002336163394174?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/kuKyBXGcuz8/o3d-update-new-capabilities-and.html" title="O3D update: New capabilities and expanded compatibility" /><author><name>Ali Pasha</name><uri>http://www.blogger.com/profile/09111985048728097364</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03532655683070876489" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/o3d-update-new-capabilities-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEESXY6fCp7ImA9WxJWGUo.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-3312893399992003701</id><published>2009-06-25T17:14:00.000-07:00</published><updated>2009-06-25T18:10:08.814-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-25T18:10:08.814-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><title>Gmail for Mobile HTML5 Series : Cache Pattern For Offline HTML5 Web Applications</title><content type="html">&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;On April 7th, Google launched a new version of Gmail for mobile for iPhone and Android-powered devices. We shared the behind-the-scenes story through this blog and decided to share more of our learnings in a brief series of follow-up blog posts. This week, I'll talk about the cache pattern for building offline-capable web applications.&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt; &lt;p&gt;I recently gave a talk (preserved &lt;a href="http://www.youtube.com/watch?v=aQ9w--W4J6U"&gt;YouTube&lt;/a&gt; here) about the cache pattern and the &lt;a href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-common.html"&gt;Web Storage Portability Layer&lt;/a&gt; (WSPL) at Google I/O. It was exciting getting to give a talk at the Moscone Center as previously I had only ever been one of the audience members. The conference seemed to go by in a blur for me as I was sleep-deprived from getting the WSPL to "just good enough" to actually be released. (And some ofyou have already pointed out that I missed several bugs.)  In my talk, I provided a general overview of the cache pattern and this post expands on the handling of hit determination and merging server and local changes.&lt;br /&gt;&lt;/p&gt;       &lt;p&gt;The cache pattern is a design pattern for building an offline-capable web application. We implemented the cache pattern to make Gmail for Mobile tolerant of flaky wireless connections but the approach is generally applicable. Here's how it works. Consider a typical AJAX application. As shown in the diagram, we have a web application with a local model, view and controllers. The user interacts with theapplication and the controller dispatches XmlHttpRequests (XHRs for short) to the server. The server sends asynchronous requests to the application which it inserts into the model.&lt;br /&gt;&lt;/p&gt;   &lt;h3 class="post-title entry-title"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://docs.google.com/a/google.com/File?id=dd6mf42g_11gwcmkfcd_b"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 476px; height: 105px;" src="https://docs.google.com/a/google.com/File?id=dd6mf42g_11gwcmkfcd_b" alt="" border="0" /&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;As shown in this next diagram, in the cache pattern, we insert a cache between the application and the server. Having done so, many requests that would otherwise require a round-trip to the network.&lt;br /&gt;&lt;/p&gt;&lt;h3 class="post-title entry-title"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://docs.google.com/a/google.com/File?id=dd6mf42g_12ckg2skf3_b"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 476px; height: 105px;" src="https://docs.google.com/a/google.com/File?id=dd6mf42g_12ckg2skf3_b" alt="" border="0" /&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A software cache like this one shares a great deal conceptually with hardware caches. When designing the cache used in Gmail for mobile, we used this similarity to guide our design. For example, to keep our cache as simple as possible, we implemented a software equivalent to a write-through cache with early forwarding and LRU eviction. The cache pattern in general (and consequently our implementation) has four important data flows as shown in the diagram.&lt;/p&gt;&lt;h3 class="post-title entry-title"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://docs.google.com/a/google.com/File?id=dd6mf42g_13f75f4wcc_b"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 536px; height: 257px;" src="https://docs.google.com/a/google.com/File?id=dd6mf42g_13f75f4wcc_b" alt="" border="0" /&gt;&lt;/a&gt;&lt;/h3&gt; &lt;div&gt;&lt;ul&gt;&lt;li&gt;Cached content bound for the UI.&lt;/li&gt;&lt;li&gt;Changes made to the cache by the user in the UI. These need to be both reliably sent to the server and updated locally in the cache so that reads from the cache for UI updates show the state including user changes.&lt;/li&gt;&lt;li&gt;The changes recorded in the cache need to be sent upstream to the server as the network connection is available.&lt;/li&gt;&lt;li&gt;Changes made to the server (like email delivery in the case of Gmail) need to be merged into the contents of the cache.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;As shown in the diagram we also need a place to actually write the data. We use the &lt;a id="pdq1" href="http://code.google.com/p/webstorageportabilitylayer/" title="WSPL"&gt;WSPL&lt;/a&gt; library to write a cache implementation portable across both Gears and HTML5 databases.&lt;br /&gt;&lt;br /&gt;To actually implement these four data flows, we need to decide on a hit determination mechanism, a coherency strategy and a refresh approach.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Hit Determination&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;At its heart, a cache is a mapping from keys to values: the UI invokes the cache with a key and the cache returns the corresponding element. While this sounds pretty simple, there is an additional source of complexity if the application wants to provide the user with summary listings of some subset of all values available from the server. To provide this feature, the cache needs to contain not only "real" data values but additional "index" values that list the keys (and possibly user-visible summaries) for "data" values. For example, in Gmail for mobile, the cache stores conversations as its "real" data values and lists of conversations (such as the Inbox in Gmail for Mobile) as its "index" values. Keys for index values are computed specially to record what subset of the complete index is cached locally. For example, in Gmail for Mobile, while a user's Inbox may contain thousands of conversations, the cache might contain an index entry whose data values lists metadata for only conversations 1000 through 1100. Consequently, Gmail for Mobile's cache extends keys with the cached range so that a request for metadata for conversations 1101 through1110 would be considered a cache miss.&lt;/div&gt;&lt;h2 style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Coherency and Refresh&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-weight: normal;"&gt;&lt;span style="font-size:100%;"&gt;Perhaps the most complex aspect of the cache implementation is deciding how to get updated content from the server and how to merge server updates with changes made locally. A traditional hardware cache resolves this problem by only letting one processor modify its a cache at a time and have the memory broadcast any changes to all the other caches in the system. This approach cannot work here because the Gmail server can't connect to all of its clients and update their state. Instead, the approach we took for Gmail for Mobile was for the client device regularly poll the server for alterations.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span style="font-size:100%;"&gt;Polling the server for changes such as new email or the archiving of email by the same user from a different device implies a mechanism for merging local changes with server side changes. As mentioned above, Gmail for Mobile is a write-through cache. By keeping all of the modifications to the cache in a separate queue until they have been acknowledged, they can be played back against updates delivered from the server so that the cache contains the merge of changes from the server and the local user. The following diagram shows the basic idea:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="post-title entry-title"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://docs.google.com/a/google.com/File?id=dd6mf42g_14c87z8jgv_b"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 574px; height: 363px;" src="https://docs.google.com/a/google.com/File?id=dd6mf42g_14c87z8jgv_b" alt="" border="0" /&gt;&lt;/a&gt;&lt;/h3&gt; The green box in the diagram shows the contents of the cache's write buffer changing over time and the cloud corresponds to the requests in-flight to the server with time advancing from left to right in the diagram. The function names shown in the diagram are from the simplenotes.js&lt;div&gt; example file in the Web Storage Portability Layer distribution. Here, the user has applied some change [1] and the cache has written it to the write buffer and has then requested new content resulting in query [Q]. The cache prefixes the outstanding actions from the write buffer to the query. Action [1] is marked as needing a resend on some sort of network failure.&lt;br /&gt;&lt;br /&gt;Later, the user makes change [2] to the UI which causes the cache to append it to the write buffer in the applyUIChange call. Later still, another query is made and so, the cache sends [1][2][Q] to the server. In the mean time, the user makes yet another change [3]. This is written to the write buffer. Once changes [1] and [2] are acknowledged by the server along with the new cache contents for query [Q], changes [1] and [2] are removed from the write buffer. However, to keep the cache's state reflecting the user's changes, change [3] is applied (again) over top of the result for [Q].&lt;br /&gt;&lt;br /&gt;Simplifying the implementation of this reapplication stage is the most important benefit of implementing a write-through cache. By separating the changes from the state, it becomes much easier to reapply the changes to the cache once the server has delivered new content to the cache. As discussed in a &lt;a id="j7d4" href="http://google-code-updates.blogspot.com/2009/06/gmail-for-mobile-html5-series.html" title="previous post" style="color: rgb(85, 26, 139);"&gt;previous post&lt;/a&gt;, the use of SQL triggers can greatly improve database performance. Whether updating or re-updating, triggers are a great way to make the application of changes to the cache much more efficient.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Cached Content To the UI&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;The first of the four data flows is delivering content to the UI is reasonably easy: query the cache for the desired content and when the query completes, forward the request to the UI. If you look at the &lt;span style="font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;getNoteList_ &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;function from the &lt;/span&gt;&lt;a id="y0k0" href="http://code.google.com/p/webstorageportabilitylayer/source/browse/trunk/simplenotes/simplenotes.js" title="simplenotes.js"&gt;simplenotes.js&lt;/a&gt;&lt;span style="font-size:85%;"&gt; example code included in the WSPL distribution, you'll see that the delivering cached content to the UI has the following basic steps:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;perform hit determination: deciding if the requested cache contents are actually in the cache.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;create a database transaction, and while in the transaction&lt;/li&gt;&lt;ul&gt;&lt;li&gt;query the database for the desired key&lt;/li&gt;&lt;li&gt;accumulate the results&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;then outside of the transaction, return the result to the UI.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Changes From The UI&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;The second flow (&lt;span class="Apple-style-span"  style="font-family:'Courier New';"&gt;applyUiChange&lt;/span&gt;&lt;span style="font-family:Verdana,sans-serif;"&gt;) is recording changes made by the user to the write buffer. It has a very similar structure&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;create a database transaction, and while in the transacation&lt;/li&gt;&lt;ul&gt;&lt;li&gt;write the change to the write buffer&lt;/li&gt;&lt;li&gt;wait for a trigger to update the state of the cache.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Updates Bound For The Server&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-weight: normal;"&gt;&lt;span style="font-size:100%;"&gt;As discussed above, once the changes have been written to the write buffer, they still have to be sent to the server. This happens by prepending them to queries bound for the server. The &lt;/span&gt;&lt;span class="Apple-style-span" style=";font-family:'Courier New';font-size:100%;"  &gt;fetchFromServer &lt;/span&gt;&lt;span style="font-size:100%;"&gt;from the example is responsible for this. As might be familiar by now, the flow is&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;create a database transaction and while in the transaction&lt;/li&gt;&lt;ul&gt;&lt;li&gt;query the write buffer for all the entries that need to be sent to the server&lt;/li&gt;&lt;li&gt;accumulate the entries&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;then outside the transaction, send the combination of changes and query to the server&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Changes From The Server&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-weight: normal;"&gt;&lt;span style="font-size:100%;"&gt;Finally, we need to merge the changes from the server into the cache as is done in the &lt;/span&gt;&lt;span class="Apple-style-span" style=";font-family:'Courier New';font-size:100%;"  &gt;insertUpdate &lt;/span&gt;&lt;span style="font-size:100%;"&gt;method from the example. Here the flow is as follows:&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;create a database transaction and while in the transaction&lt;/li&gt;&lt;ul&gt;&lt;li&gt;update the directory&lt;/li&gt;&lt;li&gt;write the new content into the cache&lt;/li&gt;&lt;li&gt;touch the changes in the write buffer that need to be re-applied to the cache&lt;/li&gt;&lt;li&gt;wait for the trigger to complete its update&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;then, outside of the transaction, send the response to the UI if it was satisfying a cache miss.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;That's a brief intro to the cache architecture as found in &lt;span style="background-color: rgb(255, 255, 255);"&gt;Gmail for mobile&lt;/span&gt;. We're continuing to improve our implementation of this basic architecture to improve both the performance and robustness &lt;span style="background-color: rgb(255, 255, 255);"&gt;of Gmail for mobile&lt;/span&gt;. Please stay tuned for follow on blog posts.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;Previous posts from Gmail for Mobile HTML5 Series&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;a title="HTML5 and Webkit pave the way for mobile web applications" href="http://google-code-updates.blogspot.com/2009/04/html5-and-webkit-pave-way-for-mobile.html" id="e4x7"&gt;HTML5 and Webkit pave the way for mobile web applications&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/04/gmail-for-mobile-html5-series-using.html" id="ye:o"&gt;Using AppCache to launch offline - Part 1&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-part-2.html" id="b52e"&gt;Using AppCache to launch offline - Part 2&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-part-3.html" id="moyw"&gt;Using AppCache to launch offline - Part 3&lt;/a&gt;&lt;br /&gt;&lt;a id="vn-v" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-common.html" title="A Common API for Web Storage"&gt;A Common API for Web Storage&lt;/a&gt;&lt;br /&gt;&lt;a title="Suggestions for better performance" href="http://google-code-updates.blogspot.com/2009/06/gmail-for-mobile-html5-series.html" id="oi0j"&gt;Suggestions for better performance&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Robert Kroeger, Software Engineer, Google Mobile Team&lt;/span&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-3312893399992003701?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=wAfOvQ8tG8k:zDnTXE95YY4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=wAfOvQ8tG8k:zDnTXE95YY4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=wAfOvQ8tG8k:zDnTXE95YY4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/wAfOvQ8tG8k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/3312893399992003701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/gmail-for-mobile-html5-series-cache.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/3312893399992003701?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/3312893399992003701?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/wAfOvQ8tG8k/gmail-for-mobile-html5-series-cache.html" title="Gmail for Mobile HTML5 Series : Cache Pattern For Offline HTML5 Web Applications" /><author><name>Ali Pasha</name><uri>http://www.blogger.com/profile/09111985048728097364</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03532655683070876489" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/gmail-for-mobile-html5-series-cache.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4AQHc5fSp7ImA9WxJWGEQ.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-7689599774435164669</id><published>2009-06-24T18:33:00.000-07:00</published><updated>2009-06-24T18:39:01.925-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-24T18:39:01.925-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="adsense" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>AdSense for Mobile Applications Beta</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4E9RvKH2MuA/SkLUmjG6tFI/AAAAAAAALXg/FZgjGkE41jU/s1600-h/chcps79g_20dqbzphc2_b"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 267px; height: 400px;" src="http://1.bp.blogspot.com/_4E9RvKH2MuA/SkLUmjG6tFI/AAAAAAAALXg/FZgjGkE41jU/s400/chcps79g_20dqbzphc2_b" alt="" id="BLOGGER_PHOTO_ID_5351073065993942098" border="0" /&gt;&lt;/a&gt;Are you developing free iPhone or Android applications? With our new beta product - &lt;a href="http://www.google.com/ads/mobileapps/" id="yzjr" title="Ads for Mobile Applications"&gt;AdSense for Mobile Applications&lt;/a&gt;, you can monetize your mobile applications by showing contextually targeted ads and/or placement targeted ads alongside your application content. We provide you with iPhone and Android SDKs and example applications that request and display &lt;a href="http://www.google.com/adsense" id="g5e-" title="AdSense"&gt;AdSense&lt;/a&gt; ads. Our SDKs also support &lt;a href="http://www.doubleclick.net/" id="h7n8" title="DoubleClick"&gt;DoubleClick&lt;/a&gt; ads.&lt;br /&gt;&lt;br /&gt;You can show 320x50 text and image ads linked to HTML webpages in your application. These ads are targeted to the keywords that you send us in the AdSense (or DoubleClick) ad request. The keywords must be relevant to your application content. If your application content is loaded from a webpage that is customized for iPhones and Android handsets, then you can also send us the webpage URL for us to target ads. The ads may also be placement targeted which means an advertiser can specifically target to your application.&lt;p&gt;Our iPhone SDK is compatible with iPhone OS 3.0, and our Android SDK is compatible with &lt;a href="http://developer.android.com/" id="m2.u" title="Android 1.5 SDK"&gt;Android 1.5 SDK&lt;/a&gt;. The SDKs include a library that can be linked in to your application which exposes methods to fetch and show ads. You must place a maximum of one ad per screen at the top or bottom (see the screenshot from the &lt;a title="Backgrounds" href="http://www.stylem.com/iphone/" id="j6mg"&gt;Backgrounds&lt;/a&gt; iPhone application). When a user clicks on the ad in your application, you can choose whether the user should view the advertiser's website in iPhone Safari or a full-screen UIWebView on the iPhone. For Android applications, our API defaults to opening the advertiser's website in the native browser.&lt;/p&gt;&lt;p&gt;To get started with monetizing your iPhone or Android application, sign up today on the &lt;a href="http://www.google.com/ads/mobileapps/" id="dsui" title="Ads for Mobile Applications"&gt;AdSense for Mobile Applications website&lt;/a&gt;. We can't wait to have you join our beta network!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Jennifer Lin, Software Engineer, Google Mobile Team&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-7689599774435164669?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=1bY3p171S-E:A-bXEyVV88M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=1bY3p171S-E:A-bXEyVV88M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=1bY3p171S-E:A-bXEyVV88M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/1bY3p171S-E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/7689599774435164669/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/adsense-for-mobile-applications-beta.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/7689599774435164669?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/7689599774435164669?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/1bY3p171S-E/adsense-for-mobile-applications-beta.html" title="AdSense for Mobile Applications Beta" /><author><name>Ali Pasha</name><uri>http://www.blogger.com/profile/09111985048728097364</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03532655683070876489" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_4E9RvKH2MuA/SkLUmjG6tFI/AAAAAAAALXg/FZgjGkE41jU/s72-c/chcps79g_20dqbzphc2_b" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/adsense-for-mobile-applications-beta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08HSXs7fCp7ImA9WxJWGEs.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-5736283763312984554</id><published>2009-06-23T15:40:00.000-07:00</published><updated>2009-06-24T09:43:58.504-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-24T09:43:58.504-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="speed" /><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><category scheme="http://www.blogger.com/atom/ns#" term="web performance" /><title>Let's make the web faster</title><content type="html">From building data centers in different parts of the world to designing highly efficient user interfaces, we at Google always strive to make our services faster. We focus on speed as a key requirement in product and infrastructure development, because our &lt;a href="http://googleresearch.blogspot.com/2009/06/speed-matters.html"&gt; research&lt;/a&gt; indicates that people prefer faster, more responsive apps. Over the years, through continuous experimentation, we've identified some performance best practices that we'd like to share with the web community on &lt;a href="http://code.google.com/speed" id="v0gc" title="code.google.com/speed"&gt;code.google.com/speed&lt;/a&gt;, a new site for web developers, with tutorials, tips and performance tools.&lt;br /&gt;&lt;br /&gt;We are excited to &lt;a href="http://groups.google.com/group/make-the-web-faster" id="k93m" title="discuss"&gt;discuss&lt;/a&gt; what we've learned about web performance with the Internet community. However, to optimize the speed of web applications and make browsing the web as fast as turning the pages of a magazine, we need to work together as a community, to tackle some larger challenges that keep the web slow and prevent it from delivering its full potential:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Many protocols that power the Internet and the web were developed when broadband and rich interactive web apps were in their infancy. Networks have become much faster in the past 20 years, and by collaborating to update protocols such as HTML and TCP/IP we can create a better web experience for everyone.  A great example of the community working together is &lt;a href="http://en.wikipedia.org/wiki/HTML_5" id="tuuu" title="HTML5 protocol"&gt;HTML5&lt;/a&gt;. With HTML5 features such as AppCache, developers are now able to write JavaScript-heavy web apps that run instantly and work and feel like desktop applications.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the last decade, we have seen close to a &lt;a href="http://www.webmonkey.com/print/blog/Google_Throws_Its_Weight_Behind_HTML_5" id="sc7-" title="100x improvement"&gt;100x improvement&lt;/a&gt; in JavaScript speed.  Browser developers and the communities around them need to maintain this recent focus on performance improvement in order for the browser to become the platform of choice for more feature-rich and computationally-complex applications.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Many websites can become faster with little effort, and collective attention to performance can speed up the entire web. Tools such as Yahoo!'s &lt;a href="http://developer.yahoo.com/yslow/" title="YSlow"&gt;YSlow&lt;/a&gt; and our own recently launched &lt;a href="http://code.google.com/speed/page-speed/" title="Page Speed"&gt;Page Speed&lt;/a&gt; help web developers create faster, more responsive web apps. As a community, we need to invest further in developing a new generation of tools for performance measurement, diagnostics, and optimization that work at the click of a button.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;While there are now more than 400 million broadband subscribers worldwide, broadband penetration is still relatively low in many areas of the world. Steps have been taken to bring the benefits of broadband to more people, such as the &lt;a href="http://googlepublicpolicy.blogspot.com/2008/11/vote-for-broadband-in-white-spaces.html" id="xhbi" title="FCC's decision"&gt;FCC's decision&lt;/a&gt; to open up the white spaces spectrum, for which the Internet community, including Google, was a strong champion. Bringing the benefits of cheap reliable broadband access around the world should be one of the primary goals of our industry.&lt;/li&gt;&lt;/ul&gt;To find out what Googlers think about making the web faster, see the video below. If you have ideas on how to speed up the web, please &lt;a href="http://moderator.appspot.com/#15/e=79951&amp;amp;t=79d39" id="d6o4" title="share"&gt;share&lt;/a&gt; them with the rest of the community. Let's all work together to make the web faster!&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IWWBnJEsUtU&amp;hl=en&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/IWWBnJEsUtU&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;Posted by Urs Hoelzle, SVP, Operations and Bill Coughran, SVP, Engineering&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Cross-posted on the &lt;a id="vocs" href="http://googleblog.blogspot.com/2009/06/lets-make-web-faster.html" title="Official Google Blog"&gt;Official Google Blog&lt;/a&gt;, and the &lt;a id="kf8j" href="http://googlewebmastercentral.blogspot.com/2009/06/lets-make-web-faster.html" title="Google Webmaster Central Blog"&gt;Google Webmaster Central Blog&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-5736283763312984554?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=l8jElDSFdvM:a--9nrydpWc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=l8jElDSFdvM:a--9nrydpWc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=l8jElDSFdvM:a--9nrydpWc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/l8jElDSFdvM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/5736283763312984554/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/lets-make-web-faster.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5736283763312984554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5736283763312984554?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/l8jElDSFdvM/lets-make-web-faster.html" title="Let's make the web faster" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/lets-make-web-faster.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYDQnk_fCp7ImA9WxJWF00.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-8662068026547878841</id><published>2009-06-22T12:29:00.000-07:00</published><updated>2009-06-22T13:56:13.744-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-22T13:56:13.744-07:00</app:edited><title>Introducing the Virtual Keyboard API</title><content type="html">&lt;div&gt; Inability to input text in native language has been a problem for many non-latin script based languages. This may happen for many reasons. Sometimes, users do not have the keyboard layout for their native language installed in the system they happen to be using (for example, a tourist using an internet cafe in a foreign country). Sometimes, such a keyboard layout is not well developed or not widely available. It is worse for web developers because there is no way they can ensure that their users have access to this very basic input technology. &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To address this issue, today, we added &lt;a href="http://code.google.com/apis/ajaxlanguage/documentation/#Keyboard" id="h8oa" title="Virtual Keyboard API" style="color: rgb(85, 26, 139);"&gt;Virtual Keyboard API&lt;/a&gt; into the &lt;a href="http://code.google.com/apis/ajaxlanguage/" id="okla" title="Google AJAX Language API" style="color: rgb(85, 26, 139);"&gt;Google AJAX Language API&lt;/a&gt;. With this API, developers can help their users to input text, regardless if they have the native keyboard layout installed in their Operating Systems or not. &lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_4E9RvKH2MuA/Sj_cI-wv8_I/AAAAAAAALWo/7QJ7DvCajRo/s1600-h/chpnnjdg_0gcv4bxdk_b"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 177px;" src="http://4.bp.blogspot.com/_4E9RvKH2MuA/Sj_cI-wv8_I/AAAAAAAALWo/7QJ7DvCajRo/s400/chpnnjdg_0gcv4bxdk_b" alt="" id="BLOGGER_PHOTO_ID_5350236929183970290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;  &lt;/div&gt;   &lt;b&gt;Pic 1: Russian Virtual Keyboard layout&lt;/b&gt;&lt;div&gt;&lt;div id="mb4b" style="text-align: left;"&gt;   &lt;/div&gt; &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; Another advantage is the ability to provide a better user experience for multilingual web sites. For example, on a Russian/Thai bilingual dictionary editing web site, users would type in Russian in the header, and then see a Thai description. With the Virtual keyboard API, developers can load a Russian virtual keyboard layout and bind with all the Russian text fields, and load a Thai virtual keyboard layout and bind them to Thai fields. The Virtual Keyboard API then will automatically swap to the corresponding keyboard layout depending upon the user action.  &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; Sometimes users may not be familiar with the key assignment of their keyboard layout. Virtual keyboard also shows the key assignment inside the page to allow users to input text by either pressing key or by clicking mouse on the virtual onscreen layout.  &lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;   With this initial release, we are launching 5 language layouts. These are: Arabic, Hindi, Polish, Russian, and Thai.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;   We plan to roll out support for more keyboard layouts in the future.  You can find more details by reading through the &lt;a href="http://code.google.com/apis/ajaxlanguage/documentation/referenceKeyboard.html" id="j4cg" title="class reference"&gt;class reference&lt;/a&gt; and trying the &lt;a href="http://code.google.com/apis/ajax/playground/#virtual_keyboard" id="gj1i" title="Code Playground samples"&gt;Code Playground samples&lt;/a&gt;. Feedback is always welcome in our &lt;a href="http://groups.google.com/group/Google-AJAX-Search-API" id="d8z9" title="support forum"&gt;support forum&lt;/a&gt; and &lt;a href="http://www.mibbit.com/?server=irc.freenode.net&amp;amp;channel=%23googleajaxapis" id="m0_:" title="IRC channel"&gt;IRC channel&lt;/a&gt;. &lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Manish Bhargava and Frank Tang, Google Internationalization Team&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-8662068026547878841?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=8gXcqFooLO8:SN-jjlY9e04:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=8gXcqFooLO8:SN-jjlY9e04:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=8gXcqFooLO8:SN-jjlY9e04:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/8gXcqFooLO8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/8662068026547878841/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/introducing-virtual-keyboard-api.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/8662068026547878841?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/8662068026547878841?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/8gXcqFooLO8/introducing-virtual-keyboard-api.html" title="Introducing the Virtual Keyboard API" /><author><name>Ali Pasha</name><uri>http://www.blogger.com/profile/09111985048728097364</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03532655683070876489" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_4E9RvKH2MuA/Sj_cI-wv8_I/AAAAAAAALWo/7QJ7DvCajRo/s72-c/chpnnjdg_0gcv4bxdk_b" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/introducing-virtual-keyboard-api.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQEQ3s9cCp7ImA9WxJXGE8.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-5462972168190260889</id><published>2009-06-11T17:11:00.000-07:00</published><updated>2009-06-12T10:38:22.568-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-12T10:38:22.568-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gtug" /><category scheme="http://www.blogger.com/atom/ns#" term="conferences" /><title>Google Technology User Groups</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_4E9RvKH2MuA/SjGgIqOlZzI/AAAAAAAALTg/JEfjesiSl-k/s1600-h/gtug2-175.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 175px; height: 71px;" src="http://3.bp.blogspot.com/_4E9RvKH2MuA/SjGgIqOlZzI/AAAAAAAALTg/JEfjesiSl-k/s400/gtug2-175.png" alt="" id="BLOGGER_PHOTO_ID_5346230303300347698" border="0" /&gt;&lt;/a&gt;My favorite part about Google I/O is the dozens of interesting conversations with developers -- getting a first-hand look at the different things that they are doing with our technologies. That's the spirit of the &lt;a title="Google Technology User Groups" href="http://www.gtugs.org/" id="g3.s"&gt;Google Technology User Groups&lt;/a&gt; -- regular meetups where local developers can get together to network and discuss, demo, and hack on Google's many developer offerings.&lt;br /&gt;&lt;br /&gt;From &lt;a title="lightning talks" href="http://picasaweb.google.com/sv.gtug/SVGTUGApr2009#" id="iorh"&gt;lightning talks&lt;/a&gt; in Mountain View, to &lt;a title="App Engine hackathons" href="http://picasaweb.google.com/matsuo.takashi/GaeHackAThonTokyo3rd#5323536050026197938" id="vv7q"&gt;App Engine hackathons&lt;/a&gt; in Tokyo, to &lt;a title="techno-parties" href="http://www.youtube.com/watch?v=95NQMwMPY6k" id="sipv"&gt;lectures&lt;/a&gt; in Berlin, the GTUGs are a great place to meet fellow developers and learn (or teach) something new.&lt;br /&gt;&lt;br /&gt;At &lt;a title="Google I/O" href="http://code.google.com/events/io" id="ozy8"&gt;Google I/O&lt;/a&gt;, there were many folks eager to bring the spirit of the conference back to their hometowns by starting up GTUGs of their own. Since the conference ended, our list of current GTUGs has grown to include this 'baby boomer' generation of chapters. The following are all new groups looking for members and starting to set up their first events.&lt;br /&gt;&lt;br /&gt;If there's one near you, check it out! Let the organizers know you're interested; suggest topics for discussion and even offer to do a talk about your own experiences.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Europe&lt;/b&gt;&lt;br /&gt;Paris GTUG - &lt;a href="http://groups.google.com/group/paris-gtug" target="_blank"&gt;http://groups.google.com/group/paris-gtug&lt;/a&gt;&lt;br /&gt;Hamburg GTUG - &lt;a href="http://www.hamburg-gtug.org/" target="_blank"&gt;http://www.hamburg-gtug.org&lt;/a&gt;&lt;br /&gt;GTUG Munich - &lt;a href="http://gtug-muc.org/" target="_blank"&gt;http://gtug-muc.org&lt;/a&gt;&lt;br /&gt;Istanbul GTUG - &lt;a href="http://www.istanbul-gtug.org/" target="_blank"&gt;http://www.istanbul-gtug.org/&lt;/a&gt;&lt;br /&gt;Polish GTUG - &lt;a href="http://www.gtug.pl/" target="_blank"&gt;http://www.gtug.pl&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;North America&lt;/b&gt;&lt;br /&gt;Tri-Valley California GTUG - &lt;a href="http://groups.google.com/group/tv-gtug" target="_blank"&gt;http://groups.google.com/group/tv-gtug&lt;/a&gt;&lt;br /&gt;Berkeley GTUG - &lt;a href="http://www.meetup.com/Berkeley-GTUG/" target="_blank"&gt;http://www.meetup.com/Berkeley-GTUG/&lt;/a&gt;&lt;br /&gt;San Diego GTUG - &lt;a href="http://www.meetup.com/sd-gtug/" target="_blank"&gt;http://www.meetup.com/sd-gtug/&lt;/a&gt;&lt;br /&gt;NYC GTUG - &lt;a href="http://sites.google.com/site/nycgtug" target="_blank"&gt;http://sites.google.com/site/nycgtug&lt;/a&gt;&lt;br /&gt;New Jersey GTUG - &lt;a href="http://nj-gtug.org/" target="_blank"&gt;http://nj-gtug.org/&lt;/a&gt;&lt;br /&gt;Philly/Delaware GTUG - &lt;a href="http://sites.google.com/site/phillygtug/" target="_blank"&gt;http://sites.google.com/site/phillygtug/&lt;/a&gt;&lt;br /&gt;Boston GTUG - &lt;a href="http://groups.google.com/group/boston-gtug" target="_blank"&gt;http://groups.google.com/group/boston-gtug&lt;/a&gt;&lt;br /&gt;Denver GTUG - &lt;a href="http://groups.google.com/group/denver-gtug" target="_blank"&gt;http://groups.google.com/group/denver-gtug&lt;/a&gt;&lt;br /&gt;Twin Cities GTUG - &lt;a href="http://tc-gtug.org/" target="_blank"&gt;tc-gtug.org&lt;/a&gt;&lt;br /&gt;Austin GTUG - &lt;a href="http://sites.google.com/site/austingtug/" target="_blank"&gt;http://sites.google.com/site/austingtug/&lt;/a&gt;&lt;br /&gt;Michigan GTUG - &lt;a href="http://groups.google.com/group/mi-gtug" target="_blank"&gt;http://groups.google.com/group/mi-gtug&lt;/a&gt;&lt;br /&gt;&lt;div&gt;MadGTUG - &lt;a href="http://madgtug.org/" target="_blank"&gt;http://madgtug.org&lt;/a&gt;&lt;br /&gt;Cleveland GTUG - &lt;a href="http://groups.google.com/group/cleveland-gtug" target="_blank"&gt;http://groups.google.com/group/cleveland-gtug&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Utah GTUG - &lt;a href="http://utahgtug.blogspot.com/" target="_blank"&gt;http://utahgtug.blogspot.com/&lt;/a&gt;&lt;br /&gt;Laguna GTUG - &lt;a href="http://www.laguna-gtug.org/" target="_blank"&gt;www.laguna-gtug.org&lt;/a&gt;&lt;br /&gt;Quebec GTUG - &lt;a href="http://groups.google.com/group/gtug-quebec/?pli=1" target="_blank"&gt;http://groups.google.com/group/gtug-quebec/?pli=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;South America&lt;/b&gt;&lt;br /&gt;Chile GTUG - &lt;a href="http://groups.google.com/group/gtug-cl" target="_blank"&gt;http://groups.google.com/group/gtug-cl&lt;/a&gt;&lt;br /&gt;Argentina GTUG - &lt;a href="http://groups.google.com/group/gtug-ar" target="_blank"&gt;http://groups.google.com/group/gtug-ar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Asia&lt;/b&gt;&lt;br /&gt;Kuala Lumpur GTUG - &lt;a href="http://sites.google.com/site/gtugkl/" target="_blank"&gt;http://sites.google.com/site/gtugkl/&lt;/a&gt;&lt;br /&gt;Hyderabad GTUG - &lt;a href="http://sites.google.com/site/hydgtug/" target="_blank"&gt;http://sites.google.com/site/hydgtug/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also a big shout-out to our existing chapters:&lt;br /&gt;&lt;br /&gt;Silicon Valley GTUG - &lt;a href="http://www.meetup.com/sv-gtug" target="_blank"&gt;http://www.meetup.com/sv-gtug&lt;/a&gt; (watch the organizers, Kevin and Van, talk about &lt;a title="GTUGs at Google I/O" href="http://www.youtube.com/watch?v=1RnyyE3RN3k" id="ds_4"&gt;GTUGs at Google I/O&lt;/a&gt;)&lt;br /&gt;Pune GTUG - &lt;a target="_new" href="http://pune-gtug.blogspot.com/"&gt;http://pune-gtug.blogspot.com/&lt;/a&gt;&lt;br /&gt;Chico GTUG &lt;span style="color: rgb(51, 51, 51);font-family:sans-serif;" &gt;&lt;a href="http://www.berlin-gtug.org/" style="color: rgb(51, 51, 51);" target="_blank"&gt;http://www.chico-gtug.org&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Berlin GTUG - &lt;a href="http://www.berlin-gtug.org/" target="_blank"&gt;http://www.berlin-gtug.org&lt;/a&gt;&lt;br /&gt;Tokyo GTUG - &lt;a title="http://tokyo-gtug.org/" href="http://tokyo-gtug.org/" id="bup."&gt;http://tokyo-gtug.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe marginheight="0" marginwidth="0" src="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;msa=0&amp;amp;msid=118171940392379715704.000462958bd7dc39033c4&amp;amp;ll=9.208762,8.711572&amp;amp;spn=88.693281,-98.039732&amp;amp;z=1&amp;amp;output=embed" scrolling="no" frameborder="0" height="350" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;View &lt;a href="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;msa=0&amp;amp;msid=118171940392379715704.000462958bd7dc39033c4&amp;amp;ll=9.208762,8.711572&amp;amp;spn=88.693281,-98.039732&amp;amp;z=1&amp;amp;source=embed" style="color: rgb(0, 0, 255); text-align: left;"&gt;GTUGs&lt;/a&gt; in a larger map&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Don't see a chapter near you? Start one! Join our &lt;a title="GTUG managers mailing list" href="http://groups.google.com/group/gtug-managers" id="cy5m"&gt;GTUG managers mailing list&lt;/a&gt;. Other info at &lt;a href="http://gtugs.org/"&gt;gtugs.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Stephanie Liu, Google Developer Programs&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-5462972168190260889?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=rfh-52vlBaE:NHWNiEtUkJ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=rfh-52vlBaE:NHWNiEtUkJ0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=rfh-52vlBaE:NHWNiEtUkJ0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/rfh-52vlBaE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/5462972168190260889/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/google-technology-user-groups.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5462972168190260889?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5462972168190260889?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/rfh-52vlBaE/google-technology-user-groups.html" title="Google Technology User Groups" /><author><name>Ali Pasha</name><uri>http://www.blogger.com/profile/09111985048728097364</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03532655683070876489" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_4E9RvKH2MuA/SjGgIqOlZzI/AAAAAAAALTg/JEfjesiSl-k/s72-c/gtug2-175.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/google-technology-user-groups.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEEQXY6fip7ImA9WxJXFks.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-5134536106499199970</id><published>2009-06-10T14:00:00.000-07:00</published><updated>2009-06-10T14:00:00.816-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T14:00:00.816-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="maps" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Google I/O Interactive Map: Now with videos + some Open Source goodness!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_EuCTzLdp3vE/SjAF0JNXDLI/AAAAAAAACrk/cbLUpDpLt8U/s1600-h/IO_map2.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 161px; height: 200px;" src="http://2.bp.blogspot.com/_EuCTzLdp3vE/SjAF0JNXDLI/AAAAAAAACrk/cbLUpDpLt8U/s200/IO_map2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345779151072070834" /&gt;&lt;/a&gt;If you attended Google I/O 2009 a few weeks ago, you may have noticed a kiosk station on the 2nd and 3rd floors of Moscone West labelled '&lt;a href="http://code.google.com/events/io/map/#level2" id="re_2" title="Interactive Conference Map"&gt;Interactive Conference Map&lt;/a&gt;, powered by &lt;a href="http://maps.google.com" id="t_di" title="Google Maps"&gt;Google Maps&lt;/a&gt;'. The kiosk simply pointed to a &lt;a href="http://code.google.com/apis/maps" id="i67p" title="JavaScript Maps API"&gt;JavaScript Maps API&lt;/a&gt;-based interactive map of the venue I created in my 20% time.&lt;br /&gt;&lt;br /&gt;Now that all the &lt;a href="http://code.google.com/events/io/sessions.html" id="z6df" title="I/O session videos and presentations"&gt;I/O session videos and presentations&lt;/a&gt; are live, we took the opportunity to mash up the videos with our interactive conference map to provide developers with an alternate way to navigate through 80+ keynote and session videos, and bring the action at I/O to life virtually. For example, here are &lt;a href="http://code.google.com/events/io/map/#level2:track-1-videos" id="t8c3" title="videos of sessions that took place in Room 1"&gt;videos of sessions that took place in Room 1&lt;/a&gt; (click the tabs for Wednesday and Thursday sessions). And &lt;a href="http://code.google.com/events/io/map/#level3:keynote-videos" id="iv_e" title="here's where the keynote sessions took place"&gt;here's where the keynote sessions took place&lt;/a&gt;. Check out &lt;a href="http://code.google.com/events/io/map/#level2:video-interviews" id="mq2q" title="where we filmed interviews with I/O sandbox developers"&gt;where we filmed interviews with I/O sandbox developers&lt;/a&gt; on their apps, technical challenges and business best practices.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/events/io/map/#level2"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 271px;" src="http://2.bp.blogspot.com/_EuCTzLdp3vE/SjAFhpFlEMI/AAAAAAAACrc/xJmkA902gi4/s400/IO_map1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345778833211855042" /&gt;&lt;/a&gt;&lt;br /&gt;Now, hopefully you enjoyed using the map and are now thinking, "Cool, I want to do something like this for my next event!" (or your college campus, or such). If you are, then good news everyone, I've &lt;a href="http://code.google.com/p/googleio2009-map" id="kiwn" title="open sourced the interactive conference map"&gt;open sourced the interactive conference map&lt;/a&gt; and all relevant resources. Inside the project, you'll also find a &lt;a href="http://code.google.com/p/googleio2009-map/wiki/HowTo" id="j9j2" title="how to article outlining the steps I went through"&gt;how to article outlining the steps I went through&lt;/a&gt; to create the map.&lt;br /&gt;&lt;br /&gt;If you attended I/O, then I hope you enjoyed it and had time to stop by the conference map kiosk! If not, no worries, just make sure to check out the &lt;a href="http://code.google.com/p/googleio2009-map" id="nsr8" title="open source project"&gt;open source project&lt;/a&gt; and see if you can use the code and/or techniques in your next mapping project!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Roman Nurik, Developer Programs Engineer&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-5134536106499199970?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=nanBvxUif7E:tuOGyl6xNmM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=nanBvxUif7E:tuOGyl6xNmM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=nanBvxUif7E:tuOGyl6xNmM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/nanBvxUif7E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/5134536106499199970/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/google-io-interactive-map-now-with.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5134536106499199970?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5134536106499199970?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/nanBvxUif7E/google-io-interactive-map-now-with.html" title="Google I/O Interactive Map: Now with videos + some Open Source goodness!" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_EuCTzLdp3vE/SjAF0JNXDLI/AAAAAAAACrk/cbLUpDpLt8U/s72-c/IO_map2.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/google-io-interactive-map-now-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYHR3Y_eCp7ImA9WxJXFks.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-4701777515401684746</id><published>2009-06-10T11:50:00.000-07:00</published><updated>2009-06-10T11:55:36.840-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T11:55:36.840-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><category scheme="http://www.blogger.com/atom/ns#" term="gmail" /><title>Gmail for Mobile HTML5 Series: Suggestions for Better Performance</title><content type="html">&lt;i&gt;On April 7th, Google launched a new version of Gmail for mobile for iPhone and Android-powered devices. We shared the behind-the-scenes story through &lt;a href="http://google-code-updates.blogspot.com/2009/04/html5-and-webkit-pave-way-for-mobile.html" id="j95y" title="this blog"&gt;this blog&lt;/a&gt; and decided to share more of our learnings in a brief series of follow-up blog posts.  This week, I'll talk about a few small things you can do to improve performance of your HTML5-based applications.  Our focus here will be on performance bottlenecks related to the database and AppCache.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimizing Database Performance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are hundreds of books written about optimizing SQL and database performance, so I won't bother to get into these details, but instead focus on things which are of particular interest for mobile HTML5 apps.&lt;br /&gt;&lt;br /&gt;Problem:  &lt;b&gt;Creating and deleting tables is slow!&lt;/b&gt; It can take upwards of 200 ms to create or delete a table.  This means a simple database schema with 10 tables can easily take 2-4 seconds (or more!) just to delete and recreate the tables.  Since this often needs to be done at startup time, this really hurts your launch time.&lt;br /&gt;&lt;br /&gt;Solution:  &lt;b&gt;Smart versioning and backwards compatible schema changes (whenever possible).&lt;/b&gt;  A simple way of doing this is to have a VERSION table with a single row that includes the version number (e.g., 1.0).  For backwards-compatible version changes, just update the number after the decimal (e.g., 1.1) and apply any updates to the schema.  For changes that aren't backwards compatible, update the number before the decimal (e.g., 2.0) at which point you can drop all the tables and recreate them all.  With a reasonable schema design to begin with, it should be very rare that a schema change is not backwards compatible and even if this happens every month or so, users should get to use your application 20, 30 even 100 times before they hit this startup delay again.  If your schema changes very infrequently, a simple 1, 2, 3 versioning scheme will probably work fine; just make sure to only recreate the database when the version changes!&lt;br /&gt;&lt;br /&gt;Problem:  &lt;b&gt;Queries are slow!&lt;/b&gt;  Queries are faster than creates and updates, but they can still take 100ms-150ms to execute.  It's not uncommon for traditional applications to execute dozens or even hundreds of queries at startup – on mobile this is not an option.  &lt;br /&gt;&lt;br /&gt;Solution:  &lt;b&gt;Defer and/or combine queries.&lt;/b&gt;  Any queries that can be deferred from startup (or at any other significant point in the application) should be deferred until the data is absolutely needed.  Adding 2-3 more queries on a user-driven operation can turn an action from appearing instantaneous to feeling unresponsive.  Any queries that are performed at startup should be optimized to require as few hits to the database as possible.  For example, if you're storing data about books and magazines, you could use the following two queries to get all the authors along with the number of books and magazine articles they've writen:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;SELECT Author, COUNT(*) as NumArticles&lt;br /&gt;FROM Magazines&lt;br /&gt;GROUP BY Author&lt;br /&gt;ORDER BY NumArticles;&lt;br /&gt;&lt;br /&gt;SELECT Author, COUNT(*) as NumBooks&lt;br /&gt;FROM Books&lt;br /&gt;GROUP BY Author&lt;br /&gt;ORDER BY NumBooks;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This will work fine, but the additional query will generally cost you about 100-200 ms over a different (albeit less pretty) query like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;SELECT Author, NumPublications, PubType&lt;br /&gt;FROM (&lt;br /&gt;  SELECT Author, COUNT(*) as NumPublications, 'Magazine' as PubType, 0 as SortIndex&lt;br /&gt;  FROM Magazines&lt;br /&gt;  GROUP BY Author&lt;br /&gt;  UNION&lt;br /&gt;  SELECT Author, COUNT(*) as NumPublications, 'Book' as PubType, 1 as SortIndex&lt;br /&gt;  FROM Books&lt;br /&gt;  GROUP BY Author&lt;br /&gt;)&lt;br /&gt;ORDER BY SortIndex, NumPublications;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;This will return all the entries we want, with the magazine entries first in increasing order of number of articles, followed by the book entries, in increasing order of the number of books.  This is a toy example and there are clearly other ways of improving this, such as merging the Magazines and Books tables, but this type of scenario shows up all the time.  There's always a trade-off between simplicity and speed when dealing with databases, but in the case of HTML5 on mobile, this trade-off is even more important.&lt;br /&gt;&lt;br /&gt;Problem:  &lt;b&gt;Multiple updates is slow!&lt;/b&gt;  &lt;br /&gt;&lt;br /&gt;Solution:  &lt;b&gt;Use Triggers whenever possible.&lt;/b&gt;  When the result of a database update requires updating other rows in the database, try to do it via SQL triggers.  For example, let's say you have a table called Books listing all the books you own and another called Authors storing the names of all the authors of books you own.  If you give a book away, you'll want to remove it from the Books table.  However, if this was the only book you owned by that author, you would also want to remove the author from the Authors table.  This can be done with two UPDATE statements, but a "better" way is to write a trigger that automatically deletes the author from the Authors table when the last book by this author is removed.  This will execute faster and because triggers happen asynchronously in the background, it will have less of an impact on the UI than executing two statements.  Here's an example of a simple trigger for this case:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;CREATE TRIGGER IF NOT EXISTS RemoveAuthor&lt;br /&gt;AFTER DELETE ON Books&lt;br /&gt;BEGIN&lt;br /&gt;  DELETE FROM Authors&lt;br /&gt;  WHERE Author NOT IN&lt;br /&gt;    (SELECT Author&lt;br /&gt;     FROM Books);&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;We'll get into more detail on triggers and how to use them in another performance post to come.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimizing AppCache Performance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Problem:  &lt;b&gt;Logging in is slow!&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Solution:  Avoid redirects to the login page.  App-Cache is great because it can launch the application without needing to hit the network, which makes it much faster and allows you to launch offline.  One problem you might encounter though, is that the application will launch and then you'll need to hit the network to get some data for the current user.  At this point you'll have to check that the user is authenticated and it might turn out that they're not (e.g., their cookies might have expired or have been deleted).  One option is to redirect the user to a login page somewhere, allow him to authenticate and then redirect him back to the application.  Regardless of whether or not the login page is listed in the manifest, when it redirects back to your application, the entire application will reload.  A nicer approach is for the application itself to display an authentication interface which sends the credentials and does the authentication seamlessly in the background.  This will avoid any additional reloads of the application and makes everything feel faster and better integrated.&lt;br /&gt;&lt;br /&gt;Problem:  &lt;b&gt;AppCache reloading causes my app to be slow!&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Solution:  &lt;b&gt;List as few URLs in the manifest as possible.&lt;/b&gt;  In a &lt;a id="k_3y" href="http://google-code-updates.blogspot.com/search/label/html5/" title="series of posts"&gt;series of posts&lt;/a&gt; on code.google.com, we talked about the HTML5 AppCache manifest file.  An important aspect of the manifest file is that when the version gets updated, all the URLs listed in the file are fetched again.  This happens in the background while the user is using the application, but opening all these network connections and transferring all that data can cause the application to slow down considerably during this process.  Try to setup your application so that all the resources can be fetched from as few URLs as possible to speed up the manifest download and minimize this effect.  Of course you could also just never update your manifest version, but what's the point of having rapid development if you never make any changes?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_EuCTzLdp3vE/Si_-aCA2LpI/AAAAAAAACrU/j0S5qabuqro/s1600-h/html5_table.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 132px;" src="http://4.bp.blogspot.com/_EuCTzLdp3vE/Si_-aCA2LpI/AAAAAAAACrU/j0S5qabuqro/s400/html5_table.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5345771005882543762" /&gt;&lt;/a&gt;&lt;br /&gt;That's a brief intro to some performance considerations when developing HTML5 applications.  These are all issues that we ran into ourselves and have either fixed or are in the process of fixing in our application.  I hope this helps you to avoid some of the issues we ran into and makes your application blazing fast!&lt;br /&gt;&lt;br /&gt;We plan to write several more performance related posts in the future, but for now stay tuned for next post where we'll discuss the cache pattern for building offline capable web applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Derek Phillips, Software Engineer, Google Mobile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Previous posts from Gmail for Mobile HTML5 Series&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;a title="HTML5 and Webkit pave the way for mobile web applications" href="http://google-code-updates.blogspot.com/2009/04/html5-and-webkit-pave-way-for-mobile.html" id="e4x7"&gt;HTML5 and Webkit pave the way for mobile web applications&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/04/gmail-for-mobile-html5-series-using.html" id="f18l"&gt;Using AppCache to launch offline - Part 1&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-part-2.html" id="f18l"&gt;Using AppCache to launch offline - Part 2&lt;/a&gt;&lt;br /&gt;&lt;a title="Using AppCache to launch offline - Part 1" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-part-3.html" id="f18l"&gt;Using AppCache to launch offline - Part 3&lt;/a&gt;&lt;br /&gt;&lt;a id="vn-v" href="http://google-code-updates.blogspot.com/2009/05/gmail-for-mobile-html5-series-common.html" title="A Common API for Web Storage"&gt;A Common API for Web Storage&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-4701777515401684746?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=mLo2z6kE7qk:PflgBQX4f2U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=mLo2z6kE7qk:PflgBQX4f2U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=mLo2z6kE7qk:PflgBQX4f2U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/mLo2z6kE7qk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/4701777515401684746/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/gmail-for-mobile-html5-series.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/4701777515401684746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/4701777515401684746?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/mLo2z6kE7qk/gmail-for-mobile-html5-series.html" title="Gmail for Mobile HTML5 Series: Suggestions for Better Performance" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_EuCTzLdp3vE/Si_-aCA2LpI/AAAAAAAACrU/j0S5qabuqro/s72-c/html5_table.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/gmail-for-mobile-html5-series.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMEQH47eip7ImA9WxJXFkk.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-2964494511525156803</id><published>2009-06-10T07:00:00.000-07:00</published><updated>2009-06-10T07:00:01.002-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T07:00:01.002-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google code" /><category scheme="http://www.blogger.com/atom/ns#" term="labs" /><category scheme="http://www.blogger.com/atom/ns#" term="apis" /><title>Another Round of Deprecation Policies for Labs Graduates</title><content type="html">We recently published deprecation policies for a number of APIs that graduated from &lt;a href="http://code.google.com/labs"&gt;Google Code Labs&lt;/a&gt;. They state how long we'll support each version from when it's deprecated or a newer version is introduced. It will be 3 years for most, but the time period varies a bit from product to product.&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/adwords/docs/terms.html"&gt;AdWords API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/adsense/terms.html"&gt;AdSense API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/ajaxfeeds/terms.html"&gt;AJAX Feed API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/ajaxlanguage/terms.html"&gt;AJAX Language API terms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/ajaxlibs/terms.html"&gt;AJAX Libraries API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/ajaxsearch/terms.html"&gt;AJAX Search API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/apps/intl/en/terms/api_terms.html"&gt;Apps APIs terms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/calendar/terms.html"&gt;Calendar Data API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/chart/terms.html"&gt;Chart API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://services.google.com/events/googhealthdevelopers"&gt;Health API terms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/maps/terms.html"&gt;Geo APIs terms&lt;/a&gt; (Earth API, Mapplets, Maps API, Maps API for Flash, and Static Maps API) &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/apps/intl/en/terms/api_terms.html"&gt;Secure Data Connector terms&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;We still need to update the terms for a couple remaining graduates, but should have them all done within the next couple weeks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Neel Kshetramade, Google Developer Programs&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-2964494511525156803?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=uGd5Axih0gM:vwFDLMmOL5I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=uGd5Axih0gM:vwFDLMmOL5I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=uGd5Axih0gM:vwFDLMmOL5I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/uGd5Axih0gM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/2964494511525156803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/another-round-of-deprecation-policies.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/2964494511525156803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/2964494511525156803?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/uGd5Axih0gM/another-round-of-deprecation-policies.html" title="Another Round of Deprecation Policies for Labs Graduates" /><author><name>Neel Kshetramade</name><uri>http://www.blogger.com/profile/01823824960774657238</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07303384689839753712" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/another-round-of-deprecation-policies.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EAQHk9cCp7ImA9WxJXFUU.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-1153502281837697220</id><published>2009-06-09T15:14:00.000-07:00</published><updated>2009-06-09T15:14:01.768-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T15:14:01.768-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="web exponents" /><category scheme="http://www.blogger.com/atom/ns#" term="web performance" /><title>Nicholas C. Zakas: Speed Up Your JavaScript</title><content type="html">Nicholas C. Zakas delivers the seventh &lt;a title="Web Exponents" href="http://google-code-updates.blogspot.com/2009/05/web-e-x-ponents.html" id="k_kz"&gt;Web E&lt;sup&gt;x&lt;/sup&gt;ponents&lt;/a&gt; tech talk at Google. Nicholas is a JavaScript guru and &lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/ref=ntt_athr_dp_sr_1?_encoding=UTF8&amp;amp;search-type=ss&amp;amp;index=books&amp;amp;field-author=Nicholas%20C.%20Zakas"&gt;author&lt;/a&gt; working at Yahoo!. Most recently we worked together on my next book, &lt;a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304"&gt;Even Faster Web Sites&lt;/a&gt;. Nicholas contributed the chapter on Writing Efficient JavaScript, containing much of the sage advice found in this talk. Check out his &lt;a href="http://www.slideshare.net/nzakas/speed-up-your-javascript"&gt;slides&lt;/a&gt; and watch the &lt;a href="http://www.youtube.com/watch?v=mHtdZgou0qU&amp;amp;feature=PlayList&amp;amp;p=689D6EE903ED5CB6&amp;amp;index=5"&gt;video&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mHtdZgou0qU&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/mHtdZgou0qU&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Nicholas starts by asserting that users have a greater expectation that sites will be fast. Web developers need to do most of the heavy lifting to meet these expectations. Much of the slowness in today's web sites comes from JavaScript. In this talk, Nicholas gives advice in four main areas: scope management, data access, loops, and DOM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scope Management&lt;/span&gt;: When a symbol is accessed, the JavaScript engine has to walk the scope chain to find that symbol. The scope chain starts with local variables, and ends with global variables. Using more local variables and fewer global variables results in better performance. One way to move in this direction is to store a global as a local variable when it's referenced multiple times within a function. Avoiding &lt;span style="font-family:courier new;"&gt;with&lt;/span&gt; also helps, because that adds more layers to the scope chain. And make sure to use &lt;span style="font-family:courier new;"&gt;var&lt;/span&gt; when declaring local variables, otherwise they'll end up in the global space which means longer access times.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Access:&lt;/span&gt; In JavaScript, data is accessed four ways: as literals, variables, object properties, and array items. Literals and variables are the fastest to access, although the relative performance can vary across browsers. Similar to global variables, performance can be improved by creating local variables to hold object properties and array items that are referenced multiple times. Also, keep in mind that deeper object property and array item lookup (e.g., obj.name1.name2.name3) is slower.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Loops:&lt;/span&gt; Nicholas points out that for-in and for each loops should generally be avoided. Although they provide convenience, they perform poorly. The choices when it comes to loops are for, do-while, and while. All three perform about the same. The key to loops is optimizing what is performed at each iteration in the loop, and the number of iterations, especially paying attention to the previous two performance recommendations. The classic example here is storing an array's length as a local variable, as opposed to querying the array's &lt;span style="font-family:courier new;"&gt;length&lt;/span&gt; property on each iteration through a loop.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DOM:&lt;/span&gt; One of the primary areas for optimizing your web application's interaction with the DOM is how you handle HTMLCollection objects: document.images, document.forms, etc., as well as the results of calling getElementsByTagName() and getElementsByClassName(). As noted in the &lt;a href="http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-75708506"&gt;HTML spec&lt;/a&gt;, HTMLCollections "are assumed to be &lt;span style="font-style: italic;"&gt;live&lt;/span&gt; meaning that they are automatically updated when the underlying document is changed." Any idea how long this code takes to execute?&lt;br /&gt;&lt;pre style="margin: 0pt; padding: 0pt;"&gt;&lt;br /&gt;   var divs = document.getElementsByTagName("div");&lt;br /&gt;   for (var i=0; i &amp;lt; divs.length; i++) {&lt;br /&gt;       var div = document.createElement("div");&lt;br /&gt;       document.body.appendChild(div);&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This code results in an infinite loop! Each time a div is appended to the document, the &lt;span style="font-family:courier new;"&gt;divs&lt;/span&gt; array is updated, incrementing the length so that the termination condition is never reached. It's best to think of HTMLCollections as live queries instead of arrays. Minimizing the number of times you access HTMLCollection properties (hint: copy length to a local variable) is a win. It can also be faster to copy the HTMLCollection into a regular array when the contents are accessed frequently (see the slides for a code sample).&lt;br /&gt;&lt;br /&gt;Another area for improving DOM performance is &lt;span style="font-style: italic;"&gt;reflow &lt;/span&gt;- when the browser computes the page's layout. This happens more frequently than you might think, especially for web applications with heavy use of DHTML. If you have code that makes significant layout changes, consider making the changes within a &lt;a href="http://www.w3.org/TR/2002/WD-DOM-Level-3-Core-20020409/core.html#ID-B63ED1A3"&gt;DocumentFragment&lt;/a&gt; or setting the &lt;span style="font-family:courier new;"&gt;className&lt;/span&gt; property to alter styles.&lt;br /&gt;&lt;br /&gt;There is hope for a faster web as browsers come equipped with JIT compilers and native code generation. But the legacy of previous, slower browsers will be with us for quite a while longer. So hang in there. With evangelists like Nicholas in the lead, it's still possible to find your way to a fast, efficient web page.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Steve Souders, Performance Evangelist&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Check out other blog posts and &lt;a href="http://www.youtube.com/view_play_list?p=689D6EE903ED5CB6"&gt;videos&lt;/a&gt; in the Web Exponents speaker series:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://google-code-updates.blogspot.com/2009/02/john-resig-drop-in-javascript.html"&gt;John Resig: Drop-in JavaScript Performance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://google-code-updates.blogspot.com/2009/03/doug-crockford-javascript-good-parts.html"&gt;Doug Crockford: JavaScript: The Good Parts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://google-code-updates.blogspot.com/2009/03/steve-souders-lifes-too-short-write.html"&gt;Steve Souders: Life's Too Short, Write Fast Code (part 2)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://google-code-updates.blogspot.com/2009/04/ppk-open-web-goes-mobile.html"&gt;PPK: The Open Web Goes Mobile&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://google-code-updates.blogspot.com/2009/05/rob-campbell-debugging-and-testing-web.html"&gt;Rob Campbell: Debugging and Testing the Web with Firebug&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-1153502281837697220?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=znnlo47L5vY:pQ1_y-K7DpE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=znnlo47L5vY:pQ1_y-K7DpE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=znnlo47L5vY:pQ1_y-K7DpE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/znnlo47L5vY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/1153502281837697220/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/nicholas-c-zakas-speed-up-your.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/1153502281837697220?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/1153502281837697220?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/znnlo47L5vY/nicholas-c-zakas-speed-up-your.html" title="Nicholas C. Zakas: Speed Up Your JavaScript" /><author><name>Steve Souders</name><uri>http://www.blogger.com/profile/07051900511910570322</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13542999685442726967" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/nicholas-c-zakas-speed-up-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQASHozcSp7ImA9WxJXFUo.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-640173191749121172</id><published>2009-06-09T12:00:00.000-07:00</published><updated>2009-06-09T13:12:29.489-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T13:12:29.489-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google data apis" /><category scheme="http://www.blogger.com/atom/ns#" term="ajax apis" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Google I/O: Session videos on building apps using the AJAX and Data APIs</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EuCTzLdp3vE/Si6kaMXw0RI/AAAAAAAACqs/le2TPoFWnZE/s1600-h/io.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 104px;" src="http://1.bp.blogspot.com/_EuCTzLdp3vE/Si6kaMXw0RI/AAAAAAAACqs/le2TPoFWnZE/s200/io.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5345390577639805202" /&gt;&lt;/a&gt;One of the best things about attending Google I/O is the chance to meet developers who are using our APIs and interacting with Google technology in ways we could never imagine. Not only was it amazing to see exciting examples of apps built on the AJAX and Data APIs being demoed at the developer sandbox, but it was also interesting to meet other developers who are just starting to use many of our APIs for their specific needs and cool ideas. Hopefully, by making all of our sessions available for free to watch on your own time, many of you who are interested in Google's APIs will get a better understanding of the ways we are making our API offerings easier to use, more efficient and much more feature rich.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Big Announcements &amp;amp; More&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;One of the most exciting announcements at this year's I/O was the developer preview of Google Wave.  After its introduction during the &lt;a href="http://code.google.com/events/io/" id="u408" title="Day 2 keynote"&gt;Day 2 keynote&lt;/a&gt;, there were three sessions devoted to the Google Wave APIs:  &lt;a href="http://code.google.com/events/io/sessions/ProgrammingWithAndForGoogleWave.html" id="pvzb" title="Programming With and For Google Wave"&gt;Programming With and For Google Wave&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sessions/GoogleWavePoweredByGWT.html" id="ajxa" title="Google Wave: Powered by GWT"&gt;Google Wave: Powered by GWT&lt;/a&gt;, and &lt;a href="http://code.google.com/events/io/sessions/GoogleWaveUnderTheHood.html" id="fxuc" title="Google Wave: Under the hood"&gt;Google Wave: Under the hood&lt;/a&gt;.  We hope you're as excited as we are, and can't wait to see how you use these tools.&lt;br /&gt;&lt;br /&gt;Another new product announcement this year was &lt;a href="http://www.google.com/webelements/" id="u72p" title="Google Web Elements"&gt;Google Web Elements&lt;/a&gt;, which allow you to easily add your favorite Google products onto your own website.  There are elements for Google News, Maps, Spreadsheets, YouTube and others, with more to come.  Be sure to check out the &lt;a href="http://code.google.com/events/io/" id="rv_m" title="Day 1 keynote"&gt;Day 1 keynote&lt;/a&gt; for a complete introduction to the simple copy and paste power of Google Web Elements.&lt;br /&gt;&lt;br /&gt;Keeping webmasters in mind, two sessions were all about optimizing your site for search.  In &lt;a href="http://code.google.com/events/io/sessions/SiteReviewsExperts.html" id="uuun" title="one talk"&gt;one talk&lt;/a&gt;, Matt Cutts reviewed real sites that *you* submitted. talking through real-life issues that effect developers when it comes to optimizing their app for search.  The &lt;a href="http://code.google.com/events/io/sessions/SearchFriendlyDevelopment.html" id="euhr" title="other session"&gt;other session&lt;/a&gt; focused on how to maximize your site, your content, and your application's exposure to search engines.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Javascript &amp;amp; Google AJAX APIs&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The session on &lt;a href="http://code.google.com/events/io/sessions/AdvancedCustomSearchConfiguration.html" id="vm1o" title="Custom Search Engines"&gt;Custom Search Engines&lt;/a&gt; focused on helping your users search the sites and topics that are relevant to you.  Nick Weininger discussed some of the ways to embed search and ads onto your site (including the new &lt;a href="http://www.google.com/webelements/customsearch/" id="udrg" title="Custom Search element"&gt;Custom Search element&lt;/a&gt;), then customize the look and feel of the results.  Adobe was on hand to show how they're using Custom Search Engines to enhance their products and insert contextual search into the developer's programming workflow.  We also announced the launch of the &lt;a href="http://buzz.blogger.com/2009/06/search-box-gadget-available-to-all.html" id="h3-v" title="Custom Search gadget for Blogger"&gt;Custom Search gadget for Blogger&lt;/a&gt; which gives your blog's visitors the ability to search not just your posts, but web pages linked from your blog, your blog lists, and link lists.&lt;br /&gt;&lt;br /&gt;In the session &lt;a href="http://code.google.com/events/io/sessions/ImplementingOwnVisualizationDatasource.html" id="nl4b" title="Implementing your Own Visualization Datasource"&gt;Implementing your Own Visualization Datasource&lt;/a&gt;, attendees learned about building a server-side data source compatible with the Google Visualization API, including hearing about the experience from a Salesforce.com expert.  Itai Raz also gave a &lt;a href="http://code.google.com/events/io/sessions/UsingVisualizationApiGWT.html" id="rzuh" title="great session"&gt;great session&lt;/a&gt; on using the Visualization API with GWT and treated the audience to advanced Javascript tricks such as wrapping visualizations as gadgets.&lt;br /&gt;&lt;br /&gt;Ben Lisbakken's &lt;a href="http://code.google.com/events/io/sessions/FunHacksCoolJavascripts.html" id="goku" title="session"&gt;session&lt;/a&gt; detailed some advanced Javascript techniques and then delved into some of great tips and tracks he learned while creating the &lt;a href="http://code.google.com/playground" id="db.." title="Code Playground"&gt;Code Playground&lt;/a&gt;, a tool which can help developers learn about and experiment with many of Google's APIs.  Some of the highlights include increasing the security and performance of applications and learning why App Engine is so easy on which to develop.&lt;br /&gt;&lt;br /&gt;Jon Kragh of &lt;a title="VastRank" href="http://www.vastrank.com" id="s41m"&gt;VastRank&lt;/a&gt; showed off some neat ways he's &lt;a title="Using AJAX APIs to Navigate User-Generated Content" href="http://code.google.com/events/io/sessions/UsingAjaxApisUserGen.html" id="znr9"&gt;Using AJAX APIs to Navigate User-Generated Content&lt;/a&gt;, including using Google Maps to display nearby colleges and translating reviews into the viewer's language.  Also, Michael Thompson explored the idea of &lt;a title="Building a Business with Google's free APIs" href="http://code.google.com/events/io/sessions/BuildingBusinessFreeApis.html" id="jebk"&gt;Building a Business with Google's free APIs&lt;/a&gt; using example Google Gadgets, Google Gadget Ads, Mapplets, and the Maps API.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Google Data APIs&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Jeff Fisher and Jochen Hartmann spoke on the &lt;a title="future direction of the YouTube API" href="http://code.google.com/events/io/sessions/GoingSocialYouTubeApps.html" id="b80-"&gt;future direction of the YouTube API&lt;/a&gt; as it becomes increasingly social. They used two sample applications to demonstrate the use of the activity feeds as well as the new "SUP" feed that allows high traffic websites to monitor YouTube for activity in a scalable manner.&lt;br /&gt;&lt;br /&gt;The session about &lt;a id="rkdp" href="http://code.google.com/events/io/sessions/BestPracticesYouTubeApps.html" title="writing monetizable YouTube apps"&gt;writing monetizable YouTube apps&lt;/a&gt; focused on creating applications that allowed access to YouTube videos in creative ways. In the talk, Kuan Yong showed how to expertly navigate through the YouTube API terms of service in order to avoid business pitfalls so that developers can monetize their own apps.&lt;br /&gt;&lt;br /&gt;Eric Bidelman and Anil Sabharwal &lt;a href="http://code.google.com/events/io/sessions/BuildingApplicationsCloud.html" id="alpp" title="discussed the Document List Data API"&gt;discussed the Document List Data API&lt;/a&gt; in detail, highlighting common enterprise use cases such as sync, migration, sharing, and legal discovery. Partners &lt;a title="Syncplicity" href="http://www.syncplicity.com/" id="umlo"&gt;Syncplicity&lt;/a&gt;, &lt;a title="OffiSync" href="http://offisync.com/" id="gt5v"&gt;OffiSync&lt;/a&gt;, and &lt;a title="gDocsBar" href="http://www.gdocsbar.com/" id="wcn0"&gt;gDocsBar&lt;/a&gt; showed off compelling demos.&lt;br /&gt;&lt;br /&gt;In the talk on the &lt;a href="http://code.google.com/events/io/sessions/EvolutionGoogleDataProtocol.html" id="rm_o" title="Evolution of the Google Data protocol"&gt;evolution of the Google Data protocol&lt;/a&gt;, Sven Mawson outlined all of the new features in the Google Data APIs that will help in the creation of more efficient applications. Two of the new additions included a compact and customizable JSON output and the option to retrieve only the parts of a feed that you want using partial GET.&lt;br /&gt;&lt;br /&gt;Monsur Hossain and Eric Bidelman &lt;a title="showed how to build a read/write gadget" href="http://code.google.com/events/io/sessions/UsingGoogleDataApisOauthOpenSocial.html" id="c1q3"&gt;showed how to build a read/write gadget&lt;/a&gt; using OAuth and the &lt;a title="Google Data JavaScript library" href="http://code.google.com/apis/gdata/client-js.html" id="xjts"&gt;Google Data JavaScript library&lt;/a&gt;. They went through a step by step set of instructions that explained how to set up the gadget code, how to get a token using the OAuth proxy, and how to read and write data to Blogger using the JavaScript library inside of an &lt;a title="iGoogle" href="http://www.igoogle.com" id="vikp"&gt;iGoogle&lt;/a&gt; gadget.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Google Geo APIs&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Mano Marks and Pamela Fox started with a &lt;a id="u5wr" href="http://code.google.com/events/io/sessions/DontKnowGeoApiCantHurt.html" title="grab bag session"&gt;grab bag session&lt;/a&gt; covering the vast spectrum of Geo APIs, discussing touring and HTML 5 in KML, the &lt;a id="pap1" href="http://code.google.com/apis/sketchup/" title="Sketchup Ruby API"&gt;Sketchup Ruby API&lt;/a&gt; (with an awesome physics demo), driving directions (did you know you can solve the Traveling Salesman Problem in Javascript?), desktop AIR applications, reverse geocoding, user location, and monetization using the &lt;a id="vv8d" href="http://googlegeodevelopers.blogspot.com/2009/05/earn-revenue-from-your-mashup-with-maps_20.html" title="Maps Ad Unit"&gt;Maps Ad Unit&lt;/a&gt; and &lt;a id="e3_n" href="http://googlegeodevelopers.blogspot.com/2009/03/changes-to-googlebar.html" title="GoogleBar"&gt;GoogleBar&lt;/a&gt;. Pamela finished by sneak previewing an upcoming feature in the Flash API: 3d perspective view.&lt;br /&gt;&lt;br /&gt;In the session on &lt;a id="o.6s" href="http://code.google.com/events/io/sessions/PerformanceTipsGeoApiMashups.html" title="performance tips for Maps API mashups"&gt;performance tips for Maps API mashups&lt;/a&gt;, Marcelo Camelo announced &lt;a id="ym46" href="http://code.google.com/apis/maps/documentation/v3" title="Google Maps API v3"&gt;Google Maps API v3&lt;/a&gt;, a latency-oriented rewrite of our popular JS Maps API.  Also see Susannah Raub's &lt;a id="l875" href="http://code.google.com/events/io/sessions/MapsApiMobile.html" title="more in-depth talk"&gt;more in-depth talk&lt;/a&gt; about Maps API v3.  Then Pamela gave advice on how to load many markers (by using a lightweight marker class,  clustering, or rendering a clickable tile layer) and on how to load many polys (by using a lightweight poly class, simplifying, encoding, or rendering tiles). Sascha Aickin, an engineer at &lt;a id="q3h7" href="http://www.redfin.com" title="Redfin"&gt;Redfin&lt;/a&gt;, showed how they were able to display 500 housing results on their real estate search site by creating the "SuperMarker" class.&lt;br /&gt;&lt;br /&gt;Mano and Keith presented various ways of &lt;a id="kfno" href="http://code.google.com/events/io/sessions/BuildingScalableGeoApps.html" title="hosting geo data on Google infrastructure"&gt;hosting geo data on Google infrastructure&lt;/a&gt;: Google Base API, Google App Engine, and the just-released Google Maps data API. Jeffrey Sambells showed how &lt;a id="m7vz" href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.connectorlocal.com%2F&amp;amp;ei=jdwqSvfsBJTitAOw06DiCg&amp;amp;usg=AFQjCNFYTu1FcfreGECPAzts_30x5cnojg&amp;amp;sig2=ix5YBYRZIV2BuKE8ixtdVg" title="ConnectorLocal"&gt;ConnectorLocal&lt;/a&gt; used the API (and their own custom PHP wrapper) for storing user data.&lt;br /&gt;&lt;br /&gt;On the same day as announcing &lt;a id="rs3h" href="http://googlegeodevelopers.blogspot.com/2009/05/hey-maps-api-and-earth-api-developers.html" title="better integration between the Google Earth and Google Maps JS APIs"&gt;better integration between the Google Earth and Google Maps JS APIs&lt;/a&gt;, Roman Nurik presented on &lt;a id="kf0i" href="http://code.google.com/events/io/sessions/BuildingAdvanced3DGoogleEarth.html" title="advanced Earth API topics"&gt;advanced Earth API topics&lt;/a&gt;, and released a &lt;a id="zdvy" href="http://code.google.com/p/earth-api-utility-library/" title="utility library"&gt;utility library&lt;/a&gt; for making that advanced stuff simple.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Adam Feldman and Brandon Bilinski, Google Developer Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-640173191749121172?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=kiRqYgdrkO8:HJoqtHRPoX0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=kiRqYgdrkO8:HJoqtHRPoX0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=kiRqYgdrkO8:HJoqtHRPoX0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/kiRqYgdrkO8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/640173191749121172/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/google-io-session-videos-on-building.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/640173191749121172?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/640173191749121172?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/kiRqYgdrkO8/google-io-session-videos-on-building.html" title="Google I/O: Session videos on building apps using the AJAX and Data APIs" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_EuCTzLdp3vE/Si6kaMXw0RI/AAAAAAAACqs/le2TPoFWnZE/s72-c/io.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/google-io-session-videos-on-building.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMERH44eSp7ImA9WxJXFUo.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-4453797205861256282</id><published>2009-06-09T11:00:00.000-07:00</published><updated>2009-06-09T11:00:05.031-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T11:00:05.031-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="social" /><category scheme="http://www.blogger.com/atom/ns#" term="google friend connect" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><category scheme="http://www.blogger.com/atom/ns#" term="opensocial" /><title>Everybody's talking: the Social track at Google I/O</title><content type="html">I had a great time at Google I/O -- meeting lots of developers from around the world who are interested in developing applications that use social data.  In addition to building web applications for traditional social networks like orkut, MySpace and hi5, developers are also looking at enterprise and mobile applications which take advantage of the social graph, gadgets for Google's platforms like iGoogle, Google Calendar and Gmail, and gadgets for the 5 million websites and blogs powered by Google Friend Connect.  We had some important questions raised in many of the sessions and also in the fireside chats with containers and app developers.  It was exciting to see the whole OpenSocial ecosystem come together to discuss the current status and progress of social technologies, as exemplified by the &lt;a id="yoxs" href="http://code.google.com/events/io/sandbox.html" title="I/O Developer Sandbox"&gt;I/O Developer Sandbox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;All the sessions at Google I/O were recorded, and videos and presentation materials are now available on the &lt;a id="fom9" href="http://code.google.com/events/io/sessions.html" title="Google I/O website"&gt;Google I/O website&lt;/a&gt;.  Here's a little more info about the sessions in the social track:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Google and the Social Web&lt;/i&gt;&lt;br /&gt;Daniel Holevoet outlined &lt;a id="r4rt" href="http://code.google.com/events/io/sessions/GoogleSocialWeb.html" title="all the ways Google uses social technologies"&gt;all the ways Google uses social technologies&lt;/a&gt;, highlighting those services which allow developers to extend them using the OpenSocial APIs.  During his talk, Dan announced the new support for OpenSocial gadgets in Google Calendar, which include hooks into a calendar-specific API for accessing the currently-selected date range.  Dan demonstrated the Quartermile OpenSocial application he wrote along with Arne Rooman-Kurrik and showed how the app could be used for different purposes across iGoogle, Gmail and Google Calendar and talked about how it could be used on any website via Google Friend Connect or on traditional social networks supporting the OpenSocial APIs.  Of course, Dan didn't get to cover all the exciting news about Google's social initiatives during this talk-- a &lt;a title="real-time gadgets API" href="http://googletalk.blogspot.com/2009/05/attention-nerds-new-gadgets-api-for.html" id="r4rw"&gt;real-time gadgets API&lt;/a&gt; was announced during the Developer Sandbox!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Google Friend Connect Gadgets: Best Practices in Code and Interaction Design&lt;/i&gt;&lt;br /&gt;Jonathan Terleski (lead designer on &lt;a id="h1ou" href="http://www.google.com/friendconnect/" title="Google Friend Connect"&gt;Google Friend Connect&lt;/a&gt;) and I presented this session on &lt;a id="dul2" href="http://code.google.com/events/io/sessions/GoogleFriendConnectGadgetsBestPractices.html" title="best practices for building Google Friend Connect (GFC) gadgets"&gt;best practices for building Google Friend Connect (GFC) gadgets&lt;/a&gt; for the millions of websites and blogs using GFC today.  We gave a brief overview of OpenSocial, followed by some design principles and a basic framework to think about when building GFC gadgets: what are the social objects, how do users contribute them, and how to users consume them?  In the last part of the talk, I discussed how to use page context in your gadgets for content, skinning and language while showing some small bits of code to accomplish each.  Most importantly, we announced the opening of submissions to the Google Friend Connect gadget directory and support for OpenSocial 0.9 in GFC gadgets.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Beyond Cut and Paste - Deep integrations with Google Friend Connect&lt;/i&gt;&lt;br /&gt;In &lt;a id="sa-5" href="http://code.google.com/events/io/sessions/BeyondCutPasteGoogleFriendConnect.html" title="this talk"&gt;this talk&lt;/a&gt;, Arne Roomann-Kurrik and Chris Schalk talked about how they built the Plane Crazy site for flying enthusiasts and the Chow Down site for restaurant connoisseurs as example sites demonstrating how to integrate Google Friend Connect with existing login systems and add social functionality using the REST and RPC APIs.  While these sites were built on top of Google App Engine (using Java and PHP), they talked about the other client libraries and raw protocols available for similar integrations.  The Chow Down site is already open-sourced, and the Plane Crazy site will be shortly.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Google Friend Connect and the Real World&lt;/i&gt;&lt;br /&gt;Patrick Chanezon led &lt;a id="tgi4" href="http://code.google.com/events/io/sessions/GFCPartners.html" title="this session"&gt;this session&lt;/a&gt; along with Shivani York, Henry Chan and Srivaths Lakshmi of &lt;a id="v3_1" href="http://www.TIME.com" title="TIME.com"&gt;TIME.com&lt;/a&gt; and Paul Berry of &lt;a id="l4jh" href="http://www.huffingtonpost.com" title="HuffingtonPost"&gt;HuffingtonPost&lt;/a&gt; talking about how they integrated Google Friend Connect into their sites.  Both TIME.com and HuffingtonPost used Google Friend Connect to create social lists where you rank the top items from the news, such as "Top 10 Movie Catchphrases" and "The World's Most Famous Swimsuits."  Khris Loux, of JS-Kit, concluded the session by addressing why it's a good idea to integrate with Google Friend Connect and how the web is enhanced by having open API access to social data.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Building a Business with Social Apps&lt;/i&gt;&lt;br /&gt;Shawn Shen and Chewy Trewhalla, Developer Advocates at Google, and Gerardo Capiel, VP of Product Management for the &lt;a id="axtc" href="http://developer.myspace.com/community/" title="MySpace Open Platform"&gt;MySpace Open Platform&lt;/a&gt;, led this session showing &lt;a id="u06o" href="http://code.google.com/events/io/sessions/BuildingBusinessSocialApps.html" title="how developers can make a living by building social apps"&gt;how developers can make a living by building social apps&lt;/a&gt;. Virtual currencies, the recent OpenSocial extension proposal for a virtual currency spec and implementations on hi5, 51.com and other networks were discussed.  In talking with a wide variety of developers and preparing this session content, our team learned even more about this industry, and we hope you can too.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Designing OpenSocial Apps for Speed and Scale&lt;/i&gt;&lt;br /&gt;How do you use standard web optimization techniques in combination with existing and new features of OpenSocial 0.9 &lt;a id="x2hd" href="http://code.google.com/events/io/sessions/DesigningOpenSocialAppsSpeedScale.html" title="to develop a fast social application which scales efficiently"&gt;to develop a fast social application which scales efficiently&lt;/a&gt;? Arne Rooman-Kurrik and Chris Chabot examined this question in great depth.  They took the Quartermile application which they developed and dived into the bandwidth, cpu and monetary savings achieved by applying a variety of optimizations--from image spriting, to data pipelining and proxied content.  From the naive implementation to the optimized implementation, they showed how you could improve latency by nearly 70% and drastically reduce the cost of hosting a social application.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The Social Web: An Implementer's Guide&lt;/i&gt;&lt;br /&gt;&lt;a id="imxv" href="http://josephsmarr.com/" title="Joseph Smarr"&gt;Joseph Smarr&lt;/a&gt;, Chief Platform Architect at &lt;a id="u1.7" href="http://www.plaxo.com" title="Plaxo"&gt;Plaxo&lt;/a&gt;, led this &lt;a id="j4wo" href="http://code.google.com/events/io/sessions/SocialWebImplementorsGuide.html" title="standing-room-only session"&gt;standing-room-only session&lt;/a&gt; about the current state of the social web and how "The Web is now social... and the Social Web is now open."  He recapped progress made in the last year, with the emergence and increasing adoption of a variety of technologies which make up the Open Stack: Open ID, XRDS-Simple, OAuth, Portable Contacts, OpenSocial. He gave many demos, including demonstrating the death of the "password anti-pattern" leading to a 92% conversion rate on users importing their contacts from sites supporting OpenID+OAuth and Portable Contacts.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Powering Mobile Apps with Social Data&lt;/i&gt;&lt;br /&gt;Many people today have a mobile device which has internet access, and they probably use those devices as much (if not more!) than they use their computers.  I explored the &lt;a id="l9e5" href="http://code.google.com/events/io/sessions/PoweringMobileAppsSocialData.html" title="different ways to use social data from the web"&gt;different ways to use social data from the web&lt;/a&gt; to enhance the experience users have with their mobile devices.  I demonstrated and dove into the code of three different types of apps -- pure web apps targeted at mobile devices, a web app which uses some native GPS functionality via Google Gears and adding a social scoreboard to the "Divide and Conquer" open source native Android application.  I then spoke a bit about the future of mobile development and how the features available between native applications and web applications are beginning to merge with the new HTML5 and W3C standards which provide access to native functionality such as databases, app caches and GPS location data.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;OpenSocial in the Enterprise&lt;/i&gt;&lt;br /&gt;Social networks are typically thought of as tools for personal communication, but they've increasingly become important in the enterprise world as well.  Chris Schalk of Google led this panel along with representatives from &lt;a title="IBM" href="http://www.ibm.com/" id="iltu"&gt;IBM&lt;/a&gt;, &lt;a title="Salesforce.com" href="http://www.salesforce.com/" id="wq20"&gt;Salesforce.com&lt;/a&gt;, &lt;a title="Oracle" href="http://www.oracle.com/" id="xaz1"&gt;Oracle&lt;/a&gt;, &lt;a title="eXo" href="http://www.exoplatform.com/" id="hnx_"&gt;eXo&lt;/a&gt;, &lt;a title="SAP" href="http://www.sap.com/" id="i:_s"&gt;SAP&lt;/a&gt; and &lt;a title="Atlassian" href="http://www.atlassian.com/opensocial/" id="s21s"&gt;Atlassian&lt;/a&gt; to share the &lt;a title="ways enterprises have used OpenSocial technology" href="http://code.google.com/events/io/sessions/OpenSocialEnterprise.html" id="kibd"&gt;ways enterprises have used OpenSocial technology&lt;/a&gt; outside of and behind the firewall.&lt;br /&gt;&lt;br /&gt;There's a wealth of new information in these presentations which were all prepared especially for Google I/O, including several new announcements.  The presenters also developed quite a bit of code for Google I/O, which we'll be releasing as Apache-licensed open source projects over the next couple weeks.  Stay tuned to the &lt;a id="kedh" href="http://blog.opensocial.org/" title="OpenSocial blo"&gt;OpenSocial blog&lt;/a&gt; for those releases.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Ryan Boyd, OpenSocial Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-4453797205861256282?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=LDKRXiu3yIs:J3TsC15WAC8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=LDKRXiu3yIs:J3TsC15WAC8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=LDKRXiu3yIs:J3TsC15WAC8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/LDKRXiu3yIs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/4453797205861256282/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/everybodys-talking-social-track-at.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/4453797205861256282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/4453797205861256282?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/LDKRXiu3yIs/everybodys-talking-social-track-at.html" title="Everybody's talking: the Social track at Google I/O" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/everybodys-talking-social-track-at.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UEQXw9eyp7ImA9WxJXFEQ.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-5885988162579038556</id><published>2009-06-08T13:00:00.000-07:00</published><updated>2009-06-08T13:00:00.263-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-08T13:00:00.263-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="app engine" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Google App Engine @ I/O: Java, offline processing, great partners. and more</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EuCTzLdp3vE/Si1gFVAyX7I/AAAAAAAACqk/Tq0wND6jDc8/s1600-h/app_engine.GIF"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 142px; height: 109px;" src="http://3.bp.blogspot.com/_EuCTzLdp3vE/Si1gFVAyX7I/AAAAAAAACqk/Tq0wND6jDc8/s200/app_engine.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5345033977414705074" /&gt;&lt;/a&gt;2009 has been a busy year for the App Engine team, but all along we've looked forward to Google I/O and the excitement it brings to Google's developer community. At I/O last year, App Engine was brand new and many attendees were just getting familiar with the project. Well, what a difference a year makes - this year, in addition to sharing new information about &lt;i&gt;our&lt;/i&gt; project, we got to learn about an amazing host of App Engine projects from you, our developers!&lt;br /&gt;&lt;br /&gt;First, the big news - we are excited to announce open signups for our Java language runtime. During Wednesday's keynote, Engineering Manager Kevin Gibbs and Product Manager Andrew Bowers &lt;a href="http://www.youtube.com/watch?v=vk1HvP7NO5w" id="lle9" title="demo'd"&gt;demoed&lt;/a&gt; the combined power of App Engine and GWT, all with easy deployment from the Eclipse IDE. If you've not tried our new language yet, please head over to the &lt;a href="http://appengine.google.com/" id="owq:" title="Admin Console"&gt;Admin Console&lt;/a&gt; to signup, then &lt;a href="http://code.google.com/appengine/downloads.html" id="s6w4" title="download the SDK"&gt;download the SDK&lt;/a&gt; and get programming.&lt;br /&gt;&lt;br /&gt;The engineers behind Google App Engine for Java presented two sessions. First, Toby Reyelts and Don Schwarz introduced the new runtime with &lt;a href="http://code.google.com/events/io/sessions/AppEngineNowJava.html" id="tg-q" title="App Engine: Now Serving Java"&gt;App Engine: Now Serving Java&lt;/a&gt;, including details of how our Java language layer exposes the power of Google's infrastructure. Be sure to check out the interactive game they demo'd with audience participation! Digging a bit deeper, Max Ross showed us &lt;a href="http://code.google.com/events/io/sessions/SofterSideofSchemas.html" id="t.3e" title="The Softer Side of Schemas"&gt;The Softer Side of Schemas&lt;/a&gt; - how he mapped Java Persistence Standards to App Engine's datastore.&lt;br /&gt;&lt;br /&gt;In addition to the new Java runtime, App Engine developer Brett Slatkin previewed some eagerly anticipated functionality: offline tasks. In his talk &lt;a href="http://code.google.com/events/io/sessions/OfflineProcessingAppEngine.html" id="gd7j" title="Offline Processing on App Engine: a Look Ahead"&gt;Offline Processing on App Engine: a Look Ahead&lt;/a&gt;, Brett revealed the first few milestones of App Engine's plan for offline processing with our upcoming Task Queue API. Leveraging the power of a web hook (an HTTP request body and URL) as the fundamental unit of execution on the web, this new API will allow you to organize and enqueue tasks for efficient background processing. Stay tuned to &lt;a href="http://googleappengine.blogspot.com/" id="vt8." title="the App Engine blog"&gt;the App Engine blog&lt;/a&gt; for this feature's launch.&lt;br /&gt;&lt;br /&gt;The App Engine team is always eager to share information about our infrastructure and how things work under the hood. Alon Levi kicked things off Wednesday morning with &lt;a href="http://code.google.com/events/io/sessions/FromSparkPlugToDriveTrain.html" id="gcr3" title="From Spark Plug to Drive Train: Life of an App Engine Request"&gt;From Spark Plug to Drive Train: Life of an App Engine Request&lt;/a&gt;, in which he showed new information about how an application's incoming requests are received, scheduled, and executed by App Engine. Ryan Barrett presented some of the theoretical, yet practical challenges faced by the App Engine team with &lt;a href="http://code.google.com/events/io/sessions/TransactionsAcrossDatacenters.html" id="t6ij" title="Transactions Across Datacenters (and Other Weekend Projects)"&gt;Transactions Across Datacenters (and Other Weekend Projects)&lt;/a&gt;. Finally, Brett Slatkin took the stage once again, with &lt;a href="http://code.google.com/events/io/sessions/BuildingScalableComplexApps.html" id="q7kx" title="Building Scalable, Complex Apps on App Engine"&gt;Building Scalable, Complex Apps on App Engine&lt;/a&gt;, to give you insights on advanced data structures and algorithms.&lt;br /&gt;&lt;br /&gt;In addition to the App Engine team, we were thrilled to have App Engine customers and partners present about their experience with the platform:&lt;ul&gt;&lt;li&gt;The &lt;a href="http://www.walkscore.com/" id="wsyi" title="Walk Score"&gt;Walk Score&lt;/a&gt; team shared their experience combining App Engine with other products in &lt;a href="http://code.google.com/events/io/sessions/AppEngineNittyGritty.html" id="q-.q" title="App Engine Nitty-Gritty: Scalability, Fault Tolerance, and Integrating Amazon EC2"&gt;App Engine Nitty-Gritty: Scalability, Fault Tolerance, and Integrating Amazon EC2&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Ola Bini gave a language implementor's view of our new Java runtime with &lt;a href="http://code.google.com/events/io/sessions/JrubyAppEngineJava.html" id="aakf" title="JRuby and Ioke on Google App Engine for Java"&gt;JRuby and Ioke on Google App Engine for Java&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Daniel Wilkerson presented distributed database theory in &lt;a href="http://code.google.com/events/io/sessions/DesignDistributedTransactionLayerAppEngine.html" id="on16" title="A Design for a Distributed Transaction Layer for Google App Engine"&gt;A Design for a Distributed Transaction Layer for Google App Engine&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Guillaume Laforge from SpringSource did a rapid walkthrough of Groovy and how to write Groovy applications for App Engine with &lt;a id="no1u" href="http://code.google.com/events/io/sessions/GroovyGrailsAppEngine.html" title="Groovy and Grails in App Engine"&gt;Groovy and Grails in App Engine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Last but not least, more partners joined our Developer Sandbox to share their experience building projects on Google App Engine: &lt;a href="http://code.google.com/events/io/sandbox/3scale.html" id="b9im" title="3SCale"&gt;3scale&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/bestbuy.html" id="a67e" title="Best Buy"&gt;Best Buy&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/buddypoke.html" id="t3km" title="BuddyPoke"&gt;BuddyPoke&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/ezasset.html" id="gnxy" title="EZAsset"&gt;EZAsset&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/gigapan.html" id="iw73" title="Gigapan"&gt;Gigapan&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/lifeaware.html" id="mi4k" title="LifeAware"&gt;LifeAware&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/salesforce.html" id="n5ox" title="SalesForce.com"&gt;Salesforce.com&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/sandbox/springsource.html" id="icuh" title="SpringSource"&gt;SpringSource&lt;/a&gt;, and &lt;a href="http://code.google.com/events/io/sandbox/thoughtworks.html" id="h:b0" title="ThoughtWorks"&gt;ThoughtWorks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks for making this year's Google I/O a fantastic success! We have much more in store for 2009, so be sure to watch &lt;a title="the App Engine blog" href="http://googleappengine.blogspot.com/" id="l7:a"&gt;the App Engine blog&lt;/a&gt; for updates!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Mike Repass, App Engine Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Java is a trademark or registered trademark of Sun Microsystems, Inc. in the United States and other countries.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-5885988162579038556?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=as3_P9Th0dk:6jHEMkGIknw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=as3_P9Th0dk:6jHEMkGIknw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=as3_P9Th0dk:6jHEMkGIknw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/as3_P9Th0dk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/5885988162579038556/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/google-app-engine-io-java-offline.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5885988162579038556?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/5885988162579038556?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/as3_P9Th0dk/google-app-engine-io-java-offline.html" title="Google App Engine @ I/O: Java, offline processing, great partners. and more" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_EuCTzLdp3vE/Si1gFVAyX7I/AAAAAAAACqk/Tq0wND6jDc8/s72-c/app_engine.GIF" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/google-app-engine-io-java-offline.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYFQ3c4eSp7ImA9WxJXFEU.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-4733716872293472439</id><published>2009-06-08T11:50:00.000-07:00</published><updated>2009-06-08T11:51:52.931-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-08T11:51:52.931-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google apps for your domain" /><category scheme="http://www.blogger.com/atom/ns#" term="enterprise" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Google I/O: Reflections on the Enterprise Track</title><content type="html">The Google Enterprise team was really energized to see the strong turnout for the &lt;a href="http://code.google.com/events/io/sessions.html#enterprise" id="bbkk" title="8 enterprise-track sessions"&gt;8 enterprise-track sessions&lt;/a&gt; at Google I/O last week. It was a treat to meet developers face to face and share stories about how things like Google App Engine, gadgets, GWT, Enterprise Search, and HTML 5 are impacting the industry's move to cloud computing. We were also pleased to announce &lt;a id="bqi4" href="http://www.youtube.com/watch?v=7ux-IexZFec" title="Google Apps Script"&gt;Google Apps Script,&lt;/a&gt; a new feature that allows customization and automation in Google Apps, starting with spreadsheets, and to see the positive &lt;a id="uc46" href="http://www.google.com/news/more?pz=1&amp;amp;cf=all&amp;amp;ncl=dqOCJgwhwJ6EOMMjza7AQJ7cydF6M" title="press coverage"&gt;press coverage&lt;/a&gt; it has received.&lt;br /&gt;&lt;br /&gt;The reality is that despite a formal "enterprise" track, the majority of the sessions were interesting and relevant to commercial developers, particularly &lt;a href="http://code.google.com/googleapps/" id="gc0q" title="Google Apps developers"&gt;Google Apps developers&lt;/a&gt;, who are rapidly uncovering a diverse set of &lt;a href="http://apps.gepportal.com/" id="a5ez" title="commercial opportunities"&gt;commercial opportunities&lt;/a&gt; using these developer tools.  This is something we want to continue to spread the word about!&lt;br /&gt;&lt;br /&gt;The Google I/O team is busy uploading content from the event to the Google I/O site, and today we're happy to share a few highlights from last week:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="l_5m" href="http://code.google.com/events/io/sessions/PracticalStandardsSecurityIdentityEnterprise.html" title="Practical Standards-based Security and Identity in the Enterprise"&gt;Practical Standards-based Security and Identity in the Enterprise&lt;/a&gt;:&lt;/i&gt; Eric Sachs gave an overview of how Google is incorporating today's open identity and authorization standards into both consumer applications as well as enterprise software. Eric demonstrated inter-service communication using OAuth: from extranet to intranet, from platform to platform, and even from Google App Engine to Google App Engine. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="m85t" href="http://code.google.com/events/io/sessions/GrowingSasServicesBusinessReselling.html" title="Growing a SaaS-based services business around Google Apps"&gt;Growing a SaaS-based services business around Google Apps&lt;/a&gt;&lt;/i&gt;: Jeff Ragusa of Google and Daniel Jefferies of &lt;a href="http://www.newmindgroup.com/index.php?id=1" id="s2tj" title="Newmind Group"&gt;Newmind Group&lt;/a&gt; gave a talk on how system integrators and developers can partner with Google to build a strong business reselling Google Apps and complementary services.  Jeff highlighted the the myriad opportunities that emerge when the money spent on licenses, maintenance and upgrades can instead be spent on solving specific business problems and building custom apps an gadgets. Daniel, a &lt;a href="http://google.com/apps/resellers/" id="db.a" title="Google Apps Authorized Reseller"&gt;Google Apps Authorized Reseller&lt;/a&gt;, talked about his experience bringing cloud computing to his customers.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a href="http://code.google.com/events/io/sessions/BuildingScalableComplexApps.html" title="Building Scalable, Complex Apps on App Engine"&gt;Building Scalable, Complex Apps on App Engine&lt;/a&gt;&lt;/i&gt;: Brett Slatkin gave an informative presentation on the advanced techniques and data structures developers can leverage to build complex apps with App Engine. Areas of discussion included list properties and merge-joins, and how developers can use these tools to maximize performance of their apps.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="f2eg" href="http://code.google.com/events/io/sessions/ConnectingCloudsIntergratingAppEngine.html" title="Salesforce, Appirio and ThoughtWorks on App Engine for Java"&gt;Salesforce, Appirio and ThoughtWorks on App Engine for Java&lt;/a&gt;&lt;/i&gt;: Ron Hess of &lt;a href="http://www.salesforce.com/" id="n4cz" title="Salesforce"&gt;Salesforce&lt;/a&gt; and Iein Valdez of &lt;a href="http://www.appirio.com" id="pkta" title="Appirio"&gt;Appirio&lt;/a&gt; presented &lt;i&gt;&lt;a href="http://code.google.com/events/io/sessions/ConnectingCloudsIntergratingAppEngine.html" id="ua1n" title="Connecting The Clouds"&gt;Connecting The Clouds&lt;/a&gt;: Integrating Google App Engine for Java with Force.com&lt;/i&gt;, and announced a new open source &lt;a href="http://code.google.com/p/sfdc-wsc/" id="a:-l" title="SOAP library"&gt;SOAP library&lt;/a&gt; for App Engine that helps connect App Engine apps to Force.com apps. Martin Fowler and Rebecca Parsons presented a session titled &lt;a href="http://code.google.com/events/io/sessions/ThoughtWorksAppEngineJava.html" id="yj3l" title="ThoughtWorks on App Engine for Java: An Enterprise Cumulonimbus?"&gt;ThoughtWorks on App Engine for Java: An Enterprise Cumulonimbus?&lt;/a&gt;, which provided an overview of App Engine and the move to cloud computing from the perspective of larger enterprises.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="i9s3" href="http://code.google.com/events/io/sessions/UsingGoogleSecureDataConnectorAccessFirewall.html" title="Using the Google Secure Data Connector to Access Behind-the-FIrewall Data from Google's Cloud"&gt;Using the Google Secure Data Connector to Access Behind-the-Firewall Data from Google's Cloud&lt;/a&gt;&lt;/i&gt;: In this session, Jun Yang of Google showed how enterprises can bring a behind-the-firewall relational database into Google Apps using the &lt;a id="z.b5" href="http://code.google.com/securedataconnector/" title="Google Secure Data Connector"&gt;Google Secure Data Connector&lt;/a&gt; and &lt;a id="tf13" href="http://code.google.com/p/google-feedserver/" title="Google Feed Server"&gt;Google Feed Server&lt;/a&gt;. Jun demonstrated how developers can do this without the need for special code to access the SQL data or complex firewall configuration.&lt;br /&gt;&lt;br /&gt;We hosted a mixer for enterprise developers and IT decision makers on the first day of I/O, and were thrilled at the turnout. The event was our first face to face outreach to commercial developers, covering all Enterprise product lines and touching on several recent developer announcements like &lt;a href="http://www.youtube.com/watch?v=7ux-IexZFec" id="c83i" title="Google Apps Script"&gt;Google Apps Script&lt;/a&gt; and the &lt;a id="xoce" href="http://www.google.com/apps/intl/en/business/resellers/index.html" title="Google Apps Reseller program"&gt;Google Apps Reseller program&lt;/a&gt;.   &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_EuCTzLdp3vE/Si1X1pflqKI/AAAAAAAACqc/oo6wtF0FmKQ/s1600-h/enterprise_blog.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_EuCTzLdp3vE/Si1X1pflqKI/AAAAAAAACqc/oo6wtF0FmKQ/s320/enterprise_blog.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345024911941675170" /&gt;&lt;/a&gt;&lt;i&gt;No, this is not people queuing up for free Android phones, just the line for the Enterprise Mixer.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;All told, a great two days thanks to all of you.  Since we're just getting started with tools and topics of interest to enterprise developers, please stay in touch.  We have more tools and APIs on the way.  The easiest way to do that is to subscribe to our &lt;a href="http://apps.gepportal.com/announcements" id="wq_g" title="Solution Provider announcements"&gt;Solution Provider announcements&lt;/a&gt;, and if you're tweeting, follow us on Twitter at &lt;a href="http://twitter.com/GoogleAtWork" id="v:j0" title="GoogleAtWork"&gt;GoogleAtWork&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Scott McMullan, Google Apps Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-4733716872293472439?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=cjmXV8wTJds:dCx_I86x0NA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=cjmXV8wTJds:dCx_I86x0NA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=cjmXV8wTJds:dCx_I86x0NA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/cjmXV8wTJds" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/4733716872293472439/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/google-io-reflections-on-enterprise.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/4733716872293472439?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/4733716872293472439?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/cjmXV8wTJds/google-io-reflections-on-enterprise.html" title="Google I/O: Reflections on the Enterprise Track" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_EuCTzLdp3vE/Si1X1pflqKI/AAAAAAAACqc/oo6wtF0FmKQ/s72-c/enterprise_blog.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/google-io-reflections-on-enterprise.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AHR3g_eSp7ImA9WxJXFEU.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-232067299695257052</id><published>2009-06-08T11:18:00.000-07:00</published><updated>2009-06-08T11:28:56.641-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-08T11:28:56.641-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Google Web Toolkit at Google I/O</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_EuCTzLdp3vE/Si1DZl_HbPI/AAAAAAAACqU/t9jS__yX0tQ/s1600-h/GWT.PNG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://1.bp.blogspot.com/_EuCTzLdp3vE/Si1DZl_HbPI/AAAAAAAACqU/t9jS__yX0tQ/s200/GWT.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5345002439731277042" /&gt;&lt;/a&gt;Another Google I/O has come and gone, and speaking personally I think it's going to be hard to top this year's &lt;a id="ql5c" href="http://code.google.com/events/io/" title="conference"&gt;conference&lt;/a&gt;. Free Android unlocked developer devices and the unveiling of a very cool new product built with developers in mind? I already don't envy the planning team taking on next year.&lt;br /&gt;&lt;br /&gt;There was a ton of Google Web Toolkit (GWT) related content this year, including an incredibly nice shout-out from Lars Rasmussen during the Google Wave keynote - if you haven't heard, Google Wave is built using GWT so if you want some inspiration as to what's possible, check out the &lt;a id="yd:o" href="http://code.google.com/events/io/" title="keynote"&gt;keynote&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The GWT-related &lt;a id="gy4t" href="http://code.google.com/events/io/sessions.html" title="sessions"&gt;sessions&lt;/a&gt; have now been posted, so if you missed one you'll be able to catch it here. Here's a quick overview of the many sessions:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="sha3" href="http://code.google.com/events/io/sessions/GwtPreviewGoogleWebToolkit2.html" title="GWT Can Do What? A Preview of Google Web Toolkit 2.0"&gt;GWT Can Do What? A Preview of Google Web Toolkit 2.0&lt;/a&gt;&lt;/i&gt;: Start thinking about how you will take advantage of new features like runAsyc in the next version of Google Web Toolkit. Bruce Johnson, Co-creator of GWT, goes into the details of what's coming and the philosophy behind the new features.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="jnzy" href="http://code.google.com/events/io/sessions/GoogleWavePoweredByGWT.html" title="Google Wave - Powered by GWT"&gt;Google Wave - Powered by GWT&lt;/a&gt;&lt;/i&gt;: This one's for the skeptics in your engineering department. As an adept JavaScript developer, Adam Schuck, Google Wave's Client Lead was initially skeptical about using Google Web Toolkit. Many lines of code later, he will openly tell you he's changed his mind about that. In this session, Adam discusses the Wave team's decision to use GWT and other facets of their client-side code. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="xc5w" href="http://code.google.com/events/io/sessions/GoogleWebToolkitBestPractices.html" title="Google Web Toolkit Architecture: Best Practices for Architecting your GWT App"&gt;Google Web Toolkit Architecture: Best Practices for Architecting your GWT App&lt;/a&gt;&lt;/i&gt;: A common question people ask is how to architect a GWT app. Ray Ryan discusses real-world learnings and patterns from the Google AdWords team and elsewhere which you can use in your apps. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="i7m." href="http://code.google.com/events/io/sessions/MeasureMillisecondsPerformanceTipsWebToolkit.html" title="Measure in Milliseconds: Performance Tips for Google Web Toolkit"&gt;Measure in Milliseconds: Performance Tips for Google Web Toolkit&lt;/a&gt;&lt;/i&gt;: Want some best practices for speeding up your app? Kelly Norton shares a few concrete issues and how to solve them.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="apvf" href="http://code.google.com/events/io/sessions/EffectiveGwt.html" title="Effective GWT: Developing a Complex, High- performance App with Google Web Toolkit"&gt;Effective GWT: Developing a Complex, High- performance App with Google Web Toolkit&lt;/a&gt;:&lt;/i&gt; Alex Moffat and Damon Lundin from Lombardi are back again for a second year at Google I/O. Similar in theme to Ray Ryan's talk above, but with additional perspective and content, they'll take you through how they've successfully architected Lombardi Blueprint. I recommend watching both if you are laying out a new GWT app, or refactoring an existing one. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="x6xh" href="http://code.google.com/events/io/sessions/StoryCompilerGwtCompiler.html" title="The Story of your Compile: Reading the Tea Leaves of the GWT Compiler for an Optimized Future"&gt;The Story of your Compile: Reading the Tea Leaves of the GWT Compiler for an Optimized Future&lt;/a&gt;&lt;/i&gt;: What if your app isn't as fast as you like it to be? While GWT tries to make your app as optimized as possible when you drive it off the lot, applications sometimes need to be tuned for racing by the developers themselves. Lex Spoon and Bruce Johnson talk about tools and techniques for understanding what's going on with your code and how to use that information to optimize your app. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="tees" href="http://code.google.com/events/io/sessions/ProgressivelyEnhanceAjaxApps.html" title="Progressively Enhance AJAX Applications with Google Web Toolkit and GQuery"&gt;Progressively Enhance AJAX Applications with Google Web Toolkit and GQuery&lt;/a&gt;&lt;/i&gt;: Ray Cromwell, from Timefire is one of my personal favorite speakers and commentators on GWT and web development. When he broke out his horse race demo in this session to measure performance deltas between different JS libraries, I knew why. Ray takes JQuery's power approach to manipulation and implements it in GWT. Learn about Ray's tool and how you can use this in your own projects to give designer's tools they can use directly in the HTML, without coding Java.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a id="sdt4" href="http://code.google.com/events/io/sessions/BuildingAppsGoogleAPIs.html" title="Building Applications with Google APIs"&gt;Building Applications with Google APIs&lt;/a&gt;&lt;/i&gt;: Did I mention Ray is an entertaining technical speaker? The title of this session, as Ray noted, doesn't do it justice. Related to GWT, this session outlines how he's used Google APIs and tools together to create an amazing integrated experience at Timefire. His demonstration of the interactive graph that syncs with the YouTube video is very compelling. Want to dispute Al Gore's claim of carbon emissions? Add your own dataset to the graph via a comment. Impressive.&lt;br /&gt;&lt;br /&gt;We had a great time meeting many of you at I/O. Many of us were on hand, and talked to a lot of 'familiar email addresses' - it's nice to make that familiar faces. For those of you who didn't make it to I/O or want to revisit the GWT sessions, we hope you enjoy the session videos and presentations!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Andrew Bowers, Google Web Toolkit Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-232067299695257052?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=7XDPCPeZajk:DSftMBOrFq8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=7XDPCPeZajk:DSftMBOrFq8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=7XDPCPeZajk:DSftMBOrFq8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/7XDPCPeZajk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/232067299695257052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/google-web-toolkit-at-google-io.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/232067299695257052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/232067299695257052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/7XDPCPeZajk/google-web-toolkit-at-google-io.html" title="Google Web Toolkit at Google I/O" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_EuCTzLdp3vE/Si1DZl_HbPI/AAAAAAAACqU/t9jS__yX0tQ/s72-c/GWT.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/google-web-toolkit-at-google-io.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UEQXc4fyp7ImA9WxJXEk4.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-517903599668331044</id><published>2009-06-05T15:00:00.000-07:00</published><updated>2009-06-05T15:00:00.937-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-05T15:00:00.937-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="sandbox" /><category scheme="http://www.blogger.com/atom/ns#" term="developer" /><category scheme="http://www.blogger.com/atom/ns#" term="Google I/O" /><title>The Developer Sandbox, now with Video Interviews!</title><content type="html">The &lt;a id="sz1q" href="http://code.google.com/events/io/sandbox.html" title="Developer Sandbox"&gt;Developer Sandbox&lt;/a&gt;&amp;nbsp;was a new addition to this year's &lt;a title="Google I/O" href="http://code.google.com/events/io" id="i484"&gt;Google I/O&lt;/a&gt;. The Sandbox featured a diverse range of developers and apps, all with one thing in common -- they've all built applications based on technologies and products featured at I/O. The Sandbox was very popular with attendees and saw a lot of foot traffic throughout both days of the event. Sandbox developers welcomed the opportunity to interact with fellow developers, discuss their products and answer questions.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_V9QJMrmy0es/Sil-AUH5WZI/AAAAAAAAABE/qHkbJXZcpTI/s1600-h/io_14.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_V9QJMrmy0es/Sil-AUH5WZI/AAAAAAAAABE/qHkbJXZcpTI/s320/io_14.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5343940976718731666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We interviewed these developers about their apps, the challenges they faced and the problems they solved, and finally their learnings &amp;amp; hopes for web technologies going forward. We also asked these developers to create screencast demos of their apps, much like the demos they gave to people visiting their station during I/O.&lt;br /&gt;&lt;br /&gt;These video interviews and demos are now available in the &lt;a title="Developer Sandbox" href="http://code.google.com/events/io/sandbox.html" id="z_lk"&gt;Developer Sandbox&lt;/a&gt; section of the &lt;a title="I/O website" href="http://code.google.com/events/io/" id="fegq"&gt;I/O website&lt;/a&gt;. Each developer has their own page with a brief description of their company, their app, and their interview video (if one was filmed) and screencast demo video (if available). For instance, here's a video interview with Gustav Soderstrom of Spotify, who walks us through a demo of their Android app and then talks about the platform and why Spotify chose to develop their app on Android.&lt;br /&gt;&lt;br /&gt;&lt;object width="630" height="374"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Z5whfaLH1-E&amp;amp;hl=en&amp;amp;fs=1&amp;amp;cc_load_policy=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Z5whfaLH1-E&amp;amp;hl=en&amp;amp;fs=1&amp;amp;cc_load_policy=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="630" height="374"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Are you building an app on one of Google's platforms or using Google APIs? Please send us a video about your company and your app and you could be featured on Google Code Videos. &lt;a title="Click here" href="http://code.google.com/videos/submit.html" id="q2.q"&gt;Click here&lt;/a&gt; for the submission form and guidelines.&lt;br /&gt;&lt;br /&gt;Each Sandbox developer page also features a &lt;a title="Friend Connect" href="http://code.google.com/apis/friendconnect/" id="ygin"&gt;Friend Connect&lt;/a&gt; gadget that allows anyone visiting the page to sign in with their Friend Connect id and leave comments &amp;amp; feedback. It's a great way to continue the conversation or to ask questions if you did not get a chance to meet them at I/O.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Neel Kshetramade, Google Developer Programs&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-517903599668331044?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=yHHX2rYm0D8:9vHzmgp1juQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=yHHX2rYm0D8:9vHzmgp1juQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=yHHX2rYm0D8:9vHzmgp1juQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/yHHX2rYm0D8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/517903599668331044/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/developer-sandbox-now-with-video.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/517903599668331044?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/517903599668331044?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/yHHX2rYm0D8/developer-sandbox-now-with-video.html" title="The Developer Sandbox, now with Video Interviews!" /><author><name>Neel Kshetramade</name><uri>http://www.blogger.com/profile/01823824960774657238</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07303384689839753712" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_V9QJMrmy0es/Sil-AUH5WZI/AAAAAAAAABE/qHkbJXZcpTI/s72-c/io_14.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/developer-sandbox-now-with-video.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMDQnk4cSp7ImA9WxJXFks.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-7840306516502501375</id><published>2009-06-05T13:00:00.000-07:00</published><updated>2009-06-10T12:34:33.739-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T12:34:33.739-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="google io" /><title>Tech Talk Videos from Google I/O</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_EuCTzLdp3vE/Silgj157D8I/AAAAAAAACqM/s8YoPHSyPPo/s1600-h/io.JPG"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 200px; height: 104px;" src="http://2.bp.blogspot.com/_EuCTzLdp3vE/Silgj157D8I/AAAAAAAACqM/s8YoPHSyPPo/s200/io.JPG" alt="" id="BLOGGER_PHOTO_ID_5343908601733517250" border="0" /&gt;&lt;/a&gt;This year's &lt;a id="xoeq" href="http://code.google.com/events/io/sessions.html" title="Tech Talk sessions"&gt;Tech Talk sessions&lt;/a&gt; at Google I/O cast light on a few key ingredients necessary for developing great software and applications, including faster methods and techniques, a re-envisioning of how to do things better, down to a robust architecture that is designed to scale and sustain. At the same time, developers themselves need to successfully manage the growth of new ideas in a collaborative environment, while remembering to put the user and customer first.&lt;br /&gt;&lt;br /&gt;Kicking off Tech Talks at Google I/O   this year, Steve Souders challenged developers to &lt;a href="http://code.google.com/events/io/sessions/EvenFasterWebsites.html" id="tv4g" title="build faster, high-performing websites"&gt;build faster, high-performing websites&lt;/a&gt; and presented a few best practices and tactics to these ends. Dhanji Prasanna and Jesse Wilson &lt;a href="http://code.google.com/events/io/sessions/BigModularJavaGuice.html" id="f3q4" title="revealed the fast, lightweight Guice framework"&gt;revealed the fast, lightweight Guice framework&lt;/a&gt; and how it is used at Google to power some of the largest and most complex applications in the world. Dion Almaer and Ben Galbraith walked the audience through the Bespin project at Mozilla Labs in their &lt;a href="http://code.google.com/events/io/sessions/BespinOpenWeb.html" id="n_2-" title="session"&gt;session&lt;/a&gt;, expanding on the project's core motivation to re-envision how we develop software and to provide pointers on what it takes to build bleeding edge applications for today's browsers. Jacob Lee &lt;a href="http://code.google.com/events/io/sessions/MercurialBigTable.html" id="cd-o" title="unveiled the architecture"&gt;unveiled the architecture&lt;/a&gt; behind &lt;a href="http://google-code-updates.blogspot.com/2009/04/mercurial-support-for-project-hosting.html" id="i__w" title="Mercurial on BigTable"&gt;Mercurial on BigTable&lt;/a&gt;, a new version-control component of &lt;a href="http://code.google.com/hosting/" id="ukor" title="Project Hosting on Google Code"&gt;Project Hosting on Google Code&lt;/a&gt; that was built to host hundreds of thousands of open source projects.&lt;br /&gt;&lt;br /&gt;Brian Fitzpatrick and Ben Collins-Sussman ran a duet of talks that turned the focus from the tools to the developer. First, they discussed the &lt;a href="http://code.google.com/events/io/sessions/MythGeniusProgrammer.html" id="kzqn" title="myth"&gt;myth&lt;/a&gt; of the "genius programmer" in the social dynamics of collaborative software development. In a subsequent &lt;a href="http://code.google.com/events/io/sessions/DoYouBelieveUsers.html" id="qaco" title="session"&gt;session&lt;/a&gt;, they talked about the lost art of putting the user first and "selling" the software in an exciting and honest manner through usability and uncomplicated design. Keeping with the focus on developers and what motivates developers to action, we invited Brady Forrest to run an &lt;a href="http://code.google.com/events/io/sessions/IgniteGoogleIO.html" id="xxhs" title="Ignite session at Google I/O"&gt;Ignite session at Google I/O&lt;/a&gt;, featuring &lt;a href="http://radar.oreilly.com/2009/05/ignite-google-io-line-up-5-pas.html" id="iwqz" title="nine speakers"&gt;nine speakers&lt;/a&gt; with deeply interesting perspectives on technology. Topics ranged from growing up a geek, big data and open source, and the law of gravity for scaling, to life as a developer at the frontlines with a humanitarian agency.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/dnsf/sets/72157618811777695/detail/"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 162px;" src="http://2.bp.blogspot.com/_EuCTzLdp3vE/SjAKOxD4TCI/AAAAAAAACrs/E_OmefljEYU/s200/io_sketch.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345784006492834850" /&gt;&lt;/a&gt;&lt;b&gt;Update:&lt;/b&gt; David actually used a brush, not a pen. We thought adding a thumbnail of his work would help him forgive our mistake :) &lt;br /&gt;&lt;br /&gt;We also wanted to share one of our favorite tidbits from Google I/O -- a series of ink on paper portraits by David Newman, an ex-courtroom sketch artist (now enthusiastic technologist!). David put his brush to paper at the conference floor and drew wonderful sketches of a few of the folks at I/O - we're delighted to share a few of his &lt;a href="http://www.flickr.com/photos/dnsf/sets/72157618811777695/detail/" id="aqg:" title="portrait sketches on Flickr"&gt;portrait sketches&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We hope you enjoy this year's interesting combination of perspectives at the Google I/O Tech Talks series, &lt;a href="http://code.google.com/events/io/sessions.html" id="ctm7" title="now available"&gt;now available&lt;/a&gt; online. Watch the blog &lt;a href="http://google-code-updates.blogspot.com/2009/06/post-google-io-2009.html" id="g.3g" title="next week"&gt;next week&lt;/a&gt; as we bring live more videos and presentations from the breakout session tracks at Google I/O!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Min Li Chan, Google Developer Products&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-7840306516502501375?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=zqjWqqZ3LSw:sLvfE6LLyoE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=zqjWqqZ3LSw:sLvfE6LLyoE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=zqjWqqZ3LSw:sLvfE6LLyoE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/zqjWqqZ3LSw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/7840306516502501375/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/tech-talk-videos-from-google-io.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/7840306516502501375?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/7840306516502501375?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/zqjWqqZ3LSw/tech-talk-videos-from-google-io.html" title="Tech Talk Videos from Google I/O" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_EuCTzLdp3vE/Silgj157D8I/AAAAAAAACqM/s8YoPHSyPPo/s72-c/io.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/tech-talk-videos-from-google-io.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cDRng6eCp7ImA9WxJXEUk.&quot;"><id>tag:blogger.com,1999:blog-11300808.post-6551520887838905455</id><published>2009-06-04T13:57:00.000-07:00</published><updated>2009-06-04T13:57:57.610-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-04T13:57:57.610-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web performance" /><title>Introducing Page Speed</title><content type="html">At Google, we focus constantly on speed; we believe that making our websites load and display faster improves the user's experience and helps them become more productive. Today, we want to share with the web community some of the best practices we've used and developed over the years, by open-sourcing &lt;a href="http://code.google.com/speed/page-speed/" id="y9db" title="Page Speed"&gt;Page Speed&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Page Speed is a tool we've been using internally to improve the performance of our web pages -- it's a Firefox Add-on integrated with &lt;a id="xkhy" href="http://www.getfirebug.com/" title="Firebug"&gt;Firebug&lt;/a&gt;. When you run Page Speed, you get immediate suggestions on how you can change your web pages to improve their speed. For example, Page Speed automatically optimizes images for you, giving you a compressed image that you can use immediately on your web site.  It also identifies issues such as JavaScript and CSS loaded by your page that wasn't actually used to display the page, which can help reduce time your users spend waiting for the page to download and display.&lt;br /&gt;&lt;br /&gt;Page Speed's suggestions are based on a set of commonly accepted &lt;u&gt;&lt;a href="http://code.google.com/speed/page-speed/docs/rules_intro.html" id="q7eg" title="best practices"&gt;best practices&lt;/a&gt;&lt;/u&gt; that we and other websites implement. To help you understand the suggestions and rules, we have created detailed &lt;u&gt;&lt;a href="http://code.google.com/speed/page-speed/docs/using.html" id="rne7" title="documentation"&gt;documentation&lt;/a&gt;&lt;/u&gt; to describe the rationale behind each of the rules. We look forward to your feedback on the &lt;a id="jvan" href="http://www.google.com/support/forum/p/Webmasters/" title="Webmaster Help Forum"&gt;Webmaster Help Forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We hope you give Page Speed a try. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Richard Rabbat and Bryan McQuade, Page Speed Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11300808-6551520887838905455?l=googlecode.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=m_twDLYopgw:dCwoU6RoBCg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/Dcni?a=m_twDLYopgw:dCwoU6RoBCg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/Dcni?i=m_twDLYopgw:dCwoU6RoBCg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Dcni/~4/m_twDLYopgw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://googlecode.blogspot.com/feeds/6551520887838905455/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://googlecode.blogspot.com/2009/06/introducing-page-speed.html#comment-form" title="38 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/6551520887838905455?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11300808/posts/default/6551520887838905455?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/Dcni/~3/m_twDLYopgw/introducing-page-speed.html" title="Introducing Page Speed" /><author><name>A Googler</name><uri>http://www.blogger.com/profile/09046869427384152063</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04643631162663437722" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">38</thr:total><feedburner:origLink>http://googlecode.blogspot.com/2009/06/introducing-page-speed.html</feedburner:origLink></entry></feed>
