<?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;CU4CSHo-fyp7ImA9WxJWE0k.&quot;"><id>tag:blogger.com,1999:blog-29010370</id><updated>2009-06-18T09:52:49.457-07:00</updated><title type="text">Google Mac Blog</title><subtitle type="html">Macs inside Google.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://googlemac.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://googlemac.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>A Googler</name><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>107</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/OfficialGoogleMacBlog" type="application/atom+xml" /><entry gd:etag="W/&quot;CU4CSHo9fip7ImA9WxJWE0k.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-6518826939418368987</id><published>2009-06-18T09:46:00.000-07:00</published><updated>2009-06-18T09:52:49.466-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T09:52:49.466-07:00</app:edited><title>Upload Your Photos, Download Your Albums</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Greg Robbins, Software Engineer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In December, the Picasa Web Albums Uploader added support for downloading a photo album to your Mac. We've recently updated the Uploader to include the ability to download all photos from all albums in your account. To start the download, sign in to your account with the Picasa Web Albums Uploader application and select the Existing Album tab. Holding down the Mac's Option key will change the title of the Download Album button to Download All. Then one click will bring all of your albums home.&lt;br /&gt;&lt;br /&gt;This update also improves reliability of the uploader's iPhoto export plug-in. The uploader typically keeps itself up-to-date, but you can also get the latest version, 1.3.1, from the &lt;a href="http://picasa.google.com/mac_tools.html"&gt;download page&lt;/a&gt;. Please let us know how it works for you in the Mac Uploader area of the &lt;a href="http://www.google.com/support/forum/p/Picasa"&gt;Picasa Help forum&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-6518826939418368987?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=z4bSFlUckNo:D3kDUxnk2zo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/z4bSFlUckNo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/6518826939418368987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/6518826939418368987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/z4bSFlUckNo/upload-your-photos-download-your-albums.html" title="Upload Your Photos, Download Your Albums" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/06/upload-your-photos-download-your-albums.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8CR3s5cCp7ImA9WxJXFUQ.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-1197987895020280778</id><published>2009-06-09T13:55:00.000-07:00</published><updated>2009-06-09T18:54:26.528-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T18:54:26.528-07:00</app:edited><title>Introducing Google Quick Search Box</title><content type="html">When most people think of Google, search comes to mind – and rightly so! Hundreds of millions of people have come to know and love Google.com as their starting point for searching the Internet.  About 2 years ago, &lt;a href="http://googlemac.blogspot.com/2007/04/google-desktop-for-mac_04.html"&gt;we introduced Google Desktop&lt;/a&gt; to extend Google search capabilities to your Mac and, earlier this year, &lt;a href="http://googlemac.blogspot.com/2009/01/search-without-effort-quick-search-box.html"&gt;we launched a developer preview&lt;/a&gt; of the next evolution of search outside the browser.  Today, we're officially releasing this technology to all users as the &lt;a href="http://www.google.com/quicksearchbox/"&gt;Google Quick Search Box&lt;/a&gt; (or QSB for short).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Cb4VGgCESEA/Si6wVKIUa2I/AAAAAAAATsE/IsWjNTvkd4k/s1600-h/blank.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Cb4VGgCESEA/Si6wVKIUa2I/AAAAAAAATsE/IsWjNTvkd4k/s400/blank.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
With Google Quick Search Box you can search for information from just about anywhere. As you type, suggestions will appear that match your query, ranging from applications and local files on your computer, to web search and navigational suggestions, to items from your browser history and contacts - and the types of results you can get will only grow over time! Check out the screenshot below for an example of the types of blended results you might see.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Cb4VGgCESEA/Si6wcIz4tEI/AAAAAAAATsM/jolwR9XrghM/s1600-h/screenshot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Cb4VGgCESEA/Si6wcIz4tEI/AAAAAAAATsM/jolwR9XrghM/s400/screenshot.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Once you've found the result you want, we wanted you to be able to DO something with it. To find out what you can do, select a result and press the tab key or the right arrow on the keyboard. Some examples of actions include instant messaging friends, playing a song, or emailing a URL. Just like the data you can search over, the list of actions you can perform will grow over time! &lt;br /&gt;
&lt;br /&gt;
The quickest way to launch the Google Quick Search Box is by pushing Control + spacebar at the same time (Google Desktop devotees will still be able to press Command twice to summon the box). If you prefer another keyboard shortcut to summon the Google QSB, you can change it in the Preferences panel.&lt;br /&gt;
&lt;br /&gt;
As you use the Google Quick Search Box more, it will learn which results you are likely to want. The goal here is that we get you to what you're looking for as quickly as possible. In the above example, if you chose Google Calendar, the next time you search for "cal", Google QSB will reorder the results so that you don't have to arrow down to your desired choice.  Instead, you can just type "cal" and press enter.&lt;br /&gt;
&lt;br /&gt;
Last, but definitely not least, the Google Quick Search Box is extensible.  This means that anyone can create a plug-in that enables the QSB to search over additional data or perform more actions on results. As an example, we really enjoy the &lt;a href="http://www.google.com/support/qsb/bin/answer.py?hl=en&amp;amp;answer=150959"&gt;Twitter plug-in&lt;/a&gt;&amp;nbsp;. After enabling that bad boy, we can send tweets right from the QSB and then do a Google search right after!&lt;br /&gt;
&lt;br /&gt;
The Google QSB has allowed us to do our daily tasks faster. If you want to give it a try to see it speed up your day, visit &lt;a href="http://www.google.com/quicksearchbox/"&gt;www.google.com/quicksearchbox/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you're a Google Desktop user and you want to gain this functionality, you can learn more about Google QSB and see how to upgrade in &lt;a href="http://www.google.com/support/quicksearchbox/bin/answer.py?answer=150560"&gt;this help center article&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
And please, &lt;a href="http://www.google.com/support/quicksearchbox/go/qsbfeedback"&gt;let us know what you think&lt;/a&gt;! &lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #666666;"&gt;Posted by Ryan Tabone and Karen Grünberg, Product Managers&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-1197987895020280778?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=6Z5QIv0C06Q:8q3ho_Uq7oI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/6Z5QIv0C06Q" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/1197987895020280778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/1197987895020280778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/6Z5QIv0C06Q/introducing-google-quick-search-box.html" title="Introducing Google Quick Search Box" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Cb4VGgCESEA/Si6wVKIUa2I/AAAAAAAATsE/IsWjNTvkd4k/s72-c/blank.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/06/introducing-google-quick-search-box.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AER3o5eyp7ImA9WxJXEUk.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-966124811407876713</id><published>2009-06-04T11:53:00.000-07:00</published><updated>2009-06-04T11:55:06.423-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-04T11:55:06.423-07:00</app:edited><title>Mac OS X Spelunking in PowerPC and x86 Assembly, part 2</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Avi Drissman, Google Chrome Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Note: this is another of our occasional extra-geeky technical posts. If this isn't your thing, don't worry; our usual non-technical stuff will be back soon.)&lt;p&gt;Welcome back. In our &lt;a href="http://googlemac.blogspot.com/2009/05/mac-os-x-spelunking-in-powerpc-and-x86.html"&gt;last post&lt;/a&gt; we went through a simple function that made calls to other functions, and touched on stack frames and parameter passing. This time let's talk about a different function. We'll focus less on the things we've seen, and more on some more advanced actions that this function does.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UpdateDockTitle&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;PowerPC&lt;/em&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;+0&amp;gt;: mflr    r0               // save linkage&lt;br /&gt;&amp;lt;+4&amp;gt;: stmw    r28,-16(r1)      // stash r28, r29, r30, r31&lt;br /&gt;&amp;lt;+8&amp;gt;: mr      r30,r3           // save r3 (WindowData)&lt;br /&gt;&amp;lt;+12&amp;gt;: bcl-    20,4*cr7+so,0x928d2bd4 &amp;lt;+16&amp;gt;&lt;br /&gt;&amp;lt;+16&amp;gt;: mflr    r31            // get ip in r31&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Whoa... what?&lt;/p&gt;&lt;p&gt;Short story: &amp;lt;+12&amp;gt; is an unconditional branch-and-link.&lt;/p&gt;&lt;p&gt;Long story: On the PowerPC, instructions like &lt;code&gt;bge&lt;/code&gt;, etc. are just aliases to a more primitive branch instruction, &lt;code&gt;bc&lt;/code&gt; (branch conditional). In this case, the first parameter is 20 (&lt;code&gt;0b10100&lt;/code&gt;), which indicates “branch always”. Since it's always going to branch, the second parameter doesn't matter, so it was set to all 1 bits (which translates to &lt;code&gt;4*cr7+so&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;Why do this? Because we're going to need to access some PC-relative data, and the PowerPC chip has no PC-relative addressing mode. And the register move instructions can't access the PC register. Therefore we cheat in a way by taking an unconditional jump to the next address. Since it's a branch and link, the link register is filled with the next address (in this case, that equals the address just jumped to) which can be moved to a normal register.&lt;/p&gt;&lt;p&gt;Why branch-conditional with a condition “branch always”? The &lt;code&gt;b&lt;/code&gt; opcode only provides absolute addressing. Only &lt;code&gt;bc&lt;/code&gt; has relative addressing.&lt;/p&gt;&lt;pre&gt;&amp;lt;+20&amp;gt;: stw     r0,8(r1)&lt;br /&gt;&amp;lt;+24&amp;gt;: stwu    r1,-80(r1)     // make stack frame&lt;br /&gt;&amp;lt;+28&amp;gt;: addis   r28,r31,3533&lt;br /&gt;&amp;lt;+32&amp;gt;: bl      0x928d2c50 &amp;lt;_Z15GetTitleForDockP10WindowData&amp;gt;&lt;br /&gt;&amp;lt;+36&amp;gt;: lbz     r0,-3364(r28)  // haul initialization boolean into r0&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This is where intuition comes in. We're hauling in some random byte from a PC-relative address. (&lt;code&gt;lbz&lt;/code&gt; is load byte and zero, which loads one byte from memory and clears the high bits.) What's byte sized? A &lt;code&gt;Boolean&lt;/code&gt; (the Carbon type; GCC makes C++ &lt;code&gt;bools&lt;/code&gt; 4 bytes). Why a &lt;code&gt;Boolean&lt;/code&gt;? Probably a flag. And with the value of the byte gating the call to &lt;code&gt;RegisterAsDockClientPriv&lt;/code&gt;, it's a safe bet that it's an initialization flag.&lt;/p&gt;&lt;pre&gt;&amp;lt;+40&amp;gt;: mr      r29,r3         // stash new title into r29&lt;br /&gt;&amp;lt;+44&amp;gt;: cmpwi   cr7,r0,0       // was initialized?&lt;br /&gt;&amp;lt;+48&amp;gt;: bne-    cr7,0x928d2c04 &amp;lt;+64&amp;gt; // if so, skip&lt;br /&gt;&amp;lt;+52&amp;gt;: bl      0x9287f864 &amp;lt;_Z24RegisterAsDockClientPrivv&amp;gt; // else initialize&lt;br /&gt;&amp;lt;+56&amp;gt;: li      r0,1           // and set flag&lt;br /&gt;&amp;lt;+60&amp;gt;: stb     r0,-3364(r28)  //   as being intialized&lt;br /&gt;&amp;lt;+64&amp;gt;: mr      r3,r30&lt;br /&gt;&amp;lt;+68&amp;gt;: mr      r4,r29&lt;br /&gt;&amp;lt;+72&amp;gt;: bl      0x928d2c68 &amp;lt;SyncPlatformWindowTitle&amp;gt; // call with (WindowData, new title)&lt;br /&gt;&amp;lt;+76&amp;gt;: lwz     r0,344(r30)    // pull (WindowData + 344)&lt;br /&gt;&amp;lt;+80&amp;gt;: andis.  r2,r0,64       // and pull a flag bit out of it (minimized?)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;More intuition here. &lt;code&gt;r30&lt;/code&gt; contains a pointer to the &lt;code&gt;WindowData&lt;/code&gt; class instance, and we're accessing some word 344 bytes in. We don't care about the destination register (we don't touch &lt;code&gt;r2&lt;/code&gt; again this function) but don't miss the name of the opcode: “&lt;code&gt;andis.&lt;/code&gt;” Remember that the period means to update &lt;code&gt;cr0&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Once again, this is obviously a flag (bit-sized this time). But what does it mean? Context tells us that we only call &lt;code&gt;CoreDockSetItemTitle&lt;/code&gt; when it's set. Thus, it's a safe guess that this is the is-minimized flag.&lt;/p&gt;&lt;pre&gt;&amp;lt;+84&amp;gt;: beq-    0x928d2c38 &amp;lt;+116&amp;gt; // if not minimized, skip this step&lt;br /&gt;&amp;lt;+88&amp;gt;: addi    r1,r1,80&lt;br /&gt;&amp;lt;+92&amp;gt;: lwz     r3,196(r30) // load WID&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;How do I know that &lt;code&gt;WindowData+196&lt;/code&gt; is the CoreGraphics WID (CGWindowID; see &lt;a href="http://developer.apple.com/documentation/Carbon/reference/CGWindow_Reference/DataTypes/DataTypes.html"&gt;CGWindow.h&lt;/a&gt;)? I used Quartz Debug to look at the window list for a sample app. The app only had one window, and the listed WID matched.&lt;/p&gt;&lt;pre&gt;&amp;lt;+96&amp;gt;: mr      r4,r29 // load new title&lt;br /&gt;&amp;lt;+100&amp;gt;: lwz     r0,8(r1)&lt;br /&gt;&amp;lt;+104&amp;gt;: lmw     r28,-16(r1) // tear down stack frame&lt;br /&gt;&amp;lt;+108&amp;gt;: mtlr    r0&lt;br /&gt;&amp;lt;+112&amp;gt;: b       0x92b58ce4 &amp;lt;dyld_stub_CoreDockSetItemTitle&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Note that we're tearing down the stack frame twice. In this case we're tail calling &lt;code&gt;CoreDockSetItemTitle&lt;/code&gt; so that it's as if our caller called them directly. This is equivalent to the code &lt;code&gt;return CoreDockSetItemTitle(wid, newTitle)&lt;/code&gt;. Note from the setup of &lt;code&gt;r3&lt;/code&gt; and &lt;code&gt;r4&lt;/code&gt; that we can deduce the parameter types. Can we figure out the return type, though? Not really. The calling code ignores it, so we can ignore it too.&lt;/p&gt;&lt;pre&gt;&amp;lt;+116&amp;gt;: addi    r1,r1,80&lt;br /&gt;&amp;lt;+120&amp;gt;: li      r3,0&lt;br /&gt;&amp;lt;+124&amp;gt;: lwz     r0,8(r1)&lt;br /&gt;&amp;lt;+128&amp;gt;: lmw     r28,-16(r1)&lt;br /&gt;&amp;lt;+132&amp;gt;: mtlr    r0&lt;br /&gt;&amp;lt;+136&amp;gt;: blr&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;x86&lt;/em&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;+0&amp;gt;: push   %ebp                   // make stack frame&lt;br /&gt;&amp;lt;+1&amp;gt;: mov    %esp,%ebp&lt;br /&gt;&amp;lt;+3&amp;gt;: sub    $0x28,%esp&lt;br /&gt;&amp;lt;+6&amp;gt;: mov    %ebx,-0xc(%ebp)        // save %ebx&lt;br /&gt;&amp;lt;+9&amp;gt;: call   0x92e4bbe4 &amp;lt;+14&amp;gt;&lt;br /&gt;&amp;lt;+14&amp;gt;: pop    %ebx                 // IP &amp;gt; %ebx&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;We're doing the same trick here to get the PC into a register and I'm a bit stumped as to why. From what I know, the x86 has PC-relative addressing, and surely there's got to be a better way to get the PC into a normal register. Right?&lt;/p&gt;&lt;pre&gt;&amp;lt;+15&amp;gt;: mov    %esi,-0x8(%ebp)      // save %esi&lt;br /&gt;&amp;lt;+18&amp;gt;: mov    0x8(%ebp),%esi       // WindowData &amp;gt; %esi&lt;br /&gt;&amp;lt;+21&amp;gt;: mov    %edi,-0x4(%ebp)      // save %edi&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This almost looks like it was compiled by a different compiler. In the previous function, &lt;code&gt;edi&lt;/code&gt; and &lt;code&gt;esi&lt;/code&gt; are pushed, and then the stack pointer dropped. Here, we create the stack space and then move the contents of three registers (&lt;code&gt;edi&lt;/code&gt;, &lt;code&gt;esi&lt;/code&gt;, and &lt;code&gt;ebx&lt;/code&gt;). I suspect that things change once we also have to save &lt;code&gt;ebx&lt;/code&gt;, though I don't know why.&lt;/p&gt;&lt;pre&gt;&amp;lt;+24&amp;gt;: mov    %esi,%eax            // %esi (WindowData) &amp;gt; %eax&lt;br /&gt;&amp;lt;+26&amp;gt;: call   0x92e4bc40 &amp;lt;_Z15GetTitleForDockP10WindowData&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Whoa. If we're calling a function we need to set the parameter via stack-relative addressing off &lt;code&gt;esp&lt;/code&gt;. What's going on here?&lt;/p&gt;&lt;p&gt;The point of an ABI is that it's a documented way for functions to call each other. But if a function, say &lt;code&gt;GetTitleForDock(WindowData*)&lt;/code&gt;, is a short one that's not public and is only used under controlled circumstances, why worry about setting up the stack? In this particular case, &lt;code&gt;GetTitleForDock&lt;/code&gt; happens to be a nine-instruction routine. Not worth the hassle of a stack frame, so it's reasonable to pass in the one parameter in &lt;code&gt;eax&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;&amp;lt;+31&amp;gt;: cmpb   $0x0,0xd51a36c(%ebx) // test initialization boolean&lt;br /&gt;&amp;lt;+38&amp;gt;: mov    %eax,%edi            // window title &amp;gt; %edi&lt;br /&gt;&amp;lt;+40&amp;gt;: jne    0x92e4bc0c &amp;lt;+54&amp;gt; // if initialized, skip&lt;br /&gt;&amp;lt;+42&amp;gt;: call   0x92df9fe0 &amp;lt;_Z24RegisterAsDockClientPrivv&amp;gt; // else initialize&lt;br /&gt;&amp;lt;+47&amp;gt;: movb   $0x1,0xd51a36c(%ebx) // and set flag as being initialized&lt;br /&gt;&amp;lt;+54&amp;gt;: mov    %edi,0x4(%esp)       // new title (param 2)&lt;br /&gt;&amp;lt;+58&amp;gt;: mov    %esi,(%esp)          // WindowData (param 1)&lt;br /&gt;&amp;lt;+61&amp;gt;: call   0x92e4bc52 &amp;lt;SyncPlatformWindowTitle&amp;gt;&lt;br /&gt;&amp;lt;+66&amp;gt;: xor    %eax,%eax            // clear %eax (noErr?)&lt;br /&gt;&amp;lt;+68&amp;gt;: testb  $0x2,0x159(%esi)     // test flag (WindowData + 0x159) (minimized?)&lt;br /&gt;&amp;lt;+75&amp;gt;: je     0x92e4bc35 &amp;lt;+95&amp;gt; // if not minimized, skip this step&lt;br /&gt;&amp;lt;+77&amp;gt;: mov    %edi,0x4(%esp)       // new title (param 2)&lt;br /&gt;&amp;lt;+81&amp;gt;: mov    0xc4(%esi),%eax      // (WindowData + 0xC4) WID&lt;br /&gt;&amp;lt;+87&amp;gt;: mov    %eax,(%esp)          // (param 1)&lt;br /&gt;&amp;lt;+90&amp;gt;: call   0xa0a52ad1 &amp;lt;dyld_stub_CoreDockSetItemTitle&amp;gt;&lt;br /&gt;&amp;lt;+95&amp;gt;: mov    -0xc(%ebp),%ebx&lt;br /&gt;&amp;lt;+98&amp;gt;: mov    -0x8(%ebp),%esi&lt;br /&gt;&amp;lt;+101&amp;gt;: mov    -0x4(%ebp),%edi&lt;br /&gt;&amp;lt;+104&amp;gt;: leave&lt;br /&gt;&amp;lt;+105&amp;gt;: ret&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Poking around in assembly isn't usually something you do every day. But whether you need it for debugging your own code or exploring someone else's, it's a skill that is definitely worth learning. PowerPC and x86 processors might have had a bit of a different history, but the code that's generated for either is certainly not as intractable as some suggest.&lt;/p&gt;&lt;p&gt;Where to go from here? Look around some more. Use &lt;code&gt;&lt;a href="http://developer.apple.com/DOCUMENTATION/DARWIN/Reference/ManPages/man1/otool.1.html"&gt;otool&lt;/a&gt; -tV&lt;/code&gt; to dump binaries and see what they do. Use &lt;code&gt;&lt;a href="http://developer.apple.com/DOCUMENTATION/DARWIN/Reference/ManPages/man1/nm.1.html"&gt;nm&lt;/a&gt;&lt;/code&gt; to see which symbols are exported from frameworks and watch how they work.&lt;/p&gt;&lt;p&gt;Go exploring, and have fun.&lt;/p&gt;&lt;p&gt;(Thanks to my editor, Scott Knaster, and to David Shayer, whose introductory session on PowerPC assembly at the legendary &lt;a href="http://en.wikipedia.org/wiki/MacHack_%28convention%29"&gt;MacHack&lt;/a&gt; conference started me on this path.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-966124811407876713?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=v78GY_ohRus:b9RI3bY34Ms:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/v78GY_ohRus" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/966124811407876713?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/966124811407876713?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/v78GY_ohRus/mac-os-x-spelunking-in-powerpc-and-x86.html" title="Mac OS X Spelunking in PowerPC and x86 Assembly, part 2" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/06/mac-os-x-spelunking-in-powerpc-and-x86.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08BR3s6fCp7ImA9WxJQGUs.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-7426921798335530971</id><published>2009-06-02T10:28:00.000-07:00</published><updated>2009-06-02T11:04:16.514-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-02T11:04:16.514-07:00</app:edited><title>Google Chrome, Sandboxing, and Mac OS X</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Scott Knaster, Google Mac Team&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Interested in news about &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; for Mac OS X? Google Chrome for the Mac is coming along fine, and for the technically inclined, Jeremy Moskovich of the Google Chrome team has written a &lt;a href="http://blog.chromium.org/2009/06/google-chrome-sandboxing-and-mac-os-x.html"&gt;blog post&lt;/a&gt; explaining how the developers implemented &lt;a href="http://en.wikipedia.org/wiki/Sandbox_%28software_development%29"&gt;sandboxing&lt;/a&gt;, an important Google Chrome feature. To find out more, please check out &lt;a href="http://blog.chromium.org/2009/06/google-chrome-sandboxing-and-mac-os-x.html"&gt;Jeremy's post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-7426921798335530971?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=AMLWz_82Ty0:-QwRzCaREDs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/AMLWz_82Ty0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/7426921798335530971?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/7426921798335530971?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/AMLWz_82Ty0/google-chrome-sandboxing-and-mac-os-x.html" title="Google Chrome, Sandboxing, and Mac OS X" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/06/google-chrome-sandboxing-and-mac-os-x.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HSHw7eip7ImA9WxJXEUk.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-7766054805757287032</id><published>2009-05-26T16:11:00.000-07:00</published><updated>2009-06-04T11:58:59.202-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-04T11:58:59.202-07:00</app:edited><title>Mac OS X Spelunking in PowerPC and x86 Assembly, part 1</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Avi Drissman, Google Chrome Team&lt;/span&gt;&lt;p&gt;(Note: this is one of our occasional extra-geeky technical posts. If this isn't your thing, don't worry; our usual non-technical stuff will be back soon.)&lt;/p&gt;&lt;p&gt;If you're a programmer, there are many reasons why you might want to go exploring the inner workings of Mac OS X. You might want to learn how how Apple achieves interesting effects. Or perhaps you're just curious about how things work. (We're all adults here, so I won't lecture you about the dangers of using private or undocumented interfaces in your apps.) &lt;/p&gt;&lt;p&gt;In any case, though, you need to know how to read assembly, either PowerPC (if you have an older Mac) or x86 (if you have anything recent). While there are good resources available to learn about &lt;a href="http://www.osnews.com/story/10366/A_Brief_Tutorial_on_Reverse_Engineering_OS_X"&gt;reading PowerPC assembly for exploration&lt;/a&gt;, there are fewer about x86. Despite the present and future of the Mac being x86, it seems like people have lots of &lt;a href="http://www.clarkcox.com/blog/?p=12"&gt;anxiety&lt;/a&gt; about having to work with it.&lt;/p&gt;&lt;p&gt;I think the problem is not a lack of documentation on x86 assembly, but a surfeit of it. Most of it is Windows- or DOS-centric, usually with &lt;a href="http://en.wikipedia.org/wiki/X86_assembly"&gt;syntax&lt;/a&gt; that doesn't apply (Intel syntax vs the AT&amp;amp;T syntax that GCC uses), and with the aim of teaching how to write it. But &lt;em&gt;reading&lt;/em&gt; x86 assembly really isn't that hard. If all you want to do is learn how to read the code generated by GCC, it's probably just as easy as PowerPC.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The other day I was investigating how window minimization and window titles work. While exploring, I took &lt;a href="http://www.drissman.com/blog/images/2009/05/SetWindowTitle.txt"&gt;notes of my discoveries&lt;/a&gt;. Let's touch on two functions, in both PowerPC and x86 flavors.&lt;/p&gt;&lt;p&gt;Before we begin, I'm going to assume that you're comfortable with assembly in general (though not necessarily with any particular one). If you have the latest developer tools, launch Shark (in &lt;code&gt;/Developer/Applications/Performance Tools&lt;/code&gt;) and in the Help menu you can access various ISA references. In addition, Apple has ABI documentation for both the &lt;a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/LowLevelABI/100-32-bit_PowerPC_Function_Calling_Conventions/32bitPowerPC.html"&gt;PowerPC&lt;/a&gt; and &lt;a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html"&gt;x86&lt;/a&gt;. I'm going to go over each function twice (once for PowerPC and once for x86); feel free to skim the PowerPC version if you're accustomed to it. And finally, this is only for the 32-bit version of each platform; things change even more with 64 bits.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SetWindowTitleWithCFString&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The trail always begins with a public call that uses the SPI that you want to figure out. In this case, I chose &lt;code&gt;SetWindowTitleWithCFString&lt;/code&gt; because it has to somehow set the title of a window even if it's minimized. I went with Carbon because sometimes the dynamic nature of Objective-C with Cocoa makes tracing code harder.&lt;/p&gt;&lt;p&gt;&lt;em&gt;PowerPC&lt;/em&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;+0&amp;gt;: mflr    r0          // save linkage&lt;br /&gt;&amp;lt;+4&amp;gt;: stmw    r30,-8(r1)  // stash r30, r31&lt;br /&gt;&amp;lt;+8&amp;gt;: mr      r30,r4      // save r4 (new title)&lt;br /&gt;&amp;lt;+12&amp;gt;: stw     r0,8(r1)    // make stack frame&lt;br /&gt;&amp;lt;+16&amp;gt;: stwu    r1,-80(r1)  // make stack frame&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This is the prologue of the function. The PowerPC doesn't have a dedicated stack pointer (convention is to use &lt;code&gt;r1&lt;/code&gt; for that), so the common way of implementing branches by pushing the PC onto the stack doesn't work. Instead, the PowerPC has a link register and a command &lt;code&gt;bl&lt;/code&gt; to branch and put the old PC value into the link register. Thus, almost every function starts with &lt;code&gt;mflr r0&lt;/code&gt;, to pull the old PC into a usable register. Then in &amp;lt;+4&amp;gt; we save off some registers that we're going to smash. Every function needs scratch registers to hold local variables, and usually the high-numbered registers are used. The &lt;code&gt;stmw&lt;/code&gt; (store multiple words) instruction is useful for ditching many high registers on the stack. Then in &amp;lt;+12&amp;gt; we drop the old PC onto the stack and allocate 80 bytes on the stack.&lt;/p&gt;&lt;p&gt;A note on parameter passing. Integer-sized parameters (the only kind we'll be dealing with today) are passed into a function starting with &lt;code&gt;r3&lt;/code&gt; and going up through the registers. Return values are returned in &lt;code&gt;r3&lt;/code&gt;. So we see that in &amp;lt;+8&amp;gt; we stick away the pointer to the new name in &lt;code&gt;r30&lt;/code&gt; (whose previous value was stored on the stack earlier).&lt;/p&gt;&lt;pre&gt;&amp;lt;+20&amp;gt;: bl      0x92881384 &amp;lt;_Z13GetWindowDataP15OpaqueWindowPtr&amp;gt;&lt;br /&gt;&amp;lt;+24&amp;gt;: li      r0,-5600    // errInvalidWindowRef&lt;br /&gt;&amp;lt;+28&amp;gt;: cmpwi   cr7,r3,0    // if no window data, bail&lt;br /&gt;&amp;lt;+32&amp;gt;: beq-    cr7,0x928d2ae0 &amp;lt;+60&amp;gt;&lt;br /&gt;&amp;lt;+36&amp;gt;: cmpwi   cr7,r30,0   // if no string to set, bail&lt;br /&gt;&amp;lt;+40&amp;gt;: li      r0,-50      // paramErr&lt;br /&gt;&amp;lt;+44&amp;gt;: beq-    cr7,0x928d2ae0 &amp;lt;+60&amp;gt;&lt;br /&gt;&amp;lt;+48&amp;gt;: mr      r4,r30&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This is where we must start making inferences as to what the code is doing. Fortunately, we have the symbols so it's not too hard. We see that we use the WindowRef as a parameter to a C++ function &lt;code&gt;GetWindowData(OpaqueWindowPtr)&lt;/code&gt;, as the WindowRef was passed in as &lt;code&gt;r3&lt;/code&gt; and &lt;code&gt;r3&lt;/code&gt; wasn't altered before the call. In addition, note that the function return value, being in &lt;code&gt;r3&lt;/code&gt;, will overwrite the WindowRef value which wasn't saved in a high register. That's fine, as the WindowRef was just an index into a table and won't be needed further.&lt;/p&gt;&lt;p&gt;At this point we run some checks. We compare both &lt;code&gt;r3&lt;/code&gt; and &lt;code&gt;r30&lt;/code&gt; to zero, and if either are zero we jump to the end with &lt;code&gt;r0&lt;/code&gt; set to the appropriate error code. (The end of the function will move &lt;code&gt;r0&lt;/code&gt; into &lt;code&gt;r3&lt;/code&gt; for return.)&lt;/p&gt;&lt;p&gt;The PowerPC condition register has eight condition sets. Why are we using &lt;code&gt;cr7&lt;/code&gt; here? Probably because &lt;code&gt;cr7&lt;/code&gt; is volatile and we can get away with not saving/restoring it.&lt;/p&gt;&lt;pre&gt;&amp;lt;+52&amp;gt;: bl      0x928d2af8 &amp;lt;_ZN10WindowData14SetTitleCommonEPK10__CFString&amp;gt;&lt;br /&gt;&amp;lt;+56&amp;gt;: li      r0,0        // return noErr&lt;br /&gt;&amp;lt;+60&amp;gt;: addi    r1,r1,80    // tear down stack frame and return&lt;br /&gt;&amp;lt;+64&amp;gt;: mr      r3,r0&lt;br /&gt;&amp;lt;+68&amp;gt;: lwz     r0,8(r1)&lt;br /&gt;&amp;lt;+72&amp;gt;: lmw     r30,-8(r1)&lt;br /&gt;&amp;lt;+76&amp;gt;: mtlr    r0&lt;br /&gt;&amp;lt;+80&amp;gt;: blr&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The rest is pretty simple. We call a member function &lt;code&gt;WindowData::SetTitleCommon(CFString*)&lt;/code&gt;, and then do common tear down. We restore the stack pointer, put the return value into &lt;code&gt;r3&lt;/code&gt;, restore the registers, move the old PC back into the link register, and branch to the link register (&lt;code&gt;blr&lt;/code&gt;), returning us to our caller.&lt;/p&gt;&lt;p&gt;&lt;em&gt;x86&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The PowerPC register file is really easy: &lt;code&gt;r0&lt;/code&gt;, &lt;code&gt;r1&lt;/code&gt;, &lt;code&gt;r2&lt;/code&gt; ... &lt;code&gt;r31&lt;/code&gt;. x86 has fewer registers and they've historically had different roles (accumulator, base, source index, destination index, and so on). Seriously, forget about that. There are eight registers you care about. &lt;code&gt;eax&lt;/code&gt;, &lt;code&gt;ebx&lt;/code&gt;, &lt;code&gt;ecx&lt;/code&gt;, &lt;code&gt;edx&lt;/code&gt;, &lt;code&gt;esi&lt;/code&gt;, and &lt;code&gt;edi&lt;/code&gt; are all general-purpose registers. &lt;code&gt;esp&lt;/code&gt; is the stack pointer. &lt;code&gt;ebp&lt;/code&gt; is the frame pointer. That's it.&lt;/p&gt;&lt;p&gt;PowerPC assembly reads right-to-left (except for stores). x86 AT&amp;amp;T syntax in general reads left-to-right.&lt;/p&gt;&lt;pre&gt;&amp;lt;+0&amp;gt;: push   %ebp             // make stack frame&lt;br /&gt;&amp;lt;+1&amp;gt;: mov    %esp,%ebp        // make stack frame&lt;br /&gt;&amp;lt;+3&amp;gt;: push   %esi             // stash %esi&lt;br /&gt;&amp;lt;+4&amp;gt;: sub    $0x14,%esp       // make stack frame&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;x86 is stack-based. Parameters to a function are put at the top of the stack, and the rightmost parameters have the highest addresses. To execute the function, the &lt;code&gt;call&lt;/code&gt; instruction was used. This instruction pushes the PC onto the stack, so even before we hit &amp;lt;+0&amp;gt; the parameters are four bytes above the stack pointer. In &amp;lt;+0&amp;gt; we save off the old stack frame value and in &amp;lt;+1&amp;gt; we establish our stack frame. At this point &lt;code&gt;ebp&lt;/code&gt; is fixed for the entire function. In &amp;lt;+3&amp;gt; we save the old values of registers we're going to use, and in &amp;lt;+4&amp;gt; we allocate space on the stack.&lt;/p&gt;&lt;p&gt;This is a perfect example of an ideal stack frame. &lt;code&gt;ebp&lt;/code&gt; is the frame pointer. It points (to the stack) at the old frame pointer. &lt;code&gt;ebp&lt;/code&gt;+4 is the PC of the function that called us. &lt;code&gt;ebp&lt;/code&gt;+8 is the first parameter passed in, &lt;code&gt;ebp&lt;/code&gt;+12 is the second, etc. Immediately below &lt;code&gt;ebp&lt;/code&gt; are the values saved from the registers, which will be restored before the return. And below &lt;em&gt;that&lt;/em&gt; is a bunch of stack space used for either register spillage or calling subsequent functions. One interesting note is that rarely are parameters pushed onto the stack for a call. The stack pointer doesn't move once we make it past the prologue. We just set the memory right above &lt;code&gt;esp&lt;/code&gt; (the stack pointer) and make the call.&lt;/p&gt;&lt;pre&gt;&amp;lt;+7&amp;gt;: mov    0x8(%ebp),%eax   // get WindowRef in %eax&lt;br /&gt;&amp;lt;+10&amp;gt;: mov    0xc(%ebp),%esi   // get new title in %esi&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The parameters are passed on the stack. Since fiddling in memory is slow, we pull the values into registers. It's actually pretty analogous to how things go in PowerPC. There, lower registers like &lt;code&gt;r3&lt;/code&gt; are reused for parameter passing so important values are kept in the high registers. On x86 the parameters go on the stack and values are kept in registers when possible. Why &lt;code&gt;eax&lt;/code&gt; and &lt;code&gt;esi&lt;/code&gt;? Why not?&lt;/p&gt;&lt;pre&gt;&amp;lt;+13&amp;gt;: mov    %eax,(%esp)      // put WindowRef on the stack&lt;br /&gt;&amp;lt;+16&amp;gt;: call   0x92dfb8f6 &amp;lt;_Z13GetWindowDataP15OpaqueWindowPtr&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;With the PowerPC, you can tell how many parameters a function has by seeing how many registers starting with &lt;code&gt;r3&lt;/code&gt; are loaded. Here, we just look at the register indirect addressing with &lt;code&gt;esp&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;&amp;lt;+21&amp;gt;: mov    %eax,%edx        // stick WindowData into %edx&lt;br /&gt;&amp;lt;+23&amp;gt;: mov    $0xffffea20,%eax // errInvalidWindowRef&lt;br /&gt;&amp;lt;+28&amp;gt;: test   %edx,%edx        // if no window data, bail&lt;br /&gt;&amp;lt;+30&amp;gt;: je     0x92e4bb04 &amp;lt;+54&amp;gt;&lt;br /&gt;&amp;lt;+32&amp;gt;: test   %esi,%esi        // if no string to set, bail&lt;br /&gt;&amp;lt;+34&amp;gt;: mov    $0xffce,%ax      // paramErr&lt;br /&gt;&amp;lt;+38&amp;gt;: je     0x92e4bb04 &amp;lt;+54&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Return values come back from functions in &lt;code&gt;eax&lt;/code&gt;, but otherwise this is pretty much the same. The only thing of interest to note is the clever use of the peculiar register structure. In &amp;lt;+23&amp;gt; the constant &lt;code&gt;0xffffea20&lt;/code&gt; is loaded into &lt;code&gt;eax&lt;/code&gt;. But on &amp;lt;+34&amp;gt; the constant &lt;code&gt;0xffce&lt;/code&gt; is loaded in &lt;code&gt;ax&lt;/code&gt;. But since &lt;code&gt;ax&lt;/code&gt; is just an alias for the lower 16 bits of &lt;code&gt;eax&lt;/code&gt;, the upper half of the word is left as &lt;code&gt;0xffff&lt;/code&gt; and we get the full constant &lt;code&gt;0xffffffce&lt;/code&gt; in &lt;code&gt;eax&lt;/code&gt;. Why do this? Because loading a 32 bit constant takes 5 bytes while loading a 16 bit constant only takes 4.&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;+40&amp;gt;: mov    %esi,0x4(%esp)   // load new title as param 2&lt;br /&gt;&amp;lt;+44&amp;gt;: mov    %edx,(%esp)      // load WindowData as param 1&lt;br /&gt;&amp;lt;+47&amp;gt;: call   0x92e4bb0c &amp;lt;_ZN10WindowData14SetTitleCommonEPK10__CFString&amp;gt;&lt;br /&gt;&amp;lt;+52&amp;gt;: xor    %eax,%eax        // return noErr&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Same stuff as before. The one note is the zeroing of &lt;code&gt;eax&lt;/code&gt; with an &lt;code&gt;xor&lt;/code&gt;. Just a fancy trick as the generated code is &lt;a href="http://en.wikibooks.org/wiki/X86_Disassembly/Code_Obfuscation"&gt;faster and smaller&lt;/a&gt; than the equivalent &lt;code&gt;mov $0x0,%eax&lt;/code&gt;.&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;+54&amp;gt;: add    $0x14,%esp       // tear down stack frame and return&lt;br /&gt;&amp;lt;+57&amp;gt;: pop    %esi&lt;br /&gt;&amp;lt;+58&amp;gt;: leave&lt;br /&gt;&amp;lt;+59&amp;gt;: ret&lt;br /&gt;&amp;lt;+60&amp;gt;: nop&lt;br /&gt;&amp;lt;+61&amp;gt;: nop&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The mirror image of the stack frame creation.&lt;/p&gt;&lt;p&gt;That's one function down and one left to go. &lt;a href="http://googlemac.blogspot.com/2009/06/mac-os-x-spelunking-in-powerpc-and-x86.html"&gt;Next time&lt;/a&gt;, we'll take a look at a function that behaves a little differently than this one did.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-7766054805757287032?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=W_nvhKYCizM:ipO99Zay6Pc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/W_nvhKYCizM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/7766054805757287032?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/7766054805757287032?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/W_nvhKYCizM/mac-os-x-spelunking-in-powerpc-and-x86.html" title="Mac OS X Spelunking in PowerPC and x86 Assembly, part 1" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/05/mac-os-x-spelunking-in-powerpc-and-x86.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8ARnwzcSp7ImA9WxJQEUw.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-4488514331076961924</id><published>2009-05-23T15:28:00.000-07:00</published><updated>2009-05-23T15:30:47.289-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-23T15:30:47.289-07:00</app:edited><title>Google Spreadsheets power gFlashPro Flashcards for iPhone</title><content type="html">Guest post by Mike MacDonald, Founder and CTO, gWhiz LLC&lt;br /&gt;&lt;br /&gt;&lt;a id="w1c_" href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=297332787&amp;amp;mt=8" title="gFlashPro"&gt;gFlashPro&lt;/a&gt;, the first offering in the iPhone App Store from our company, &lt;a id="pq43" href="http://www.gwhizmobile.com/" title="gWhiz's"&gt;gWhiz&lt;/a&gt;, is a popular mobile flashcards application used by students of all ages to study on the go. Google Spreadsheets provide a key element of the gFlashPro architecture.&lt;br /&gt;&lt;br /&gt;To create a gFlashPro flashcard set, students or teachers open up a new Google Spreadsheet and put questions in the first column, and answers (including multiple choice) in the adjacent columns. Meta-data (set description, search tags, runtime options, and so on) isn't required, but can be entered into a separate worksheet as simple key-value pairs.  Then, on the iPhone or iPod touch, from within gFlashPro, users are given a list of the available flashcard sets (i.e., spreadsheets) for easy download. Alternatively, they can select flashcard sets from our catalog: a searchable repository of thousands of shared flashcard sets covering virtually any subject.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_N76yGvbMPVw/Shh24G6XUHI/AAAAAAAAAFY/rb7Fgyv6LrI/s1600-h/gmbp01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 166px; height: 320px;" src="http://2.bp.blogspot.com/_N76yGvbMPVw/Shh24G6XUHI/AAAAAAAAAFY/rb7Fgyv6LrI/s320/gmbp01.png" alt="" id="BLOGGER_PHOTO_ID_5339148064547885170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div id="hvut" style="text-align: center;"&gt;&lt;a href="https://docs.google.com/a/google.com/File?id=afq2hmqfjx_2g5swzxd5_b" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once selected, the card set (spreadsheet) is downloaded into gFlashPro and presented to the user for mobile study and quizzing.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_N76yGvbMPVw/Shh3DqSfwgI/AAAAAAAAAFg/yi_XDk0rukk/s1600-h/gmbp02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 166px; height: 320px;" src="http://4.bp.blogspot.com/_N76yGvbMPVw/Shh3DqSfwgI/AAAAAAAAAFg/yi_XDk0rukk/s320/gmbp02.png" alt="" id="BLOGGER_PHOTO_ID_5339148263022903810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div id="mub4" style="text-align: center;"&gt;&lt;a href="https://docs.google.com/a/google.com/File?id=afq2hmqfjx_3gp4xc3ts_b" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;A few reasons we chose to use Google Spreadsheets:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We didn't want to have to write our own server-side flashcard creation code.  If we "rolled our own", it would have been code that we'd need to maintain going forward. Using Google Spreadsheets allowed us to leverage the strength of Google's development team, the many built-in functions (e.g., importing .xls), and in the future, Google Gadgets.&lt;/li&gt;&lt;li&gt;Google's server infrastructure reliability is far better than anything we could possibly afford.&lt;/li&gt;&lt;li&gt;User authentication is handled by Google. While this is not a huge problem, it's just one more thing that our small development team doesn't need to deal with.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And a few lessons learned:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are document limits for each account. In our case, the number and storage of documents is distributed across many thousands of users.  Having a shared document in your account doesn't count against that limit.&lt;/li&gt;&lt;li&gt;While the &lt;a id="q26-" href="http://code.google.com/p/gdata-objectivec-client/" title="Objective-C libraries"&gt;Objective-C libraries&lt;/a&gt; for connecting to Google Docs are incredibly powerful, they are also fairly heavyweight for content-heavy apps like ours. We found that flashcard sets with more than 300 rows would blow out memory on the iPhone because of the substantial number of objects being created for each spreadsheet cell. One alternative we're considering in another application is to write our own XML parser to exclusively process spreadsheet data coming from Google.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Any questions?  Just email us at &lt;a href="mailto:info@gwhizmobile.com"&gt;info@gwhizmobile.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-4488514331076961924?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=9KMX9dH7LIY:TX8xx5a_ogE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/9KMX9dH7LIY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/4488514331076961924?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/4488514331076961924?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/9KMX9dH7LIY/google-spreadsheets-power-gflashpro.html" title="Google Spreadsheets power gFlashPro Flashcards for iPhone" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_N76yGvbMPVw/Shh24G6XUHI/AAAAAAAAAFY/rb7Fgyv6LrI/s72-c/gmbp01.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/05/google-spreadsheets-power-gflashpro.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4CR3w_fip7ImA9WxVaEU8.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-3170157565675324719</id><published>2009-04-07T10:56:00.000-07:00</published><updated>2009-04-07T10:56:06.246-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-07T10:56:06.246-07:00</app:edited><title>Updated Gmail and Calendar for iPhone</title><content type="html">Today I'm happy to announce that we've updated Gmail and Calendar for the iPhone.  We've completely re-architected the code so you get more consistent performance, refreshed the user interface so it's easier to perform batch actions, and most importantly, laid the foundation which will allow us to iterate quickly and provide you with performance improvements and new features in the future.  &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_Cb4VGgCESEA/SduTbjOo-JI/AAAAAAAASwk/JB0gvfcXlQ8/s1600-h/screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_Cb4VGgCESEA/SduTbjOo-JI/AAAAAAAASwk/JB0gvfcXlQ8/s400/screenshot.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To find out more about how you can get all the Gmail goodies, like threaded conversations, search, starring and labels, all on your iPhone, head on over to the &lt;a href="http://googlemobile.blogspot.com/2009/04/gmail-gets-new-engine-for-iphone-and.html"&gt;Google Mobile Blog&lt;/a&gt;.  Or, if you're convinced and want to try it out now, go to &lt;b&gt;gmail.com&lt;/b&gt; on your iPhone. Click the Calendar link at the top to access Google Calendar. Please note that only iPhone OS 2.2.1 or higher is supported.  We're rolling out this release over the next few days, so if you don't see the updated user interface, check back soon.  &lt;br /&gt;
&lt;br /&gt;
&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/v5J5sA48eV0&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/v5J5sA48eV0&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #666666;"&gt;Posted by Deng-Kai Chen, Google Mobile&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-3170157565675324719?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=8K0F-hxBjj4:fcXSF5KijLc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/8K0F-hxBjj4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/3170157565675324719?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/3170157565675324719?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/8K0F-hxBjj4/updated-gmail-and-calendar-for-iphone.html" title="Updated Gmail and Calendar for iPhone" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Cb4VGgCESEA/SduTbjOo-JI/AAAAAAAASwk/JB0gvfcXlQ8/s72-c/screenshot.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/04/updated-gmail-and-calendar-for-iphone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08HRn05cCp7ImA9WxVbEE8.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5921588522239324794</id><published>2009-03-25T17:20:00.000-07:00</published><updated>2009-03-25T18:10:37.328-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T18:10:37.328-07:00</app:edited><title>Using Google APIs in an iPhone App</title><content type="html">&lt;span class="Apple-style-span"  style="color:#666666;"&gt;&lt;i&gt;Guest post by Tom Saxton, Idle Loop Software Design&lt;/i&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;In September, my small software company shipped our first iPhone app, a grocery list program called &lt;a href="http://www.grocophile.com/" id="sozk" title="Grocophile"&gt;Grocophile&lt;/a&gt;. One of the most common requests from our users was the ability to exchange data over the Internet. Greg Robbins of Google's Mac team suggested that the Google Docs API might be useful, so I jumped in and took a look.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Cb4VGgCESEA/ScrOQaE6QJI/AAAAAAAASZE/BAJzjOlngeQ/s1600-h/grocophile2.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Cb4VGgCESEA/ScrOQaE6QJI/AAAAAAAASZE/BAJzjOlngeQ/s400/grocophile2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5317289091337437330" style="cursor: pointer; width: 278px; height: 400px; " /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This turned out to be a great way to give our users access to free Internet storage, letting them back up their data and share it across multiple devices. To return the favor, I'd like to share my experience: the learning process, getting the code working on the iPhone, and how I found what I needed from what Google generously provides.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Greg helped me get started by pointing out some online resources. I started with the Objective-C library's &lt;a href="http://docs.google.com/Present?docid=dftpzpbs_0g5w3q5cg" id="b1vr" title="overview slideshow"&gt;overview slideshow&lt;/a&gt;. Then I read the Objective-C &lt;a href="http://code.google.com/p/gdata-objectivec-client/wiki/GDataObjCIntroduction" id="ua-6" title="client introduction"&gt;client introduction&lt;/a&gt;, which explains how to get the Google Data APIs library into an iPhone Xcode project. Finally, I downloaded the &lt;a href="http://code.google.com/p/gdata-objectivec-client/downloads/list" id="ln7e" title="library sources"&gt;library sources&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;There's a sample app that you'll get with the sources that shows how to talk to Google Docs. The file of interest is &lt;a href="http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Examples/DocsSample/DocsSampleWindowController.m" id="o0bp" title="DocsSampleWindowController.m"&gt;DocsSampleWindowController&lt;/a&gt;. Start by looking at the two methods "uploadFileAtPath:" and "saveSelectedDocumentToPath:", as those demonstrate how to upload and download files, respectively.&lt;br /&gt;&lt;br /&gt;The code is part of a Mac OS X Cocoa app, so it has some Mac-specific code intermingled with the GData code. To bring it into an iPhone project, I trimmed out the Mac user interface stuff, and defined a class and a protocol to create code that should work from any Mac or iPhone application.&lt;br /&gt;&lt;br /&gt;The library requires several steps to upload or download a file. First, you create a service object that encodes the user agent that identifies your application, along with the username and password for the account you want to access. Then use that object to request a document list feed, which is the list of documents in the user's account.&lt;br /&gt;&lt;br /&gt;Retrieving the document list feed both validates the account credentials and captures information you'll need to either upload or download files. The feed contains the URL for downloading each document. To download, you can use any http call such as NSURLConnection or the library's GDataHTTPFetcher. The feed also has the URL for uploading new document entries.&lt;br /&gt;&lt;br /&gt;The networking operations are asynchronous, so my encapsulating object has methods for starting an upload or download, then uses an Objective-C protocol to inform the controlling object of the progress and status at completion.&lt;br /&gt;&lt;br /&gt;I've been calling these document objects files, but Google Docs isn't a file system. It's much more like a web publishing system: a collection of objects with associated metadata including title, creation and modification dates, and so on.&lt;br /&gt;&lt;br /&gt;The first difference from a file system that I encountered is that you can have multiple different files with the same name. So, if you just upload a new version of a file the same way you uploaded it the first time, you'll get a second document with that same name. To avoid that, search for the document entry with the title that you want to upload to. You can then request an update operation instead of an insert.&lt;br /&gt;&lt;br /&gt;The second issue I discovered is that much like when you post to a blog, what you upload can get transformed to match the type of document that is holding the data. When you download the same object, you get something different than what you uploaded. For example, I uploaded a plain text document (specified by MIME type "text/plain"), but when I downloaded that same object I found the text wrapped in a bunch of HTML that makes it display well on the Google Docs web page. Our app's files are UTF-8 XML files created by NSKeyedArchiver. Google Docs fails if you try to specify a MIME type of "text/xml" and totally mangles the document contents if you specify "text/plain". That is not a big surprise because there's not currently a way to specify that the text is encoded UTF-8, and the content gets stuffed into an XML file for the journey to the server.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;I solved this issue by converting my files into a plain ASCII encoding, wrapping that in HTML which explains that the file our users see in the Google Docs web page is a Grocophile data file and isn't user editable, and uploading that as "text/html". When I download this file, the HTML does pick up a bunch of Google additions, but it's a simple matter to scan the file to find my encoded document contents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Different apps will have different needs for storing their documents. If your app can store and retrieve its data in text, HTML or a spreadsheet, then Google Docs will work well for you. Grocophile's data is basically a relational database with a series of tables and joins keyed off of UUIDs. I could represent the data in text, but it would be fragile and not appropriate for end-user editing. Even though our data won't be editable within Google Docs, there's still plenty of value in being able to back up, restore and merge data sets from Grocophile.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Cb4VGgCESEA/ScrQoVS-jwI/AAAAAAAASZM/nF4VQBXpJ04/s1600-h/groc3.png"&gt;&lt;img src="http://4.bp.blogspot.com/_Cb4VGgCESEA/ScrQoVS-jwI/AAAAAAAASZM/nF4VQBXpJ04/s400/groc3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5317291701394378498" style="cursor: pointer; width: 278px; height: 400px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To help out other Mac and iPhone developers, I've published my code for using the library in an iPhone application as an &lt;a title="open source project" href="http://code.google.com/p/googledocs-cocoa-sample/" id="wtou"&gt;open source project&lt;/a&gt;. If you have any questions, or suggestions for improvement, please contact me at &lt;a href="http://idleloop.com/" id="y1en" title="http://idleloop.com"&gt;idleloop.com&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5921588522239324794?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=H2zAD3HTXKU:joz7Let7W6U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/H2zAD3HTXKU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5921588522239324794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5921588522239324794?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/H2zAD3HTXKU/using-google-apis-in-iphone-app.html" title="Using Google APIs in an iPhone App" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Cb4VGgCESEA/ScrOQaE6QJI/AAAAAAAASZE/BAJzjOlngeQ/s72-c/grocophile2.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/03/using-google-apis-in-iphone-app.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EMQns9eyp7ImA9WxVbEE8.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-7421320041567227962</id><published>2009-03-17T12:22:00.000-07:00</published><updated>2009-03-25T18:08:03.563-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T18:08:03.563-07:00</app:edited><title>Health and Vigor in a Google Data APIs Library Update</title><content type="html">&lt;i&gt;Posted by Greg Robbins, Software Engineer&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;If there's a hole in my memory, it's right where the date of my last tetanus shot should be stored. Luckily, &lt;a href="http://www.google.com/health" id="t9ce" title="Google Health"&gt;Google Health&lt;/a&gt; promises to help us keep track of the many medical details in our lives that would otherwise be lost. But stored information only matters if it's accessible when and where we need it. Independent developer Ford Parsons' application &lt;a href="http://snosrap.com/healthcloud/" id="anuy" title="Health Cloud"&gt;Health Cloud&lt;/a&gt; provides access to health profiles quickly and conveniently, for iPhone owners anywhere.&lt;br /&gt;&lt;br /&gt;Health Cloud is the first released app to use the Google Data APIs Objective-C Client Library's new support for the Google Health Data API. The recent version 1.7 release of the library also offers a variety of performance and memory improvements for iPhone and Mac developers. It still provides easy access to Google Docs, Picasa Web Albums, YouTube, and many other Google services.&lt;br /&gt;&lt;br /&gt;If you have an iPhone or an iPod Touch, you can download Health Cloud today to keep your Google Health account handy. Or if you're a Mac or iPhone developer, check out the &lt;a href="http://code.google.com/p/gdata-objectivec-client/" id="fwjf" title="Google Data APIs Objective-C Client Library"&gt;Google Data APIs Objective-C Client Library&lt;/a&gt; open-source project page for an introduction to adding Google services to your products.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-7421320041567227962?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=SsPMp_QVI90:PkUJle0zUmA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/SsPMp_QVI90" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/7421320041567227962?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/7421320041567227962?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/SsPMp_QVI90/health-and-vigor-in-google-data-apis.html" title="Health and Vigor in a Google Data APIs Library Update" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/03/health-and-vigor-in-google-data-apis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMDRXo_eyp7ImA9WxVXGUw.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5153589028129324072</id><published>2009-02-17T15:11:00.000-08:00</published><updated>2009-02-17T15:14:34.443-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-17T15:14:34.443-08:00</app:edited><title>What's New for iPhone</title><content type="html">&lt;div style="color: #666666;"&gt;&lt;i&gt;By Jason Toff, Google Mac Team&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
Over the past few weeks, a number of enhancements have been made to Google's offerings for the iPhone.&amp;nbsp; We wanted to highlight some of those improvements here.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Google Sync Beta&lt;br /&gt;
&lt;/b&gt;Google Sync allows you to get your Gmail Contacts and Google Calendar events to your phone.&amp;nbsp; Once you set up Sync on your phone, it will automatically begin synchronizing your address book and calendar in the background, over-the-air, so you can attend to other tasks. Sync uses push technology so any changes or additions to your calendar or contacts are reflected on your device in minutes.&lt;br /&gt;
&lt;br /&gt;
Learn more on the &lt;a href="http://googlemobile.blogspot.com/2009/02/google-sync-beta-for-iphone-winmo-and.html"&gt;Google Mobile blog&lt;/a&gt; or try Sync at &lt;a href="http://m.google.com/sync"&gt;m.google.com/sync&lt;/a&gt;. &lt;br /&gt;
&lt;span style="color: #999999;"&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie"
value="http://www.youtube.com/v/Kt_-qHczCMg&amp;amp;hl=en&amp;amp;fs=1&amp;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/Kt_-qHczCMg&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"
type="application/x-shockwave-flash" allowscriptaccess="always"
allowfullscreen="true" width="480"
height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;b&gt;Tasks&lt;br /&gt;
&lt;/b&gt; Tasks lets you easily create and manage to-do lists in Gmail and on your iPhone.&amp;nbsp; While on the go, you can view tasks, add tasks, and mark them as completed. These changes are automatically reflected in Gmail. Using your iPhone, you can also add, edit, and delete entire lists.&lt;br /&gt;
&lt;br /&gt;
Learn more on the &lt;a href="http://gmailblog.blogspot.com/2009/02/tasks-paper-vs-iphone.html"&gt;Gmail blog&lt;/a&gt; or get started with tasks at &lt;a href="http://gmail.com/tasks"&gt;gmail.com/tasks&lt;/a&gt;. &lt;br /&gt;
&lt;span style="color: #999999;"&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie"
value="http://www.youtube.com/v/AbiMbmq3JG4&amp;amp;hl=en&amp;amp;fs=1&amp;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/AbiMbmq3JG4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"
type="application/x-shockwave-flash" allowscriptaccess="always"
allowfullscreen="true" width="480"
height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Google Book Search&lt;br /&gt;
&lt;/b&gt;Over 1.5 million public domain books in the US (and over half a million outside the US) are now available for perusing on your iPhone.&amp;nbsp; You can search for a title, author, or subject. Or you can browse the list of "Featured books" and various categories like business, the classics, travel, and more.&lt;br /&gt;
&lt;br /&gt;
Learn more on the &lt;a href="http://booksearch.blogspot.com/2009/02/15-million-books-in-your-pocket.html"&gt;Google Book Search blog&lt;/a&gt; or start reading at &lt;a href="http://books.google.com/m"&gt;http://books.google.com/m&lt;/a&gt;. &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Cb4VGgCESEA/SZXNALdp6cI/AAAAAAAASQY/HY1KuxYXM1I/s1600-h/Mystery.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Cb4VGgCESEA/SZXNALdp6cI/AAAAAAAASQY/HY1KuxYXM1I/s320/Mystery.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;b&gt;Edit Docs&lt;br /&gt;
&lt;/b&gt;Last week, we launched new capabilities to Google Docs for your iPhone that allow you to add new rows, edit existing cells, sort by columns, and filter by terms. Now you don't have to wait until you get to your computer to update a spreadsheet.&lt;br /&gt;
&lt;br /&gt;
Learn more on the &lt;a href="http://googledocs.blogspot.com/2009/02/add-edit-sort-and-filter-improved.html"&gt;Google Docs blog&lt;/a&gt; or start editing at &lt;a href="http://m.google.com/docs"&gt;m.google.com/docs&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;.&lt;/span&gt; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Cb4VGgCESEA/SZXM6hqyqCI/AAAAAAAASQQ/ZfaeyWvTTjA/s1600-h/1one.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_Cb4VGgCESEA/SZXM6hqyqCI/AAAAAAAASQQ/ZfaeyWvTTjA/s320/1one.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5153589028129324072?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=HVjzkPbU"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/H7GSdqBnyyE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5153589028129324072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5153589028129324072?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/H7GSdqBnyyE/whats-new-for-iphone.html" title="What's New for iPhone" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Cb4VGgCESEA/SZXNALdp6cI/AAAAAAAASQY/HY1KuxYXM1I/s72-c/Mystery.jpg" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/02/whats-new-for-iphone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcFR3w_fyp7ImA9WxVSGEw.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-1249488496572223608</id><published>2009-01-12T18:00:00.000-08:00</published><updated>2009-01-12T18:00:16.247-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-12T18:00:16.247-08:00</app:edited><title>Search Without Effort: The Quick Search Box</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Nicholas Jitkoff and Dave MacLachlan, Google Mac Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of our goals at Google is to make your search experience as fluid as possible. While much of our work is focused on Google.com, we're trying to make it just as easy to search outside your browser.&lt;br /&gt;&lt;br /&gt;For the last year, we have been working on a new, open-source quick search box. Today, we are releasing our first developer preview for the Mac.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_N76yGvbMPVw/SWu4JjRD4aI/AAAAAAAAAFQ/kAQMLJeWLNo/s1600-h/QSBscreen.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 347px; height: 285px;" src="http://3.bp.blogspot.com/_N76yGvbMPVw/SWu4JjRD4aI/AAAAAAAAAFQ/kAQMLJeWLNo/s400/QSBscreen.png" alt="" id="BLOGGER_PHOTO_ID_5290524661501911458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This Mac version is much more experimental than its iPhone sibling, &lt;a href="http://googlemobile.blogspot.com/2008/11/google-mobile-app-for-iphone-now-with.html"&gt;Google Mobile App&lt;/a&gt;, and through it you will be able to see many of the areas we are exploring: contextual search, actions, and extensibility. It is by no means feature-complete, but is a very good indication of things to come.&lt;br /&gt;&lt;br /&gt;If you are interested in participating in our experiment, head over to the &lt;a href="http://code.google.com/p/qsb-mac"&gt;Google Code site&lt;/a&gt; and give it a try. We are eager to involve users in the development process and will be posting new builds frequently. Over the coming months we'll be posting a few articles about the architecture and interaction we are exploring, and we look forward to your feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-1249488496572223608?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=97bNESd4"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/LrV6hgt_r1I" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/1249488496572223608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/1249488496572223608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/LrV6hgt_r1I/search-without-effort-quick-search-box.html" title="Search Without Effort: The Quick Search Box" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_N76yGvbMPVw/SWu4JjRD4aI/AAAAAAAAAFQ/kAQMLJeWLNo/s72-c/QSBscreen.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/01/search-without-effort-quick-search-box.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YCRno8eyp7ImA9WxVSFU4.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5285621218084696775</id><published>2009-01-09T11:58:00.000-08:00</published><updated>2009-01-09T14:12:47.473-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T14:12:47.473-08:00</app:edited><title>YouTube Upload Booth</title><content type="html">&lt;div style="color: #666666;"&gt;&lt;i&gt;By Jason Toff, Google Mac Team&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
In addition to the &lt;a href="http://google-latlong.blogspot.com/2009/01/flying-through-google-earth-at-macworld.html" target="_blank"&gt;Earth Surfer&lt;/a&gt; application, our Macworld booth also features a YouTube Upload Booth this year.&amp;nbsp; Several famed YouTubers stopped in the booth and used &lt;a href="http://www.youtube.com/my_videos_quick_capture" target="_blank"&gt;Quick Capture&lt;/a&gt; to upload their videos to the web.&amp;nbsp; For instance...&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=3AoF8m04-ss" target="_blank"&gt;Ijustine&lt;/a&gt; jumped in the moment she saw it.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=fUPvZYniqUE&amp;amp;NR=1" target="_blank"&gt;Chris Pirillo&lt;/a&gt; had some..ahem..difficulties at first but was able to make it work.&lt;br /&gt;
&lt;br /&gt;
And there were &lt;a href="http://www.youtube.com/results?search_query=macworld+youtube+booth+2009&amp;amp;search_type=&amp;amp;aq=f" target="_blank"&gt;many more&lt;/a&gt; &lt;a href="http://www.youtube.com/watch?v=14kOArLld-U" target="_blank"&gt;excited people&lt;/a&gt; ready to try it out!&amp;nbsp; Check out the video below to hear more about the YouTube booth:&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oKZZH_thjLY&amp;hl=en&amp;fs=1&amp;fmt=22"&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/oKZZH_thjLY&amp;hl=en&amp;fs=1&amp;fmt=22" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5285621218084696775?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=A3FpeIRU"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/ynFaQdvof-E" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5285621218084696775?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5285621218084696775?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/ynFaQdvof-E/youtube-upload-booth.html" title="YouTube Upload Booth" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/01/youtube-upload-booth.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYHRHg-eyp7ImA9WxVSFEs.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-4354090282289144048</id><published>2009-01-08T14:39:00.000-08:00</published><updated>2009-01-08T16:15:35.653-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-08T16:15:35.653-08:00</app:edited><title>Surf Through Google Earth</title><content type="html">&lt;i style="color: #666666;"&gt;By Jason Toff, Google Mac Team&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
This year for Macworld a Google engineer, David Phillip Oster, wrote a fun application that allows you to surf through Google earth.&amp;nbsp; Watch the video below and read more about it on the &lt;a href="http://google-latlong.blogspot.com/2009/01/flying-through-google-earth-at-macworld.html" target="_blank"&gt;Google Lat Long blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2U794gq3_IQ&amp;hl=en&amp;fs=1&amp;ap=%2526fmt%3D6"&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/2U794gq3_IQ&amp;hl=en&amp;fs=1&amp;ap=%2526fmt%3D6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-4354090282289144048?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=smgbjXbo"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/ptR-rmMA57w" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/4354090282289144048?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/4354090282289144048?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/ptR-rmMA57w/surf-through-google-earth.html" title="Surf Through Google Earth" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><feedburner:origLink>http://googlemac.blogspot.com/2009/01/surf-through-google-earth.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQEQ34-fyp7ImA9WxVSEko.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5614769266945850420</id><published>2009-01-06T11:05:00.000-08:00</published><updated>2009-01-06T13:28:22.057-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-06T13:28:22.057-08:00</app:edited><title>Macworld Has Arrived</title><content type="html">&lt;div style="color: black;"&gt;&lt;span style="font-style: italic;"&gt;By Jason Toff, Google Mac Team&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;After months of anticipation, Macworld is finally here!&amp;nbsp; We put the finishing touches on our booth yesterday and look forward to visits from many of the expected 40,000+ attendees.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: black; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Cb4VGgCESEA/SWPLJfWH7lI/AAAAAAAAPnw/yhnOcpqkvwc/s1600-h/new_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_Cb4VGgCESEA/SWPLJfWH7lI/AAAAAAAAPnw/yhnOcpqkvwc/s320/new_1.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;More than 100 Googlers across several teams-- including Picasa, Mobile, Geo, &amp;amp; YouTube-- will be staffing our booth throughout the four days of the expo (from now until Jan. 9).  We have plenty in store for our booth and plan to update this blog regularly-- so stay tuned.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: black; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Cb4VGgCESEA/SWPL6KnSdaI/AAAAAAAAPn4/Fz1fbxOoGHs/s1600-h/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_Cb4VGgCESEA/SWPL6KnSdaI/AAAAAAAAPn4/Fz1fbxOoGHs/s320/2.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;
If you're planning to attend, we hope you'll stop by to say hello!  And for those of you who can't make it or aren't in the area, we invite you to visit &lt;a href="http://google.com/macworld" target="_blank"&gt;google.com/macworld&lt;/a&gt; to explore Google's offerings for Mac and the iPhone.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="font-style: italic;"&gt;&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/29010370-5614769266945850420?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=RwBYi16I"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/221-I54N4TA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5614769266945850420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5614769266945850420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/221-I54N4TA/macworld-has-arrived.html" title="Macworld Has Arrived" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Cb4VGgCESEA/SWPLJfWH7lI/AAAAAAAAPnw/yhnOcpqkvwc/s72-c/new_1.JPG" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/01/macworld-has-arrived.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GQXc9fip7ImA9WxVSEk0.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-715082936912146969</id><published>2009-01-05T14:15:00.000-08:00</published><updated>2009-01-05T17:20:20.966-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-05T17:20:20.966-08:00</app:edited><title>Picasa's Macworld Debut</title><content type="html">&lt;span style="border-collapse: collapse;"&gt;&lt;i&gt;&lt;span style="color: #666666;"&gt;By Stuart Morgan, Software Engineer&lt;/span&gt;&lt;br /&gt;
&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="border-collapse: collapse;"&gt;Last year we had a blast at Macworld demonstrating all our Mac&amp;nbsp;products, but as Mac users, we also know that the best part of Macworld is&amp;nbsp;new product announcements. This year, we're getting in the spirit by&amp;nbsp;making a little announcement of our own: we're happy to say that&amp;nbsp;&lt;a href="http://picasa.google.com/mac/" id="x9lk" title="Picasa"&gt;Picasa&lt;/a&gt;, Google's photo management software, will be joining the ranks&amp;nbsp;of the free&amp;nbsp;&lt;a href="http://www.google.com/mac/" id="svp-" title="Mac OS X applications from Google"&gt;Mac OS X applications from Google&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
If you've never tried Picasa before, it's a program that helps you&amp;nbsp;manage, edit, and share your photo collection. It works especially&amp;nbsp;well with&amp;nbsp;&lt;a href="http://picasaweb.google.com/" id="p.0l" title="Picasa Web Albums"&gt;Picasa Web Albums&lt;/a&gt;, Google's free photo-sharing site, so it&amp;nbsp;can help you manage the photo albums you've shared online with friends&amp;nbsp;and family as well as the photos on your computer. In addition to&amp;nbsp;photo editing tools, the Picasa client includes features like&amp;nbsp;automatic web sync, fast and simple sharing, collage making, and&amp;nbsp;simple movie editing. And on the web side, Picasa Web Albums offers&amp;nbsp;unique features like name tags, which help you automatically organize&amp;nbsp;your photo collection based on the faces in each picture.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Cb4VGgCESEA/SWKLfGwY4lI/AAAAAAAAPXk/qNPwEflxbNw/s1600-h/Picasa_Uploading_blogsize.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Cb4VGgCESEA/SWKLfGwY4lI/AAAAAAAAPXk/qNPwEflxbNw/s320/Picasa_Uploading_blogsize.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;br /&gt;
You'll notice that Picasa for Mac is still in Google Labs and has&amp;nbsp;a "beta" label attached—a few minor features like geotagging and webcam capture aren't functional yet, and we plan to sand and polish some parts of the user interface to make sure Picasa feels right at home on Mac OS X. Still, we think you'll find plenty to like in this first beta, and&amp;nbsp;we're excited to get this release out into the hands of the&amp;nbsp;Mac community at this year's Macworld! We're looking forward to making&amp;nbsp;Picasa for the Mac even better, and to hearing what you think — Picasa engineers will be at the Google booth's demo stations&amp;nbsp;throughout Macworld, and we always listen to the feedback on our&amp;nbsp;&lt;a href="http://www.google.com/support/forum/p/Picasa?hl=en" id="ywtw" title="Help Forum"&gt;Help Forum&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
There's plenty more to say about Picasa on the Mac, so check out the&amp;nbsp;video below, swing by the&amp;nbsp;&lt;a href="http://googlephotos.blogspot.com/" id="fo.g" title="Google Photos blog"&gt;Google Photos blog&lt;/a&gt;&amp;nbsp;to learn more and&amp;nbsp;download a copy to play with—and of course, come see us at Macworld!&lt;br /&gt;
&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NDKFjc3_wrk&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/NDKFjc3_wrk&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-715082936912146969?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=kLzovMXi"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/daj07Kk56Bk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/715082936912146969?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/715082936912146969?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/daj07Kk56Bk/picasas-macworld-debut.html" title="Picasa's Macworld Debut" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Cb4VGgCESEA/SWKLfGwY4lI/AAAAAAAAPXk/qNPwEflxbNw/s72-c/Picasa_Uploading_blogsize.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/01/picasas-macworld-debut.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcBRHg5fSp7ImA9WxVTFUU.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5350712055688349846</id><published>2008-12-29T14:00:00.000-08:00</published><updated>2008-12-29T14:00:55.625-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-29T14:00:55.625-08:00</app:edited><title>One Week Until Macworld</title><content type="html">&lt;div style="color: #666666;"&gt;&lt;span style="font-style: italic;"&gt;By Jason Toff, Google Mac Team&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
With one week until the start of Macworld, we wanted to give you a glimpse of what to expect at Google's booth.&lt;br /&gt;
&lt;br /&gt;
At any given time, there will be plenty of Googlers at our booth available to answer questions about any Google software made for Mac or iPhone.&amp;nbsp; Demo stations will be placed throughout the booth so that attendees can try out Google software on their own, and in many cases, talk to the people who helped create that software.&lt;br /&gt;
&lt;br /&gt;
Additionally, there will be larger presentations in the booth each day covering specific topics in more depth.&amp;nbsp; Our goal is to make these presentations as interactive as possible, so we are hoping for feedback from Macworld attendees in the booth on the topics they'd like to see discussed.&lt;br /&gt;
&lt;br /&gt;
We are very excited about Macworld and hope that you'll stop by our booth if you're in the area!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5350712055688349846?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=LgWPjJup"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/ZTIIJeO7p6g" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5350712055688349846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5350712055688349846?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/ZTIIJeO7p6g/one-week-until-macworld.html" title="One Week Until Macworld" /><author><name>Jason Toff</name><uri>http://www.blogger.com/profile/10147144638183086328</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="08724365987937309426" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/12/one-week-until-macworld.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYFSH87fCp7ImA9WxRbF0U.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5597279182744723951</id><published>2008-12-08T16:37:00.000-08:00</published><updated>2008-12-08T16:38:39.104-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-08T16:38:39.104-08:00</app:edited><title>Google at Macworld Expo</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Jason Toff, Google Mac Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm thrilled to officially announce Google's presence at the upcoming &lt;a href="http://www.macworldexpo.com/" id="rvjz" title="Macworld Expo"&gt;Macworld Expo&lt;/a&gt; (taking place January 5-9, 2009). We had a great time last year (see picture of our booth below), and we're excited to share our range of offerings for Mac and iPhone with everyone who can make it this year.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt; With exactly one month to go, we are busy preparing fun demonstrations for the 50,000+ expected Macworld attendees. Stay tuned in the coming weeks for previews of what to expect this time.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_N76yGvbMPVw/ST232aMikVI/AAAAAAAAAE4/kMBcACFbyqI/s1600-h/IMG_5990.JPG"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_N76yGvbMPVw/ST232aMikVI/AAAAAAAAAE4/kMBcACFbyqI/s320/IMG_5990.JPG" alt="" id="BLOGGER_PHOTO_ID_5277576483720827218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And if you'd like to come see us and don't yet have a pass to Macworld, use this link and code for 20% off the Expo Hall pass.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.macworldexpo.com/register"&gt;&lt;img style="cursor: pointer; width: 400px; height: 80px;" src="http://4.bp.blogspot.com/_N76yGvbMPVw/ST24M8Xt1JI/AAAAAAAAAFA/b_KGF9vRcO8/s400/google+blog1.jpg" alt="" id="BLOGGER_PHOTO_ID_5277576870851630226" border="0"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5597279182744723951?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=S6JU8AfH"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/6IrbB4d0BqQ" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5597279182744723951?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5597279182744723951?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/6IrbB4d0BqQ/google-at-macworld-expo.html" title="Google at Macworld Expo" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_N76yGvbMPVw/ST232aMikVI/AAAAAAAAAE4/kMBcACFbyqI/s72-c/IMG_5990.JPG" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2008/12/google-at-macworld-expo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUFRXszfip7ImA9WxRbF0U.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-837411725009402827</id><published>2008-12-08T14:34:00.000-08:00</published><updated>2008-12-08T16:56:54.586-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-08T16:56:54.586-08:00</app:edited><title>Bringing Your Photos Home</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Greg Robbins, Software Engineer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Picasa Web Albums Uploader makes it easy to share your photos and videos with friends and family. But occasionally you may want to use it in reverse, and download an album back to your computer. If you've ever had a hard drive crash or had to work from a new computer, you know how important it is to get your photos back.&lt;br /&gt;&lt;br /&gt;The latest release of the Picasa Web Albums Uploader application makes downloading photos as easy as uploading. After you sign in to your account, select the Existing Album tab, choose an album and click the Download Album button. You'll soon have copies of your photos in a new folder on your Mac.&lt;br /&gt;&lt;br /&gt;If your copy of the Picasa Web Albums Uploader hasn't updated itself to the latest version, 1.3, you can get it now from the &lt;a title="download page" href="http://picasa.google.com/mac_tools.html" id="iyyn"&gt;download page&lt;/a&gt;. The album download feature is available only in the Picasa Web Albums Uploader application, not in the iPhoto Exporter. This release downloads photos, but not yet videos. You can give us feedback about the uploaders at the &lt;a title="Picasa Help forum" href="http://www.google.com/support/forum/p/Picasa" id="qj_v"&gt;Picasa Help forum&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-837411725009402827?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=h5CnttQS"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/DFNhDqIsVNw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/837411725009402827?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/837411725009402827?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/DFNhDqIsVNw/bringing-your-photos-home.html" title="Bringing Your Photos Home" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/12/bringing-your-photos-home.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcESX08eSp7ImA9WxRbFE0.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-983246797719821181</id><published>2008-12-04T08:25:00.000-08:00</published><updated>2008-12-04T08:26:48.371-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-04T08:26:48.371-08:00</app:edited><title>Google Earth Browser Plugin</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Scott Knaster, Google Mac Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The very cool Google Earth Browser Plugin is now available for Mac OS X. Read all about it in our &lt;a href="http://googlegeodevelopers.blogspot.com/2008/12/google-earth-in-your-browser-on-your.html"&gt;Geo Developers Blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-983246797719821181?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=nF2GMpBj"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/KlUElv5DNgo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/983246797719821181?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/983246797719821181?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/KlUElv5DNgo/google-earth-browser-plugin.html" title="Google Earth Browser Plugin" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/12/google-earth-browser-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQHSX44eCp7ImA9WxRbE0s.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-3255576370420021020</id><published>2008-12-03T20:00:00.000-08:00</published><updated>2008-12-03T20:02:18.030-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-03T20:02:18.030-08:00</app:edited><title>Google.com/mac now available in 10 languages</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Jason Toff, Associate Product Marketing Manager, Google Mac Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As a new member of the Google Mac team and a diehard Apple and Google fan, there are few places on the web that get me as excited as &lt;a title="google.com/mac" href="http://www.google.com/mac" id="bqt3"&gt;google.com/mac&lt;/a&gt;. But until now, non-English speakers had been unable to view this page in their native languages.&lt;br /&gt;&lt;br /&gt;Today, I'm happy to let you know that many more people all over the world can take advantage of google.com/mac, as it is now available in 10 languages: &lt;a title="German" href="http://www.google.de/mac" id="lyy-"&gt;German&lt;/a&gt;, &lt;a title="Spanish" href="http://www.google.es/mac" id="a58p"&gt;Spanish&lt;/a&gt;, &lt;a title="French" href="http://www.google.fr/mac" id="v286"&gt;French&lt;/a&gt;, &lt;a title="Italian" href="http://www.google.it/mac" id="sqg7"&gt;Italian&lt;/a&gt;, &lt;a title="Dutch" href="http://www.google.nl/mac" id="xy6x"&gt;Dutch&lt;/a&gt;, &lt;a title="British English" href="http://www.google.co.uk/mac" id="z8dz"&gt;British English&lt;/a&gt;, &lt;a title="American English" href="http://www.google.com/mac" id="ew.g"&gt;American English&lt;/a&gt;, &lt;a title="Japanese" href="http://www.google.co.jp/mac" id="tc0p"&gt;Japanese&lt;/a&gt;, &lt;a title="Chinese" href="http://www.google.cn/mac" id="zd:d"&gt;Chinese&lt;/a&gt;, and &lt;a title="Taiwanese" href="http://www.google.com/intl/zh-TW/mac/" id="ojpt"&gt;Taiwanese&lt;/a&gt;. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-3255576370420021020?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=r04EeFGQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/YdwerwX9YaM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/3255576370420021020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/3255576370420021020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/YdwerwX9YaM/googlecommac-now-available-in-10.html" title="Google.com/mac now available in 10 languages" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/12/googlecommac-now-available-in-10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8GQX07fSp7ImA9WxRbEUo.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5527917723989355637</id><published>2008-12-01T16:46:00.000-08:00</published><updated>2008-12-01T16:47:00.305-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-01T16:47:00.305-08:00</app:edited><title>Google Calendar now supports Apple iCal</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By David Besbris, Engineering Director&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Google Calendar team is proud to &lt;a title="announce" href="http://gmailblog.blogspot.com/2008/11/syncing-your-google-calendar.html" id="z0_v"&gt;announce&lt;/a&gt; the public release of our support for the CalDAV protocol. You can now use Apple iCal with your Google Calendar, so you can work even when you're offline, sync almost instantly, respond to invitations from others and see the free/busy data of your friends and coworkers.&lt;br /&gt;&lt;br /&gt;We launched CalDAV support to our developers last July for feedback, and since that time a few of us whipped up a nifty &lt;a title="setup program for iCal" href="http://code.google.com/p/calaboration/" id="qii-"&gt;setup program for iCal&lt;/a&gt;. This tool makes it a breeze to get iCal working with your Google account. We've released this as open source and the program is available for &lt;a title="download" href="http://code.google.com/p/calaboration/downloads/list" id="p2_t"&gt;download&lt;/a&gt; at our Google Code site. &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5527917723989355637?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=tMxCGE0m"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/Cen-544p19k" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5527917723989355637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5527917723989355637?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/Cen-544p19k/google-calendar-now-supports-apple-ical.html" title="Google Calendar now supports Apple iCal" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/12/google-calendar-now-supports-apple-ical.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcFRXg8cSp7ImA9WxRUEEg.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-6658466110016256652</id><published>2008-11-18T15:44:00.000-08:00</published><updated>2008-11-18T15:46:54.679-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-18T15:46:54.679-08:00</app:edited><title>Vocito (Voe-kee-toe)*</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Dave MacLachlan, Google Mac Team&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Times;"&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;For those of you who are lucky enough to be be part of the &lt;a id="qr3j" href="http://www.grandcentral.com/" title="GrandCentral Beta Program"&gt;GrandCentral Beta Program&lt;/a&gt;, there's a new toy on the Google Mac Playground. &lt;a id="s82t" href="http://code.google.com/p/vocito/" title="Vocito"&gt;Vocito&lt;/a&gt;* is a quick dialer that lets you dial your phone directly from your desktop.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_N76yGvbMPVw/SSNR-aLiySI/AAAAAAAAADo/qy_gU36PKaE/s1600-h/File.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://1.bp.blogspot.com/_N76yGvbMPVw/SSNR-aLiySI/AAAAAAAAADo/qy_gU36PKaE/s400/File.png" alt="" id="BLOGGER_PHOTO_ID_5270146121575090466" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center; margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;a id="zrzb" href="http://code.google.com/p/vocito/" title="Vocito"&gt;Vocito&lt;/a&gt; is also integrated into Address Book, &lt;a id="uo3z" href="http://www.blacktree.com/" title="QuickSilver"&gt;QuickSilver&lt;/a&gt;, and &lt;a id="miyr" href="http://automator.us/leopard/index.html" title="Automator"&gt;Automator&lt;/a&gt;, and is fully &lt;a id="ic5r" href="http://developer.apple.com/applescript/" title="AppleScriptable"&gt;AppleScriptable.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_N76yGvbMPVw/SSNSL9pXQvI/AAAAAAAAADw/euUDJkINtBA/s1600-h/File-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 245px;" src="http://4.bp.blogspot.com/_N76yGvbMPVw/SSNSL9pXQvI/AAAAAAAAADw/euUDJkINtBA/s400/File-1.png" alt="" id="BLOGGER_PHOTO_ID_5270146354433704690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_N76yGvbMPVw/SSNSMHeNd9I/AAAAAAAAAD4/oc_Ln657CEg/s1600-h/File-2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 205px;" src="http://3.bp.blogspot.com/_N76yGvbMPVw/SSNSMHeNd9I/AAAAAAAAAD4/oc_Ln657CEg/s400/File-2.png" alt="" id="BLOGGER_PHOTO_ID_5270146357071280082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;The AppleScript connection makes it easy to have Vocito automatically dial your phone from just about any application that supports scripting or Automator actions. For example, you can easily set up your iCal meeting appointment to automatically dial the conference call for you at the correct time.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Since &lt;a id="nfda" href="http://www.grandcentral.com/" title="GrandCentral"&gt;GrandCentral&lt;/a&gt; is currently in a limited beta, we don't have any more invites to hand out right now. So those of you without a &lt;a id="u8l7" href="http://www.grandcentral.com/" title="GrandCentral"&gt;GrandCentral&lt;/a&gt; number don't get to play just yet, so please &lt;a id="pq5e" href="http://www.grandcentral.com/home/reserve" title="please reserve your number now"&gt;reserve your number now&lt;/a&gt; to get in on the action as soon as more invites become available.&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;a id="p4vb" href="http://code.google.com/p/vocito/downloads/list" title="Vocito is available here for download"&gt;Vocito is available here for download&lt;/a&gt;. It works on Tiger and Leopard, is both PowerPC and Intel native, and is fully open sourced. There is a discussion group at &lt;a id="vxu4" href="http://groups.google.com/group/vocito-discuss" title="vocito-discuss on Google Groups"&gt;vocito-discuss on Google Groups&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px;"&gt;* Vocito is "call" in Latin. According to most scholars, Latin speakers used a hard 'c' (sounds like an English 'k') as opposed to the soft 'c' (sounds like an English 'ch') used by Italians and the&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;/span&gt; Catholic Church. We decided to go with the hard 'c' to give us some street cred with all the Latin scholars out there. If it was good enough for &lt;a id="i8en" href="http://www.youtube.com/watch?v=93-oH5K0x24" title="Julie"&gt;Julie&lt;/a&gt;, it's good enough for us.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-6658466110016256652?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=rOmBlgKu"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/m_sJHrn3e60" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/6658466110016256652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/6658466110016256652?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/m_sJHrn3e60/vocito-voe-kee-toe.html" title="Vocito (Voe-kee-toe)*" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_N76yGvbMPVw/SSNR-aLiySI/AAAAAAAAADo/qy_gU36PKaE/s72-c/File.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2008/11/vocito-voe-kee-toe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4ERX0yeCp7ImA9WxRVGUo.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5129083586703517914</id><published>2008-11-14T11:47:00.001-08:00</published><updated>2008-11-17T17:48:24.390-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-17T17:48:24.390-08:00</app:edited><title>Just say it! Searching by voice with the new Google Mobile App for iPhone</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;Posted by Bill Byrne, Mobile UI Witch, Google&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Call me lazy, but sometimes I just don't have the time or the patience to type a search query on my iPhone. Well, no more excuses. With the new release of the Google Mobile App for iPhone, I can just hold the phone to my ear, wait for the tone and say stuff like "Indian restaurants." And just like that, I'm looking at a bunch of places that will easily satisfy my craving.&lt;br /&gt;&lt;br /&gt;And, of course, while I'm enjoying my Tandoori chicken, I can use the voice search feature to settle important disputes with my friends without ever having to lift a finger. I say "lyrics to Purple Haze" and Google quickly proves I was right. Ha ha! "How much wood COULD a woodchuck chuck?" I knew it! "Where HAVE all the flowers gone?"  Wow. Didn't know that one.&lt;br /&gt;&lt;br /&gt;The new release can also make use of my current location when I search. So whether I'm in San Francisco, Chicago, or New York City, "Indian restaurants" is all I have to say to get my next Tandoori chicken fix.&lt;br /&gt;&lt;br /&gt;Just remember not to search with your mouth full. It's going to be harder now, for sure.&lt;br /&gt;&lt;br /&gt;To get the latest Google Mobile App for iPhone, go to the App Store and search for "Google Mobile App." Note that voice search will be enabled by default for U.S. English users only. You can learn more about the new Google Mobile App for iPhone on the &lt;a href="http://googlemobile.blogspot.com/2008/11/google-mobile-app-for-iphone-now-with.html"&gt;Google mobile blog&lt;/a&gt; and by watching this overview video:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/uZapF6fqz8M&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/uZapF6fqz8M&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5129083586703517914?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=juAasMhs"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/IEOixLmoPPM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5129083586703517914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5129083586703517914?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/IEOixLmoPPM/just-say-it-searching-by-voice-with-new.html" title="Just say it! Searching by voice with the new Google Mobile App for iPhone" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/11/just-say-it-searching-by-voice-with-new.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcFQHo-cCp7ImA9WxRWEU8.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-6365717688724905027</id><published>2008-10-27T09:12:00.000-07:00</published><updated>2008-10-27T09:13:31.458-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-27T09:13:31.458-07:00</app:edited><title>Google Earth for iPhone</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Scott Knaster, Google Mac Team&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Google Earth is now available for the iPhone! And it's free, of course. Read all about it at the &lt;a href="http://googlemobile.blogspot.com/2008/10/google-earth-now-available-for-iphone.html"&gt;Google Mobile Blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-6365717688724905027?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=OBD1wXh2"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/ZmSly8DMWtg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/6365717688724905027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/6365717688724905027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/ZmSly8DMWtg/google-earth-for-iphone.html" title="Google Earth for iPhone" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/10/google-earth-for-iphone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEGRX0_eSp7ImA9WxRXGE0.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-1311056293438283151</id><published>2008-10-23T17:03:00.001-07:00</published><updated>2008-10-23T17:03:44.341-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-23T17:03:44.341-07:00</app:edited><title>Your data, on the web and at your fingertips</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Greg Robbins, Google Mac Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More of Google's web services are allowing you to manage your personal information. Since the freedom to access and control your data is one of our core principles, Google Data APIs are keeping up with the personalization trend. &lt;a title="Google Book Search" href="http://books.google.com/" id="hxq0"&gt;Google Book Search&lt;/a&gt;, for example, lets you keep track of your own library of favorite books. The &lt;a title="Book Search API" href="http://googledataapis.blogspot.com/2008/09/new-google-data-api-for-book-search.html" id="n:q9"&gt;Book Search Data API&lt;/a&gt; helps developers create applications that give you access to your library, including the books you've reviewed online. Similarly, there is now an API for &lt;a title="Google Finance" href="http://code.google.com/apis/finance/" id="ajpg"&gt;Google Finance&lt;/a&gt;, so developers can create software that lets you keep tabs on the portfolio you've set up with Google Finance. Or if you prefer, you can make up a portfolio of the investments that you &lt;i&gt;wish&lt;/i&gt; you had, and follow that instead of your actual savings.&lt;br /&gt;&lt;br /&gt;The Book Search and Finance Data APIs are part of the new version 1.5 release of the the &lt;a title="Google Data APIs Objective-C Client Library" href="http://code.google.com/p/gdata-objectivec-client/" id="i6nh"&gt;Google Data APIs Objective-C Client Library&lt;/a&gt;. Along with support for the new services, software developers will find this release of the library offers better compatibility and parsing performance for iPhone applications, and 64-bit compatibility for Mac desktop applications. I hope that this release encourages even more developers to take advantage of Google's services as a part of their applications.&lt;br /&gt;&lt;br /&gt;If you would like to see the other open source toys that our Mac team has built for Mac users and developers, please take a look at our &lt;a title="playground" href="http://code.google.com/mac/" id="fx_j"&gt;Playground&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-1311056293438283151?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?a=5YoyO7Ik"&gt;&lt;img src="http://feeds.feedburner.com/~f/OfficialGoogleMacBlog?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/OfficialGoogleMacBlog/~4/RzFXTfglSIo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/1311056293438283151?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/1311056293438283151?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/RzFXTfglSIo/your-data-on-web-and-at-your-fingertips.html" title="Your data, on the web and at your fingertips" /><author><name>Scott Knaster</name><uri>http://www.blogger.com/profile/08082237075114304127</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14571934712626145078" /></author><feedburner:origLink>http://googlemac.blogspot.com/2008/10/your-data-on-web-and-at-your-fingertips.html</feedburner:origLink></entry></feed>
