<?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;A0MHRng4eip7ImA9WxNVGE4.&quot;"><id>tag:blogger.com,1999:blog-29010370</id><updated>2009-10-29T11:03:57.632-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="hub" href="http://pubsubhubbub.appspot.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>113</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" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;AkMNSXkyfip7ImA9WxNVGE4.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-3739399304260440194</id><published>2009-10-29T10:47:00.000-07:00</published><updated>2009-10-29T10:48:18.796-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T10:48:18.796-07:00</app:edited><title>New auto-expanding compose boxes in Gmail for iPhone</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Scott Knaster, Mac Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gmail for iPhone has a new feature: auto-expanding compose boxes. This means that when you're writing a new message and you reach the bottom of the compose box, the box now gets bigger automatically. And you can now scroll through the whole message just by flicking – no need to use the magnifying glass any more.&lt;br /&gt;&lt;br /&gt;For all the details, see &lt;a href="http://googlemobile.blogspot.com/2009/10/iterative-web-app-auto-expanding.html"&gt;this post on the 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-3739399304260440194?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=bB3ePUfSCU0:a0HUsj5IZUo: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/bB3ePUfSCU0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/3739399304260440194?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/3739399304260440194?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/bB3ePUfSCU0/new-auto-expanding-compose-boxes-in.html" title="New auto-expanding compose boxes in Gmail 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/2009/10/new-auto-expanding-compose-boxes-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QEQH89eCp7ImA9WxNQFkg.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-2413107416610599824</id><published>2009-09-22T13:00:00.000-07:00</published><updated>2009-09-22T13:28:21.160-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T13:28:21.160-07:00</app:edited><title>New face-tagging, iPhoto compatibility, &amp; more Mac-friendly features in Picasa 3.5</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Todd Bogdan, Software Engineer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Today, I'm happy to announce that &lt;a href="http://googlephotos.blogspot.com/2009/09/announcing-picasa-35-now-with-name-tags.html"&gt;we're releasing Picasa 3.5&lt;/a&gt;, a new version of our free photo editing software. Since we &lt;a href="http://googlephotos.blogspot.com/2009/01/announcing-picasa-for-mac.html"&gt;launched&lt;/a&gt; it as a beta Labs product 9 months ago, we've been steadily improving Picasa for Mac. Now that it has almost all the same features as the PC version, we've decided it's time to remove the beta label once and for all.&lt;br /&gt;&lt;br /&gt;If you haven't tried Picasa for Mac, the new version gives you the ability to add name tags to your photos so that you organize them by what matters most: people. Picasa groups similar faces and lets you easily add a name tag to dozens of photos at once. After you've tagged some photos with names, you can do creative things with your tagged photos, like quickly finding all the photos with the same two people in them, making a face collage for a friend, or simply uploading and sharing people albums.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_N76yGvbMPVw/Srj4o5ftxxI/AAAAAAAAAGg/MACycKvjI4U/s1600-h/cc8c38qf_31frnj8bdw_b.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 119px;" src="http://3.bp.blogspot.com/_N76yGvbMPVw/Srj4o5ftxxI/AAAAAAAAAGg/MACycKvjI4U/s400/cc8c38qf_31frnj8bdw_b.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5384326736033728274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In addition to name tags, Picasa 3.5 has integrated Google Maps so you can more easily geotag your photos. And using our redesigned import process, you can now import photos from your camera and upload selected photos to Picasa Web Albums in one easy step.&lt;br /&gt;&lt;br /&gt;Of course, Picasa for Mac is also designed to "play nice" with iPhoto, taking a special read-only approach to editing photos stored in the iPhoto library. It duplicates instead of changing files as needed, so your iPhoto library isn't ever affected when you use Picasa.&lt;br /&gt;&lt;br /&gt;Picasa 3.5 is available in English (for now; more languages to come). You can download and try it today at &lt;a href="http://picasa.google.com/"&gt;picasa.google.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-2413107416610599824?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=3rrK6GaS3JI:j_1aY9bD-TI: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/3rrK6GaS3JI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/2413107416610599824?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/2413107416610599824?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/3rrK6GaS3JI/new-face-tagging-iphoto-compatibility.html" title="New face-tagging, iPhoto compatibility, &amp; more Mac-friendly features in Picasa 3.5" /><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/Srj4o5ftxxI/AAAAAAAAAGg/MACycKvjI4U/s72-c/cc8c38qf_31frnj8bdw_b.jpeg" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/09/new-face-tagging-iphoto-compatibility.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMESXo9eSp7ImA9WxNSGEk.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-4392899276952439705</id><published>2009-09-01T14:56:00.001-07:00</published><updated>2009-09-01T15:00:08.461-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-01T15:00:08.461-07:00</app:edited><title>Improved Contact Sync in Snow Leopard</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 May 2008, &lt;a title="we told you" href="http://googlemac.blogspot.com/2008/05/mac-os-x-1053-sync-google-contacts.html" id="h3fs"&gt;we told you&lt;/a&gt; how iPhone and iPod touch users could sync their Gmail contacts with Address Book in Mac OS X 10.5. Now with Mac OS X 10.6, syncing Gmail contacts is also available to users who do not have an iPhone or iPod touch. If your Mac is running Snow Leopard, you can turn on contact sync in the Address Book preferences.&lt;br /&gt;&lt;br /&gt;The syncing is better, too: in Mac OS X 10.6, only contacts in Gmail's "My Contacts" group are synced, rather than all of Gmail's contact suggestions. And photos are now transferred as well, since sometimes you just need to put a face to a name.&lt;br /&gt;&lt;br /&gt;Before turning on contact sync, it's a good idea to back up your Gmail and Address Book contacts. Our &lt;a title="FAQ page" href="http://www.google.com/support/contactsync/" id="bzur"&gt;help page&lt;/a&gt; explains how to do that, and covers a bit more on how contact sync works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-4392899276952439705?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=c1dAgqvDREM:DBx7NWoPWeo: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/c1dAgqvDREM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/4392899276952439705?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/4392899276952439705?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/c1dAgqvDREM/improved-contact-sync-in-snow-leopard.html" title="Improved Contact Sync in Snow Leopard" /><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/09/improved-contact-sync-in-snow-leopard.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUERHs-eyp7ImA9WxNSEU4.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-5703418413004756075</id><published>2009-08-24T11:05:00.000-07:00</published><updated>2009-08-24T11:06:45.553-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T11:06:45.553-07:00</app:edited><title>WWDC 2009 journal (part 2)</title><content type="html">by Mike Morton, Google Mac Team&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Every year, Google engineer Mike Morton becomes intrepid reporter Mike Morton as he ventures to Apple's Worldwide Developer Conference. Apple doesn't allow attendees to disclose the technical bits of the conference, so Mike writes about other important observations and details: general survival tips for the week, how to figure out in advance when the conference will be held, and insight into how WWDC is like the Soviet Union. Once you've read &lt;a href="http://googlemac.blogspot.com/2009/08/wwdc-2009-journal-part-1.html"&gt;part 1&lt;/a&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;of Mike's annual report&lt;/span&gt;&lt;span style="font-style: italic;"&gt;, you can continue to the thrilling conclusion here in part 2.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;b&gt;Between the lines&lt;/b&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Wednesday morning, I discovered the gym in the corporate apartments, and found that 20 minutes on the elliptical goes a lot faster when there’s no TV intruding.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Eating the minimalist breakfast provided at Moscone, I looked over a web page of WWDC-related parties. I think I’m probably too old to go to a club called “Harlot”. In fact, I’m even too old for the music they play before sessions; there's nothing that was written before the turn of the millennium. Several other folks commented that they didn’t think much of the music either. I told them about my neighbor’s bumper sticker: “It’s Not That I’m Old. Your Music Really Does Suck.”&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Two guys at the breakfast table seemed to be forming a business on the spot. They weren’t too far along, though: one said to the other, “Let me give you my card”, ripped a page from a notebook, and wrote his contact info on it.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;The session rooms were the same size as last year, but with more people trying to crowd in. The poor Apple engineers, who don’t get to go in until all the paying customers have, must have been even more frustrated this year. I wonder how Apple will handle the growth next year. Some rumors claimed that this is the last year at Moscone, that Apple has met some contractual obligation.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Despite the larger crowds, there seemed to be more power outlets in the sessions. You can often spot clusters of them from a distance — those seats are more densely filled. I went the whole week without having to pull the spare battery from my pack, a first.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div id="iw4c" style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_N76yGvbMPVw/SpLRINGdy2I/AAAAAAAAAF4/OO-ewdwVt3E/s1600-h/File.jpg"&gt;&lt;img style="cursor: pointer; width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_N76yGvbMPVw/SpLRINGdy2I/AAAAAAAAAF4/OO-ewdwVt3E/s320/File.jpg" alt="" id="BLOGGER_PHOTO_ID_5373587244292361058" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: center; margin-left: 0pt; margin-right: 0pt;"&gt;Nerdvana! &lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;For me this year, the most interesting part of the week was in the labs, not the sessions. Apple said that they brought in over 1,000 of their engineers, and I can believe it. Lots of attendees (n00bies and not) queue up for help from an Apple expert in the area they need help with. At one point, an iPhone performance engineer was helping one person, with four others (including me) in line with questions.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Attendees lined up for other things, too: to get good seats for sessions, for snack tables set up between sessions, for the fridges with Odwalla juice. It felt a little like the old Soviet economy: you see a line and you figure it must be worth waiting in. Of course, the Soviet strategy has its downside: you might find that the line turns out to be a bunch of Apple engineers waiting to see if a session has seats.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt; font-weight: bold;"&gt;iPhones everywhere&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Walking to Moscone, I noticed just how many iPhones there are in the city, and not just near the conference. Maybe this platform really is as big a deal as Apple keeps telling us. I think I saw more iPhones than Zipcars, which are also plentiful.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Earlier, I mentioned the importance of the labs for one-on-one access to helpful Apple engineers, but I should say that most sessions were good, too. Sitting for that many hours was tiring – when will they introduce premium seating? I’d pay more for Herman Miller – but mostly worth it. The only time it’s not worth it is when the talk is too elementary or too advanced. Alas, that does happen. Apple has a difficult challenge because attendees have experience ranging from near-zero up to decades of &lt;a href="http://en.wikipedia.org/wiki/Cocoa_%28API%29"&gt;Cocoa&lt;/a&gt; development. It’s a balancing act, and Apple did it fairly well. At least as an old-timer I thought they did. I wonder what newcomers think. All those folks focusing on their laptops in sessions: are they tuned out, or just trying the examples from the session?&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Even though some sessions miss the mark, the week as a whole is useful. I think the importance of this conference is demonstrated by a Googler I know who doesn’t work with Apple products enough to justify Google sending him, so he took a week of vacation and paid his own conference fee and travel expenses just to go.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt; font-weight: bold;"&gt;Show’s Over&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;I confess I blew off the last day of the conference to go to my godson’s college graduation. In the BART station, waiting for a train to the airport, I chatted with someone who was also skipping the last day of his conference, some non-Apple thing. We agreed that the last day is usually the most boring, and that we felt sorry for anyone who has to speak on the last day.&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt;"&gt;Sitting on the flight home, I had to focus on work because, again, I had no window. I tried to go through all my notes. It was a frantic week, and I had notes in my laptop, in my iPhone, in emails to my team, on scraps of paper big and small, and it was good that I made those notes, because the conference feeds me so much information, I for one have to write it down or lose it. Now it was time to look at all the cool new things in the OS and the hardware and figure out how and when we can take advantage of them!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5703418413004756075?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=WX0OWOLkulo:YvITkMLytRY: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/WX0OWOLkulo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5703418413004756075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/5703418413004756075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/WX0OWOLkulo/wwdc-2009-journal-part-2.html" title="WWDC 2009 journal (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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_N76yGvbMPVw/SpLRINGdy2I/AAAAAAAAAF4/OO-ewdwVt3E/s72-c/File.jpg" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/08/wwdc-2009-journal-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4NR3c9eCp7ImA9WxNSFEw.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-8687359182386426993</id><published>2009-08-17T14:02:00.000-07:00</published><updated>2009-08-27T15:43:16.960-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-27T15:43:16.960-07:00</app:edited><title>WWDC 2009 journal (part 1)</title><content type="html">by Mike Morton, Google Mac Team&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Every year, Google engineer Mike Morton becomes intrepid reporter Mike Morton as he ventures to Apple's Worldwide Developer Conference. Apple doesn't allow attendees to disclose the technical bits of the conference, so he writes about other important observations and details: general survival tips for the week, how to figure out in advance when the conference will be held, and insight into how WWDC is like the Soviet Union. Here's part 1 of Mike's annual report.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;When’s vacation? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For one week this past June, it was unusually hard to get your AT&amp;amp;T cell phone to work if you got too near San Francisco’s &lt;a href="http://www.moscone.com/"&gt;Moscone Center&lt;/a&gt;. Over five thousand Apple developers came from around the world to learn about Apple’s latest news at the Worldwide Developer Conference (WWDC). Most of them had iPhones, and to make up for the few who didn’t, some folks brought more than one. You could usually place a call, but most of my incoming calls never rang.&lt;br /&gt;&lt;br /&gt;I had planned my summer carefully, scheduling vacations and other events to make sure I wouldn’t miss the conference. Advance planning is difficult, because Apple doesn’t announce the dates very far ahead of time. My partner works as a counselor in an elementary school, so summer months are precious. This year, I thought of a way to help me plan: I guessed that the conference would again be in Moscone West, and watched Moscone’s web site to see when it was booked. When I saw something like an orthodontists' convention at Moscone West, overlapping even part of the week, I knew we could consider that week for vacation, not WWDC.&lt;br /&gt;&lt;br /&gt;Of course, Apple is smarter (and more secretive) than that. They booked Moscone West way in advance, but had Moscone list it as “Corporate Event” until Apple announced the date. Luckily, I didn’t plan my vacation during that Corporate Event week. Now that I’ve spilled the beans, they’ll have to pick a new name to pre-book under. Probably “Orthodontists' Convention”.&lt;br /&gt;&lt;br /&gt;Having planned my summer perhaps more thoroughly than needed, I sat on the plane to California, thinking about the usual rumors that precede any Apple event. (I had to think about the rumors: my seat on the 757 had no window for watching the Rockies go by.) There was lots of speculation about both iPhone and desktop models, but I was mostly curious about something else: would Steve Jobs address the troops, even briefly, weeks before his medical leave was scheduled to end?&lt;br /&gt;&lt;br /&gt;I checked into my corporate apartment (my first time in one; it was, well, corporate) and walked 20 minutes to Moscone to register. To my horror, I had forgotten that they would hand me &lt;a href="http://en.wikipedia.org/wiki/Tchotchke"&gt;tchotchkes&lt;/a&gt;. Nothing much, just the usual t-shirt and backpack. But I was traveling for 15 days with nothing but carry-on luggage, with not a cubic centimeter of room to spare. An Apple staffer saw my face fall. Perhaps she figured I was thinking “yet another backpack”? She burbled, “This one’s a Brenthaven!” It is indeed a very nice pack, and I quickly found a new home for it on the west coast. Perhaps next year they’ll give out iPhone cozies instead and I’ll have room to bring one home.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lining up&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_N76yGvbMPVw/Som838oddxI/AAAAAAAAAFw/WSfqKYs57_Q/s1600-h/File.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_N76yGvbMPVw/Som838oddxI/AAAAAAAAAFw/WSfqKYs57_Q/s320/File.jpeg" alt="" id="BLOGGER_PHOTO_ID_5371031699970684690" border="0" /&gt;&lt;/a&gt;No, I didn't sleep under the bridge&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;On Monday I woke before my alarm, and got to Moscone a little after 5:30 a.m. I asked one of the first dozen people how early he had been there. “Midnight!” Thinking of Keith Laumer’s short story &lt;span style="font-style: italic;"&gt;In The Queue&lt;/span&gt;, about people spending their lives in line, I shuddered and joined the back of the line, which was only about a block long at this point. This is closer than I usually get to the front of the line, and I thought I was just earlier than I usually am, but I learned that others thought a Phil Schiller keynote was less of a draw than a Steve Jobs. (Would we show up earlier if Apple invented an &lt;a href="http://en.wikipedia.org/wiki/Reality_distortion_field"&gt;RDF&lt;/a&gt; generator?) I chatted with strangers and old friends. Some colleagues joined me (cutting in line in this way is generally accepted). An Apple staffer came by, counting us. I was number 269.&lt;br /&gt;&lt;br /&gt;Various people walked by offering freebies: tech magazines, brochures, pastries, and other goodies. The only thing most of us wanted was coffee; I’m surprised nobody was out selling that. I heard that later in the morning that a bunch of bikini-clad promotional models (AKA "booth babes") came by. Perhaps it was too cold for them when I arrived. And why were there no bikinied booth boys? This was open-minded San Francisco, after all.&lt;br /&gt;&lt;br /&gt;The keynote was good. Phil is no Steve, but he and the other speakers had a lot of interesting products to hold our attention. They threw plenty of numbers at us, especially the number of apps available, and dissed various competitors. Plus we had to pay attention to the keynote, because most of us couldn’t get WiFi to work in a room that crowded. Perhaps it worked better in the overflow rooms (or “&lt;a href="http://en.wikipedia.org/wiki/Cover_Flow"&gt;coverflow&lt;/a&gt; rooms”, as my colleague Mark Dalrymple calls them).&lt;br /&gt;&lt;br /&gt;Personally, I was most thrilled by the new iPhone’s video recording feature and the keyboard going landscape. &lt;a href="http://en.wikipedia.org/wiki/Tethering"&gt;Tethering&lt;/a&gt; sounds great, too, but the audience was very disappointed that Apple won’t say when it’ll work in the U.S., as you can observe when watching the &lt;a href="http://www.apple.com/quicktime/qtv/keynote/"&gt;keynote on the web&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another thing that struck me: in the mobile world, hacking is going to be nastier than the desktop world. If Apple can &lt;a href="http://www.apple.com/mobileme/news/2009/06/find-my-iphone-now-available.html"&gt;Find Your iPhone&lt;/a&gt;, can a hacker find you? If you can unlock your &lt;a href="http://www.zipcar.com/"&gt;Zipcar&lt;/a&gt; with your iPhone, how hard will it be for someone else to do the same? It's not that these two applications are any less secure than others, but the consequences of security problems will be different for mobile apps.&lt;br /&gt;&lt;br /&gt;The keynote ended with no Steve Jobs cameo. I wasn’t the only one hoping. The New York Times &lt;a href="http://bits.blogs.nytimes.com/"&gt;Bits&lt;/a&gt; blog was headlined “New Software, New iPhone, New Steve?”. Oh, well, we found out later that he was back at work by the end of June.&lt;br /&gt;&lt;br /&gt;Oh, one more thing: my best laugh of the day came in one of the afternoon sessions. An Apple designer named Max Drukman stood up to show us &lt;a href="http://developer.apple.com/tools/dashcode/"&gt;Dashcode&lt;/a&gt; and greeted us with “Good afternoon, developers … developers … developers”. His timing was perfect homage to Steve Ballmer’s &lt;a href="http://www.youtube.com/watch?v=8To-6VIJZRE"&gt;famous greeting&lt;/a&gt; to another bunch of developers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Everything’s digital&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don’t know how the show does it, but by Tuesday morning I feel like I’ve already been here all week. I’m struggling to recognize faces and remember names and, when I’m lucky, put them together. Why doesn’t Apple put the name badges in a bigger font?&lt;br /&gt;&lt;br /&gt;One thing I don’t have to remember any more is which sessions I want to go to. It used to be that Apple would hand you a small paper schedule of the week, which was nearly useless because it had lots of To Be Announced sessions. This was because when they gave it to you on Sunday or early Monday, it couldn’t list sessions about technologies that were going to be introduced mid-Monday. This year they did something great: they gave us an iPhone app listing the sessions, including updates during the week! The app let you mark favorites, and even showed you where the sessions were in Moscone. It did almost everything I wanted, but perhaps next year’s version could help me coordinate with my colleagues, to help us decide who’s covering which sessions.&lt;br /&gt;&lt;br /&gt;A highlight of the show was a huge wall display (20 large monitors) showing icons for 20,000 top iPhone apps. Each time an app got downloaded, its icon bounced a little and jostled its neighbors. The apps weren’t organized alphabetically, though. They were sorted by icon color, creating a big spectrum. A lot of developers spent a lot of time looking for their apps. Several of us agreed that Apple could have made money by charging a dollar to find your icon for you. I never did find the icon for Google Earth. Maybe it gets downloaded so often that Apple thought the constant bouncing would just be distracting. Yeah, that must have been it.&lt;br /&gt;&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/T2IMHuZXfl0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/T2IMHuZXfl0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="295" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Strange sight for the day: An attendee walking around holding a Steve Jobs doll like &lt;a href="http://www.podbrix.com/itemdetails.php?PID=1209444693"&gt;this one&lt;/a&gt;. I doubt it's RDF-enabled.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Coming soon: part 2, featuring Nerdvana and more.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-8687359182386426993?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=urr-GDXH2lI:r6UyB18nc38: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/urr-GDXH2lI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/8687359182386426993?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/8687359182386426993?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/urr-GDXH2lI/wwdc-2009-journal-part-1.html" title="WWDC 2009 journal (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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_N76yGvbMPVw/Som838oddxI/AAAAAAAAAFw/WSfqKYs57_Q/s72-c/File.jpeg" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/08/wwdc-2009-journal-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUNR346cCp7ImA9WxJbE0U.&quot;"><id>tag:blogger.com,1999:blog-29010370.post-317129055587598550</id><published>2009-07-23T10:54:00.001-07:00</published><updated>2009-07-23T15:14:56.018-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T15:14:56.018-07:00</app:edited><title>Google Latitude for iPhone</title><content type="html">If you're an iPhone user, you might have been waiting for Google Latitude, our service that lets you see where your friends are, which has not been available on iPhone. Well, today we're releasing  Google Latitude for iPhone and iPod touch as a web application running on iPhone's Safari browser.  Now you can share your location with your friends, as well as control who gets to see it, all from your iPhone.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_N76yGvbMPVw/Smih12gPvsI/AAAAAAAAAFo/YOv_KcLfN0Y/s1600-h/File.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_N76yGvbMPVw/Smih12gPvsI/AAAAAAAAAFo/YOv_KcLfN0Y/s320/File.png" alt="" id="BLOGGER_PHOTO_ID_5361713302920478402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To start using Latitude, go to &lt;a href="http://google.com/latitude"&gt;google.com/latitude&lt;/a&gt; from the iPhone's browser. You can even add a bookmark to your home screen for one-touch access. Check out the &lt;a href="http://googlemobile.blogspot.com/2009/07/google-latitude-now-for-iphone.html"&gt;Google Mobile Blog&lt;/a&gt; to learn more.&lt;br /&gt;&lt;br /&gt;Posted by Scott Knaster, Google Mac Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-317129055587598550?l=googlemac.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/OfficialGoogleMacBlog?a=WTjn5HFq9C0:vhCKJKMHC8o: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/WTjn5HFq9C0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/317129055587598550?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/29010370/posts/default/317129055587598550?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/OfficialGoogleMacBlog/~3/WTjn5HFq9C0/google-latitude-for-iphone.html" title="Google Latitude 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://1.bp.blogspot.com/_N76yGvbMPVw/Smih12gPvsI/AAAAAAAAAFo/YOv_KcLfN0Y/s72-c/File.png" height="72" width="72" /><feedburner:origLink>http://googlemac.blogspot.com/2009/07/google-latitude-for-iphone.html</feedburner:origLink></entry><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></feed>
