CINXE.COM
Google App Engine Blog: Highlights from our Google I/O Presentations
<!DOCTYPE html> <html xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/55013136-widget_css_bundle.css' rel='stylesheet' type='text/css'/> <link href='http://googlecloudplatform.blogspot.com' rel='canonical'/> <meta content='The official Google App Engine blog. The latest news on Google App Engine and the App Engine community.' name='description'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='http://googleappengine.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Google App Engine Blog - Atom" href="http://googleappengine.blogspot.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Google App Engine Blog - RSS" href="http://googleappengine.blogspot.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Google App Engine Blog - Atom" href="https://www.blogger.com/feeds/8501956666581132164/posts/default" /> <link rel="alternate" type="application/atom+xml" title="Google App Engine Blog - Atom" href="http://googleappengine.blogspot.com/feeds/2734497258099508127/comments/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html' property='og:url'/> <meta content='Highlights from our Google I/O Presentations' property='og:title'/> <meta content='Now that things have settled down from last month鈥檚 Google I/O, we thought it would be a good time to highlight some of the technical talks ...' property='og:description'/> <title>Google App Engine Blog: Highlights from our Google I/O Presentations</title> <link href='http://www.google.com/uds/solutions/partnerbar/gfpartnerbar.css' rel='stylesheet' type='text/css'/> <style id='page-skin-1' type='text/css'><!-- /* ----------------------------------------------- Blogger Template Style Name: Minima Designer: Douglas Bowman URL: www.stopdesign.com Date: 26 Feb 2004 Updated by: Blogger Team ----------------------------------------------- */ /* Variable definitions ==================== <Variable name="bgcolor" description="Page Background Color" type="color" default="#fff"> <Variable name="textcolor" description="Text Color" type="color" default="#333"> <Variable name="linkcolor" description="Link Color" type="color" default="#58a"> <Variable name="pagetitlecolor" description="Blog Title Color" type="color" default="#666"> <Variable name="pagesubtitlecolor" description="Blog Sub Title Color" type="color" default="#929292"> <Variable name="descriptioncolor" description="Blog Description Color" type="color" default="#666666"> <Variable name="titlecolor" description="Post Title Color" type="color" default="#666666"> <Variable name="bordercolor" description="Border Color" type="color" default="#ccc"> <Variable name="sidebarcolor" description="Sidebar Title Color" type="color" default="#666666"> <Variable name="sidebartextcolor" description="Sidebar Text Color" type="color" default="#666"> <Variable name="visitedlinkcolor" description="Visited Link Color" type="color" default="#999"> <Variable name="bodyfont" description="Text Font" type="font" default="normal normal 100% Arial, sans-serif"> <Variable name="headerfont" description="Sidebar Title Font" type="font" default="normal normal 95% Arial, sans-serif"> <Variable name="pagetitlefont" description="Blog Title Font" type="font" default="normal normal 200% Arial, sans-serif"> <Variable name="pagesubtitlefont" description="Blog Sub Title Font" type="font" default="normal normal 50% Arial, sans-serif"> <Variable name="descriptionfont" description="Blog Description Font" type="font" default="normal bold 150% Arial, sans-serif"> <Variable name="postfooterfont" description="Post Footer Font" type="font" default="normal normal 78% Arial, sans-serif"> */ /* Use this with templates/template-twocol.html */ body { background:#ffffff; margin:0; color:#333333; font-size/* */:/**/small; font-size: /**/small; text-align: center; } a img { border-width:0; } /* Header ----------------------------------------------- */ #scratchpad-container { margin-bottom: 10px; border-bottom: 2px dotted #676767; display: none; } #searchcontrol { width : 218px; } #searchResults { margin-right: 25px; } #searchResults .gsc-control { width : 100%; } #searchResults .gsc-resultsbox-visible { border-bottom : 1px solid #e9e9e9; margin-bottom : 10px; } #header-wrapper { margin:0 auto 15px; } #header { margin: 5px; color:#666666; } #logo { background-image:url('http://photos1.blogger.com/x/blogger2/1999/969950576445500/1600/z/458950/gse_multipart19246.jpg'); background-repeat:no-repeat; padding-left:240px; padding-top:45px; height:90px; } #logo h1 { color:#929292; padding:0px; margin:0px; font: Arial Narrow, Helvetica, sans-serif; font-size:26px; line-spacing:.1em } #logo h2 { color:#929292; padding:0px; margin:0px; font: Arial Narrow, Helvetica, sans-serif; font-size:15px; font-weight:bold; letter-spacing: -.01em } #header h1 { margin:5px 5px 0; padding:15px 20px .25em; line-height:1.2em; text-transform:uppercase; letter-spacing:.2em; } #header .description { margin:0; padding:15px 0; max-width:700px; font: normal bold 150% Arial, sans-serif; color: #666666; } #header a { color:#666666; text-decoration:none; } #header a:hover { color:#666666; } /* Outer-Wrapper ----------------------------------------------- */ #outer-wrapper { margin:10px 0px 0px 10px; text-align:left; font: normal normal 100% Arial, sans-serif; width:740px; } #main-wrapper { padding-right: 10px margin:0 10px 5px; width:500px; float: left; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } #sidebar-wrapper { border-left: 1px solid #CCCCCC; margin-left:5px; padding-left:5px; width: 220px; float:right; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } #countdown {font-size: 14pt; font-color: black;} /* Headings ----------------------------------------------- */ h2 { margin:1.5em 0 .75em; font:$ erfont; color:#666666; } /* Posts ----------------------------------------------- */ h2.date-header { margin:0; } h2.post-author { margin:0 0 1em; } .post { margin:.5em 0 1.5em 0; border-bottom:1px dotted #cccccc; padding-bottom:1.5em; padding-right:1.5em; } .post h3 { margin:.25em 0 0 0; padding:0 0 0; font-size:140%; font-weight:normal; line-height:1.4em; color:#666666; } .post h3 a, .post h3 a:visited, .post h3 strong { display:block; text-decoration:none; color:#666666; font-weight:normal; } .post h3 strong, .post h3 a:hover { color:#333333; } .post p { margin:0 0 .75em; line-height:1.6em; } .post-footer { margin: .75em 0; color:#666666; letter-spacing:.1em; font: normal normal 78% Arial, sans-serif; line-height: 1.4em; } .comment-link { margin-left:.6em; } .post img { padding:4px; border:1px solid #cccccc; } .post blockquote { margin:1em 20px; } .post blockquote p { margin:.75em 0; } /* Comments ----------------------------------------------- */ #comments h4 { margin:.25em 0 .5em 0; padding:0 0 4px; font-size:160%; font-weight:normal; line-height:1.4em; color:#666666; } #comments-block { margin:1em 0 1.5em; line-height:1.6em; } #comments-block .comment-author { margin:.5em 0; } #comments-block .comment-body { margin:.25em 1em 0; padding-right:2em; } #comments-block .comment-footer { margin:-.25em 0 2em; } #comments-block .comment-body p { margin:0 0 .75em; padding-right:2em; margin-right:10px; } .deleted-comment { font-style:italic; color:gray; } #blog-pager-newer-link { float: left; } #blog-pager-older-link { float: right; } #blog-pager { text-align: center; padding-right:2em; } .feed-links { clear: both; line-height: 2.5em; } .disclaimer { padding-right: 2em; } /* Sidebar Content ----------------------------------------------- */ .sidebar { color: #666666; line-height: 1.5em; } .sidebar h2 { margin:.25em 0 .5em 0; padding:0 0 4px; font: Arial, Helvetica, sans-serif; font-size:115%; font-weight:bold; } .sidebar ul { list-style:none; margin:0 0 0; padding:0 0 0; } .sidebar li { margin:0; padding:0 0 .25em 15px; text-indent:-15px; line-height:1.5em; } div.subscribe a { text-decoration: none; color: #da5800; } div.subscribe a img { border: 0; vertical-align: middle; } div.subscribe a .text { text-decoration: underline; } .sidebar .widget, .main .widget { border-bottom:1px dotted #cccccc; margin:0 0 1.5em; padding:0 0 1.5em; } .main .Blog { border-bottom-width: 0; margin-left: 5px; } .smalllink { font-size:75%; color:#666666; } /* Profile ----------------------------------------------- */ .profile-img { float: left; margin: 0 5px 5px 0; padding: 4px; border: 1px solid #cccccc; } .profile-data { margin:0; text-transform:uppercase; letter-spacing:.1em; font: normal normal 78% Arial, sans-serif; color: #666666; font-weight: bold; line-height: 1.6em; } .profile-datablock { margin:.5em 0 .5em; } .profile-textblock { margin: 0.5em 0; line-height: 1.6em; } .profile-link { font: normal normal 78% Arial, sans-serif; text-transform: uppercase; letter-spacing: .1em; } /* Footer ----------------------------------------------- */ #footer { width:800px; clear:both; margin:0 auto; padding-top:15px; text-align: left; } */ /* Partner Bar ----------------------------------------------- */ #partnerBar .pb-root { font-weight: normal; line-height: 1.25em; width : 100%; } #partnerBar .pb-root a { text-decoration : none; } #partnerBar .pb-root a:hover { text-decoration : underline; } /* logo-title rules */ #partnerBar .pb-root a:visited .pb-logo-title, #partnerBar .pb-root a:hover .pb-logo-title, #partnerBar .pb-root a .pb-logo-title { color : #666666; text-decoration : none; } #partnerBar .pb-root a:hover .pb-logo-title { color : #666666; text-decoration : underline; } #partnerBar .pb-root a:visited .pb-logo-title { color : #666666; } /* logo-subtitle rules */ #partnerBar .pb-root a:visited .pb-logo-subtitle, #partnerBar .pb-root a .pb-logo-subtitle { color : #666666; text-decoration : none; } #partnerBar .pb-root a:hover .pb-logo-subtitle { color : #5588aa; } #partnerBar h3.pb-header { font-size : 16px; font-weight : bold; color : #666666; padding : 4px 18px 8px 8px; margin : 12px 0px 8px 0px; } #partnerBar .pb-logo-subtitle { font-size: 11px; font-weight: normal; margin-bottom : 6px; line-height : 1.25em; height : 1.25em; overflow : hidden; } #partnerBar h4 { font-size: 12px; margin : 0px 0px 0px 0px; } #partnerBar h5 { margin : 0px 0px 0px 0px; } #partnerBar h4.pb-partner-logo, #partnerBar div.pb-partner-logo { text-decoration : none; text-transform : none; font-weight: bold; letter-spacing: 0pt; line-height: 1.4em; text-align: left; word-spacing: normal; } #partnerBar .pb-partner-cell { border-top : 1px solid #f9f9f9; border-right : 1px solid #f9f9f9; border-left : 1px solid #f9f9f9; border-bottom : 1px solid #f9f9f9; width : 200px; padding : 4px 10px 4px 10px; margin : 4px 8px 4px 8px; } #partnerBar div.pb-title { line-height : 1.25em; height : 1.25em; overflow : hidden; } #partnerBar li.pb-entry { margin-bottom : 4px; } #partnerBar .pb-root ul { margin-top : 2px; } #partnerBar .pb-root li { background-image : url("http://www.google.com/uds/solutions/partnerbar/skins/bullet.gif"); background-position : 0pt .45em; background-repeat : no-repeat; font-size : 90%; line-height : 1.2em; padding : 0px 0px 0px 8px; } /*pre /code format */ pre { font-size: 9pt; background-color: #fafafa; border: 1px solid #bbbbbb; line-height: 125%; margin-top: 1em 0 0 0; padding: 0.99em; overflow-x: auto; overflow-y: auto; } code, pre { font-family: monospace; font-size: 1.2em; color: #007000; } --></style> <link href='http://www2.blogger.com/widgets/3319451950-blogarchive.css' rel='stylesheet' type='text/css'/><link href='http://www2.blogger.com/widgets/2791266615-blog.css' rel='stylesheet' type='text/css'/><!-- --><style type='text/css'>@import url('http://www2.blogger.com/css/blog_controls.css'); @import url('http://www2.blogger.com/dyn-css/authorization.css?blogID=15045980'); </style> <!-- jcooper: We load two scripts here. The first is the /jsapi script. This is also known as the "common loader". You guys used to load /api?file=uds.js This is still a valid way to load the search API, BUT by cutting over to the common loader, we now have a simpler and common way to load the search and feed api via google.load(). The other thing I've done here is switch to an internal-googleblogs key. This is nice for me because in our dashboards, we have a single pane for internal usage filtered by internal*. Wherever possible we like to use internal- keys for Google API usage. The second script is the partner bar. --> <script src='http://www.google.com/jsapi?key=internal-googleblogs' type='text/javascript'></script> <script SRC='http://www.google.com/uds/solutions/partnerbar/gfpartnerbar.js' TYPE='text/javascript'></script> <!-- jcooper: This block of script starts by loading the search api and the feed api. You used to load the search api through a script tag, but I have switched you over to the common loader (/jsapi) and as a result, we use google.load() to load the search api, and since the partnerbar requires the feed api, I also use google.load() to load the feed API. All of the comments in this block are plain old comments without a jcooper: marker. Read them all. --> <script language='Javascript' type='text/javascript'> //<![CDATA[ // Load Search and Feed APIs google.load("search", "1"); google.load("feeds", "1"); // This function is called once the page has loaded // the first part of this function is identical to // the old code. It just loads a search control into // the sidebar function OnLoad() { var controlRoot = document.getElementById("searchResults"); // Create a search control var searchControl = new GSearchControl(); searchControl.setLinkTarget(GSearch.LINK_TARGET_SELF); searchControl.setResultSetSize(GSearch.LARGE_RESULTSET); // Tell the searcher to draw itself and tell it where to attach var searchFormElement = document.getElementById("searchcontrol"); var drawOptions = new GdrawOptions(); drawOptions.setSearchFormRoot(searchFormElement); drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED); // This Blog var searcher = new GwebSearch(); searcher.setSiteRestriction("http://googleappengine.blogspot.com/"); searcher.setUserDefinedLabel("This Blog"); searchControl.addSearcher(searcher); // Official Google Blogs var searcher = new GwebSearch(); searcher.setSiteRestriction("010222979794876194725:abdomvzqczg"); searcher.setUserDefinedLabel("Google Blogs"); searchControl.addSearcher(searcher); // the web searcher = new GwebSearch(); searchControl.addSearcher(searcher); // all blogs searcher = new GblogSearch(); searchControl.addSearcher(searcher); // news searcher = new GnewsSearch(); searchControl.addSearcher(searcher); // draw it searchControl.draw(controlRoot, drawOptions); // Now, Load the Partnerbar. First thing we do is set up // the options. // - open links in the current window // - generate semantic markup (ul, li, hN markup) // - headerTitle is the optional section title for the partnerbar // - numEntries : 3 means 3 articles per blog are shown in each cell // - randomSelectionCounte : 9 says to pick 9 blogs from the array of all blogs // - autoRefresh : true says to re-select a different set of 9 every few seconds // read all about it: http://www.google.com/uds/solutions/partnerbar/index.html // // - the first argument "partnerBar" matches the id of a DIV element just above the page's footer. // - the second argument sampleGoogleBlogs is an array of blog descripters that we select from // each blog descriptor contains title, subtitle, the blog's feed url, and the blog's url // - the third argument is the options var options = { linkTarget : google.feeds.LINK_TARGET_SELF, semanticMarkup : true, headerTitle : "From our Google Blogs", numEntries : 3, randomSelectionCount : 9, // jcooper: take out the leading X to enable random selection autoRefresh : true, // jcooper: take out the leading X to enable auto refresh cycleTime : 30000 } new PartnerBar("partnerBar", googleBlogs, options); } var scratchpad_loaded = false; function toggleScratchPad() { var container = document.getElementById("scratchpad-container"); var link = document.getElementById("scratchpad-link"); if (container.style.display != "block") { if (!scratchpad_loaded) { container.innerHTML = [ '<div style="text-align:right;">[<a onclick="toggleScratchPad();" href="javascript:void(0);">close</a>]</div>', '<iframe style="width:100%; height:435px;" frameborder="0" scrolling="no" src="http://gmodules.com/ig/ifr?url=scratchpad.xml&synd=open&output=html"></iframe>' ].join(""); scratchpad_loaded = true; } container.style.display = "block"; } else { container.style.display = "none"; } } // This function call schedules OnLoad() to be called as soon as the page finishes loading // Note, your template used to have a script block that called OnLoad() directly. Remove // that script block. It is wrong and will cause some number of errors google.setOnLoadCallback(OnLoad, true); //]]> </script> <!-- This loads the list of googleBlogs --> <script SRC='http://www.google.com/uds/solutions/partnerbar/google-blogs.js' TYPE='text/javascript'></script> <script type='text/javascript'> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-1870203-42']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=8501956666581132164&zx=76b970ed-d590-45ff-a397-54c02dbb2982' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=8501956666581132164&zx=76b970ed-d590-45ff-a397-54c02dbb2982' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body> <div class='navbar section' id='navbar'><div class='widget Navbar' data-version='1' id='Navbar1'><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar.g?targetBlogID\x3d8501956666581132164\x26blogName\x3dGoogle+App+Engine+Blog\x26publishMode\x3dPUBLISH_MODE_BLOGSPOT\x26navbarType\x3dLIGHT\x26layoutType\x3dLAYOUTS\x26searchRoot\x3dhttps://googleappengine.blogspot.com/search\x26blogLocale\x3den\x26v\x3d2\x26homepageUrl\x3dhttp://googleappengine.blogspot.com/\x26targetPostID\x3d2734497258099508127\x26blogPostOrPageUrl\x3dhttp://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html\x26vt\x3d5071043787687635571', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe", messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER, messageHandlers: { 'blogger-ping': function() {} } }); } }); </script><script type="text/javascript"> (function() { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(script); }})(); </script> </div></div> <center> <div id='outer-wrapper'><div id='wrap2'> <!-- skip links for text browsers --> <span id='skiplinks' style='display:none;'> <a href='#main'>skip to main </a> | <a href='#sidebar'>skip to sidebar</a> </span> <div class='header-wrapper'> <div id='logo' onClick='window.location="http://googleappengine.blogspot.com/";' style='cursor:pointer;'><h1>Google App Engine Blog</h1><h2>News, notes, tips and tricks from the Google App Engine Team</h2></div></div> <div id='main-wrapper'> <div id='searchResults'></div> <div class='header no-items section' id='header'> </div> </div> <div id='content-wrapper'> <div id='scratchpad-container'></div> <div id='main-wrapper'> <div id='searchResults'></div> <div class='main section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='blog-posts hfeed'> <!--Can't find substitution for tag [defaultAdStart]--> <div class="date-outer"> <h2 class='date-header'><span>Wednesday, June 22, 2011</span></h2> <div class="date-posts"> <div class='post-outer'> <div class='post hentry'> <a name='2734497258099508127'></a> <h3 class='post-title entry-title'> <a href='http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html'>Highlights from our Google I/O Presentations</a> </h3> <div class='post-header-line-1'></div> <div class='post-body entry-content'> <p>Now that things have settled down from last month’s Google I/O, we thought it would be a good time to highlight some of the technical talks given by the App Engine team. At this year’s I/O, we emphasized some of the big themes we’ve been focusing on this past year: availability and productionization of our platform, removing limits while maintaining performance at scale, and developing new APIs.</p> <h3>Availability and Productionization of our Platform</h3> <p>Since App Engine automatically handles all of the sharding and distribution of your application across datacenters, we thought it would be important to talk about the strategies we use to run and maintain our platform. These talks also give you an opportunity to meet some of the engineers who carry pagers so you don’t have to.</p> <ul> <li><a href="http://www.google.com/events/io/2011/sessions/more-9s-please-under-the-covers-of-the-high-replication-datastore.html">More 9s Please: Under the Covers of the High Replication Datastore</a> - We were excited to announce the HR Datastore in January, since it provides a high level of availability, even during unplanned outages, and even if an entire datacenter goes offline. HRD uses the paxos algorithm to distribute data across multiple datacenters. Alfred Fuller and Matt Wilder talk about the high level distribution strategy used and how this helps keep your app serving.</li> <li><a href="http://www.google.com/events/io/2011/sessions/life-in-app-engine-production.html">Life in App Engine Production</a> - Let’s face it - everyone has some great war stories about running live applications. And the stories of Google’s <a href="http://www.google.com/intl/ln/jobs/uslocations/mountain-view/engops/sre/index.html">SRE team</a> probably rank with the best of them. Michael Handler and Alan Green talk about what goes right and what can go wrong running in Production.</li> </ul> <h3>Removing Limits while maintaining performance at scale</h3> <p>How can you design your application so you can transition from serving 1 user to 1 million users with the minimum amount of work? How do you make sure your user experience stays consistent for those users?</p> <ul> <li><a href="http://www.google.com/events/io/2011/sessions/app-engine-backends.html">App Engine Backends</a> - At I/O this year we launched App Engine Backends, which allow you to write long running processes on App Engine. Crunch numbers, process data, and build large in-memory models! Justin Haugh and Greg Darke give an overview of this new feature and cover best practices.</li> <li><a href="http://www.google.com/events/io/2011/sessions/scaling-app-engine-applications.html">Scaling App Engine Applications</a> - We always get lots of question on what it means and how it works to scale an app using App Engine (hint: low latency is the key!). Guido van Rossum and Justin Haugh explain how instances work and cover best practices for scaling your application.</li> </ul> <h3>Developing New APIs</h3> <ul> <li><a href="http://www.google.com/events/io/2011/sessions/full-text-search.html">Full Text Search</a> - It took 8 days after App Engine’s initial launch for this feature request to be filed - and now work on the Full Text Search API is nearing completion. Bo Majewski and Ged Ellis give a preview of the upcoming App Engine Full Text Search API.</li> <li><a href="http://www.google.com/events/io/2011/sessions/app-engine-mapreduce.html">App Engine MapReduce</a>- So you just want to analyze 5TB of data? You’ll probably need MapReduce to do so! Mike Aizatsky talks about the progress being made on the App Engine MapReduce framework and how you can use it to generate reports for your data.</li> <li><a href="http://www.google.com/events/io/2011/sessions/large-scale-data-analysis-using-the-app-engine-pipeline-api.html">Large-scale Data Analysis using the App Engine Pipeline API</a> - Once you’ve written one MapReduce, you’ll probably want to write more, and then you’ll need a way to manage your application’s analysis pipeline. In this talk, Brett Slatkin discusses a lightweight API for managing MapReduce workflows.</li> </ul> <p>Our team always enjoys participating in Google I/O because our engineers get to share their vision and discuss their work with a large audience. If you are interested in what some of our customers had to say at I/O, check out the <a href="http://googleenterprise.blogspot.com/2011/06/businesses-innovate-and-scale-faster-on.html">Google Enterprise Blog</a>. Of course, with App Engine featured in 23 talks for Google I/O, we couldn’t cover them all here. See the <a href="http://www.google.com/events/io/2011/sessions.html">complete session</a> list for I/O and discover all the talks on App Engine and more!</p> <span class="byline-author">Posted by The App Engine Team</span> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'><span class='post-timestamp'> at <a class='timestamp-link' href='http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html' rel='bookmark' title='permanent link'><abbr class='published' title='2011-06-22T09:52:00-07:00'>9:52 AM</abbr></a> </span> <span class='post-icons'> <span class='item-action'> <a href='https://www.blogger.com/email-post.g?blogID=8501956666581132164&postID=2734497258099508127' title='Email Post'> <img alt='' class='icon-action' src='http://www.blogger.com/img/icon18_email.gif'/> </a> </span> <span class='item-control blog-admin pid-1423863407'> <a href='https://www.blogger.com/post-edit.g?blogID=8501956666581132164&postID=2734497258099508127&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <span class='post-backlinks post-comment-link'> </span> </div> <div class='post-footer-line post-footer-line-2'><span class='post-labels'> </span> </div> <div class='post-footer-line post-footer-line-3'></div><br/> <p><div class='post-share-buttons'> <a class='goog-inline-block share-button sb-email' href='https://www.blogger.com/share-post.g?blogID=8501956666581132164&postID=2734497258099508127&target=email' target='_blank' title='Email This'><span class='share-button-link-text'>Email This</span></a><a class='goog-inline-block share-button sb-blog' href='https://www.blogger.com/share-post.g?blogID=8501956666581132164&postID=2734497258099508127&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='BlogThis!'><span class='share-button-link-text'>BlogThis!</span></a><a class='goog-inline-block share-button sb-twitter' href='https://www.blogger.com/share-post.g?blogID=8501956666581132164&postID=2734497258099508127&target=twitter' target='_blank' title='Share to X'><span class='share-button-link-text'>Share to X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://www.blogger.com/share-post.g?blogID=8501956666581132164&postID=2734497258099508127&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Share to Facebook'><span class='share-button-link-text'>Share to Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://www.blogger.com/share-post.g?blogID=8501956666581132164&postID=2734497258099508127&target=pinterest' target='_blank' title='Share to Pinterest'><span class='share-button-link-text'>Share to Pinterest</span></a> </div></p> </div> </div> <div class='comments' id='comments'> <a name='comments'></a> <h4>1 comment:</h4> <div id='Blog1_comments-block-wrapper'> <dl class='avatar-comment-indent' id='comments-block'> <dt class='comment-author ' id='c3239324628126784063'> <a name='c3239324628126784063'></a> <div class="avatar-image-container avatar-stock"><span dir="ltr"><a href="https://www.blogger.com/profile/05722964841807635185" target="" rel="nofollow" onclick="" class="avatar-hovercard" id="av-3239324628126784063-05722964841807635185"><img src="//www.blogger.com/img/blogger_logo_round_35.png" width="35" height="35" alt="" title="lead"> </a></span></div> <a href='https://www.blogger.com/profile/05722964841807635185' rel='nofollow'>lead</a> said... </dt> <dd class='comment-body' id='Blog1_cmt-3239324628126784063'> <p> Michael Handler and Alan Green talk about what goes right and what can go wrong running in Production.<br />Thanks for post..<br /><a href="http://www.leadmaster.com.hk/" rel="nofollow">CRM tools</a> </p> </dd> <dd class='comment-footer'> <span class='comment-timestamp'> <a href='http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html?showComment=1309775424200#c3239324628126784063' title='comment permalink'> July 4, 2011 at 3:30 AM </a> <span class='item-control blog-admin pid-1245919089'> <a class='comment-delete' href='https://www.blogger.com/delete-comment.g?blogID=8501956666581132164&postID=3239324628126784063' title='Delete Comment'> <img src='https://resources.blogblog.com/img/icon_delete13.gif'/> </a> </span> </span> </dd> </dl> </div> <p class='comment-footer'> <a href='https://www.blogger.com/comment/fullpage/post/8501956666581132164/2734497258099508127' onclick=''>Post a Comment</a> </p> </div> </div> </div></div> <!--Can't find substitution for tag [adEnd]--> </div> <div class='blog-pager' id='blog-pager'> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='http://googleappengine.blogspot.com/2011/07/wanted-app-engineers.html' id='Blog1_blog-pager-newer-link' title='Newer Post'>Newer Post</a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='http://googleappengine.blogspot.com/2011/06/app-engine-151-release.html' id='Blog1_blog-pager-older-link' title='Older Post'>Older Post</a> </span> <a class='home-link' href='http://googleappengine.blogspot.com/'>Home</a> </div> <div class='clear'></div> <div class='post-feeds'> <div class='feed-links'> Subscribe to: <a class='feed-link' href='http://googleappengine.blogspot.com/feeds/2734497258099508127/comments/default' target='_blank' type='application/atom+xml'>Post Comments (Atom)</a> </div> </div> </div></div> </div> <div id='sidebar-wrapper'> <div id='searchcontrol'></div> <script type='text/javascript'> OnLoad(); </script> <div class='sidebar section' id='sidebar'><div class='widget HTML' data-version='1' id='HTML7'> <h2 class='title'>More Blogs from Google</h2> <div class='widget-content'> Visit our <a href="http://www.google.com/press/blogs/directory.html#tab0"> directory</a> for more information about Google blogs. </div> <div class='clear'></div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <h2>Archives</h2> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <select id='BlogArchive1_ArchiveMenu'> <option value=''>Archives</option> <option value='http://googleappengine.blogspot.com/2013/05/'>May (4)</option> <option value='http://googleappengine.blogspot.com/2013/04/'>April (3)</option> <option value='http://googleappengine.blogspot.com/2013/03/'>March (4)</option> <option value='http://googleappengine.blogspot.com/2013/02/'>February (9)</option> <option value='http://googleappengine.blogspot.com/2013/01/'>January (2)</option> <option value='http://googleappengine.blogspot.com/2012/12/'>December (2)</option> <option value='http://googleappengine.blogspot.com/2012/11/'>November (2)</option> <option value='http://googleappengine.blogspot.com/2012/10/'>October (8)</option> <option value='http://googleappengine.blogspot.com/2012/09/'>September (2)</option> <option value='http://googleappengine.blogspot.com/2012/08/'>August (3)</option> <option value='http://googleappengine.blogspot.com/2012/07/'>July (4)</option> <option value='http://googleappengine.blogspot.com/2012/06/'>June (2)</option> <option value='http://googleappengine.blogspot.com/2012/05/'>May (3)</option> <option value='http://googleappengine.blogspot.com/2012/04/'>April (4)</option> <option value='http://googleappengine.blogspot.com/2012/03/'>March (5)</option> <option value='http://googleappengine.blogspot.com/2012/02/'>February (3)</option> <option value='http://googleappengine.blogspot.com/2012/01/'>January (5)</option> <option value='http://googleappengine.blogspot.com/2011/12/'>December (3)</option> <option value='http://googleappengine.blogspot.com/2011/11/'>November (4)</option> <option value='http://googleappengine.blogspot.com/2011/10/'>October (4)</option> <option value='http://googleappengine.blogspot.com/2011/09/'>September (5)</option> <option value='http://googleappengine.blogspot.com/2011/08/'>August (3)</option> <option value='http://googleappengine.blogspot.com/2011/07/'>July (4)</option> <option value='http://googleappengine.blogspot.com/2011/06/'>June (3)</option> <option value='http://googleappengine.blogspot.com/2011/05/'>May (8)</option> <option value='http://googleappengine.blogspot.com/2011/04/'>April (2)</option> <option value='http://googleappengine.blogspot.com/2011/03/'>March (5)</option> <option value='http://googleappengine.blogspot.com/2011/02/'>February (3)</option> <option value='http://googleappengine.blogspot.com/2011/01/'>January (2)</option> <option value='http://googleappengine.blogspot.com/2010/12/'>December (2)</option> <option value='http://googleappengine.blogspot.com/2010/10/'>October (2)</option> <option value='http://googleappengine.blogspot.com/2010/09/'>September (1)</option> <option value='http://googleappengine.blogspot.com/2010/08/'>August (5)</option> <option value='http://googleappengine.blogspot.com/2010/07/'>July (5)</option> <option value='http://googleappengine.blogspot.com/2010/06/'>June (6)</option> <option value='http://googleappengine.blogspot.com/2010/05/'>May (3)</option> <option value='http://googleappengine.blogspot.com/2010/04/'>April (5)</option> <option value='http://googleappengine.blogspot.com/2010/03/'>March (5)</option> <option value='http://googleappengine.blogspot.com/2010/02/'>February (2)</option> <option value='http://googleappengine.blogspot.com/2010/01/'>January (2)</option> <option value='http://googleappengine.blogspot.com/2009/12/'>December (4)</option> <option value='http://googleappengine.blogspot.com/2009/11/'>November (3)</option> <option value='http://googleappengine.blogspot.com/2009/10/'>October (6)</option> <option value='http://googleappengine.blogspot.com/2009/09/'>September (5)</option> <option value='http://googleappengine.blogspot.com/2009/08/'>August (3)</option> <option value='http://googleappengine.blogspot.com/2009/07/'>July (3)</option> <option value='http://googleappengine.blogspot.com/2009/06/'>June (4)</option> <option value='http://googleappengine.blogspot.com/2009/05/'>May (3)</option> <option value='http://googleappengine.blogspot.com/2009/04/'>April (5)</option> <option value='http://googleappengine.blogspot.com/2009/03/'>March (3)</option> <option value='http://googleappengine.blogspot.com/2009/02/'>February (7)</option> <option value='http://googleappengine.blogspot.com/2009/01/'>January (1)</option> <option value='http://googleappengine.blogspot.com/2008/12/'>December (4)</option> <option value='http://googleappengine.blogspot.com/2008/11/'>November (3)</option> <option value='http://googleappengine.blogspot.com/2008/10/'>October (10)</option> <option value='http://googleappengine.blogspot.com/2008/09/'>September (5)</option> <option value='http://googleappengine.blogspot.com/2008/08/'>August (6)</option> <option value='http://googleappengine.blogspot.com/2008/07/'>July (4)</option> <option value='http://googleappengine.blogspot.com/2008/06/'>June (2)</option> <option value='http://googleappengine.blogspot.com/2008/05/'>May (5)</option> <option value='http://googleappengine.blogspot.com/2008/04/'>April (7)</option> </select> </div> </div> <div class='clear'></div> </div> </div></div> </div> <!-- spacer for skins that want sidebar and main to be the same height--> <div class='clear'> </div> </div> <!-- end content-wrapper --> <div id='footer-wrapper'> <div id='partnerBar'></div> <div class='footer no-items section' id='footer'> </div> </div> </div></div> </center><!-- end outer-wrapper --> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/984859869-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY4L-4B_Dr89molfsEjAcCjteGlXFA:1732705219383';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d8501956666581132164','//googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html','8501956666581132164'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '8501956666581132164', 'title': 'Google App Engine Blog', 'url': 'http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html', 'canonicalUrl': 'http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html', 'homepageUrl': 'http://googleappengine.blogspot.com/', 'searchUrl': 'http://googleappengine.blogspot.com/search', 'canonicalHomepageUrl': 'http://googleappengine.blogspot.com/', 'blogspotFaviconUrl': 'http://googleappengine.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': '', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google App Engine Blog - Atom\x22 href\x3d\x22http://googleappengine.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Google App Engine Blog - RSS\x22 href\x3d\x22http://googleappengine.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google App Engine Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/8501956666581132164/posts/default\x22 /\x3e\n\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Google App Engine Blog - Atom\x22 href\x3d\x22http://googleappengine.blogspot.com/feeds/2734497258099508127/comments/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/02de2df73990045b', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'item', 'postId': '2734497258099508127', 'pageName': 'Highlights from our Google I/O Presentations', 'pageTitle': 'Google App Engine Blog: Highlights from our Google I/O Presentations'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Highlights from our Google I/O Presentations', 'description': 'Now that things have settled down from last month\u2019s Google I/O, we thought it would be a good time to highlight some of the technical talks ...', 'url': 'http://googleappengine.blogspot.com/2011/06/highlights-from-our-google-io.html', 'type': 'item', 'isSingleItem': true, 'isMultipleItems': false, 'isError': false, 'isPage': false, 'isPost': true, 'isHomepage': false, 'isArchive': false, 'isLabelSearch': false, 'postId': 2734497258099508127}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/2646514562-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/1964470060-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML7', 'sidebar', document.getElementById('HTML7'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); </script> </body> </html>