<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Google Data &#187; Scott</title>
	<atom:link href="/author/scott/feed/" rel="self" type="application/rss+xml" />
	<link>https://googledata.org</link>
	<description>Everything Google: News, Products, Services, Content, Culture</description>
	<lastBuildDate>Thu, 19 Mar 2015 12:00:08 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.7.5</generator>
	<item>
		<title>An Uploader Update</title>
		<link>https://googledata.org/google-mac-blog/an-uploader-update/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=an-uploader-update</link>
		<comments>https://googledata.org/google-mac-blog/an-uploader-update/#comments</comments>
		<pubDate>Mon, 15 Oct 2007 17:16:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[by Greg Robbins, Software EngineerToday's release of version 1.1 of the Picasa Web Albums Uploaders adds support for Apple's new iPhoto '08. But under the covers, the new uploaders reflect some of the other ongoing work in Google's Mac team. For starte...]]></description>
				<content:encoded><![CDATA[<span style="font-style: italic;" class="byline-author">by Greg Robbins, Software Engineer</span><br /><br />Today's release of version 1.1 of the <a href="http://picasa.google.com/web/mac_tools.html" id="sfns" title="Picasa Web Albums Uploaders">Picasa Web Albums Uploaders</a> adds support for Apple's new iPhoto '08. But under the covers, the new uploaders reflect some of the other ongoing work in Google's Mac team. For starters, this release installs and updates via Google Updater to ensure that you are running the latest version.<br /><br />While our first release used a private API to talk with the Picasa Web Albums server, the new version is built on the public <a href="http://code.google.com/apis/picasaweb/overview.html" id="b-o7" title="Google Data API interfaces">Google Data API interfaces</a> and our <a href="http://code.google.com/p/gdata-objectivec-client/" id="dl0r" title="Objective-C GData Library">Objective-C GData Library</a>. This will make it easier for us to keep up with Picasa Web Albums' new features. For example, the iPhoto export plug-in now can convert keywords in iPhoto to tags in Picasa Web Albums.<br /><br />Our goal is to keep the Uploaders as quick, straightforward utilities that make Picasa Web Albums readily available to Mac users. You can give us feedback about them at the <a href="http://groups.google.com/group/picasa" id="qj_v" title="Picasa Help discussion group">Picasa Help discussion group</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-2976447627334599997?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/an-uploader-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adventures in the culinary arts</title>
		<link>https://googledata.org/google-mac-blog/adventures-in-the-culinary-arts/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=adventures-in-the-culinary-arts</link>
		<comments>https://googledata.org/google-mac-blog/adventures-in-the-culinary-arts/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 01:14:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Dave MacLachlan, Mac Software EngineerHow often do you get to cook fine cuisine for 800 people -- especially while learning from some of the finest chefs in the business? Our Google chefs offer a limited number of culinary internships, and I ...]]></description>
				<content:encoded><![CDATA[Posted by Dave MacLachlan, Mac Software Engineer<br /><br />How often do you get to cook fine cuisine for 800 people -- especially while learning from some of the finest chefs in the business? Our Google chefs offer a limited number of culinary internships, and I was lucky enough to win one. So one fine Thursday morning I got to spend 4 hours in the Google kitchens working with, and learning from, our amazing culinary engineers.<br /><br />I arrived slightly late (stupid Bay Area traffic!) at 08:35 at Café 7 and Head Chef Eric grabbed me a hat and sent me over to Kelly to learn the ropes. The menu for the day was East Indian-inspired, and I was assigned to the vegetarian dishes. One was zucchini sautéed with some turmeric, and the other was a cauliflower-tomato curry. Sounds incredibly simple, but I had never really considered the scale that Google cooks for. A few hundred people can eat a lot of vegetables, and Cafe 7 is one of our smaller cafés.<br /><br />Kelly started me on my first of three trays of tomatoes, coring out the tops, and dicing them into cubes. All the ingredients were amazingly fresh, many of them having been delivered from the farm first thing that morning. Each of the Google cafés runs almost completely independently from the others, and each one has a different style and ambiance. The chefs even get to choose where their produce comes from.<br /><br />Being a rookie, I had to wear a knife guard on my left hand to make sure the vegetarian dish stayed vegetarian. Kelly was flying through vegetables, cutting 4 tomatoes into perfect 1 cm cubes faster than I could cut 1 into randomly diced sizes. She told me all about being a chef at Google, and compared it to her several years working in high-end restaurants. We managed to get through all the tomatoes, and then started in on the onions. Kelly had lent me some of her knives, which were razor-sharp, so I was actually glad that I was wearing the knife guard. I didn't realize that the chefs at Google all have their own private knife set. Most of the tools are shared, but knives are all owned personally.<br /><br />After all the vegetables were chopped up, we moved over to the massive steam ovens and steamed the vegetables. To keep them looking fresh, we steamed them and then immediately dropped them in sinks full of ice water to blanch them. At this point I moved over to sandwich duty, and we put together 15 or so large turkey, avocado and aioli sandwiches.<br /><br />It was getting to be mid-morning, so it was time to cook up the vegetables. We headed over to the stoves where we sautéed the cauliflower and tomatoes in one pan and the zucchini and onions in another. For some reason, I was expecting Kelly to have an exact recipe, but she did pretty much everything off the top of her head, with a quick taste here and there to verify that things were going as planned.<br /><br />Finally, once things were all cooked up, it was time to start serving. I was put on the line and started serving all the hungry Googlers who came in. Interestingly, it was a bit of a slow day, so I actually had a chance to chat with some of the folks as they went through. It's interesting how you become a different person standing behind the counter in the chef's jacket. I ended up serving two people that I know quite well, and they didn't recognize me at all.<br /><br />After an hour behind the counter, it was time to head back to the office and get some of MY work done.<br /><br />I'd like to thank Eric, Kelly, and all the chefs at Cafe 7 for being so great. I'd also like to thank Emily for arranging it all. It was a wonderful experience that once again puts me in awe of our incredible cooking staff.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-7432759590740012999?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/adventures-in-the-culinary-arts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fetch your docs, find your code</title>
		<link>https://googledata.org/google-mac-blog/fetch-your-docs-find-your-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fetch-your-docs-find-your-code</link>
		<comments>https://googledata.org/google-mac-blog/fetch-your-docs-find-your-code/#comments</comments>
		<pubDate>Wed, 15 Aug 2007 19:32:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[by Greg Robbins, Mac Software EngineerThe collection of Google Data APIs continue to grow, and the Google Data APIs Objective-C Client Library is growing too. If you're a Mac software developer, you'll find that today's release of version 1.2 of the li...]]></description>
				<content:encoded><![CDATA[by Greg Robbins, Mac Software Engineer<br /><br />The collection of Google Data APIs continue to grow, and the Google Data APIs Objective-C Client Library is growing too. If you're a Mac software developer, you'll find that today's release of version 1.2 of the library sports new capabilities for your users and greater convenience for you.<br /><br />Your application can now use the library to <a href="http://googledataapis.blogspot.com/2007/08/new-api-it-slices-it-dices-it-uploads.html" title="browse and upload documents">browse and upload documents</a> and spreadsheets to Google Docs &amp; Spreadsheets. If you write utilities for Google Calendar, your software can <a href="http://googledataapis.blogspot.com/2007/07/create-calendars-with-google-calendar.html" title="create new calendars and add subscriptions">create new calendars and add subscriptions</a> to calendars. The library now also supports the new <a href="http://code.google.com/apis/calendar/calendar_gadgets.html" id="idku" title="Calendar Gadgets">Calendar Gadgets</a>. For development tool builders, we have added support for <a href="http://code.google.com/apis/codesearch/overview.html" title="Google Code Search">Google Code Search</a>. Finally, the Picasa Web Albums interfaces include a <a href="http://googledataapis.blogspot.com/2007/07/picasa-web-albums-adds-new-api-features.html" title="richer set of query parameters">richer set of query parameters</a>, allowing searches across all public photos in everyone's albums.<br /><br />To ease your development effort, Google Data APIs Objective-C Client Library now has built-in support for logging of its server http transactions. All of its GData objects permit arbitrary developer-defined properties and keys, so it's easy to hang custom data off of the GData objects. And because developers may want to subclass the standard GData objects, the library allows your subclasses to be instantiated as surrogates instead of the standard GData classes when parsing XML.<br /><br />A variety of bug fixes and other small improvements are also present in <a href="http://code.google.com/p/gdata-objectivec-client/" title="the latest release">the latest release</a>, many of them suggested by developers who use the library. Check out the release notes, download the new version, and <a href="http://groups.google.com/group/gdata-objectivec-client" id="m36v" title="let us know">let us know</a> what you think.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-4209390397499878733?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/fetch-your-docs-find-your-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Non-)Secrets of WWDC</title>
		<link>https://googledata.org/google-mac-blog/non-secrets-of-wwdc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=non-secrets-of-wwdc</link>
		<comments>https://googledata.org/google-mac-blog/non-secrets-of-wwdc/#comments</comments>
		<pubDate>Tue, 14 Aug 2007 01:03:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[by Mike Morton, Mac Team EngineerEach summer for more than 25 years, thousands of developers have flocked to Northern California to attend Apple’s Worldwide Developer Conference (which everyone calls WWDC). It’s a week of lectures and labs, schmooz...]]></description>
				<content:encoded><![CDATA[by Mike Morton, Mac Team Engineer<br /><br />Each summer for more than 25 years, thousands of developers have flocked to Northern California to attend Apple’s Worldwide Developer Conference (which everyone calls WWDC). It’s a week of lectures and labs, schmoozing and socializing, and it concentrates Apple geekery on a scale unmatched by anything else.<br /><br />Recently most of Google’s Mac developers attended WWDC at San Francisco’s <a href="http://www.moscone.com/">Moscone Center</a>. As usual, we learned a lot of cool new stuff and, also as usual, Apple asked everyone not to talk about the stuff we learned: only the Steve Jobs keynote speech is public information. So instead, I’d like to tell you about the experience of attending the keynote and the rest of WWDC.<br /><br /><br /><span style="font-weight: bold;">The build-up</span><br /><br />So what’s the attraction? Isn’t all of Apple’s developer info available on the web? Yes, eventually, it is. But WWDC offers early information, in depth and in person. Some presentations are quite small and informal, and there are labs staffed by Apple engineers where you can ask questions or ask for help.<br /><br />On top of that, there’s the social component. We all know the cliche that engineers are asocial, but the truth is that most of us really aren't. WWDC gives everyone a chance to see old school friends, former colleagues, and meet cyber-friends and -colleagues for the first time. I tend to look at nametags as people whiz by, just in case I spot a name I recognize under a face I’ve never seen.<br /><br />There’s organized socializing, too, in the form of WWDC-sponsored parties and events held by companies, organizations, and individuals. Many folks believe that the technology industry exists to give us all a chance to drink beer, and they take good advantage of the opportunity.<br /><br />Well before the conference starts, Apple posts a detailed schedule on its website. The schedule usually has some slots labeled TBA (to be announced). This usually means that Steve Jobs is going to tell us some big news on Monday, and those sessions later in the week will fill in the details. I plan my schedule in advance, meticulously choosing talks and other sessions like a first-year college student trying to plan all four years in advance. It’s fun, but nearly pointless, because you can't know what's in the TBA sessions.<br /><br /><br /><span style="font-weight: bold;">Lining up</span><br /><br />Experienced attendees fly in a few days before to shake the jet lag. This time, I didn’t: I walked into my hotel in the city about one minute past midnight on the first day of the conference. Still, I didn’t need my alarm to get up early, because the first day of WWDC is a big deal. I guess everyone else thought so, too, because when I arrived at Moscone Center at 7:00 a.m., the line outside was two blocks long and growing fast.<br /><br />They let us in without too much of a wait, and registration went quickly. Everyone gets a badge, and tries not to lose it during the week — security folks really do check them every time you come in.<br /><br />Then we line up again. There’s only one event the first morning: Steve Jobs’ keynote. Waiting two to three hours in line means lots of time to reconnect with old friends and exchange business cards with new ones. Sitting up front is a big deal. When the doors finally open, some folks want those seats badly enough that they will sprint the entire length of the auditorium. Since some of them don’t get much exercise, let alone running while lugging a laptop, the resulting race isn’t exactly <a href="http://en.wikipedia.org/wiki/Wide_World_of_Sports_%28US_TV_series%29#Introduction">the human drama of athletic competition</a>. For me, this is when WWDC really begins, and I like to call it The Running Of The Geeks.<br /><br /><br /><span style="font-weight: bold;">The Keynote</span><br /><br />Nobody rallies the troops like Steve Jobs, and… this year's keynote began with nobody like Steve Jobs. It was John Hodgman (“I’m a PC” in <a href="http://www.apple.com/getamac/ads/">Apple’s ads</a>) on video, claiming to be Steve Jobs, telling us that Apple was disbanding and… well, you can <a href="http://www.youtube.com/watch?v=Bf5qZrFfQFg">watch it for yourself</a>.<br /><br />When the real Steve walked on stage, he wasted no time in telling us that Apple was doing well. He showed some upcoming games, previewed a bunch of features of <a href="http://www.apple.com/macosx/leopard/">Leopard…</a> and then showed Safari running on Windows. That last was my favorite, not for the technical or marketing implications, but for the moment when he sat down at a Windows box, paused, and said (almost to himself) “This is odd”.<br /><br />After the keynote, everyone headed to lunch, then to a “Mac OS X State of the Union” talk (the only one in that time slot), a survey of major changes affecting developers. By the end of Monday, regular sessions have begun, and I try hard to pay attention as I realize I’m at the beginning of a week full of new things to absorb.<br /><br /><br /><span style="font-weight: bold;">Entertainment</span><br /><br />There are things to do nearly every evening: Monday night was a reception hosted by <a href="http://developer.apple.com/">Apple Developer Connection</a>. Tuesday night was the <a href="http://developer.apple.com/ada/">Apple Design Awards</a>, which left a lot of people Wednesday morning saying “Did you see that cool <a href="http://worrydream.com/bartwidget/">BART widget</a>?!”. Later that evening was <a href="http://en.wikipedia.org/wiki/Stump_the_experts">Stump The Experts</a>, a sort of quiz show featuring impossibly hard tech trivia questions (but looking on the web for answers isn’t cheating). Thursday night is a big party — for many years it was held on the Apple campus, but this year it was outdoors in San Francisco.<br /><br />For my money, the best entertainment of the week is Apple engineer James Dempsey, who performs original songs about Apple’s latest technology. I still remember laughing through <a href="http://www.youtube.com/watch?v=YYvOGPMLVDo">Model View Controller</a> when he did it live. This year I missed his two new songs, <a href="http://www.youtube.com/watch?v=X0AcrL6vHE8">I love View</a> and <a href="http://www.youtube.com/watch?v=4t7fNzwNgzM">Release Me</a>. If you don’t think these performances are hilarious — well, maybe you’re not nerdy enough (take that as you will).<br /><br /><br /><span style="font-weight: bold;">Eventually it's Friday</span><br /><br />WWDC always feels like a long week, but it's great fun. When it ended, I wanted to get home and start working on cool Google products using everything new in OS X!<br /><br />Getting into the shuttle from the hotel to SFO, I realized all four of us were carrying WWDC bags. Somehow we managed to not get them mixed up as we rushed for our flights. Now that might have been interesting.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-2404482916761681080?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/non-secrets-of-wwdc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AppleScripting Google Desktop</title>
		<link>https://googledata.org/google-mac-blog/applescripting-google-desktop/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=applescripting-google-desktop</link>
		<comments>https://googledata.org/google-mac-blog/applescripting-google-desktop/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 00:49:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[     Posted by Dave MacLachlan, Mac Software EngineerMost people aren't aware that Google Desktop has a simple, but powerful, AppleScript interface. You can use this interface to write scripts that search with Google Desktop. The most basic script allo...]]></description>
				<content:encoded><![CDATA[<b> </b> <div>   Posted by Dave MacLachlan, Mac Software Engineer<br /><br />Most people aren't aware that <a title="Google Desktop" href="http://desktop.google.com/mac/">Google Desktop</a> has a simple, but powerful, <a title="AppleScript" href="http://www.apple.com/macosx/features/applescript/">AppleScript</a> interface. You can use this interface to write scripts that search with Google Desktop. The most basic script allows you to quickly search for some text: </div> <div>  <br /></div> <div>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 255);"><b>tell</b></span> <span style="color: rgb(0, 0, 255);">application</span> "Google Desktop"   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>search for<span style="color: rgb(0, 0, 0);"> "happy"</span>   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <b>end</b><span style="color: rgb(0, 0, 0);"> </span><b>tell</b>   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <b><br />    </b>   </p> </div> <div> This will return an array of search results. A search result is a record containing the title, snippet, and URL of the result, along with other details. So if you wanted to display just the title of the first result, you could do this: </div> <div>  <br /></div> <div>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 255);"><b>tell</b></span> <span style="color: rgb(0, 0, 255);">application</span> "Google Desktop"   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><b>set</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">results</span><span style="color: rgb(0, 0, 0);"> </span><b>to</b><span style="color: rgb(0, 0, 0);"> </span>search for<span style="color: rgb(0, 0, 0);"> "We wish"</span>   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><b>set</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">a</span><span style="color: rgb(0, 0, 0);"> </span><b>to</b><span style="color: rgb(0, 0, 0);"> </span>title<span style="color: rgb(0, 0, 0);"> </span><b>of</b><span style="color: rgb(0, 0, 0);"> </span>item<span style="color: rgb(0, 0, 0);"> 1 </span><b>of</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">results</span>   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <b>end</b><span style="color: rgb(0, 0, 0);"> </span><b>tell</b>   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     display dialog<span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">a</span>   </p> </div> <div>  <br /></div> <div>Or if you wanted to open the first result: </div> <div>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;">     <span class="Apple-style-span" style="color: rgb(0, 0, 255);"><b><br />    </b></span>   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 255);"><b>tell</b></span> <span style="color: rgb(0, 0, 255);">application</span> "Google Desktop"   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><b>set</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">results</span><span style="color: rgb(0, 0, 0);"> </span><b>to</b><span style="color: rgb(0, 0, 0);"> </span>search for<span style="color: rgb(0, 0, 0);"> "you a"</span>   </p>   <p face="Verdana" size="12px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><b>set</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">a</span><span style="color: rgb(0, 0, 0);"> </span><b>to</b><span style="color: rgb(0, 0, 0);"> </span>URL<span style="color: rgb(0, 0, 0);"> </span><b>of</b><span style="color: rgb(0, 0, 0);"> </span>item<span style="color: rgb(0, 0, 0);"> 1 </span><b>of</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">results</span>   </p>   <p face="Verdana" size="12px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <b>end</b><span style="color: rgb(0, 0, 0);"> </span><b>tell</b></p>   <p face="Verdana" size="12px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     open location<span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">a</span>   </p>   <p face="Verdana" size="12px" style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <span class="Apple-style-span" style="color: rgb(64, 128, 0);"><br />    </span>   </p> </div> <div> The "search for" <span style="font-size:100%;">command</span> has several more powerful options, some of which are exclusively available in the <span style="font-size:100%;">scripting</span> interface. Suppose you want to search for results between two dates: </div> <div>  <br /></div> <div>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;">     <span style="color: rgb(0, 0, 255);"><b>tell</b></span> <span style="color: rgb(0, 0, 255);">application</span> "Google Desktop"   </p>   <p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;">     <span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: rgb(0, 0, 255);"><b>set</b></span> <span style="color: rgb(64, 128, 0);">startDate</span> <span style="color: rgb(0, 0, 255);"><b>to</b></span> <span style="color: rgb(0, 0, 255);">date</span> "Monday, July 17, 2006 00:00:00 "   </p>   <p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><b>set</b><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">endDate</span><span style="color: rgb(0, 0, 0);"> </span><b>to</b><span style="color: rgb(0, 0, 0);"> </span>current date   </p>   <p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>search for<span style="color: rgb(0, 0, 0);"> "happy" </span>after date<span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">startDate</span><span style="color: rgb(0, 0, 0);"> </span>before date<span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(64, 128, 0);">endDate</span>   </p>   <p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <b>end</b><span style="color: rgb(0, 0, 0);"> </span><b>tell</b>   </p>   <p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);"><br />   </p>   <p style="margin: 0px;">Or, let's say you want to find only email results:   </p>   <p style="margin: 0px;">     <span class="Apple-style-span"  style="font-size:85%;"><span class="Apple-style-span"  style="font-size:13;"><br />    </span></span>   </p>   <p style="margin: 0px;">        </p>   <span class="Apple-style-span"  style="font-size:85%;">   </span><p   style="margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:12px;"> <span class="Apple-style-span"  style="font-size:85%;">    <span style="color: rgb(0, 0, 255);"><b>tell</b></span> <span style="color: rgb(0, 0, 255);">application</span> "Google Desktop"   </span></p> <span class="Apple-style-span"  style="font-size:85%;">  </span><p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);"> <span class="Apple-style-span"  style="font-size:85%;">    <span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>search for<span style="color: rgb(0, 0, 0);"> "birthday" restrict to email</span></span></p> <span class="Apple-style-span"  style="font-size:85%;">  </span><p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);"> <span class="Apple-style-span"  style="font-size:85%;">    <b>end</b><span style="color: rgb(0, 0, 0);"> </span><b>tell</b>   </span></p> <span class="Apple-style-span"  style="font-size:100%;">  </span>   <p>   </p>   <p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <b><br />    </b>   </p>   <p style="margin: 0px;">     Or, finally, you'd like to do an exact search (as opposed to a prefix search, which is the default):   </p>   <p style="margin: 0px;">     <span class="Apple-style-span"  style="font-size:100%;"><span class="Apple-style-span"  style="font-size:13;"><br />    </span></span>   </p>   <p style="margin: 0px;">     <span class="Apple-style-span"  style="font-size:100%;"><span class="Apple-style-span"  style="font-size:13;"><span class="Apple-style-span"  style="font-size:16;">     </span></span></span></p><span class="Apple-style-span"  style="font-size:100%;"><p   style="margin: 0pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal;font-family:Verdana;font-size:10pt;">       <span style="color: rgb(0, 0, 255);"><b>tell</b></span> <span style="color: rgb(0, 0, 255);">application</span> "Google Desktop"     </p>     <p   style="margin: 0pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);font-family:Verdana;font-size:10pt;"><span class="Apple-style-span"  style="font-size:12;"><span style="color: rgb(0, 0, 0);"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>search for<span style="color: rgb(0, 0, 0);"> "hoff" </span><b>without</b><span style="color: rgb(0, 0, 0);"> </span>prefix match</span></p>     <p style="margin: 0pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255); font-family: Verdana; font-size: 10pt;">       <b>end</b><span style="color: rgb(0, 0, 0);"> </span><b>tell</b>     </p>     </span>   <p> </p>   <p style="margin: 0px;">     Of course, you can use all of this directly from the command line using <a title="osascript" href="http://developer.apple.com/documentation/Darwin/Reference/Manpages/man1/osascript.1.html">osascript</a>. </p><p style="margin: 0px;"><br /></p><p style="margin: 0px;">There are several other options for "search for" and a few other simple commands hidden within the dictionary, so poke around and see what you can do.</p>   <p style="margin: 0px; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: rgb(0, 0, 255);">     <b><br />    </b>   </p> </div> <div>  <br /></div> <div>  <br /></div> <div><br /></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-3348412750067273080?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/applescripting-google-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Picasa Web Albums meets Google data APIs</title>
		<link>https://googledata.org/google-mac-blog/picasa-web-albums-meets-google-data-apis/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=picasa-web-albums-meets-google-data-apis</link>
		<comments>https://googledata.org/google-mac-blog/picasa-web-albums-meets-google-data-apis/#comments</comments>
		<pubDate>Wed, 06 Jun 2007 01:17:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Greg Robbins, Mac Software EngineerMy parents enjoy it when I bring them printouts of my favorite photos, but the rest of my family and friends are happier just to get links to the pictures. With the Mac uploaders for Picasa Web Albums, it's ...]]></description>
				<content:encoded><![CDATA[Posted by Greg Robbins, Mac Software Engineer<br /><br />My parents enjoy it when I bring them printouts of my favorite photos, but the rest of my family and friends are happier just to get links to the pictures. With the <a href="http://picasa.google.com/web/mac_tools.html" title="Mac uploaders">Mac uploaders</a> for Picasa Web Albums, it's quick and easy to put my photos on Google's servers.<br /><br />But there's a lot more to share besides snapshots. Maybe you've created an avatar for your online world and you'd like to show your creativity to friends who live "outside." Or consider this: security cameras and webcams can capture suspicious activity. Those could go into a Picasa Web Album, and be monitored like any other RSS feed. Almost every Mac application can extend its reach by sharing online. And with Google Data APIs, there's no need for a specialized server. Any application can let you share your data with your Google Account.<br /><br />Now that Picasa Web Albums has a Google data API, I've updated the open-source <a href="http://code.google.com/p/gdata-objectivec-client/" title="Objective-C Client Library">Objective-C Client Library</a> to make it easy for developers to share photos from their applications. Here's what it looks like for a programmer adding the picture SunsetPhoto.jpg to the album "My Best Photos":<br /><br /><pre><br /><font face="Courier New">GDataServiceGooglePicasaWeb* service =<br /> [[GDataServiceGooglePicasaWeb alloc] init];<br /><br />[service setUserCredentialsWithUsername:@"my.account@gmail.com"<br /> password:@"mypasswd"];<br /><br />// get the URL for the album<br />NSURL *albumURL = [GDataServiceGooglePicasaWeb<br /> picasaWebFeedURLForUserID:@"my.account" albumID:nil<br /> albumName:@"MyBestPhotos" photoID:nil kind:nil access:nil];<br /><br />// set a title and description for the new photo<br />GDataTextConstruct *title, *desc;<br />title = [GDataTextConstruct textConstructWithString:@"Sunset Photo"];<br />desc = [GDataTextConstruct textConstructWithString:@"A nice day"];<br /><br /></font><font face="Courier New">GDataEntryPhoto *newPhoto = [GDataEntryPhoto photoEntry];<br /></font><font face="Courier New">[newPhoto setTitle:title];<br />[newPhoto setPhotoDescription:desc];<br /><br />// attach the photo data<br />NSData *data = [NSData dataWithContentsOfFile:@"/SunsetPhoto.jpg"];<br />[newPhoto setPhotoData:data];<br />[newPhoto setPhotoMIMEType:@"image/jpeg"];<br /><br />// now upload it<br />GDataServiceTicket *ticket;<br />ticket = [service fetchPicasaWebEntryByInsertingEntry:newPhoto<br /> forFeedURL:albumURL<br /> delegate:self<br /> didFinishSelector:@selector(addPhotoTicket:finishedWithEntry:)<br /> didFailSelector:@selector(addPhotoTicket:failedWithError:)];</font><br /></pre><br />The new library includes sample code that shows developers how to browse albums, add tags, display upload progress, and take advantage of the full <a href="http://code.google.com/apis/picasaweb/overview.html" title="Picasa Web Albums API">Picasa Web Albums API</a>. So now you can encourage the developer of <i>your</i> favorite application to make it easy and free for you to share your work online, too.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-8910839797281155405?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/picasa-web-albums-meets-google-data-apis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Gears for WebKit</title>
		<link>https://googledata.org/google-mac-blog/google-gears-for-webkit/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-gears-for-webkit</link>
		<comments>https://googledata.org/google-mac-blog/google-gears-for-webkit/#comments</comments>
		<pubDate>Thu, 31 May 2007 17:06:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Dan Waylonis, Mac Software EngineerHave you heard about Google Gears? It's an extension to your favorite web browser and a new open source project from Google. It adds support for local data storage and helps web application developers manage...]]></description>
				<content:encoded><![CDATA[Posted by Dan Waylonis, Mac Software Engineer<br /><br /><div>Have you heard about <a title="Google Gears" href="http://gears.google.com/">Google Gears</a>? It's an extension to your favorite web browser and a new open source project from Google. It adds support for local data storage and helps web application developers manage resources so you can make your web application work offline. It is currently available for Linux, Windows, and Macintosh platforms and you can learn more at <a title="http://gears.google.com" href="http://gears.google.com/">http://gears.google.com</a>. I got a chance to work on this product for WebKit, which is the render engine Safari is based on, and we're happy to announce that the source code is available to all Mac developers today.<br /><br /></div> <div> Since Google Gears is leveraging the latest technology from WebKit, it is currently not compatible with the shipping versions of Safari (Mac OS X 10.4.x and 419.x). So, if you want to play with Google Gears for WebKit, you'll have to download a recent WebKit build from <a href="http://nightly.webkit.org/" >http://nightly.webkit.org</a>.  </div> <div><br /></div>   <div><h3>How it works</h3>Google Gears for WebKit is made up of an Internet plugin for Webkit or Safari (Gears.plugin) that's installed into /Library/Internet Plug-Ins and an InputManager (GoogleGearsEnabler) that's installed into /Library/InputManagers. The GoogleGearsEnabler ensures that Google Gears can provide resources to web applications. It registers a NSURLProtocol class only if the OS X Application is a supported version of Safari or WebKit. Once installed, the registered class will check any URL requests to see if Google Gears can provide the content. If so, it will intercept the call and provide the data. Otherwise, the URL will be processed normally. This is how Google Gears is able to work when you're not connected to the Internet. </div><div><br />Google Gears is an open source project and we're working with partners like Adobe, Mozilla, Opera, and others to make sure this is the right solution for users. So come check it out for yourself at <a title="http://code.google.com/p/google-gears/" href="http://code.google.com/p/google-gears/">http://code.google.com/p/google-gears/</a>  and help us make it even better for WebKit and Safari. </div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-4083034767151637524?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-gears-for-webkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Developer Day</title>
		<link>https://googledata.org/google-mac-blog/google-developer-day/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-developer-day</link>
		<comments>https://googledata.org/google-mac-blog/google-developer-day/#comments</comments>
		<pubDate>Wed, 30 May 2007 19:02:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[posted by Scott Knaster, Technical WriterSeasoned Mac developers and fans know that Apple's upcoming Worldwide Developer Conference (better known as WWDC) is a highlight of every year. And for the first time this year, we are getting into the developer...]]></description>
				<content:encoded><![CDATA[posted by Scott Knaster, Technical Writer<br /><br />Seasoned Mac developers and fans know that Apple's upcoming <a href="http://developer.apple.com/wwdc/" title="Worldwide Developer Conference">Worldwide Developer Conference</a> (better known as WWDC) is a highlight of every year. And for the first time this year, we are getting into the developer conference act too -- with tomorrow's <a href="http://code.google.com/events/developerday/" title="Google Developer Day">Google Developer Day</a>. It's not strictly a Mac event, but I'm looking forward to it because GDD is going to showcase all sorts of cool web-based cross-platform goodies, including Google data APIs, developing with Google Maps, AJAX development, and lots of fun with mashups (I got to help out with that topic).<br /><br />Google Developer Day is a tough ticket, but I'm happy to report that we're <a href="http://googledeveloperday2007-us.blogspot.com/2007/05/less-than-30-hours.html" title="webcasting the whole thing">webcasting the whole thing live</a> and then posting the videos to YouTube, so you can virtually be there without having to travel. And if you <i>are</i> actually there, maybe we'll run into each other -- or if not, then maybe at WWDC.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-8773191080746468601?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-developer-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Measuring performance of distributed notifications</title>
		<link>https://googledata.org/google-mac-blog/measuring-performance-of-distributed-notifications/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=measuring-performance-of-distributed-notifications</link>
		<comments>https://googledata.org/google-mac-blog/measuring-performance-of-distributed-notifications/#comments</comments>
		<pubDate>Thu, 10 May 2007 23:16:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Mike Morton, Software EngineerOn April 4th, we announced Google Updater. It uses several pieces of software that run in the background, but we knew early on it was important for the one user-visible application to be able to show you what tho...]]></description>
				<content:encoded><![CDATA[Posted by Mike Morton, Software Engineer<br /><br />On April 4th, we announced <a href="http://googlemac.blogspot.com/2007/04/google-desktop-for-mac_04.html">Google Updater</a>. It uses several pieces of software that run in the background, but we knew early on it was important for the one user-visible application to be able to show you what those background pieces were up to.<br /><br />We looked briefly at using Apple's <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/DistrObjects/DistrObjects.html">Distributed Objects</a> technology, but it can take a fair amount of work to make DO work well. We also need multiple copies of the user interface to listen to a single background process, so the logical way to implement it was <a href="http://www.google.com/url?sa=D&q=http%3A%2F%2Fdeveloper.apple.com%2Fdocumentation%2FCocoa%2FReference%2FFoundation%2FClasses%2FNSNotificationCenter_Class%2FReference%2FReference.html">NSNotificationCenter</a>, a class in Apple's <a href="http://www.google.com/url?sa=D&amp;q=http%3A%2F%2Fdeveloper.apple.com%2Fdocumentation%2FCocoa%2FReference%2FFoundation%2FObjC_classic%2Findex.html">Foundation framework</a> that broadcasts notifications across processes. It can even broadcast to applications run by other users logged into the same computer.<br /><br />We did have one worry, though. <a href="http://www.google.com/url?sa=D&q=http%3A%2F%2Fdeveloper.apple.com%2Fdocumentation%2FCocoa%2FConceptual%2FNotifications%2FConcepts%2FNotificationCenters.html">Apple’s doc</a> warns that “Posting a distributed notification is an expensive operation. The notification gets sent to a system-wide server that distributes it to all the tasks that have objects registered for distributed notifications…”. This left me wondering two things:<br /><br />(1) Just how expensive is it? How many notifications can you broadcast per second? As with all Google client products, we want to be good citizens and not bog down the client machine.<br /><br />(2) Does subscribing to any distributed notification really mean that the server sends you every notification, and not just the ones you asked to receive? Could we assume that the server keeps track of the “names” you ask to hear about, and filters before distributing?<br /><br />One of my favorite riddles is “How many <a href="http://en.wikipedia.org/wiki/Category:Empiricists">empiricists</a> does it take to change a light bulb?”. So I wrote a command-line tool that broadcasts NSDistributedNotifications and another that listens. I ran ten copies of the listener and one broadcaster on a 2GHz Intel Core Duo.<br /><br />The first interesting result was that the broadcaster can consistently push out a notification about every 2.64 milliseconds, no matter whether the listening processes are listening for the same name-and-object.<br /><br />The second finding was that nothing burns much CPU except Apple’s <span style="font-family:courier new;">distnoted</span> process, which is the bottleneck through which all notifications get sent. When the listeners did listen for the name the broadcaster was sending, <span style="font-family:courier new;">distnoted</span> used about 30% of the CPU. <a href="http://developer.apple.com/performance/">Shark</a> showed <span style="font-family:courier new;">distnoted</span> was spending time in memory management involving simple data structures.<br /><br />So we can conclude two things:<br /><br />• We can easily send several messages per second to a dozen or so listeners without impairing a client machine.<br /><br />• Registering to get only the name/object you want can help performance.<br /><br />We designed our background processes to limit the number of notifications they broadcast, and distributed notifications have been a great base on which to build this part of the Updater system.<br /><br /><br />P.S. The answer to the riddle: “I don’t know, either. Want to find out?” ;-)<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-5477371076863500793?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/measuring-performance-of-distributed-notifications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google data APIs connect Cocoa developers to Google</title>
		<link>https://googledata.org/google-mac-blog/google-data-apis-connect-cocoa-developers-to-google/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-data-apis-connect-cocoa-developers-to-google</link>
		<comments>https://googledata.org/google-mac-blog/google-data-apis-connect-cocoa-developers-to-google/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 13:51:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Greg Robbins, Software EngineerWhen you trust your personal data to Google, it's still your data. You're free to edit it, to share it with others, or to download it and take it somewhere else entirely. The principle is simple: we won't lock y...]]></description>
				<content:encoded><![CDATA[Posted by Greg Robbins, Software Engineer<br /><br />When you trust your personal data to Google, it's still your data. You're free to edit it, to share it with others, or to download it and take it somewhere else entirely. The principle is simple: we won't lock you away from your data. In practice, we work hard to be sure that you and the software you use have the access that makes the principle really meaningful.<br /><br />Last year, Google introduced<a href="http://code.google.com/apis/gdata/" title="Google data APIs"> Google data APIs</a>, based on the Atom Publishing Protocol. Google data APIs are just a standard way to allow programs to get at your data on our servers. They already work with Google Calendar, Google Base, Blogger, and many other services. Google provides<a href="http://code.google.com/apis/gdata/clientlibs.html" title="libraries"> libraries</a> to make it easy for programmers working in Java, C#, and Javascript to use the APIs.<br /><br />The native language for Mac OS X applications is Objective-C, and it's our preferred language for Mac application development. To make it simpler for us to write Mac software that interacts with Google services, I created a framework to use Google data APIs directly in Objective-C programs. We are using the framework for our application development, and today we are making the framework available to all developers. The<a href="http://code.google.com/p/gdata-objectivec-client/" title="Google Data APIs Objective-C Library"> Google Data APIs Objective-C Library</a> joins<a href="http://code.google.com/p/macfuse/" title="MacFUSE"> MacFUSE</a> and<a href="http://code.google.com/p/google-breakpad/" title="Breakpad"> Breakpad</a> as open-source development efforts of Google's Mac software team, hosted at code.google.com.<br /><br />A few small examples will give programmers an idea of how natural it is to use the framework to interact with Google services. Say an online roleplaying game wants to add a reminder to your Google Calendar that you need to be ready to join your guild in battle tonight between 10 and 11 pm. Adding the appointment to your calendar takes a few lines like this:<br /><pre><br />#import "GData/GData.h"<br /><br />GDataServiceGoogleCalendar *service =<br />  [[GDataServiceGoogleCalendar alloc] init];<br />[service setUserCredentialsWithUsername:@"myaccount@gmail.com"     <br />                               password:@"mypassword"];<br /><br />NSURL *calendarFeedURL =<br />  [NSURL URLWithString:kGDataGoogleCalendarDefaultPrivateFullFeed];<br /><br />GDataEntryCalendarEvent *newEvent =<br />  [GDataEntryCalendarEvent calendarEvent];<br />GDataTextConstruct *content =<br />  [GDataTextConstruct textConstructWithString:@"Battle today at 10pm"];<br /><br />[newEvent setContent:content];<br />[newEvent setIsQuickAdd:YES];<br /><br />[service fetchCalendarEventByInsertingEntry:newEvent<br />                         forFeedURL:calendarFeedURL<br />                           delegate:self<br />        didFinishSelector:@selector(calendarTicket:finishedWithEntry:)<br />          didFailSelector:@selector(calendarTicket:failedWithError:)];<br /></pre><br />Or, if a screensaver wants to get the items you've advertised for sale on Google Base and animate them in a groovy fashion, this is how it would retrieve your stuff:<br /><pre><br />NSURL *baseFeedURL = [NSURL URLWithString:kGDataGoogleBaseUserItemsFeed];<br />[service fetchGoogleBaseFeedWithURL:baseFeedURL                 <br />                     delegate:self<br />            didFinishSelector:@selector(baseTicket:finishedWithFeed:)    <br />              didFailSelector:@selector(baseTicket:failedWithError:)];<br /></pre><br /><br />The framework calls back into the screensaver with the list (called a<span style="font-style: italic;"> feed</span>) of Google Base items:<br /><pre><br />- (void)baseTicket:(GDataServiceTicket*)ticket<br />  finishedWithFeed:(GDataFeedGoogleBase *)feed {<br />  NSArray *myItems = [feed entries];<br />}<br /></pre><br />The framework also supports<a href="http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/" title="key-value coding"> key-value coding</a>, so it's quick and easy for Mac code chefs to use<a href="http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/" title="Cocoa bindings"> Cocoa bindings</a> to whip up user interface displays of your information. Several sample Cocoa applications are available at code.google.com to show how to use more features of the Google data APIs.<br /><br />Google Calendar, Google Base, Google Spreadsheets, and generic Atom feeds like Blogger are supported now in the framework, with access to more services already in development. If you are a Mac developer, I hope you'll join the<a href="http://code.google.com/p/gdata-objectivec-client/" title="open-source project"> open-source project</a> and help us make even more Mac applications Google-savvy.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117673169943681917?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-data-apis-connect-cocoa-developers-to-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Desktop for Mac</title>
		<link>https://googledata.org/google-mac-blog/google-desktop-for-mac/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-desktop-for-mac</link>
		<comments>https://googledata.org/google-mac-blog/google-desktop-for-mac/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 13:05:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted By Mike Pinkerton, Software EngineerPeople have been asking me since I started at Google what I've been working on, and until today, I've been unable to say. Now is the time to change all that and introduce the newest product from the Google Mac...]]></description>
				<content:encoded><![CDATA[Posted By Mike Pinkerton, Software Engineer<br /><br />People have been asking me since I started at Google what I've been working on, and until today, I've been unable to say. Now is the time to change all that and introduce the newest product from the Google MacEng team: <a title="Google Desktop for the Mac (beta)" href="http://desktop.google.com/mac">Google Desktop for Mac (beta)</a>.<br /><br />Google Desktop for Mac takes many of the features from the Windows product, such as indexing Gmail and web history, <a href="http://google.com/"  onclick="return top.js.OpenExtLink(window,event,this)"> Google.com</a> integration, finding content in past file revisions and deleted files, and fast application launching. But we know that simply "porting" to the Mac is not a good idea. So we took the time to develop a product that deeply integrates into Mac OS X and maintains its high standards of usability. This is a Mac product through and through, from the bezel on our search box down to correctly (and securely) handling multiple users and FileVault.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/132028/iChatScreenSnapz001.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/400/725559/iChatScreenSnapz001.jpg" alt="" border="0" /></a>Our primary goal was to make desktop search as fast as Google.com web search. When people think Google, they think speed, and our Google Desktop product is no different. The search box makes launching documents and applications lightning fast and provides quick access to your files, folders, email, and webpages. Better still, with a convenient shortcut key (command + command) it's always right at your fingertips.<br /><br /><br /><br />The next goal was to make Google Desktop as easy to use as a Google.com web search. In your web browser, Google Desktop looks and behaves like our web search, seamlessly blending the two experiences. When you do a Google.com search we'll also display interesting results from your Mac that are related to your search. Getting to Google Desktop is easy, whether you use the search box's shortcut key or click the "Desktop" tab on Google.com. Google Desktop additionally searches your Gmail and web history (from Safari, Camino, and Firefox) without you having to lift a finger, and can even find that important outline you deleted by accident!<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/660189/CaminoScreenSnapz001.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/400/957113/CaminoScreenSnapz001.jpg" alt="" border="0" /></a>As part of Google Desktop, you also get the new Google Updater. Don't worry, you don't have to do anything special: installing Google Desktop gets you Google Updater for free. It is designed to allow you to easily install, update, and uninstall all the Google software for Mac OS X. In addition to managing the products you have installed, Updater allows you to explore and discover other Google software, including Google Earth, Notifier, and Picasa Web Uploader, and learn a little about each of them.  Best of all, Google Updater is always up to date with our full product line, and can even notify you about new software releases from Google!<br /><br />Over the coming months, we'll continue to improve the product and innovate in the area of search, as well as find other ways to integrate into Mac OS X. As tech lead, I'm incredibly proud of the work my team has done, and I hope you enjoy the fruits of our labor. If you'd like to send us some feedback, we'd love to hear it over in <a title="our forum" href="http://groups.google.com/group/google-mac-desktop/">our forum</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117566721699743727?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-desktop-for-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>User 99, Unknown</title>
		<link>https://googledata.org/google-mac-blog/user-99-unknown/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=user-99-unknown</link>
		<comments>https://googledata.org/google-mac-blog/user-99-unknown/#comments</comments>
		<pubDate>Wed, 14 Mar 2007 17:30:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Greg Miller, Mac Team Software Engineer   If you're familiar with Unix or you've poked around user accounts and file permissions in Mac OS X, you have probably seen typical user accounts such as root, nobody, and daemon. Mac OS X has an addit...]]></description>
				<content:encoded><![CDATA[Posted by Greg Miller, Mac Team Software Engineer  <p> If you're familiar with Unix or you've poked around user accounts and file permissions in Mac OS X, you have probably seen typical user accounts such as <span style="font-style: italic;">root</span>, <span style="font-style: italic;">nobody</span>, and <span style="font-style: italic;">daemon</span>. Mac OS X has an additional interesting account for a user named <span style="font-style: italic;">unknown</span>. Unknown has the UID (user ID) number 99, which is treated specially in the kernel and in some user-level libraries. The special properties afforded to unknown are needed to make device sharing between computers as painless as possible. Let's look at what makes unknown so special.<br /><br />User unknown, or more precisely, the user with a UID of 99, is treated specially in the following ways:<br /></p> <ol><br /><li> A file owned by UID 99 <em>appears</em> to be owned by whoever is viewing it (but see the caveat below). </li> <li> Volumes mounted with the <code>MNT_IGNORE_OWNERSHIP</code> flag treat all files as if they were owned by UID 99. </li><br /></ol> An important caveat to the first item above is that this special treatment does not apply to the root user. If root views a file owned by unknown, the file appears as it actually is — owned by user 99. Let's look at an example, using Terminal:<br /><pre>$ <b>touch file.txt</b><br />$ <b>ls -l file.txt</b><br />-rw-r--r-- 1 jgm jgm 0 Mar 9 22:07 file.txt<br /><br />$ <b>sudo chown 99:99 file.txt</b><br />$ <b>ls -l file.txt</b><br />-rw-r--r-- 1 <em>jgm jgm</em> 0 Mar 9 22:07 file.txt </pre><br />Here I created the file file.txt, then changed its owner and group to 99, but the file listing still shows me as the owner. What happens when I list the file as the root user?<br /><pre><br />$ <b>sudo ls -l file.txt</b><br />-rw-r--r-- 1 <em>unknown unknown</em> 0 Mar 9 22:07 file.txt<br /></pre> When I use <code>sudo</code> to list the file as root, we can see that the real owner of the file is indeed <span style="font-style: italic;">unknown</span>. Further, we can verify the behavior when we list the file as another, non-root user:<br /><pre>$ <b>sudo -u <em>test</em> ls -l file.txt</b><br />-rw-r--r-- 1 <em>test test</em> 0 Mar 9 22:07 file.txt<br /></pre><br />This special treatment is handled in the VFS layer of the kernel, specifically, in the file <a href="http://www.google.com/codesearch?hl=en&q=+kpi_vfs+MNT_IGNORE_OWNERSHIP+show:4CSAhwSthoU:0bnv6-sP7n4:wUQy2ud1xwM&amp;sa=N&amp;cd=1&ct=rc&amp;cs_p=http://darwinsource.opendarwin.org/tarballs/apsl/xnu-792.6.61.tar.gz&cs_f=xnu-792.6.61/bsd/vfs/kpi_vfs.c#a0"><code>xnu/bsd/vfs/kpi_vfs.c</code></a>. In that file, the <code>vnode_getattr()</code> function has logic that looks like this:<br /><br /><pre><br />int<br />  vnode_getattr(...) {<br />  ...<br /><br />  if ((nuid == 99) && !vfs_context_issuser(ctx))<br />    nuid = kauth_cred_getuid(vfs_context_ucred(ctx));<br />  ...<br />}<br /></pre><br />This shows the logic used when retrieving the attributes of a vnode. (A vnode is basically an in-kernel structure that represents a file.) In the code, if the vnode is owned by UID 99, and the current calling process is <em>not</em> root, then it returns the calling process's UID as the file's owner. The equivalent logic for handling a GID of 99 is not shown here. This is exactly the behavior that we saw above.<br /><br />The second item I mentioned above is that volumes mounted with the <code>MNT_IGNORE_OWNERSHIP</code> flag cause all files to appear as if they are owned by user <span style="font-style: italic;">unknown</span>. Additionally, new files on those volumes will be created with the <span style="font-style: italic;">unknown</span> owner and group. In many cases, the <code>MNT_IGNORE_OWNERSHIP</code> flag can be controlled on a per-volume basis by checking the "Ignore ownership on this volume" checkbox in the volume's "Get Info" Finder window. However, the flag can also be set by specifying <code>MNT_IGNORE_OWNERSHIP</code> when calling <code>mount(2)</code>.<br /><br />We can use the following C program to determine whether a volume (in this case, we'll try my iPod shuffle) has this flag set:<br /><br /><pre><br />$ <b>cat mnt_ownership.c</b><br />#include &lt;stdio.h&gt;<br />#include &lt;sys/param.h&gt;<br />#include &lt;sys/mount.h&gt;<br /><br />int<br />main(int argc, char **argv) {<br />  struct statfs sb;<br />  int ignore_flag;<br /><br />  /* argv[1] is path to the volume or a file/folder within */<br />  statfs(argv[1], &sb);<br />  ignore_flag = (sb.f_flags & MNT_IGNORE_OWNERSHIP);<br />  printf("ownership %s\n", ignore_flag ? "ignored" : "enabled");<br />  return 0;<br />}<br /><br />$ <b>gcc -o mnt_ownership mnt_ownership.c -Wall</b><br />$ <b>./mnt_ownership /Volumes/TINY</b><br />ownership ignored<br /></pre><br />We can see here that the mounted volume for my iPod shuffle is ignoring ownership. This means that all files on the iPod will appear to be owned by me (or whomever is the current user, according to the rules discussed above), and files created on the iPod will be owned by user 99. Let's prove that with an example in Terminal:<br /><br /><pre>$ <b>cd /Volumes/TINY</b><br />$ <b>ls -l</b><br />total 16<br />drwxrwxrwx 1 jgm jgm 8192 Jan 27 14:12 iPod_Control/<br /><br />$ <b>sudo ls -l</b><br />total 16<br />drwxrwxrwx 1 unknown unknown 8192 Jan 27 14:12 iPod_Control<br /><br />$ <b>touch file.txt</b><br />$ <b>ls -l file.txt </b><br />-rwxrwxrwx 1 jgm jgm 0 Mar 10 16:27 file.txt<br /><br />$ <b>sudo ls -l file.txt</b><br />-rwxrwxrwx 1 unknown unknown 0 Mar 10 16:27 file.txt<br /></pre><br />From this example, we see that files on the iPod are shown as belonging to me, although root sees that they really belong to <span style="font-style: italic;">unknown</span>. When I create a new file, it follows the same behavior.<br /><br />This special behavior is also handled in the VFS layer of the kernel, about 5 lines above the <code>vnode_getattr()</code> snippet discussed above. The relevant code from the function is highlighted here:<br /><br /><pre><br />int<br />vnode_getattr(...) {<br />  ...<br /><b><br />  /*<br />   * Handle uid/gid == 99 and MNT_IGNORE_OWNERSHIP here.<br />   */<br />  ...<br />  if (vp-&gt;v_mount-&gt;mnt_flag & MNT_IGNORE_OWNERSHIP) {<br />    nuid = vp-&gt;v_mount-&gt;mnt_fsowner;<br />    if (nuid == KAUTH_UID_NONE)<br />      nuid = 99;<br />  ...<br />  }<br /></b><br /><br />  if ((nuid == 99) &&amp; !vfs_context_issuser(ctx))<br />    nuid = kauth_cred_getuid(vfs_context_ucred(ctx));<br />  ...<br />}<br /></pre><br />We see that if the MNT_IGNORE_OWNERSHIP flag is specified, the <code>mnt_fsowner</code> value of the mounted file system is consulted. If that value is <code>KAUTH_UID_NONE</code>, then the kernel hardcodes a value of 99 — user <span style="font-style: italic;">unknown</span>. Following that, we go through the same logic as before for handling files owned by 99.<br /><br />One question this brings up: what if the <code>mnt_fsowner</code> value is <em>not</em> <code>KAUTH_UID_NONE</code>? In that case, the files on the volume will appear to be owned by the user specified in <code>mnt_fsowner</code>. In the kernel, HFS+ is the only file system that actually makes use of this feature. This fact is noted in several places with comments like <code>/* XXX 3762912 hack to support HFS filesystem 'owner' */</code>.<br /><br />One final question: should you ever uncheck "Ignore ownership on this volume"?<br /><br />Maybe. If the device is shared among several computers, like an iPod or a thumb drive, then you probably want to leave that box checked. However, if you have a large external drive that you always leave attached to one machine, then unchecking that box is probably a good idea.<br /><br />(This post is adapted from a post on Greg Miller's <a href="http://unixjunkie.blogspot.com/" title="Unixjunkie Blog">Unixjunkie Blog</a>.)<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117388992280017710?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/user-99-unknown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacFUSE news</title>
		<link>https://googledata.org/google-mac-blog/macfuse-news/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=macfuse-news</link>
		<comments>https://googledata.org/google-mac-blog/macfuse-news/#comments</comments>
		<pubDate>Sat, 10 Mar 2007 00:44:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Scott Knaster, Mac Team Technical WriterThere are some new developments with MacFUSE, the open source project that makes it easier to bring file systems to Mac OS X, that we want to let you know about:  One of the great features of MacFUSE is...]]></description>
				<content:encoded><![CDATA[Posted by Scott Knaster, Mac Team Technical Writer<br /><br />There are some new developments with <a href="http://googlemac.blogspot.com/2007/01/taming-mac-os-x-file-systems.html" title="MacFUSE">MacFUSE</a>, the <a href="http://code.google.com/p/macfuse/" title="open source project">open source project</a> that makes it easier to bring file systems to Mac OS X, that we want to let you know about:<br /><ul> <li> One of the great features of MacFUSE is the large set of language bindings available to programmers who want to write file systems. Now the MacFUSE website has an <a href="http://macfuse.googlecode.com/svn/trunk/filesystems-objc/" title="Objective-C library">Objective-C library</a> that's going to be especially popular with all you Cocoa programmers. Like MacFUSE itself, this library is open source so you can extend it to your heart's content. Note that this is the very same library that was used to create the <a href="http://video.google.com/videoplay?docid=3138515991250095768" title="MacFUSE demos">MacFUSE demos</a> shown during Macworld Expo 2007. </li> <li> By popular demand, you can now get source code for the <a href="http://code.google.com/p/macfuse/wiki/MACFUSE_FS_SPOTLIGHTFS" title="Spotlight file system">Spotlight file system</a> that was presented as a demo of what you can do with MacFUSE. </li> <li> For those of you wondering what MacFUSE is and what you can do with it, check out this <a href="http://www.macdevcenter.com/pub/a/mac/2007/03/06/macfuse-new-frontiers-in-file-systems.html" title="article">article</a> I wrote that appears on <a href="http://www.macdevcenter.com/" title="O'Reilly's MacDevCenter">O'Reilly's MacDevCenter</a>. </li> </ul>  You can always get the latest info on MacFUSE by visiting the project's <a href="http://code.google.com/p/macfuse/wiki/CHANGELOG" title="changelog page">changelog page</a>.<br /><br />Good luck exploring new file systems with MacFUSE!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117348731971451265?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/macfuse-news/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Camino talk now on Google Video</title>
		<link>https://googledata.org/google-mac-blog/camino-talk-now-on-google-video/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=camino-talk-now-on-google-video</link>
		<comments>https://googledata.org/google-mac-blog/camino-talk-now-on-google-video/#comments</comments>
		<pubDate>Fri, 02 Mar 2007 18:19:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Mike Pinkerton, Mac Team Software EngineerBack in January, I had the pleasure of speaking at Google as a part of the Open Source Developers @ Google Speaker Series about the past, present and future of Camino. It's impossible to tell the stor...]]></description>
				<content:encoded><![CDATA[Posted by Mike Pinkerton, Mac Team Software Engineer<br /><br />Back in January, I had the pleasure of <a href="http://video.google.com/videoplay?docid=6765603919277760697" title="speak at Google">speaking at Google</a> as a part of the <a href="http://google-code-updates.blogspot.com/" title="Open Source Developers @ Google Speaker Series">Open Source Developers @ Google Speaker Series</a> about the past, present and future of <a href="http://www.caminobrowser.org/" title="Camino">Camino</a>. It's impossible to tell the story without understanding Mozilla's past and the lessons we learned through our involvement with the open source community at Netscape. Many of these lessons are universal across open source projects, and I hope others can learn from the successes and failures to improve their own work.<br /><br />I hope you enjoy watching the talk.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117285966251876884?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/camino-talk-now-on-google-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A visit to Apple</title>
		<link>https://googledata.org/google-mac-blog/a-visit-to-apple/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-visit-to-apple</link>
		<comments>https://googledata.org/google-mac-blog/a-visit-to-apple/#comments</comments>
		<pubDate>Sat, 24 Feb 2007 04:40:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Scott Knaster, Mac Team Technical WriterWhen you start work at Google, you get to choose whether you want a Mac, Windows, or Linux computer. For many new employees who have never used a Mac (or who haven't used one for a long time), this choi...]]></description>
				<content:encoded><![CDATA[Posted by Scott Knaster, Mac Team Technical Writer<br /><br />When you start work at Google, you get to choose whether you want a Mac, Windows, or Linux computer. For many new employees who have never used a Mac (or who haven't used one for a long time), this choice represents a chance to try living in Mac OS X. Google provides a supportive environment for users of various operating systems, so newbie Mac users can count on something of a comfort zone. And, just as elsewhere in the world, new Mac users at Google are often won over by Apple's excellent combination of hardware and software.<br /><br />I spend part of my time at Google writing documentation for <a href="http://checkout.google.com/">Google Checkout</a>, and in that group I work with several of these recent Mac converts. Some of the folks in the group became intrigued with the idea of visiting Apple's headquarters, located just a brief <a href="http://maps.google.com/maps?f=d&hl=en&amp;saddr=1600+Amphitheatre+Pky,+Mountain+View,+CA+94043&daddr=1+Infinite+Loop,+Cupertino,+CA&amp;sll=37.0625,-95.677068&sspn=74.527493,86.835938&amp;amp;amp;amp;amp;amp;amp;layer=&ie=UTF8&amp;z=12&amp;om=1">drive down the road</a>, and I mentioned that I could probably convince a couple of Apple friends to host us for lunch in Apple's cafeteria. The Mac newbies thought that was a fine idea, and lunch was arranged.<br /><br />When the date arrived, my gang and I piled into our cars for the quick trip to Cupertino. We met up with my friends and spent the first part of our visit at Apple's legendary <a href="http://www.apple.com/companystore/">Company Store</a>, where we admired all the new Macs and iPods, and wandered through the selection of Apple-logoed clothing, pens, notebooks, and other chotchkas. Strong willpower kept us from buying too much stuff.<br /><br />After the store visit, our Google gang entered the main Apple building at 1 Infinite Loop and walked to <a href="http://writersblocklive.com/part-94">Caffé Macs</a>. We chose our food from among the sushi, burritos, soups, and other fare that was somewhat Google-like, paused to pay for our lunches (<a href="http://googleblog.blogspot.com/2005/08/keyword-chefs.html">which was not Google-like at all</a>), then took our seats.<br /><br />A few minutes later, as we were enjoying our lunch and chatting with Apple friends, we noticed a slight disturbance in the room, as if all the air had rushed to a single place, over by the salad bar. As you have probably guessed, it was Apple CEO Steve Jobs, grabbing some lunch with <a href="http://en.wikipedia.org/wiki/Jonathan_Ive">Jonathan Ive</a>, Apple's industrial design guru. As the two moved across the room, there was no great commotion -- after all, this probably happens just about every day at Apple -- but our Google group and many other folks stopped eating long enough to follow the two rock stars around the room for awhile.<br /><br />Later, as we drove back to Mountain View, we reflected on our visit. My coworkers enjoyed the entire trip, but were most impressed with the impromptu Steve Jobs flyby. They even accused me of timing our visit to correspond with Steve's lunch (as if!). And so, a gang of new Mac fans at Google visited Apple and became full on converts.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117229230380867135?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/a-visit-to-apple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You can go home again (with Google Maps)</title>
		<link>https://googledata.org/google-mac-blog/you-can-go-home-again-with-google-maps/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=you-can-go-home-again-with-google-maps</link>
		<comments>https://googledata.org/google-mac-blog/you-can-go-home-again-with-google-maps/#comments</comments>
		<pubDate>Fri, 09 Feb 2007 03:05:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Mike Morton, Mac Team Technical StaffMy mother’s parents lived on a farm in New Jersey, or at least it seemed like a farm to me. To a kid from the Boston ’burbs, parking the car in a barn and drinking water from a well seemed very exotic....]]></description>
				<content:encoded><![CDATA[Posted by Mike Morton, Mac Team Technical Staff<br /><br />My mother’s parents lived on a farm in New Jersey, or at least it seemed like a farm to me. To a kid from the Boston ’burbs, parking the car in a barn and drinking water from a well seemed very exotic. Best of all, my grandparents rented the part of the property across the creek to their neighbors, who grazed cows there. Wading across the creek and feeling the mud squish under my bare feet as I approached huge, terrifying (to me) cows was unlike anything I’d experienced.<br /><br />Today I live in Northern New England. As a telecommuter, I travel mostly to <a href="http://maps.google.com/maps?f=q&hl=en&amp;q=One+Broadway,+Cambridge,+MA+02142&om=1+%28Google+Cambridge%29">Cambridge</a> and <a href="http://www.google.com/support/jobs/bin/static.py?page=why-ca-mv.html">Mountain View</a> for my work on products like the <a href="http://picasa.google.com/web/mac_tools.html">Picasa Web Albums Uploader for Mac</a>. I haven’t visited the farm in 30 years, but it stays in my mind. When I read a novel with a rural setting, I unconsciously place the characters on the porch, in the kitchen, behind the barn. Fresh corn and fresh strawberries today remind me of the garden then. Come summer where I live now, lightning bugs bring back memories of catching them on my grandparents' lawn.<br /><br />Cousins tell me the farm stays with them too. The phrase “You can’t go home again” comes to mind, and a Google search finds that it comes from the title of <a href="http://en.wikipedia.org/wiki/Thomas_Wolfe">Thomas Wolfe</a>’s novel — published posthumously (when it’s even harder to go home again). But in idle moments (they do happen at Google, just not often) I think about visiting the farm. Next week I’ll fly out of Newark on my way to a vacation, and <a href="http://maps.google.com/">Google Maps</a> tells me the farm is an hour from Newark airport…but I doubt I’ll have time.<br /><br />I recently asked my mom for help as I tried to find the house using Google Maps. The first problem was that she didn’t know the address. It wasn’t that she’d forgotten it — her parents received postal mail by <a href="http://en.wikipedia.org/wiki/Rural_Free_Delivery">Rural Free Delivery</a>, and didn’t have a street address. So we found the town, and just browsed, trying to spot landmarks from above. But decades of growth, especially new highways, made it difficult. Then we remembered the neighbors' last name. Google found a street address in seconds, and that took us back to Google Maps. Scrolling a few hundred yards southeast, we found the farm.<br /><br />Here’s a screen shot from Maps. The original house is in the lower right. The driveway and barn are the same. It looks like someone’s added a second driveway and — where the garden was — a second house.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/904346/house.jpg"><img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/400/636104/house.jpg" alt="" border="0" /></a><br /><br />An amazing confluence of satellite and server technologies lets me sit on my couch and see the house. If I prefer, I can use <a href="http://earth.google.com/">Google Earth</a> to "fly" there from anywhere else. I don’t know yet if that diminishes or increases my urge to see it in person, but it makes me happy to see the creek as it is today. Satellite images aren’t sharp enough to know for sure, but I expect there are still kids there squishing their toes in the mud.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117099059069821619?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/you-can-go-home-again-with-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Notifier tips and tidbits</title>
		<link>https://googledata.org/google-mac-blog/google-notifier-tips-and-tidbits/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-notifier-tips-and-tidbits</link>
		<comments>https://googledata.org/google-mac-blog/google-notifier-tips-and-tidbits/#comments</comments>
		<pubDate>Tue, 30 Jan 2007 03:37:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by David Phillip Oster, Mac Software EngineerGoogle Notifier is a program I wrote that lets you know when there is new Gmail ready to be read in your inbox and when you have upcoming Google Calendar events. The basic features of Notifier are pre...]]></description>
				<content:encoded><![CDATA[Posted by David Phillip Oster, Mac Software Engineer<br /><br /><a href="http://www.google.com/mac.html" title="Google Notifier">Google Notifier</a> is a program I wrote that lets you know when there is new Gmail ready to be read in your inbox and when you have upcoming Google Calendar events. The basic features of Notifier are pretty obvious, but there are a few bits of trivia that Notifier users might be interested in. That's the purpose of this post.<br /><br />Notifier is a descendant of Gmail Notifier, Greg Miller's Gmail-only program. (And I want to thank him for getting me started here at Google.)<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/865315/notifier.jpg"><img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/317431/notifier.jpg" alt="" border="0" /></a><br /><br /><span style="font-weight: bold;">Notifier basic interface philosophy</span><br /><br />To understand the basic interface strategy of Notifier, let's compare it with the way Dashboard works. Dashboard is designed to show you an instrument panel of information, like a car's dashboard, when you want to see it. Dashboard flies in when you want it, and flies out when you're done. In a sense, you are interrupting your normal collection of applications to see its information. Google Notifier is intended to be the opposite: you've given it permission to interrupt you, to get your attention about something nearby in time. If you want to see the full details of your calendar, you can open <a href="http://google.com/calendar" title="Google Calendar">Google Calendar</a> in a browser. If you want a quick overview of what's important now, Notifier is the way to go.<br /><br /><span style="font-weight: bold;">Based on Calendar GData</span><br /><br />The first version of Notifier only let you know about Gmail. After that version came out, the Google Calendar team launched a new, publicly available data feed called <a href="http://code.google.com/apis/calendar/overview.html" title="GData for Calendar">GData for Calendar</a>. This seemed like a great opportunity to add Calendar features to Notifier, so I revised Notifier so that it also lets you know about your upcoming Calendar events.<br /><br /><span style="font-weight: bold;">Notifier gets attention your way</span><br /><br />When it's time to get your attention, Notifier plays a sound and shows a dark, translucent window in the upper right corner of your screen. That window fades out after a few seconds, or you can click on it to get rid of it right away. I've picked a sound and a window style I like, but because this a Macintosh, you can make it work the way you want: you can pick your own alert sound in Notifier's Preferences dialog, and you can completely change the way Notifier gets your attention by using the free third-party product <a href="http://www.growl.info/"  title="Growl">Growl</a>, with the <a href="http://wafflesoftware.net/gmailgrowl/"  title="Growl+Notifier">Growl+Notifier</a>  adapter. (Note: these are not Google products, and I've got no say in how they behave.)<br /><br /><span style="font-weight: bold;">Easter egg</span><br /><br />As a reward for reading this far, here's a hidden feature you might like. Pull down the Notifier menu (either Calendar or Gmail), hold down Command and Option, and click Preferences on the menu. You'll see a hidden settings editor. Enter MaxMessagesOnMainMenu in the Key field (upper and lower case must be entered as shown) and 20 in the Value field, then click Set. Quit Notifier and start it up again. Now, when you pull down the Notifier menus, you'll see all your Gmails and all your Calendar events listed in single menus, without any "View More" sub-menus.<br /><br />If you want to get the sub-menus back, get the hidden settings editor back again, enter MaxMessagesOnMainMenu for the Key, and 4 for the Value, then click Set. Quit Notifier and start it again, and your sub-menus will be back, good as new.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-117012851808415039?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-notifier-tips-and-tidbits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Spotlight File System for MacFUSE</title>
		<link>https://googledata.org/google-mac-blog/the-spotlight-file-system-for-macfuse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-spotlight-file-system-for-macfuse</link>
		<comments>https://googledata.org/google-mac-blog/the-spotlight-file-system-for-macfuse/#comments</comments>
		<pubDate>Tue, 23 Jan 2007 18:49:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Greg Miller, Software Engineer, Mac Team  A little over a week ago, we announced the open-source release of MacFUSE. Since FUSE makes it so easy to slap a file system view on data, I thought it might be neat to give Spotlight a file system in...]]></description>
				<content:encoded><![CDATA[Posted by Greg Miller, Software Engineer, Mac Team<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/282613/Picture%202.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/669304/Picture%202.jpg" alt="" border="0" /></a><br /><br /><br /><h1> <span style="font-weight: bold;"><br /></span> </h1>A little over a week ago, we <a href="http://googlemac.blogspot.com/2007/01/taming-mac-os-x-file-systems.html" title="Google announced">announced</a> the open-source release of <a href="http://code.google.com/p/macfuse/" title="MacFUSE">MacFUSE</a>. Since FUSE makes it so easy to slap a file system view on data, I thought it might be neat to give <a href="http://www.apple.com/macosx/features/spotlight/" title="Spotlight.">Spotlight</a> a file system interface. So in my spare time I wrote <a href="http://code.google.com/p/macfuse/wiki/MACFUSE_FS_SPOTLIGHTFS" title="SpotlightFS">SpotlightFS</a>, which is now available for download from the <a href="http://code.google.com/p/macfuse/downloads/list" title="MacFUSE project page">MacFUSE project page</a>.<br /><br />SpotlightFS is a MacFUSE file system that creates true smart folders, where the folders' contents are dynamically generated by querying Spotlight. This differs from Finder's version of smart folders, which are really plist files with a ".savedSearch" file extension. Since SpotlightFS smart folders are true folders, they can be used from anywhere—including the command line!<br /><br />SpotlightFS is not very complicated, and it's a good example of what can quickly and easily be done using MacFUSE. Please check out <a href="http://code.google.com/p/macfuse/wiki/MACFUSE_FS_SPOTLIGHTFS" title="SpotlightFS">SpotlightFS</a> and the other cool stuff on the newly updated <a href="http://code.google.com/p/macfuse/" title="MacFUSE project">MacFUSE project</a> site.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116957825929200726?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/the-spotlight-file-system-for-macfuse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Macworld keynote campout</title>
		<link>https://googledata.org/google-mac-blog/macworld-keynote-campout/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=macworld-keynote-campout</link>
		<comments>https://googledata.org/google-mac-blog/macworld-keynote-campout/#comments</comments>
		<pubDate>Fri, 19 Jan 2007 20:16:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Rose Yao, Mac Product Manager and Mike Pinkerton, Software EngineerRemember when I said I was "new to the Mac"? Well, after camping out the night before Steve Jobs' keynote speech at Macworld Expo, I now consider myself a Mac veteran. I joine...]]></description>
				<content:encoded><![CDATA[Posted by Rose Yao, Mac Product Manager and Mike Pinkerton, Software Engineer<br /><br />Remember when I said I was "<a href="http://googlemac.blogspot.com/2006/10/something-old-something-new.html" title="new to the Mac">new to the Mac</a>"? Well, after camping out the night before <a title="Steve Jobs' keynote speech at Macworld Expo" href="http://events.apple.com.edgesuite.net/j47d52oo/event/">Steve Jobs' keynote speech at Macworld Expo</a>, I now consider myself a Mac veteran. I joined a group of product managers and Google Mac Team engineers, and we were the second group in line to get in. Although the Google Mac team now has almost 20 people, I only managed to convince three engineers that it was a good idea to camp overnight in San Francisco to see the keynote. (I wonder why?)<br /><br />So here's the rough timeline for this whole thing based on what Mike and I remember:<br /><br />December 2006 - Rose gets shamed into camping out at Macworld Expo by other Google product managers because she is the Mac PM. Rose immediately turns around and tries to shame other Mac team members into camping out with her.<br /><br />January 8, 3 PM - The people going to the campout wonder if we have tents or need permits to camp in the middle of downtown San Francisco. Rose emails <a href="http://avichal.wordpress.com/2007/01/13/camping-out-for-macworld/" title="Avichal">Avichal</a>, our official planner for this, who responds, "Tents? Permits? What?" We know we'll be OK, however, as our Engineering Director would be more than happy to bail us all out of jail on trespassing charges simply to get the airline miles.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/470599/IMG_1647.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/482677/IMG_1647.jpg" alt="" border="0" /></a><br />6:30 PM - Headed to Moscone North to pick up our badges. This will ensure we do not need to get out of line at 6 AM :).<br /><br />8 PM - We get our badges and wonder what's next. Aha, Thai food and beer! Need you even ask?<br /><br />10:45 PM - We get in line behind a few guys from Arizona (whose names we wrote down but can't read because we didn't write them down until 5 AM; we think they were Andrew, Steven, and Robinson). We're incredibly disappointed to find that we aren't the first in line, but we quickly learn that it's better for a restful (hah!) night's sleep that we aren't, as the front of the line collects much media attention. With long faces, we set up Camp Google behind the early birds and settle in.<br /><br />11 PM - A photographer from Apple comes by to take our picture. Apparently he couldn't believe we were camping out either.<br /><br />11:10 PM - We start playing some odd board game derived from some other odd board game, but when the rules became too complicated (what, there are more than two rules?!) we end up playing BS (Rose won). At this point it starts to sink in that we really are in for a long night of concrete and board games.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/480827/IMG_1634.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/299280/IMG_1634.jpg" alt="" border="0" /></a><br />11:20 PM - Media descends: <a href="http://blog.blankbaby.com/blankbaby/2007/01/scott_talks_to__1.html" title="Unofficial Apple Weblog interview">Unofficial Apple Weblog interview</a>. Rose tries to get free PR for <a title="Google Earth" href="http://earth.google.com/">Google Earth</a>, <a title="SketchUp" href="http://www.sketchup.com/">SketchUp</a>, and <a title="Notifier" href="http://mail.google.com/mail/help/notifier/notifier_mac.html">Notifier</a>, but just ends up getting hit on. The rest of us try to look busy, or enthralled in some other board game, so we won't get asked any questions. In the background, the larger of the two tents is raised, causing passersby to stop and ask what tickets we were in line for. We decide the best answer is either Aerosmith or Bon Jovi, because that sounds much less lame than lining up for a computer show.<br /><br />11:45 PM - Marissa Mayer, our VP of Product Management, shows up to encourage the campers. We manage to fit 14 people into an 8-person tent. It was warm, it was cozy, and it felt something you would do in college -- like so many other things we do around here.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/583134/IMG_1663.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/550244/IMG_1663.jpg" alt="" border="0" /></a><br />January 9, 12:30 AM - Some people decide to start working...<sigh>. Also typical for Google.<br /><br />2 AM - 4 AM - Catnap. Rose stays warm, but several of us do not, although being in the tent allows us to stay fully functional. It's quite cold (even by East Coast standards) and there is a significant difference in temperature inside and outside the tent.<br /><br />4:30 AM - Documentary film crew shows up. Avi wakes up at 3:50, Pink at 4:30, Rose and Amanda around 5:00. By this point we are very glad we're not first in line, as every 5 minutes another group of people with cameras and microphones shoves an electronic recording device in the faces of the poor chaps ahead of us. They are a popular item; we're not sure they slept a wink the entire night.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/459276/IMG_1667.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/823807/IMG_1667.jpg" alt="" border="0" /></a><br />5:15 AM - The coordinator comes out and lets us know they'll "soon" be letting us inside, so we need to start clearing the tents and compacting the line. At this point, the line extends down two full sides of Moscone West, and nobody looks particularly warm or happy. There's still at least another two hours until sunrise. We compact the tents, and the line compacts in turn. Weary faces greet Marissa as she arrives fresh with doughnuts and water. Coffee arrives, donated by a local coffee shop.<br /><br />6:20 AM - Hooligans drive by, shouting "Windows Vista" out the car window.<br /><br />6:35 AM - We start moving indoors. Incredulous looks from Apple employees inside (you would think they're used to this by now). One of us says, "It's gonna be another two hours. I'm gonna work!" They snake us around inside the building, reminding us that we are supposed to be the example for the remainder of the mob behind us: we must walk slowly and not run, else everyone else will run. Run?! Who has the energy to run?! They lead us to the very front of the line, and we can almost feel the cushions on the chairs in the 10th row. Then they start lining up the SuperPass VIP ticketholders beside us. They get to go first, so we don't like them. People start doing calculations on how much each lost hour of sleep was worth in terms of the VIP ticket price.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/599386/MacworldPanoramaLineOutsidePlanar.jpg"><img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/722158/MacworldPanoramaLineOutsidePlanar.jpg" alt="" border="0" /></a><br />6:50 AM - Macworld employees are miming a tennis match with their large directional signs. I guess we're going to be here a while.<br /><br />7:50 AM - People with Platinum and Superpass tickets start moving forward -- and stop. Everyone sits back down again. The concrete indoors is only marginally better than the concrete outdoors, but at least it's warm.<br /><br />8:30 AM - We're moving. Then not. Stop teasing us!<br /><br />8:55 AM - Almost moving. This time for sure! Again we're supposed to be the responsible ones and walk (not run) up the escalators, and we're assured we will be getting incredible seats for the keynote. I think they just said that so we wouldn't trade their lives for a muffin.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/88061/IMG_1688.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/813/3778/320/436374/IMG_1688.jpg" alt="" border="0" /></a><br />9:06 AM - We're in, about halfway back from the stage. The entire front section is taken by VIPs, Platinum, and SuperPass ticket holders. After dreams of 10th-row seats, we're disappointed, but we're in!<br /><br />11:30 AM - The keynote is over. Steve Jobs is a god and we must all buy an iPhone now :) Sadly, there's nothing to buy immediately so we can't even run over to the Apple store and fight over boxes of pretty plastic. Now we must wait, and <a  title="tape together our cutout iPhone mockups" href="http://www.iphoneunboxed.com/">tape together our cutout iPhone mockups</a> like everyone else.<br /><br />As a team-building experience (rest of the team, where were you? You know who you are!) this was a lot of fun. Seeing so many Googlers excited about Apple and its announcements keeps us excited about delivering insanely great Mac products. Would we do it again? I can't say yes for sure, especially since we ended up so far back after all that waiting and sleep deprivation. But we had to do it once, and we certainly picked a great show to camp out for. Next year I think I'll just wait for the weblogs. Unless there's a SuperPass out there with my name on it.</sigh><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116923796316983564?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/macworld-keynote-campout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taming Mac OS X File Systems</title>
		<link>https://googledata.org/google-mac-blog/taming-mac-os-x-file-systems/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=taming-mac-os-x-file-systems</link>
		<comments>https://googledata.org/google-mac-blog/taming-mac-os-x-file-systems/#comments</comments>
		<pubDate>Thu, 11 Jan 2007 19:57:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Amit Singh, Mac Engineering ManagerGoogle is a fantastic company to work for. I could cite numerous reasons why. Take the concept of "20 percent time." Google engineers are encouraged to spend 20 percent of their time pursuing projects they'r...]]></description>
				<content:encoded><![CDATA[Posted by Amit Singh, Mac Engineering Manager<br /><br />Google is a <a href="http://money.cnn.com/magazines/fortune/bestcompanies/2007/snapshots/1.html" title="fantastic company to work for">fantastic company to work for</a>. I could cite numerous reasons why. Take the concept of "20 percent time." Google engineers are encouraged to spend 20 percent of their time pursuing projects they're passionate about. I started one such exciting project some time back, and I'm pleased to announce that Google is releasing the fruits of this project as an open source contribution to the Macintosh community. That project is MacFUSE, a Mac OS X version of the popular <a href="http://fuse.sourceforge.net/" title="FUSE">FUSE</a> (File System in User Space) mechanism, which was created for Linux and subsequently ported to FreeBSD.<br /><br />FUSE makes it possible to implement a very functional file system in a normal program rather than requiring a complex addition to the operating system. More importantly, the FUSE API is very easy to program for. The <a href="http://fuse.sourceforge.net/wiki/index.php/FileSystems" title="large number">large number</a> of interesting and/or useful FUSE file systems out there is a testament to this. An often-cited example of such a useful file system is <a href="http://fuse.sourceforge.net/sshfs.html" title="sshfs">sshfs</a>, which until now was not available on Mac OS X.<br /><br />One of the missions of the Google Macintosh team is to contribute to the Mac community and make the Mac OS X experience better for users and developers. We hope that MacFUSE will not only make several existing FUSE file systems readily available to Macintosh users--typically, right out of the box--but will also help Macintosh developers give vent to their creative fervor and come up with innovative products and file systems that we have never seen before.<br /><br />The MacFUSE implementation Google is releasing today includes the following components:<br /><ul><li>A virtual file system (VFS) kernel extension</li><li>A special-purpose mount_fusefs program</li><li>A patch to the FUSE user-space library</li><li>A patch to the SSHFS file system</li></ul>More details on using and developing for MacFUSE are available on the <a href="http://code.google.com/p/macfuse/" title="project's Google Code page">project's Google Code page</a>.<br /><br />Small disclaimer: Please note that MacFUSE is a complex piece of software, and it is a work in progress. We believe in releasing early and often, so we're releasing it now so that the community can help us to make it more robust.<br /><br />Finally, I would like to express my thanks to the FUSE developers for having created FUSE in the first place. Miklos Szeredi did a wonderful job with FUSE on Linux, and Csaba Henk did an equally great job porting FUSE to FreeBSD.<br /><br />Enjoy your file systems!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116854551162439667?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/taming-mac-os-x-file-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spolsky and me</title>
		<link>https://googledata.org/google-mac-blog/spolsky-and-me/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spolsky-and-me</link>
		<comments>https://googledata.org/google-mac-blog/spolsky-and-me/#comments</comments>
		<pubDate>Thu, 04 Jan 2007 17:48:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Mike Morton, Member of Technical Staff, Mac TeamOne of the nice things about working for Google is that even though we engineers have a lot to do in our day jobs, we’re encouraged to learn new things. We attend "tech talks" (which aren’t ...]]></description>
				<content:encoded><![CDATA[Posted by Mike Morton, Member of Technical Staff, Mac Team<br /><br />One of the nice things about working for Google is that even though we engineers have a lot to do in our day jobs, we’re encouraged to learn new things. We attend "tech talks" (which aren’t always technical, despite their name), tackle <a href="http://www.google.com/support/jobs/bin/static.py?page=about.html" title="20% projects">20% projects</a>, take training courses, and so on. Among the things I do is try to read one technology book each quarter. That can be a lot of effort, given the complexity (not to mention the sheer mass) of some of these books.<br /><br />Last quarter, I read <a href="http://www.amazon.com/exec/obidos/ASIN/1893115941/ref=nosim/joelonsoftware" style="font-style: italic;" title="User Interface Design for Programmers">User Interface Design for Programmers</a>  by Joel Spolsky, host of the popular <a href="http://www.joelonsoftware.com/" title="Joel On Software">Joel On Software</a>. It was more interesting — and more useful — than I expected.<br /><br />It’s also short (about 140 pages paperback) and fairly light reading, a rare pleasure in a technology book these days. I recommend it. My only complaints are that it’s five years old and mostly covers Windows (so it’s really 15 years old in Mac years). Most of the book revisits things we (should) already know: user-centered design, the user’s model, the importance of usability testing. Spolsky is great at explaining these things succinctly and memorably.<br /><br />Here are some of his thoughts, which I think are worth keeping in mind, even though I don’t agree with all of them:<br /><ul><li> Usability testing of five or six users tells you all you need. You’re looking for big problems, not statistical significance on the small ones. </li><li> Users want to accomplish their tasks, not use your features ("users care about a lot fewer things than you might think"). </li><li> Usability isn’t the same as learnability, and “usability testing” usually tests the latter. </li><li> So what if 30% of users fail to accomplish the task in testing? Those people will ask for help or read the doc, or aren’t your target users, anyway. </li><li> Karen Fries at Microsoft invented the Wizard as a way to teach you how to use the usual UI, not to do the task for you. </li><li> Users don’t read (documentation or dialog instructions). </li><li> Users can’t use the mouse as easily as you think. </li><li> Invent imaginary users, name them, and talk about them to make them seem like real people, which they do represent. </li><li> Icons work well to represent nouns, but not verbs. </li></ul> My favorite quote: "Pull up the Tools &gt; Options dialog box and you will see a history of the heated arguments that the software designers had about the design of the product." That’s not exclusively a Windows problem — the same is true if you select Preferences from the application menu on a lot of Mac products. The next time I have the urge to say “Let’s just make that a preference setting," I should keep this book in mind.<br /><br />If you have time to read only one chapter, read <a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000065.html" title="“The Process of Designing a Product,&quot;">“The Process of Designing a Product,"</a> which describes Activity-Based Planning. It’s one of several chapters you can <a href="http://www.joelonsoftware.com/uibook/chapters/fog0000000057.html" title="read for free">read for free</a> on Spolsky’s site, but as he points out, the published book is more polished, and you might enjoy it enough to read the whole thing.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116793295220949329?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/spolsky-and-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Chanute?</title>
		<link>https://googledata.org/google-mac-blog/why-chanute/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=why-chanute</link>
		<comments>https://googledata.org/google-mac-blog/why-chanute/#comments</comments>
		<pubDate>Wed, 20 Dec 2006 21:34:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Dan Webb, Software Engineer, Google Earth for Mac OS XIf you're in the U.S. and you have a Mac, try this: Launch Google Earth, wait for the zooming to stop, and then press the + button to zoom closer. You'll arrive at the small town of Chanut...]]></description>
				<content:encoded><![CDATA[Posted by Dan Webb, Software Engineer, Google Earth for Mac OS X<br /><br />If you're in the U.S. and you have a Mac, try this: Launch <a href="http://earth.google.com/" title="Google Earth">Google Earth</a>, wait for the zooming to stop, and then press the + button to zoom closer. You'll arrive at the small town of <a title="Chanute, Kansas" href="http://en.wikipedia.org/wiki/Chanute%2C_Kansas">Chanute, Kansas</a>, nestled in the southeast corner of the state. I doubt you've ever noticed this before now. But even if you have, you're probably wondering -- why Chanute?<br /><br />There are several reasons. The most important reason is that I was born and raised there. I grew up on a small farm, and while everyone else was out feeding the ducks and milking the cows, I was inside making electronic contraptions and eventually programming computers (which would scarcely be recognized as such today, since <a title="my first computer" href="http://en.wikipedia.org/wiki/ELF_II">my first computer</a>   had only 256 bytes of memory and a dual hexadecimal LED display).<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/815622/tioga2.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/x/blogger/813/3778/320/357806/tioga2.jpg" border="0" alt="" /></a><br />The second reason I chose Chanute is that it's near the geographic center of the 48 contiguous states. If I had been born in, say, New Hampshire, I never would have thought to tamper with the Google Earth coordinates.<br /><br />And the last reason is that my co-worker Brian McClendon, who grew up in <a title="Lawrence, Kansas" href="http://en.wikipedia.org/wiki/Lawrence%2C_Kansas">Lawrence, Kansas</a>, had already positioned the Windows version of Google Earth (which shipped a few months earlier than the Mac version) at his hometown. I guess you could say that Brian's shenanigans inspired my own.<br /><br />But the choice of Chanute is not without controversy. Because it's farther than Lawrence from the geographic center of the 48 states, and since (as of this writing) the satellite imagery at Chanute is not as crisp, it could be interpreted as a less user-friendly choice, which is not in keeping with the Macintosh tradition. But don't let that fool you -- the people in Chanute are as friendly as they come. Stop by sometime and say hello -- and be sure to tell them Dan sent you.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116665075158318521?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/why-chanute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Passion for Music</title>
		<link>https://googledata.org/google-mac-blog/a-passion-for-music/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-passion-for-music</link>
		<comments>https://googledata.org/google-mac-blog/a-passion-for-music/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 20:18:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by Mark Dalrymple, Member of Technical Staff, Mac TeamAfter an orchestra rehearsal last month, some of us went to the local Eat-n-Park, a family restaurant chain here in western Pennsylvania. I was decked out in a traditional black Google T-shir...]]></description>
				<content:encoded><![CDATA[Posted by Mark Dalrymple, Member of Technical Staff, Mac Team<br /><br />After an orchestra rehearsal last month, some of us went to the local <a href="http://eatnpark.com/" title="Eat-n-Park">Eat-n-Park</a>, a family restaurant chain here in western Pennsylvania. I was decked out in a traditional <a href="http://googlestore.com/product.asp?catid=5&code=GO0108" title="black Google T-shirt">black Google T-shirt</a>. After chatting with the waitress a bit, she asked about the shirt, and I said that I worked at Google. She said "Wow! It never occurred to me that people actually worked there."<br /><br />Yes, indeed, real live people work here. And because we're real people, we have real interests. The most interesting programmers I've come across have also had serious passions outside the world of bits and bytes. Among the Googlers I know are a triathlete, an expert wordsmith, a rescue dog trainer, and an incredible black-and-white photographer.<br /><br />My particular passion is music. I've been playing music of one kind or another since fourth grade, having floated into and out of dozens of groups, and I have played hundreds of performances over the years. I met my wife Sharlotte in a <a href="http://loudounsymphony.org/" title="community orchestra in Northern Virginia">community orchestra in Northern Virginia</a>. Since moving to the Pittsburgh area in 2000, we've joined <a href="http://kvcb.net/" title="two">two</a> <a href="http://wswinds.org/" title="concert bands">concert bands</a>, one <a href="http://edgewoodsymphony.org/" title="community orchestra">community orchestra</a>, an on-again off-again woodwind quintet, and we sing in a church choir.<br /><br />I started out my music career on trombone in elementary school and got to be a fairly decent player. In junior high school, my folks sent me to <a href="http://www.interlochen.org/camp/" title="The Summer Arts Camp at Interlochen">The Summer Arts Camp at Interlochen</a>, an 8-week musical immersion experience where you perform 7 complete concerts. That's a fresh batch of music nearly every week! At Interlochen, I met the bassoon while I was counting hundreds of bars of rest during orchestra rehearsals. One week the group was doing the Berceuse and Finale from <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?playlistId=5916652&i=5916573" title="Stravinski's Firebird suite">Stravinski's Firebird suite</a>, which has an amazing bassoon part. At that point, I decided I wanted to play that thing. I <span style="font-style: italic;">had</span> to play that thing. Luckily, my school had an instrument no one was using, so I glommed onto it and took some lessons. I've kept up with both instruments over the years, becoming a "doubler": that is, I play each of them well enough to not embarrass myself in public.<br /><div style="direction: ltr;">  <br />Sharlotte and I are very busy musically, especially during the holiday times. This month, we're slated to play a three-night run of a hometown Christmas musical, one orchestra concert, three community band benefit concerts, background music at a grocery store, background music for a dinner banquet, two church services, and we'll be demonstrating the double-reed family to the local middle school's seventh grade band. It's a crazy schedule, but we love it.<br /> <br />  I'll leave you with two recordings. In the first, I'm performing "<a href="http://homepage.mac.com/borkware/.Music/byebyeblues.mp3" title="Bye Bye Blues">Bye Bye Blues</a>", a bass trombone solo with the Westmoreland Symphonic Winds Jazz band. The other is Zephyrs (The West Winds), a quintet I'm in, playing the <a href="http://homepage.mac.com/borkware/.Music/quintetForWindsII.m4a" title="second movement of the woodwind quintet by Muczynski">second movement of the woodwind quintet by Muczynski</a>, which includes Sharlotte on oboe and me on bassoon. I hope you enjoy the music -- played by people!<br /> <br /></div> <table style="width: auto;">   <tbody>   <tr>     <td>       <a href="http://picasaweb.google.com/sknaster/Woz/photo#5005934744530594706"><img src="http://lh5.google.com/image/sknaster/RXinIKiIK5I/AAAAAAAAA50/EvDXt98qnIs/s288/IMG_1080.jpg" style="width: 164px; height: 199px;" /></a>     </td>   </tr>   <tr>     <td style="font-family: arial,sans-serif; font-size: 66%; text-align: right;">      <br />    </td>   </tr>   </tbody> </table><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116586842455358233?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/a-passion-for-music/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Summer of Code and Macs</title>
		<link>https://googledata.org/google-mac-blog/google-summer-of-code-and-macs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-summer-of-code-and-macs</link>
		<comments>https://googledata.org/google-mac-blog/google-summer-of-code-and-macs/#comments</comments>
		<pubDate>Wed, 06 Dec 2006 20:10:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Desmond Elliott, StudentWhat did you do on your summer vacation? Desmond Elliott, a computer science student at Edinburgh University, spent some of his  time working on Camino, the Mac-only open source browser, as part of the Google Summer o...]]></description>
				<content:encoded><![CDATA[Posted by: Desmond Elliott, Student<span style="font-style: italic;"><br /><br />What did you do on your summer vacation? <a href="http://summerofcamino.blogspot.com/">Desmond Elliott</a>, a computer science student at <a href="http://www.ed.ac.uk/" title="Edinburgh University">Edinburgh University</a>, spent some of his  time working on <a href="http://www.caminobrowser.org/">Camino</a>, the Mac-only open source browser, as part of the <a href="http://code.google.com/soc/">Google Summer of Code (GSoC)</a>. Here's what Desmond had to say about the experience:</span><br /><br />Working on <a href="http://www.caminobrowser.org/" title="Camino">Camino</a> this summer was so much fun. I had never done much software development outside of the required coursework for University, and I decided that I really needed some experience. There is only so much you can learn from coursework!<br /><br />My <a href="http://code.google.com/soc/">GSoC</a> project was certainly a challenge for me. I had never written any Objective-C, and let me assure you, it showed! I wasn't part of the Mozilla/Camino community. I had never worked on a codebase as vast as Camino/Gecko. And I'd never had somebody review my code and scrutinise it as much as Google engineer Stuart Morgan did.<br /><br />Working on this project made me a better developer because so many of the patches I submitted were negatively reviewed. Instead of taking this personally, I used it to improve my coding style and standard. For example, when I write code in Java for my research project, I think about whether I am wastefully creating objects.<br /><br />Of course, I did learn a lot about Cocoa/Objective-C Programming on Mac OS X, but I learned a lot more as well. I learned about the importance of being able to communicate with people non-verbally. I think that being a great developer means you can work as a team and I certainly learned a lot about that this summer. Some of the people you work with might not even natively speak your language, so how you express yourself is important. I learned about managing my own time on a self-directed project. It was almost like it was a trial for my undergraduate research project.<br /><br />Although my mentor <a href="http://weblogs.mozillazine.org/pinkerton/" title="Mike Pinkerton">Mike Pinkerton</a> was always busy with those "work" things that Google forces him to do (and he cannot talk about them, which is even worse), he was an excellent mentor. He was always able to meet with me once a week. This was important for both of us because it made sure that neither of us were out of the loop. He was quick to respond to my emails, too.<br /><br />There are so many great things that I took from GSoC that I could go on and on.<br /><br />Even though GSoC is over, I'm still active within the Camino team. And I will definitely apply for a place in GSoC next summer, my last summer at University, and it will probably be writing Mac software once again.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116544517192445702?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-summer-of-code-and-macs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remote Access</title>
		<link>https://googledata.org/google-mac-blog/remote-access/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=remote-access</link>
		<comments>https://googledata.org/google-mac-blog/remote-access/#comments</comments>
		<pubDate>Fri, 01 Dec 2006 20:50:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Amanda Walker, Member of Technical Staff, Mac TeamI started my career working on Mac networking products way back in the '80s and '90s, well before the Internet was in everybody's living room. For example, I wrote SLIP and PPP packages to ge...]]></description>
				<content:encoded><![CDATA[Posted by: Amanda Walker, Member of Technical Staff, Mac Team<br /><br />I started my career working on Mac networking products way back in the '80s and '90s, well before the Internet was in everybody's living room. For example, I wrote <a href="http://en.wikipedia.org/wiki/Serial_Line_Internet_Protocol">SLIP</a> and <a href="http://en.wikipedia.org/wiki/Point-to-Point_Protocol">PPP</a> packages to get Mac users online over dialup connections, pitched in on efforts to standardize things so that everyone's gear would actually work with everyone else's, and so on. In those days, "Internet client software" meant <a href="http://www.telnet.org/htm/faq.htm">Telnet</a> and <a href="http://www.webopedia.com/TERM/F/FTP.html">FTP</a>, not web browsers and streaming video. We could see the potential, but it would take years for reality to catch up to the vision.<br /><br />About a year ago, I got a phone call out of the blue from a recruiter, asking if I was interested in talking to Google about its incipient Mac team. This was quite a surprise: Until that point, while I was an avid Google user, I hadn't noticed Google paying any special attention to Mac users, beyond delivering a Mac version of <a href="http://earth.google.com/" title="Google Earth.">Google Earth.</a><br /><br />By the time I got the recruiting call, I had not worked on <a href="http://www.gulker.com/gulker/InsanelyGreat.html">insanely great</a> Mac software for awhile. The idea of a Google Mac team was very intriguing, and things snowballed from there. As <a href="http://googlemac.blogspot.com/2006/10/our-far-flung-mac-team.html">Greg   Robbins noted</a>, Google was quietly recruiting a top-notch Mac development group, and the search wasn't limited to just Silicon Valley. I live near Washington D.C., where Google does not have an engineering office, so I mostly work at home. This has its downside -- there's no excellent, free <a href="http://www.flickr.com/photos/brettlider/sets/154249/">Google food</a>, and I sometimes feel like I'm living at work (hmm, maybe I am: check out the picture).<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/813/3778/1600/73048/home-office.jpg"><img style="margin: 10px 10px 10px 0pt; float: left; cursor: pointer; width: 302px; height: 170px;" src="http://photos1.blogger.com/x/blogger/813/3778/320/399722/home-office.jpg" alt="" border="0" /></a><br />However, it all works surprisingly well, at least for our team. <a href="http://en.wikipedia.org/wiki/VPN">VPN</a>, high-speed Internet service, and flat-rate long distance make it a lot easier than it used to be, but I also spend about 20% of my time working from Mountain View and other Google offices. Of course, there are worse things than having to leave D.C. for California during the winter.<br /><br />In the '80s, I chose to develop Mac networking software because I wanted to change the world. Here in the future, it's a much taller order. Technology is moving faster than ever, and Apple and Google are both very careful not to tip their hands in advance about future products. So instead of questions like "the Inter-what?", I get questions like "will I be able to watch YouTube on my iPhone?" Unfortunately, they don't tell me the answer to that. But I'm ready for anything: one thing my home office has in common with the Googleplex is an espresso machine, available 24/7.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116500697182812588?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/remote-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Loaded</title>
		<link>https://googledata.org/google-mac-blog/getting-loaded/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=getting-loaded</link>
		<comments>https://googledata.org/google-mac-blog/getting-loaded/#comments</comments>
		<pubDate>Tue, 28 Nov 2006 18:04:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Dave MacLachlan, Member of Technical Staff, Mac TeamCategories are a really interesting feature of Objective-C, especially for those of us who came from C++. Not only do categories allow you to extend other classes for which you may be lacki...]]></description>
				<content:encoded><![CDATA[Posted by: Dave MacLachlan, Member of Technical Staff, Mac Team<br /><br />Categories are a really interesting feature of Objective-C, especially for those of us who came from C++. Not only do categories allow you to extend other classes for which you may be lacking the source, but they also give you a really simple way of hiding interfaces from your clients without all the baggage of a <a href="http://en.wikipedia.org/wiki/Opaque_pointer" title="pImpl pattern">pImpl pattern</a>. We use categories a lot here at Google to "enhance" the system frameworks.<br /><br />We do run into a couple of major problems with categories, though. One issue is about class-specific initialization. Objective-C has traditionally had three solutions for class-specific initialization:<br /><ol><li>     lazy initialization   </li><li>     +initialize   </li><li>     +load   </li></ol> With lazy initialization, we call our initialization routine as necessary to make sure our class-specific stuff is initialized before we use it. This works fine except that in implementing it, we often end up writing code where every method starts with a method call to the initialization check, which is ugly and a potential source of stupid bugs.<br /><br /><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/initialize" title="+initialize">+initialize</a> is the "best practice" for initializing class variables. For a standard class, it works great. This technique usually does almost everything we want it to do and has reasonably clear semantics, although the part that says "you could be invoked more than once" is a bit of a pain. The problem with +initialize is that it is virtually useless for categories, in that if I override a class's initialize method in my category, I can't call the original initialize. Also, if I have two categories on a class, and both have initialize methods, it is unclear which one will be called. Even if it works now, there's no guarantee the original framework you're extending won't be "enhanced" and break you in the future when an initialize method is added to the class you extended. So, as far as categories are concerned, +initialize is pretty much useless. Interestingly if you think about it, in some ways +initialize is very much like lazy initialization, with the details hidden under the covers. Basically, you have the runtime doing the check instead of you having to code it.<br /><br /><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/load" title="+load">+load</a> is an interesting option, and probably one of the less understood areas of how the Objective-C runtime actually works. According to the NSObject documentation:<br /><ol><li>     +load is invoked once per class or category.   </li><li>     +load is usually invoked before +initialize, but not always.   </li><li>     You can't be sure your superclasses are loaded.   </li><li>     You can't be sure any other classes are loaded.   </li><li>     You know, you really should be using +initialize.   </li></ol>Item 1 is great, but there are a lot of interesting little caveats that follow it. Basically, the docs say you can't call ANY other classes, including your superclass, safely from within a +load. Looking at the <a href="http://www.opensource.apple.com/darwinsource/10.4.7.x86/objc4-274/runtime/objc-runtime.m" title="obj-c runtime code (ADC registration required)">obj-c runtime code (ADC registration required)</a>, we can get a bit more information on how +load works. We see that we are guaranteed that our superclasses are "+load"ed before we are "+load"ed, but we can't call out to other classes, so officially we can't use NSDictionary, NSString, et al. In practice, this appears to work pretty much all the time, but I certainly wouldn't intentionally ship code that depended on it.<br /><br />So it appears that if we stay with traditional Objective-C, we are basically stuck with lazy initialization for doing class-specific initialization in a category. Luckily, if we break with tradition, we can use the "constructor" attribute. Yes, the syntax is ugly, but it does potentially solve a lot of our problems.<br /><br />Constructors (which is a horrible name that must have been intentionally designed to cause confusion with C++/Java constructors) are <a href="http://developer.apple.com/documentation/developertools/Conceptual/DynamicLibraries/Articles/DynamicLibraryDesignGuidelines.html#//apple_ref/doc/uid/TP40002013-DontLinkElementID_22" title="guaranteed to be called after load">guaranteed to be called after +load</a> but before main. This gets rid of several of the caveats of +load, because you can be guaranteed that all your classes are loaded and that +initialize will be invoked on classes as needed by your constructor function.<br /><br />So doing something like the following gives us a nice, relatively clean way of class-specific initialization in a category.<br /><pre><br />@implementation Foo(FooBarAdditions)<br />....<br />@end<br /><br />@interface Foo(FooBarAdditionsPrivateMethods)<br />+ (void)initializeBar;<br />@end<br /><br />@implementation Foo(FooBarAdditionsPrivateMethods)<br />+ (void)initializeBar {<br />// Initialize stuff here<br />}<br />@end<br /><br />void __attribute__ ((constructor)) InitializeFooBar(void) {<br />static BOOL wasInitialized = NO; <div>  <code style="">if (!wasInitialized) {    <br />// safety in case we get called twice.</code></div><div><code>    [Foo initializeBar];</code></div><div><code>    wasInitialized = YES;</code></div><div><code>  }<br />}<br /></code></div></pre><br /><span style="font-weight: bold;">@synchronized swimming Feedback</span><br /><br />Thanks to reader <a href="http://avitzur.hax.com/" title="Ron Avitzur">Ron Avitzur</a> for pointing out that the <a href="http://googlemac.blogspot.com/2006/11/synchronized-swimming-part-2.html" title="nice Objective C workaround for the DLCP that I showed last week is officially bad">nice Objective-C workaround for the DCLP that I showed in a recent post is officially bad</a>. He's got a nice writeup on his <a href="http://avitzur.hax.com/2006/11/efficient_thread_safe_static_i.html#more" title="blog here">blog</a> about why even though it's pretty, it's nothing more than a global flag, which in theory doesn't get us around the problem at all.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116473720436237524?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/getting-loaded/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Woz comes to Google</title>
		<link>https://googledata.org/google-mac-blog/woz-comes-to-google/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=woz-comes-to-google</link>
		<comments>https://googledata.org/google-mac-blog/woz-comes-to-google/#comments</comments>
		<pubDate>Tue, 21 Nov 2006 17:21:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Scott Knaster, Technical WriterThe first time I ever saw the mysterious inscription Woz was while reading the legendary Red Book that came with my Apple ][. I soon found out that Woz was Steve Wozniak, who had designed the Apple ][ and co-fo...]]></description>
				<content:encoded><![CDATA[Posted by: Scott Knaster, Technical Writer<br /><br />The first time I ever saw the mysterious inscription <span style="font-style: italic;">Woz</span> was while reading the legendary <a href="http://www.digibarn.com/stories/dankottke/Image03.jpg" title="Red Book">Red Book</a> that came with my Apple ][. I soon found out that Woz was Steve Wozniak, who had designed the Apple ][ and co-founded Apple Computer. The more I learned about Woz and his inventions, the more amazed I was: how he enabled the Apple ][ to use a cheap cassette recorder to load and save data; his incredible design for <a href="http://en.wikipedia.org/wiki/Apple_II#Apple_II" title="color output">color output</a> that two professional engineers told me "couldn't possibly work"; his unique <a href="http://apple2history.org/history/ah05.html" title="disk controller">disk controller</a> that somehow managed to use software for timing and eliminated the need for all but 5 chips.<br /><br />Woz is a Silicon Valley legend of the highest order, so we at Google were thrilled to welcome him here last Thursday to talk about his new book, <a href="http://www.iwoz.org/" title="iWoz: From Computer Geek to Cult Icon: How I Invented the Personal Computer, Co-Founded Apple, and Had Fun Doing It">iWoz: From Computer Geek to Cult Icon: How I Invented the Personal Computer, Co-Founded Apple, and Had Fun Doing It</a>. Woz arrived about 20 minutes late, but stayed more than twice as long as he was "supposed" to, answering every question, signing every book, and talking to everyone who wanted to talk to him (and so I figured out why he was late in the first place).<br /><br />Woz's talk showed why he is an inspiration to engineers (and other people) everywhere. He captivated the crowd with his passion and enthusiasm for what he does, whether it's designing computers, putting on <a href="http://www.woz.org/US/" title="massive concerts">massive concerts</a>, or talking about his life and work. I highly recommend you see Woz on his <a href="http://woz.org/Features/iwoz.html" title="travels">travels</a> if you get a chance -- if you're lucky, you might even get <a href="http://www.metroactive.com/metro/10.04.06/alleys-0640.html" title="pranked">pranked</a> -- and whether you see him in person or not, his book is a wonderful peek at the life of this remarkable guy.<br /><br />And now I have this great souvenir:<br /><br /><table style="width: auto;">   <tbody>   <tr>     <td>       <a href="http://picasaweb.google.com/sknaster/Woz/photo#4998436181499445266"><img src="http://lh5.google.com/image/sknaster/RWMvl54KABI/AAAAAAAAA4g/RV1IxcLAbmQ/smallwoz.JPG" /></a>     </td>   </tr>   <tr>     <td style="font-family: arial,sans-serif; font-size: 66%; text-align: right;">     <br />   </td>   </tr>   </tbody> </table><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116412982799981114?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/woz-comes-to-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Earth for the Mac</title>
		<link>https://googledata.org/google-mac-blog/more-earth-for-the-mac/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=more-earth-for-the-mac</link>
		<comments>https://googledata.org/google-mac-blog/more-earth-for-the-mac/#comments</comments>
		<pubDate>Tue, 14 Nov 2006 18:49:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: John Gardiner, Technical Writer, Google Earth team, and Rose Yao, Mac Product ManagerLate last week, Google released an updated beta version of Google Earth 4 for Mac OS X (and some other platforms). For those of you who love Google Earth, t...]]></description>
				<content:encoded><![CDATA[Posted by: John Gardiner, Technical Writer, Google Earth team, and Rose Yao, Mac Product Manager<br /><br />Late last week, Google released an <a href="http://earth.google.com/earth4-beta6.html">updated beta version of Google Earth 4</a> for Mac OS X (and some other platforms). For those of you who love Google Earth, this release includes a number of neat new features and enhancements:<br /><br /><span style="font-weight: bold;">Performance improvements:</span> we've made 3-D models (such as those created in <a href="http://www.sketchup.com/">SketchUp</a> or imported from <a href="http://sketchup.google.com/3dwarehouse/">the 3D warehouse</a>) load more quickly and more realistically.<br /><br /><span style="font-weight: bold;">Paths and polygons:</span> a very cool advanced feature -- and now it's in the <span style="font-weight: bold;">FREE </span>version.<br /><br /><span style="font-weight: bold;">Altitude:</span> This is useful for overlays such as weather radar images where you want to see the image from directly above, but also want to look at the ground imagery from an angle. It's also good if you're going on a hike and want to pick an easier path :).<br /><br />And as usual, we're trying to improve the Google Earth experience with new icons, printing functionality, and more. <a title="Check it out" href="http://earth.google.com/">Check it out</a>!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116353044008263004?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/more-earth-for-the-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@synchronized swimming (part 2)</title>
		<link>https://googledata.org/google-mac-blog/synchronized-swimming-part-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=synchronized-swimming-part-2</link>
		<comments>https://googledata.org/google-mac-blog/synchronized-swimming-part-2/#comments</comments>
		<pubDate>Tue, 07 Nov 2006 18:52:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Dave MacLachlan, Member of Technical Staff, Mac TeamPreviously we addressed the problem of optimizing around a shared resource. We came up with one solution, but it was kind of messy, and we wondered if there might be a better way. And now: ...]]></description>
				<content:encoded><![CDATA[Posted by: Dave MacLachlan, Member of Technical Staff, Mac Team<br /><br /><i><a href="http://googlemac.blogspot.com/2006/10/synchronized-swimming.html">Previously</a> we addressed the problem of optimizing around a shared resource. We came up with one solution, but it was kind of messy, and we wondered if there might be a better way. And now: the conclusion.</i><br /><br />There is at least one more elegant solution, but it is slightly less safe. So far I've assumed we're using Objective-C, but what happens if we use Objective C++, specifically Objective C++ with gcc 4? According to the <a href="http://developer.apple.com/releasenotes/DeveloperTools/GCC40PortingReleaseNotes/Articles/PortingToGCC.html">GCC4 porting notes</a>:<br /><br /><i>GCC 4.0 automatically adds locks around any code that initializes local static variables in C++. If you do not need this protection and want to reduce your code size slightly, you can disable the locking behavior by passing the <code>-fno-threadsafe-statics</code> option to the compiler</i>.<br /><br />This appears to be backed up by the <a href="http://gcc.gnu.org/gcc-4.0/changes.html">gcc 4.0 release notes</a> and the <a href="http://www.codesourcery.com/cxx-abi/abi.html#once-ctor">C++ ABI</a>. So this implies that if we just change our compiler from standard Obj-C to Obj-C++ we should be able to do the following:<br /><pre><br />+(id)fooFerBar:(id)bar {<br />   static NSDictionary *foo = [NSDictionary dictionaryWithObjects:...];<br />   return [foo objectWithKey:bar];<br />}<br /></pre><br />which is certainly nice and clean. Let's take a quick look at the disassembly:<br /><pre><br />cxa_guard_acquire<br /><br />my actual code<br /><br />cxa_guard_release<br />cxa_guard_abort<br />Unwind_Resume<br />...<br /></pre><br />and by scanning the <a href="http://www.opensource.apple.com/darwinsource/10.4.7.x86/libstdcxx-5.1/libstdcxx/libstdc++-v3/libsupc++/guard.cc">code for cxa_* (ADC registration required)</a> we can see that it's doing almost exactly what we want. The only pitfalls here are if we somehow attempt to compile with a gcc version less than 4.0 (we can put in guards against this happening) or we use <code>-fno-threadsafe-statics</code> in a threaded environment, in which case we're asking for trouble, and trouble will certainly follow (we won't do that).<br /><br />So, we've got a thread-safe shared resource that does what we want with a minimal amount of code. One last tiny issue remains. What happens if we accidentally mix our Objective-C <code>@synchronized</code> with C++ dynamic initialization of local statics?<br /><pre><br />+(id)fooFerBar:(id)bar {<br />@synchronized(self) {<br />   static NSDictionary *foo = [NSDictionary dictionaryWithObjects:...];<br />   return [foo objectWithKey:bar];<br />}<br />}<br /></pre><br />and the disassembly shows:<br /><pre><br />...<br />objc_sync_enter<br />objc_exception_try_enter<br />setjmp<br />objc_exception_extract<br />cxa_guard_acquire<br /><br />my actual code<br /><br />cxa_guard_release<br />cxa_guard_abort<br />objc_exception_try_exit<br />objc_sync_exit<br />objc_exception_throw<br />...<br /></pre><br />Yes, ladies and gentlemen, you get to pay for 4 lock/unlocks and two<br />exception stacks to protect your wee shared resource, so you may want<br />to watch for this pattern in your performance-sensitive code when<br />porting to Objective C++.<br /><br /><b>Feedback from <a href="http://googlemac.blogspot.com/2006/10/synchronized-swimming.html">part 1</a></b><br /><br />Thanks to reader Bill Bumgarner, who came up with an interesting solution to my problem that has a distinctive Obj-C feel to it:<br /><pre><br />static NSDictionary *foo = nil;<br /><br />+(id)fooFerBar:(id)bar {<br />@synchronized(self) {<br />   if (!foo) foo = [NSDictionary dictionaryWithObjects:...];<br />   ReplaceMethodImplementationWithSelector<br />      ([self class], @selector(fooFerBar), @selector(fooFerBar2));<br />}<br />   return [foo objectWithKey:bar];<br />}<br /><br />+(id)fooFerBar2:(id)bar {<br />   return [foo objectWithKey:bar];<br />}<br /></pre><br />where <code>ReplaceMethodImplementationWithSelector</code> <a href="http://www.cocoadev.com/index.pl">swizzles</a> <code>fooFerBar</code> with <code>fooFerBar2</code>. So, the first time <code>fooFerBar</code> is called we get our slow case, and any later calls get the fast case, assuming the first thread has completed <code>fooFerBar</code>. This solution provides great performance, and you only have to pay for the <code>synchronize</code> once. Very nice!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116223971511225045?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/synchronized-swimming-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@synchronized swimming</title>
		<link>https://googledata.org/google-mac-blog/synchronized-swimming/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=synchronized-swimming</link>
		<comments>https://googledata.org/google-mac-blog/synchronized-swimming/#comments</comments>
		<pubDate>Tue, 31 Oct 2006 02:20:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Dave MacLachlan, Member of Technical Staff, Mac Team(Editor's note: today's post is a bit different from our usual fare -- it's aimed at the Mac programmers out there. And if you're not a programmer, you might want to find one to guide you t...]]></description>
				<content:encoded><![CDATA[Posted by: Dave<span id="_user_dmaclach@google.com"> MacLachlan, Member of Technical Staff, Mac Team</span><br /><br /><span style="font-style: italic;">(Editor's note: today's post is a bit different from our usual fare -- it's aimed at the Mac programmers out there. And if you're not a programmer, you might want to find one to guide you through this peek behind the scenes of how we make our applications fast and reliable.)</span><br /><br />At Google, software performance is extremely important. Every millisecond counts, which is why we spend a lot of time using performance tools and other techniques to help make our software faster. I was recently <a href="http://developer.apple.com/tools/sharkoptimize.html">Sharking</a> a piece of multithreaded code and realized we were getting bitten by the use of an <code>@synchronized</code> block around a shared resource we were using:<br /><pre><br />+(id)fooFerBar:(id)bar {<br />@synchronized(self) {<br />   static NSDictionary *foo = nil;<br />   if (!foo) foo = [NSDictionary dictionaryWithObjects:...];<br />}<br />   return [foo objectWithKey:bar];<br />}<br /></pre><br />Shark told us without a doubt that we were paying heavily for the <code>@synchronized </code> block each of the millions of times we were calling <code>fooFerBar</code>. We couldn't create the resource in <code>+initialize</code>, because <code>fooFerBar</code> was part of a category, and overriding <code>+initialize</code> in a category is a bad thing. We also couldn't use <code>+load</code>, because other classes could have easily called <code>fooFerBar</code> in their <code>+load</code>, and there's no guarantee on loading order. So our only choice was to minimize the impact of that <code>@synchronized</code> block, and we didn't want to run into the infamous and dreaded <a href="http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf">double-checked locking anti-pattern</a>.<br /><br />So, I wondered, how exactly does <code>@synchronized</code> work? And is there a cheaper way of getting the same thread-safe result? I disassembled the code to find out what <code>@synchronized</code> does, and I saw something like this:<br /><br /><code><br />...<br />objc_sync_enter<br />objc_exception_try_enter<br />setjmp<br />objc_exception_extract<br /><br />my actual code<br /><br />objc_exception_try_exit<br />objc_sync_exit<br />...<br />objc_exception_throw<br />...<br /></code><br /><br />That's a lot of setup and tear-down for a simple lock around a shared resource. In this case, we don't need to be exception safe. By reading the <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Articles/chapter_4_section_9.html">Objective-C documentation on exception handling and thread synchronization</a>, we learn that not only does <code>@synchronized</code> give us a lock, but it's a recursive lock, which is overkill for this particular usage.<br /><br />By examining the <a href="http://www.opensource.apple.com/darwinsource/10.4.7.ppc/objc4-267.1/runtime/objc-sync.m">code (ADC registration required)</a> that implements <code>objc_sync_enter</code> and <code>obc_sync_exit</code>, we can see that on every <code>@synchronized(foo)</code> block, we are actually paying for 3 lock/unlock sequences. <code>objc_sync_enter</code> calls <code>id2data</code>, which is responsible for getting the lock associated with <code>foo</code>, and then locks it. <code>objc_sync_exit</code> also calls <code>id2data</code> to get the lock associated with <code>foo</code>, and then unlocks it. And, <code>id2data</code> must lock/unlock its own internal data structures so that it can safely get the lock associated with <code>foo</code>, so we pay for that on each call as well.<br /><br />We need to do better than this. It looks like it's time to go back to basics, throw away the <code>@synchronized</code> call, and wrap our code with some <code>pthread</code> locks instead.<br /><br /><pre><br />#include &lt;pthread.h&gt;<br /><br />+(id)fooFerBar:(id)bar {<br />   static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;<br />   if (pthread_mutex_lock(&mtx)) {<br />      printf("lock failed sigh...");<br />      exit(-1);<br />}<br />   static NSDictionary *foo = nil;<br />   if (!foo) foo = [NSDictionary dictionaryWithObjects:...];<br />   if (pthread_mutex_unlock(&mtx) != 0)) {<br />      printf("unlock failed sigh...");<br />      exit(-1);<br />}<br />   return [foo objectWithKey:bar];<br />}<br /><br /></pre><br />This is ugly stuff, but it's significantly faster, according to Shark. And fast is what we want. We've avoided setting up an exception stack, two excess locks, and a bunch of miscellaneous support code.<br /><br />So we've achieved our goal of faster code that will work fine, but are there other, cleaner options? After all, if the code is cleaner, there are fewer places for bugs to hide. Tune in for our next post, wherein we'll explore that question.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116223823559240945?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/synchronized-swimming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google goes to MacExpo UK</title>
		<link>https://googledata.org/google-mac-blog/google-goes-to-macexpo-uk/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-goes-to-macexpo-uk</link>
		<comments>https://googledata.org/google-mac-blog/google-goes-to-macexpo-uk/#comments</comments>
		<pubDate>Tue, 24 Oct 2006 04:09:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Tim Partridge, Associate Product Marketing Manager, UKAs a Mac fanatic for over fourteen years, I was thrilled to find my first job here at Google UK would be working on Google’s presence at this year’s London MacExpo UK.People here reco...]]></description>
				<content:encoded><![CDATA[Posted by: Tim Partridge, Associate Product Marketing Manager, UK<br /><br />As a Mac fanatic for over fourteen years, I was thrilled to find my first job here at Google UK would be working on Google’s presence at this year’s London <a href="http://www.mac-expo.co.uk/Home.html" >MacExpo UK</a>.<br /><br />People here recognise the passion that Mac users have for their computers, and we really want to show you all the great things you can do when you use Google products in your projects. As Jason Chuck, one of our European product marketing managers said, "Google and Apple users could really have a <i style="">fruitful</i> relationship." (He wanted to put that on a t-shirt, but we wouldn’t let him.)<br /><br />And so this Thursday, we’re taking Google for Macs on the road to the <a href="http://maps.google.co.uk/maps?f=q&amp;hl=en&q=Olympia+Exhibition+Centre,+W14+8UX&amp;ie=UTF8&z=17&amp;ll=51.496634,-0.210543&spn=0.003954,0.006942&amp;amp;amp;amp;amp;amp;amp;om=1&iwloc=A" title="See this on Google Maps">Olympia Exhibition Centre</a>, bad puns and all. We’ll be there for all three days, MacBooks in hand, to show you how to get the most from Google on your Mac. As well as being there to answer any questions you might have, we’ll be running five free workshops each day.<br /><br />Each morning our <a href="http://video.google.co.uk">Google Video</a> session will highlight uploading videos and placing them within your site. Learn how to share your work with millions this way, and how to enliven your site with embedded videos. Following this, find out how to embed <a href="http://maps.google.co.uk" title="Google Maps">Google Maps</a> into your own web pages, providing a useful way of displaying local information. We'll highlight some innovative examples of Google Maps mashups already online, and show how they were created.<br /><br />From exotic locales to local restaurants and schools, <a href="http://www.google.co.uk/earth" title="Google Earth">Google Earth</a> puts a planet's worth of imagery and other geographical information right on your desktop. In the afternoon we'll show how you can use Google Earth to display your own content using overlays. We will also showcase <a href="http://www.sketchup.com/" title="SketchUp">SketchUp</a>, our award-winning 3D design software, demonstrating its simple yet robust toolset and how it too can be integrated with Google Earth.<br /><br />If that's not good enough, there might even be a give-away or two. The exhibition kicks off on <span style="font-weight: bold;">Thursday 26th October</span> at 10am, and runs until <span style="font-weight: bold;">Saturday 28th October</span>. Tickets are available on the door, or by visiting the <a href="http://www.mac-expo.co.uk/Home.html" >MacExpo website.</a><br /><p></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116166413113870397?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/google-goes-to-macexpo-uk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our far-flung Mac team</title>
		<link>https://googledata.org/google-mac-blog/our-far-flung-mac-team/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=our-far-flung-mac-team</link>
		<comments>https://googledata.org/google-mac-blog/our-far-flung-mac-team/#comments</comments>
		<pubDate>Mon, 23 Oct 2006 17:35:00 +0000</pubDate>
		<dc:creator><![CDATA[Scott]]></dc:creator>
				<category><![CDATA[Google Mac Blog]]></category>
		<category><![CDATA[google mac]]></category>
		<category><![CDATA[macs inside google]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Posted by: Greg Robbins, Software EngineerEight years ago, I moved from Silicon Valley to Seattle, leaving the heart of the Mac software development world for a vibrant city surrounded by tall mountains. I thought this meant that most of the interestin...]]></description>
				<content:encoded><![CDATA[Posted by: Greg Robbins, Software Engineer<br /><br />Eight years ago, I moved from Silicon Valley to Seattle, leaving the heart of the Mac software development world for a vibrant city surrounded by tall mountains. I thought this meant that most of the interesting opportunities to be a Mac developer were left behind as well. But then a year ago, friends from Google mentioned that Google wanted to devote more attention to writing Mac software. More importantly, there was an <a href="http://www.google.com/support/jobs/bin/static.py?page=why-wa-ki.html" title="office near Seattle">office near Seattle</a> set up for engineering (one of many), because Google knew that not all the best developers wanted to move to Mountain View. When I met some of the developers, I was happy to see Google's unique work culture had survived the northward migration intact.<br /><br />Today, our Seattle-area engineering office in Kirkland is growing rapidly. In the two years since the office opened, we've grown to more than 150, and Kirkland drives the development of an impressive list of software products, including <a href="http://video.google.com/" title="Google Video">Google Video</a> and <a href="http://www.google.com/talk/" title="Google Talk">Google Talk</a>. The range of projects and expertise among the Googlers here makes it a fascinating environment.<br /><br />True, most of the Mac programmers are in the Mountain View office. But I'm in Washington State, while others are in New York and elsewhere on the east coast. Finding a way to effectively collaborate across 3,000 miles and 3 time zones has been an enjoyable challenge. We have state-of-the-art tools, like video conferencing and <a href="http://docs.google.com/" title="Writely">Writely</a>. But our daily development discussions take place in an internal group chat room that we set up for Mac developers. It's become a 24-hour meeting room and watering hole, a forum for us to seek programming assistance, exchange Mac industry news, and speculate on the upcoming features in <a href="http://www.apple.com/macosx/leopard/" title="Mac OS X Leopard">Mac OS X Leopard</a>. In debating how to turn our strengths into unique and exciting Mac applications, we've become a tight-knit group of colleagues.<br /><br />Though I had worked in large and small companies prior to joining Google, the rapid pace of development here still amazed me. Within weeks, I was helping the Mac developers working on <a href="http://earth.google.com/" title="Google Earth">Google Earth</a> get it talking with <a href="http://www.sketchup.com/" title="Sketchup">Sketchup</a>, making Google Video player keep itself up to date, and turning a <a href="http://picasa.google.com/web/mac_tools.html" title="photo uploader">photo uploader</a> that had been an impressive, experimental 20% project into a polished, easy way for Mac users to take advantage of <a href="http://picasaweb.google.com" title="Picasa Web Albums">Picasa Web Albums</a>. Of course, even more cool applications are underway.<br /><br />While I've made many friends among the Seattle-area developers (and I love the food here, too), I feel like I'm part of a wider team of incredibly smart and experienced Mac developers with shared goals -- but diverse weather.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29010370-116162681292192232?l=googlemac.blogspot.com' alt='' /></div>]]></content:encoded>
			<wfw:commentRss>https://googledata.org/google-mac-blog/our-far-flung-mac-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
