<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-35584545</id><updated>2010-09-06T21:15:54.115-07:00</updated><title type='text'>Gregable.</title><subtitle type='html'>Discussing geekery, the environment, and life in Silicon Valley.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gregable.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default?orderby=updated'/><link rel='alternate' type='text/html' href='http://gregable.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default?start-index=26&amp;max-results=25&amp;orderby=updated'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>146</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35584545.post-8704460128017761946</id><published>2010-08-31T05:35:00.000-07:00</published><updated>2010-08-31T05:35:58.984-07:00</updated><title type='text'>Back from Kilimanjaro</title><content type='html'>I'm a little late in writing this post, but better late than never.  Two weeks ago, I got back from my trip to Tanzania where me and 3 buddies climbed Mt. Kilimanjaro.  It was a great trip - a week on the mountain, 3 days of Safari, and a few rest days scattered between.  I posted some photos to Picasa: &lt;a href="http://picasaweb.google.com/ggrothau/Kilimanjaro"&gt;Kilimanjaro Trip Pictures&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;99% of the hikers climbing Kilimanjaro start at midnight from Barafu camp at around 15k ft altitude, hike to the top (19k ft) for sunrise, and then turn around and descend a few minutes later back to 10k ft altitude.  Our group instead opted for the little known Crater Camp option.  We started our hike from Barafu at 8am, daylight and much warmer.  We ascended to Stella's Point on the Crater Rim, 500 ft lower and a 30 minute hike from the actual peak (Uhuru Peak) and then dropped down into the Crater for the night.  The plan was to wake up and start hiking at a leisurely hour of 5am in the morning.&lt;br /&gt;&lt;br /&gt;The crater was well worth the extra day, most of the hikers never set foot in it, but we had time to explore.  I opted to check out the glacier inside the crater, which is shrinking and may soon be gone completely.  Many of our porters had never done the Crater Camp option before, so they were just as excited as we were.&lt;br /&gt;&lt;br /&gt;Unfortunately, after going to bed, the altitude kicked in for me.  We were all already weak, but it really hit me hard.  When our guides woke us up in the morning, I decided to descend instead of finishing the last few hundred feet to the top.  Acute Mountain Sickness was an interesting experience - it felt like the worst flu you've ever had: headache, nausea, vomiting, and extremely low energy levels.  I had to take a break between tying one boot and the other.  I was wearing a heart rate monitor for the trip and my resting heart rate was around 120 beats per minute - normally, it's around 70.  Fortunately, dropping altitude did the trick.  A few hours later at a lower vantage point, I was feeling absolutely fine.  The other 3 in our group finished the route to the top and joined me that afternoon.&lt;br /&gt;&lt;br /&gt;Not too many meteors, but the stars were better than I've ever seen before.  By day 2 we were camping above the clouds, so there was essentially no man-made light pollution except for our own flashlights.  The milky way was not only bright and clear, but I swear that I could actually make out hints of different colors in the stars with my unaided eye.  I tried but failed to take any photos worthy of sharing.&lt;br /&gt;&lt;br /&gt;On the tail end of the trip, we went on a 3 day Safari.  I have to admit that I was mostly on the trip for the hike and hadn't really researched the Safari much in advance, but it was also a blast.  Nice and relaxing, and crazy amounts of wildlife as you'll see in the photos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-8704460128017761946?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/8704460128017761946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=8704460128017761946' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/8704460128017761946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/8704460128017761946'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/08/back-from-kilimanjaro.html' title='Back from Kilimanjaro'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-1525658249692576027</id><published>2010-08-02T17:08:00.000-07:00</published><updated>2010-08-02T17:11:42.448-07:00</updated><title type='text'>Kilimanjaro: Wish me luck</title><content type='html'>Tomorrow morning, I'm off to hike &lt;a href="http://en.wikipedia.org/wiki/Mount_Kilimanjaro"&gt;Mt. Kilimanjaro&lt;/a&gt; in Tanzania.  It is 19,334 ft above sea level at the summit, the tallest peak in Africa.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/File:Mount_Kilimanjaro_Dec_2009_edit1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 342px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Mount_Kilimanjaro_Dec_2009_edit1.jpg/800px-Mount_Kilimanjaro_Dec_2009_edit1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If we're doing well, we'll even sleep one night inside the Crater, at roughly 18,000 ft.  That should be amazing and &lt;a href="http://en.wikipedia.org/wiki/Altitude_sickness"&gt;painful&lt;/a&gt; at the same time.  We'll be hitting the summit around new moon.  Most people go for full moon as you have to do some night hiking, but we'll be hiking during the &lt;a href="http://earthsky.org/astronomy-essentials/earthskys-meteor-shower-guide"&gt;Perseids meteor shower&lt;/a&gt;, so the lack of moonlight, the lack of human-made light, and the high altitude should really make for quite a show.&lt;br /&gt;&lt;br /&gt;I was hoping to be able to use MyTracks on the journey and post the route when I return.  On some test trips, I &lt;a href="http://www.wetfirewood.com/questions/11/options-for-keeping-a-cell-phone-charged"&gt;tried a few solar chargers to keep my phone going&lt;/a&gt;, but none of them were able to collect as many photons as my &lt;a href="http://www.google.com/phone/static/en_US-nexusone_tech_specs.html"&gt;Nexus One&lt;/a&gt; wanted to eat.  I'll still be bringing the phone along for identifying stars (see my previous post), but I'll leave it off most of the way.  I'll also bring back lots of photos to share on the blog.&lt;br /&gt;&lt;br /&gt;If you want to get more involved, Jeremy, one of the other hikers, will be carrying a Spot messaging device that will track our route.  You can see the map at &lt;a href="http://jeremyshapiro.com/kili/"&gt;http://jeremyshapiro.com/kili/&lt;/a&gt;.  Another way to participate it to "sponsor" our climb in a sense.  Matt Cutts set up a page at &lt;a href="http://mycharitywater.org/climb-kilimanjaro"&gt;charity:water&lt;/a&gt; in honor of our trip, and he blogged a little bit about his &lt;a href="http://www.mattcutts.com/blog/climb-kilimanjaro/"&gt;choice of charities&lt;/a&gt;.  Lastly, check back in about 2 weeks for a final update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-1525658249692576027?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/1525658249692576027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=1525658249692576027' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/1525658249692576027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/1525658249692576027'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/08/kilimanjaro-wish-me-luck.html' title='Kilimanjaro: Wish me luck'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-720359013025528127</id><published>2010-07-30T20:01:00.000-07:00</published><updated>2010-07-30T20:01:11.176-07:00</updated><title type='text'>The 4 Android Apps that all backpackers should carry</title><content type='html'>If you go backpacking or even hiking and use an android phone, here is a list of the Android Apps you should be carrying.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mytracks.appspot.com/"&gt;My Tracks&lt;/a&gt;: Record GPS tracks of where you hiked, view elevation profiles, and upload to Google Maps. &amp;nbsp;Tip: To keep battery low, change the settings for coordinate frequency to "battery miser". &amp;nbsp;This is what I use to generate nifty maps and elevation profiles of my hikes that I post on this blog.&lt;br /&gt;&lt;a href="http://www.google.com/sky/skymap/"&gt;Google Skymap&lt;/a&gt;: &amp;nbsp;Augmented reality for showing the stars in the sky. &amp;nbsp;Hold your phone up to the starry sky and see whether that bright thing is a planet or a star, and which one. &amp;nbsp;Works even without data access.&lt;br /&gt;&lt;a href="http://peakar.salzburgresearch.at/"&gt;Peak.AR&lt;/a&gt;: Augmented reality that will tell you the name of every mountain peak you are looking at.&lt;br /&gt;&lt;a href="http://code.neenbedankt.com/my-first-published-android-app-rainy-days"&gt;Rainy Days&lt;/a&gt;: Overlays moving weather images over google maps to show you live weather around you. &amp;nbsp;Obviously only works if you have data coverage.&lt;br /&gt;&lt;br /&gt;I'm headed to Kilimanjaro on Tuesday, what are some other good backpacking Apps?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-720359013025528127?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/720359013025528127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=720359013025528127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/720359013025528127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/720359013025528127'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/07/4-android-apps-that-all-backpackers.html' title='The 4 Android Apps that all backpackers should carry'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-7636364908011677993</id><published>2010-04-22T16:57:00.000-07:00</published><updated>2010-06-08T11:17:41.710-07:00</updated><title type='text'>Twitter Queries and the Telephone game</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Last week, during the Twitter &lt;a href="http://chirp.twitter.com/"&gt;Chirp&lt;/a&gt; conference, Evan Williams apparently (I wasn't there) said that twitter gets about 600 million queries per day.  Danny Sullivan claims to have caught Evan after the talk and Evan confirmed that the number was around 19 billion queries per month.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Danny then takes this number and made a blog post about this on Search Engine Land: &lt;a href="http://searchengineland.com/twitter-does-19-billion-searches-per-month-39988"&gt;Twitter Does 19 Billion Searches per month, beating Yahoo and Bing (sort of)&lt;/a&gt;.  In this post, Danny compares the 19 billion number to comscore numbers on google/yahoo/bing worldwide queries.  He follows up by pointing out the "(sort of)" part, the caveats as I read them:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The comscore numbers are third-party, twitter is self-reported.  Apples and oranges.&lt;/li&gt;&lt;li&gt;The number doesn't count partners like Google and Bing.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The "vast majority" of the searches are API requests, via applications running standing queries.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Many queries are generated by widgets placed on web pages that automatically return search results to display.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Danny even adds that Evan mentioned that twitter search itself only contributed to the overall queries in "the low double-digits".  I'm not sure if that means 10s of millions per day or something else&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Danny's article seems completely accurate to me, although certainly suggestive of a comparison that isn't entirely accurate.  However, few people seem to read closely to the caveats.  People have started reporting Danny's numbers verbatim without mentioning any of the caveats.  For example:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://news.softpedia.com/news/Twitter-Chirp-Twitter-Search-Is-Bigger-than-Yahoo-and-Bing-Combined-139879.shtml"&gt;Twitter Chirp: Twitter Search is Bigger than Yahoo and Bing Combined&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://twittercism.com/one-billion-searches/"&gt;Daily searches on Twitter Should Reach One Billion Queries in May&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;People have started quoting the articles that are quoting Danny, the notion that twitter is a bigger search engine than bing/yahoo seems to be gaining popularity.  I believe that I even heard someone at SMX yesterday claim the 600M/19B numbers were search.twitter.com queries, and that the actual API queries far exceeded this.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;My theory though is that the 600M/19B numbers refer to a backend query count, not actual user search queries.  The comscore numbers are referring to actual queries done by users in a search box.  If a running Tweetdeck instance is monitoring a query every 5 seconds or so, that one instance could rack up around 20,000 queries/day for each query it is monitoring.  Similarly, widgets placed on web pages will generate at least one query per page view on those web pages.  That's similar to saying google has bajillions of queries because analytics is installed on lots of webpages.  Its even possible that me looking at my twitter stream or @gregable stream is a counted query.  Furthermore, if I conduct a query on search.twitter.com and leave the page up, it refreshes every once in awhile - presumably each time it polls for new data, that's also considered a query - so 1 user query on search.twitter.com could be hundreds of queries the way Evan is counting.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Note, I don't claim Evan lied.  I don't even claim he did anything deceptive in the way he counted queries.  Danny put the twitter queries in context with comscore numbers, not Evan.  And Danny was clear to point out the caveats, no blame there either.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I would take a wild guess that apples to apples, if you looked at actual twitter search "queries" in the sense that a user considers a query, it's "low double-digit" counts - say 20 million/day, and that those are actually roughly 10x smaller due to repeated polling - say 2 million / day.  That puts Danny's comparison more like:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Google: 88 billion per month&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Yahoo: 9.4 billion per month&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Bing: 4.1 billion per month&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Twitter: 0.06 billion per month&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Still a huge number for twitter, but a bit more accurate of a comparison.  Am I right?  Evan?  Danny?&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Update: 06/08/2010: &lt;/b&gt;Techcrunch quoted Twitter's COO Dick Costolo as saying that &lt;a href="http://techcrunch.com/2010/06/08/twitter-190-million-users/"&gt;twitter has 190 million visitors per month&lt;/a&gt;.  This casts additional cold water on the notion that twitter actually gets 19B user queries every month.  It would be strange indeed if the average visitor actually made 100 queries/month on twitter.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-7636364908011677993?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/7636364908011677993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=7636364908011677993' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/7636364908011677993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/7636364908011677993'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/04/twitter-queries-and-telephone-game.html' title='Twitter Queries and the Telephone game'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-3872909940717856525</id><published>2010-06-07T22:03:00.000-07:00</published><updated>2010-06-07T22:12:48.614-07:00</updated><title type='text'>Training for Kili</title><content type='html'>In August, I'll be doing my best to hike to the summit of Mt. Kilimanjaro, Africa's tallest peak.  In the meantime, I've been trying to hit the trail whenever I can to make sure I'm in the best shape I can be in.  The better shape I'm in, the more fun I'll have.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://chart.apis.google.com/chart?&amp;amp;chs=600x350&amp;amp;cht=lxy&amp;amp;chtt=Elevation&amp;amp;chxt=x,y&amp;amp;chxr=0,0,12,2|1,800.0,2500.0,200&amp;amp;chco=009A00&amp;amp;chm=B,00AA00,0,0,0&amp;amp;chg=100000,11.764705882352942,1,0&amp;amp;chd=e:AAANAlA3BGBXBdBtB-CPCjC3DNDcDiDwD3EJEVEjEvE3FGFgF1GFGXGyHEHZHfHtH-IIIWIjIvI8JRJmJwJ7KJKWKlK5LGLZLkLvL8MKMZMpNMNcNyN.OMOTOZOhOwO.PHPPPfPnP0QDQQQcQnQ0RARNRURjRySASMSYSlSvS9THTSTcTlTuT2UEUQUeUnU5VJVXVnV0V6WCWPWVWhWnW2XCXRXdXmXvX4YBYSYaYlY1Y9ZKZWZeZuZ3aAaIaOaZamaua-bGbSbgbsb.cJcVcdcncwdCdLdcdqd7eGeOebeie0e9fIfPfZfiftf4gLgVgigug1hChQhqh7ifiwi5jFjWjoj2kFkUkbkok3k9lGlWlxl3mDmNmXmjmrnBnbnhnsnyn7oEoNobopo6pKpRpgpmp-qMqgqxq-rQrqr1sUs1s8tQtht0uFuTulu3vJvavrwNwfwlw3xJxPxrx8yOyXyoy6zQzWzoz60D0d0o0u1A1S1p1x2A2P2f2m223H3i30374H4Y4l415F5L5e5k546E6L6d6r6z7D7L7d7w758M8c8l8z9C9J9c9j-B-M-d-z-7.F,FkE5EtEqEXELD7D9D8EOEjEzEyE1E8FCFZFnF1GEGBFwFoFbFAE2EvEzE2FFFNFAEqEeEqFBFsGcHPH8IsJrKsLxM3N5O6QHRKSAS0T1UfViWsYNZ1bydge3f4g6hhh-itjdj5knlbmNm2nkoSpHp4qkrJr6sdtGt0urvVwGw4xzycyuzHzhz1z50Q0a0f0u1i2k345G6I627J7J7F6x6W6S6X6R6g666-7J7b7u8F8m8p8X7x7i7N7M7Q7l7g7J6e6A5g4g3u3E2Q0.0hzWyTxjwvvovQuSthtEsir3roq8p.pLn-m.l2k.jqikhNgXfpeyePdtcwbkabZLYBXOV2UzT5TMSGR1RtRiRXRfRqSKSWSbSnSoScSnSgR9ReRhSBSKS1TgTXSsSrSeSQSNSNSLRyRPQwQSP1PpPpPDOcOgOhOEOAN3MyL2LaLQLZL0MJL.LeK0KLJvJuJsJmJcJBIcH6HxHqHhHdHlHdHEG5HGHOHEHCG7GhGIF9F.GRGTGMGEF2FoFfFkFsFrFZFVFdFhFrGFGXGWGZGYGCF.F2FoFjFZFMFIFKFSFkFaFPFCEhD8DX" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="184" src="http://chart.apis.google.com/chart?&amp;amp;chs=600x350&amp;amp;cht=lxy&amp;amp;chtt=Elevation&amp;amp;chxt=x,y&amp;amp;chxr=0,0,12,2|1,800.0,2500.0,200&amp;amp;chco=009A00&amp;amp;chm=B,00AA00,0,0,0&amp;amp;chg=100000,11.764705882352942,1,0&amp;amp;chd=e:AAANAlA3BGBXBdBtB-CPCjC3DNDcDiDwD3EJEVEjEvE3FGFgF1GFGXGyHEHZHfHtH-IIIWIjIvI8JRJmJwJ7KJKWKlK5LGLZLkLvL8MKMZMpNMNcNyN.OMOTOZOhOwO.PHPPPfPnP0QDQQQcQnQ0RARNRURjRySASMSYSlSvS9THTSTcTlTuT2UEUQUeUnU5VJVXVnV0V6WCWPWVWhWnW2XCXRXdXmXvX4YBYSYaYlY1Y9ZKZWZeZuZ3aAaIaOaZamaua-bGbSbgbsb.cJcVcdcncwdCdLdcdqd7eGeOebeie0e9fIfPfZfiftf4gLgVgigug1hChQhqh7ifiwi5jFjWjoj2kFkUkbkok3k9lGlWlxl3mDmNmXmjmrnBnbnhnsnyn7oEoNobopo6pKpRpgpmp-qMqgqxq-rQrqr1sUs1s8tQtht0uFuTulu3vJvavrwNwfwlw3xJxPxrx8yOyXyoy6zQzWzoz60D0d0o0u1A1S1p1x2A2P2f2m223H3i30374H4Y4l415F5L5e5k546E6L6d6r6z7D7L7d7w758M8c8l8z9C9J9c9j-B-M-d-z-7.F,FkE5EtEqEXELD7D9D8EOEjEzEyE1E8FCFZFnF1GEGBFwFoFbFAE2EvEzE2FFFNFAEqEeEqFBFsGcHPH8IsJrKsLxM3N5O6QHRKSAS0T1UfViWsYNZ1bydge3f4g6hhh-itjdj5knlbmNm2nkoSpHp4qkrJr6sdtGt0urvVwGw4xzycyuzHzhz1z50Q0a0f0u1i2k345G6I627J7J7F6x6W6S6X6R6g666-7J7b7u8F8m8p8X7x7i7N7M7Q7l7g7J6e6A5g4g3u3E2Q0.0hzWyTxjwvvovQuSthtEsir3roq8p.pLn-m.l2k.jqikhNgXfpeyePdtcwbkabZLYBXOV2UzT5TMSGR1RtRiRXRfRqSKSWSbSnSoScSnSgR9ReRhSBSKS1TgTXSsSrSeSQSNSNSLRyRPQwQSP1PpPpPDOcOgOhOEOAN3MyL2LaLQLZL0MJL.LeK0KLJvJuJsJmJcJBIcH6HxHqHhHdHlHdHEG5HGHOHEHCG7GhGIF9F.GRGTGMGEF2FoFfFkFsFrFZFVFdFhFrGFGXGWGZGYGCF.F2FoFjFZFMFIFKFSFkFaFPFCEhD8DX" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pinnacles Day Hike Elevation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Last Monday, May 31, Memorial Day, Cristin and I joined &lt;a href="http://twitter.com/jeremyshapiro/" style="color: #3778cd;"&gt;@JeremyShapiro&lt;/a&gt; and Emily to hike around &lt;a href="http://www.nps.gov/pinn/index.htm"&gt;Pinnacles National Monument&lt;/a&gt;.  Our &lt;a href="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;msa=0&amp;amp;msid=111519889680125758624.000487fa48000a5fb38a9&amp;amp;ll=36.50046,-121.181688&amp;amp;spn=0.060509,0.061197&amp;amp;t=h&amp;amp;z=14"&gt;route&lt;/a&gt; climbed from the east entrance up the High Peaks Trail, descended from the peaks on Tunnel Trail and Juniper Canyon Trail, and then looped back along the mellow Balconies Trail through Balconies Cave, a Talus Cave formed by rocks falling into a V-shaped valley.  The whole trip was supposedly around 9 miles, of course with as much elevation change as we could find in order to prepare for the climbs we expect on Kili.  The graph on the right is the elevation profile that &lt;a href="http://mytracks.appspot.com/"&gt;MyTracks&lt;/a&gt; recorded.  The GPS bounces around a bit though so the total distance of 12 miles is an overestimate.  We were on the lookout for some California Condors, but failed to find them.  The area was starting to get a bit hot for the summer, but still not too bad.  Hopping into a dark cool cave in the middle of the afternoon was still an appreciated break from the sun.  A few photos that I snapped with my cell phone when I remembered can be found here: &lt;a href="http://picasaweb.google.com/ggrothau/PinnaclesHike#"&gt;Pinnacles Photos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://chart.apis.google.com/chart?&amp;amp;chs=600x350&amp;amp;cht=lxy&amp;amp;chtt=Elevation&amp;amp;chxt=x,y&amp;amp;chxr=0,0,18,3|1,600.0,3300.0,400&amp;amp;chco=009A00&amp;amp;chm=B,00AA00,0,0,0&amp;amp;chg=100000,14.814814814814815,1,0&amp;amp;chd=e:AAAXAnA0BFBVBmBwB.CRCdCvDIDYDyEGEXEwE8FQFcF0F.GNGeGrG9HOHaHzIGIYItI9JOJgJtJ.KOKiKtK6LHLSLkLyL8MQMfMoMyNFNPNZNrOAOPOfOrO3PEPOPgPtP.QMQgQ2RLRZRxR3R9SOSeSrS2TJTWTpT5UKUaUoU0U-VLVYVlVyV.WMWXWlWyXAXPXXXkXvX9YHYQYhYwZDZRZeZsZ4aCaLaXalaza-bNbZbkbycEcVckcwc5dGdVdidud3eEeVeheqe8fOfdfrf1gIgQgfgqg0hBhIhOhWhihqhxh3h.iFiOiaili4jEjSjgjuj7kKkYkkk0lBlKlblml2l-mImYmnm4nCnMnYnhn0n9oIoPoZojoto3o-pNpVpdpnp4qDqJqWqjqqqyq7rErMrUrhrorwr.sIsRsaslsvs5tFtMtVtetktut0t7uDuRubuou0u9vGvNvUvevovyv3v.wSwXwfwqwxw4xFxLxSxgxoxyx7yByFyOyYygynyyy5,AyArBbBmBmAzBLBiB6ClEHFBGCHfI0KRLWL8MIMOMHMLMOMqNeOTPKQTRMR8S3TvUgVaWRXUYaZxa9cHdIecfXgbhpiji6jskbk3lal-mUmbmpmwm4mjmRl5lfkvjzikhDfceHdIcicVcRcLb7bpbabKbGbjcPdFeZf4hejAkXlxmqnJnen3oAowp6qlrMr8sps6thuKuyu7vEvrwNwqxkykza0W021T102b3A4E5B6I657t8V8.9h-U-6.E.M.A-3-n-r-u-v-d-M949S8o7u6a5H4J3V2o2i2n2d2g2v2u2l272.232x2v2l2r3L354e475k5.6T6q7H7G7b718I8S8V8G7n7W7P7Y7o7-8K8J8E7-7777768H8N8S8P8T7.7u7R7G60636h6k6x6.7K7w778D8R8V8W8W8J8H8K8K8F7q7b7P6-687Q7D6v6X6T6U6G5n6F6N6S617m7q7p7u7x7q7e7c7r7x797-8R8I8F8C8f8k8v8k888v8y8q8l8Q" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="186" src="http://chart.apis.google.com/chart?&amp;amp;chs=600x350&amp;amp;cht=lxy&amp;amp;chtt=Elevation&amp;amp;chxt=x,y&amp;amp;chxr=0,0,18,3|1,600.0,3300.0,400&amp;amp;chco=009A00&amp;amp;chm=B,00AA00,0,0,0&amp;amp;chg=100000,14.814814814814815,1,0&amp;amp;chd=e:AAAXAnA0BFBVBmBwB.CRCdCvDIDYDyEGEXEwE8FQFcF0F.GNGeGrG9HOHaHzIGIYItI9JOJgJtJ.KOKiKtK6LHLSLkLyL8MQMfMoMyNFNPNZNrOAOPOfOrO3PEPOPgPtP.QMQgQ2RLRZRxR3R9SOSeSrS2TJTWTpT5UKUaUoU0U-VLVYVlVyV.WMWXWlWyXAXPXXXkXvX9YHYQYhYwZDZRZeZsZ4aCaLaXalaza-bNbZbkbycEcVckcwc5dGdVdidud3eEeVeheqe8fOfdfrf1gIgQgfgqg0hBhIhOhWhihqhxh3h.iFiOiaili4jEjSjgjuj7kKkYkkk0lBlKlblml2l-mImYmnm4nCnMnYnhn0n9oIoPoZojoto3o-pNpVpdpnp4qDqJqWqjqqqyq7rErMrUrhrorwr.sIsRsaslsvs5tFtMtVtetktut0t7uDuRubuou0u9vGvNvUvevovyv3v.wSwXwfwqwxw4xFxLxSxgxoxyx7yByFyOyYygynyyy5,AyArBbBmBmAzBLBiB6ClEHFBGCHfI0KRLWL8MIMOMHMLMOMqNeOTPKQTRMR8S3TvUgVaWRXUYaZxa9cHdIecfXgbhpiji6jskbk3lal-mUmbmpmwm4mjmRl5lfkvjzikhDfceHdIcicVcRcLb7bpbabKbGbjcPdFeZf4hejAkXlxmqnJnen3oAowp6qlrMr8sps6thuKuyu7vEvrwNwqxkykza0W021T102b3A4E5B6I657t8V8.9h-U-6.E.M.A-3-n-r-u-v-d-M949S8o7u6a5H4J3V2o2i2n2d2g2v2u2l272.232x2v2l2r3L354e475k5.6T6q7H7G7b718I8S8V8G7n7W7P7Y7o7-8K8J8E7-7777768H8N8S8P8T7.7u7R7G60636h6k6x6.7K7w778D8R8V8W8W8J8H8K8K8F7q7b7P6-687Q7D6v6X6T6U6G5n6F6N6S617m7q7p7u7x7q7e7c7r7x797-8R8I8F8C8f8k8v8k888v8y8q8l8Q" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ohlone Backpacking Day 1, Elevation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This past weekend, June 5-5, &lt;a href="http://twitter.com/jeremyshapiro/" style="color: #3778cd;"&gt;@JeremyShapiro&lt;/a&gt;, &lt;a href="http://moultano.blogspot.com/"&gt;Ryan Moulton&lt;/a&gt; and I loaded up the backpacks and went for a 2-day trip in the Ohlone wilderness, hiking from &lt;a href="http://www.ebparks.org/parks/del_valle"&gt;Del Valle&lt;/a&gt; to Stewart Camp.  Since it's a training mission, I opted for plenty of comforts and extra water, my pack weighed in at right about 40 pounds.  While only 6.5 miles (again MyTracks is incorrect), The &lt;a href="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;t=p&amp;amp;msa=0&amp;amp;msid=111519889680125758624.0004887d53083ae908261&amp;amp;ll=37.557915,-121.695557&amp;amp;spn=0.059672,0.061197&amp;amp;z=14"&gt;route&lt;/a&gt; was quite steep and exposed for much of the way as you can see in the elevation profile on the left.  We ate lunch in the little dip you see around 1,800 ft, alongside a shady brook in Williams Gulch.  Then it was more climbing up to the final ridge. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/ryanmoulton/OhloneBackpacking#5479850057857885426" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_s5emCsFnEdE/TA3M4MmNLSI/AAAAAAAADW0/u1Chp5sP_fU/s400/IMG_3950.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Nearing the campsite, we saw a small cairn indicating a path the bottom of &lt;a href="http://www.weekendsherpa.com/story/hike-to-murietta-falls-in-the-ohlone-regional-wilderness/496"&gt;Murietta Falls&lt;/a&gt;.  We dropped packs and wandered down to find that the falls was only a trickle at the time.  There was a small pool at the bottom with several small snakes in it trying to stay cool.  The basalt rocks on top of which it flowed were fairly unusual looking for the area, and since two of us are regular rock climbers, we decided to free climb the falls back to our packs instead of hiking back up the path.  The climb had several large ledges so it was fairly safe, but the climbing was sketchy in places, we thought we might need to downclimb a couple times.  We eventually made it up the falls with only minor injuries, and startling only a handful of snakes.  A little extra adventure for our adventure.&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://picasaweb.google.com/ryanmoulton/OhloneBackpacking#5479851418649829858" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_s5emCsFnEdE/TA3ObOhGYtI/AAAAAAAADW4/r0b-jVBRT4w/s320/IMG_3961.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Another half mile of mellow trails and we reached our campsite, only to find someone else already in it.  We held the reservation for this site for that night.  The other group we found in our campsite had a reservation for the next campsite over - another 4 more miles.  After completing the 6 miles of strenuous climbing, they had found themselves unable to continue on, so they squatted in our site instead.  Fortunately, we found another spot just a short distance further down the trail that had been used as a campsite before and while it was smaller it turned out to be an even better campsite.  A rock outcropping above the site provided some great flat spots to cook food and enjoy a fantastic view of the bay area, overlooking Livermore, Oakland, the SF Bay, San Francisco, and even the Pacific.  It was possibly the best view we saw on the trail, and we only found it because someone else had stolen our campsite.  We hung out and watched the sun set, the lights of the cities come on, satellites and shooting stars flying by overhead, and airplane traffic starting the descent into SFO.  Ryan played the role of cameraman for this venture, you can find more photos over at &lt;a href="http://picasaweb.google.com/ryanmoulton/OhloneBackpacking"&gt;Ohlone Backpacking Photos&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-3872909940717856525?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/3872909940717856525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=3872909940717856525' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3872909940717856525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3872909940717856525'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/06/training-for-kili.html' title='Training for Kili'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_s5emCsFnEdE/TA3M4MmNLSI/AAAAAAAADW0/u1Chp5sP_fU/s72-c/IMG_3950.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-6506148897255485019</id><published>2010-05-23T23:25:00.000-07:00</published><updated>2010-05-23T23:26:42.858-07:00</updated><title type='text'>Using Amazon's Mechanical Turk for Price Comparison Shopping</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_s5emCsFnEdE/S_oasEOv9tI/AAAAAAAADTI/7QXSFXvTEdc/s1600/hard_drives1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://1.bp.blogspot.com/_s5emCsFnEdE/S_oasEOv9tI/AAAAAAAADTI/7QXSFXvTEdc/s200/hard_drives1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;I use a &lt;a href="http://www.tomsguide.com/us/infrant-readynas-nv,review-654.html"&gt;ReadyNAS NV&lt;/a&gt;&amp;nbsp;attached to my home network. &amp;nbsp;When I bought the device, I initially installed 3x 300GB drives into it and that has served me well providing 600GB of RAID protected storage. &lt;br /&gt;&lt;br /&gt;I recently decided to upgrade the drives. &amp;nbsp;Netgear has a &lt;a href="http://www.readynas.com/?page_id=82"&gt;ReadyNAS Compatibility Guide&lt;/a&gt;&amp;nbsp;which lists specifically tested and recommended drives to use with each of the ReadyNAS products. &amp;nbsp;I knew that I wanted 1TB drives, which seemed from limited research to be a fairly good spot in the market. &amp;nbsp;That left me with 11 drives to choose from, which seemed like alot of work to research and price compare. &amp;nbsp;I researched a few on Amazon and bought my first drive for around $145.&lt;br /&gt;&lt;br /&gt;For the other 3, I decided to try a different approach mostly as an experiment. &amp;nbsp;I created an account on &lt;a href="https://requester.mturk.com/mturk/welcome"&gt;Mechanical Turk&lt;/a&gt;&amp;nbsp;and asked 3 workers to find me the lowest price they could on any of these drives. &amp;nbsp;I charged the task out at $3/worker and since there was no clear success criteria, I promised in the task description to give a $10 bonus to whichever worker found the cheapest price. &amp;nbsp;I mentioned that coupon codes, discounts, and rebates were all fair game, but not to worry about shipping/taxes to keep it simple. &amp;nbsp;I only cared about price: performance didn't matter much since it was a NAS drive. &amp;nbsp;Total cost = $3 x 3 + 0.30 x 3 (Amazon's fee) + $10 = $19.90.&lt;br /&gt;&lt;br /&gt;Here are the results, about an hour later:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Seagate Barracuda LP ST31000520AS at &lt;/b&gt;&lt;a href="http://uk.buy.com/PR/Product.aspx?sku=211035780"&gt;&lt;b&gt;buy.co.uk&lt;/b&gt;&lt;/a&gt;&lt;b&gt; for&amp;nbsp;£68.02&lt;/b&gt;. &amp;nbsp;I didn't specify US, my mistake. &amp;nbsp;Still approved the work.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Seagate Barracuda ST31000528AS at&amp;nbsp;&lt;a href="http://www.unistorage.com/unistorage/index.cfm?fuseaction=shop.dspSpecs&amp;amp;part=3312975"&gt;unistorage.com&lt;/a&gt; for&amp;nbsp;$68.84&lt;/b&gt;. &amp;nbsp;This worker actually listed lowest prices for every one of the drives. &amp;nbsp;The&amp;nbsp;$68.84&amp;nbsp;one was the cheapest before shipping/taxes. &amp;nbsp;This worker got the bonus by a slim slim margin (see worker 3).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Seagate Barracuda LP ST31000520AS at &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16822148411&amp;amp;nm_mc=OTC-C173T&amp;amp;cm_mmc=OTC-C173T-_-Hard+Drives-_-Seagate-_-22148411"&gt;Newegg&lt;/a&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;for $69.99.&lt;/b&gt;&amp;nbsp;&amp;nbsp;This drive ended up cheapest after shipping/taxes.&lt;/li&gt;&lt;/ol&gt;Ultimately I went with worker #3's suggestion, despite awarding the bonus to worker #2. &amp;nbsp;Either way, &lt;b&gt;I saved about $75 per drive&lt;/b&gt; over what I had bought with my own poor research, so this paid off in spades. &amp;nbsp;I might have been able to figure this out myself and save the $20 as well, but this approach was less work and more interesting.&lt;br /&gt;&lt;br /&gt;I think if I did it again, I'd be a little bit more specific about what I want (&lt;i&gt;US&lt;/i&gt; retailer), maybe add shipping/tax to the mix, possibly ask for the 2-3 cheapest drives they could find so I have some choices. &amp;nbsp;I'd also probably drop the task price to say $0.25 but add that any worker that gets within 10% of the lowest price worker will also earn a $3-5 bonus. &amp;nbsp;I suspect that the ability to earn $3 for a few quick pricegrabber searches might make sticking around and spending more time doing research less enticing. &amp;nbsp;Still the results weren't that bad with my first try, enough to make me wonder what else I could use the turk workers for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-6506148897255485019?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/6506148897255485019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=6506148897255485019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6506148897255485019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6506148897255485019'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/05/using-amazons-mechanical-turk-for-price.html' title='Using Amazon&apos;s Mechanical Turk for Price Comparison Shopping'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_s5emCsFnEdE/S_oasEOv9tI/AAAAAAAADTI/7QXSFXvTEdc/s72-c/hard_drives1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-6838617854659485018</id><published>2010-05-23T20:39:00.000-07:00</published><updated>2010-05-23T22:10:24.138-07:00</updated><title type='text'>Google Encrypted Search</title><content type='html'>It's often fun to read the response that the internet community has to Google's launches, especially ones that I'm somewhat familiar with. &amp;nbsp;There is always a bit of tinfoil hat concerns about Google's intentions.&lt;br /&gt;&lt;br /&gt;Late last week we launched to Beta an &lt;a href="http://googleblog.blogspot.com/2010/05/search-more-securely-with-encrypted.html"&gt;Encrypted Google Search&lt;/a&gt; option. &amp;nbsp;Most discussions focus on the privacy aspect of this launch, but there are a number of discussions noting that this disables referrer (and hence query) passing for many destination websites: take the &lt;a href="http://www.webmasterworld.com/google/4137008.htm"&gt;webmasterworld discussion&lt;/a&gt; for one example. &amp;nbsp;The tin foil hat interpretation is that Google hidden agenda is to prevent webmasters from seeing their query data.&lt;br /&gt;&lt;br /&gt;Fortunately, it's easy to see what is actually going on. &amp;nbsp;When you surf using the HTTP&lt;b&gt;S&lt;/b&gt; protocol, the goal is to encrypt(hide) your surfing traffic from your transmitting network, not from the destination sites. &amp;nbsp;However, if you click from a HTTP&lt;b&gt;S&lt;/b&gt; page to an HTTP page, passing the referrer would leak a small amount of data about your encrypted traffic to the network. &amp;nbsp;As a result, all &lt;i&gt;web&lt;/i&gt;&amp;nbsp;&lt;i&gt;browsers&lt;/i&gt; that I know of send an empty referrer string in this case. &amp;nbsp;Interestingly, if you navigate between HTTP&lt;b&gt;S&lt;/b&gt; pages, &lt;u&gt;even on different domains&lt;/u&gt;, the referrer is passed. &amp;nbsp;This is consistent with hiding the data from the network but not the destination site.&lt;br /&gt;&lt;br /&gt;If a webmaster so desired, they could move their entire site onto HTTP&lt;b&gt;S&lt;/b&gt; and then start getting the HTTP&lt;b&gt;S&lt;/b&gt; referrers sent to their server again. &amp;nbsp;If Google's intent was to prevent websites from seeing query strings, there are much easier ways to do so, such as using POST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-6838617854659485018?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/6838617854659485018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=6838617854659485018' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6838617854659485018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6838617854659485018'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/05/google-encrypted-search.html' title='Google Encrypted Search'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-4306630434705865505</id><published>2010-05-22T21:18:00.000-07:00</published><updated>2010-05-22T21:24:18.289-07:00</updated><title type='text'>Gas Station Inefficiency</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s5emCsFnEdE/S_itBKfwPaI/AAAAAAAADSo/uYtpssdeAYM/s1600/gas_station_pay_cash_seven_cent_discount.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 250px; height: 244px;" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S_itBKfwPaI/AAAAAAAADSo/uYtpssdeAYM/s320/gas_station_pay_cash_seven_cent_discount.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5474315582577851810" /&gt;&lt;/a&gt;&lt;br /&gt;Near where I live is a gas station that is almost always packed and &lt;i&gt;overflowing into the road&lt;/i&gt;.  It's not particularly small, but they have decent prices.&lt;br /&gt;&lt;br /&gt;I've wondered why the station always looks so busy.  I think I have the answer.  In addition to having decent prices on gas, they also have a big sign that reads "9c/gallon off with cash".  I've observed that the vast majority of the users wait in line until their car is in front of a pump, then walk into the store to get in another line to prepay in cash for their gas.  Once they've prepaid, they return, pump, and sometimes go back in for change.  If you add all this up, they spend about 5-10 minutes with their car in front of the pump for every 1 minute or so of actual pumping of gas.Pump utilization is abysmal, leading to low throughput, leading to long queues.  Sounds like a dumb algorithm to me.&lt;br /&gt;&lt;br /&gt;What I don't know is if this behavior increases their sales or decreases them.  I know that Cristin and I sometimes avoid this station because of the congestion meaning lost sales.  However, it's possible that the lines of overflowing cars out into the road draws attention and gives a false sense that this must be the cheapest around driving more sales still.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-4306630434705865505?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/4306630434705865505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=4306630434705865505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/4306630434705865505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/4306630434705865505'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/05/gas-station-inefficiency.html' title='Gas Station Inefficiency'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s5emCsFnEdE/S_itBKfwPaI/AAAAAAAADSo/uYtpssdeAYM/s72-c/gas_station_pay_cash_seven_cent_discount.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-876548025762569322</id><published>2007-10-08T22:27:00.000-07:00</published><updated>2010-05-22T21:07:39.508-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>Reservoir Sampling</title><content type='html'>If you don't find programming algorithms interesting, stop reading.  This post is not for you.&lt;br /&gt;&lt;br /&gt;On the other hand, if you do find algorithms interesting, in addition to this post, you might also want to read my other posts with the &lt;a href="http://gregable.com/search/label/algorithms"&gt;algorithms&lt;/a&gt; tag.&lt;br /&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-size:130%;"&gt;Problem Statement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reservoir Sampling is an algorithm for sampling elements from a stream of data.  Imagine you are given a really large stream of data elements (queries on google searches in May, products bought at Walmart during the Christmas season, names in a phone book, whatever).  Your goal is to &lt;span style="font-style: italic;"&gt;efficiently&lt;/span&gt; return a random sample of 1,000 elements &lt;span style="font-weight: bold;"&gt;evenly distributed&lt;/span&gt; from the original stream.  How would you do it?&lt;br /&gt;&lt;br /&gt;The right answer is generating random integers between 0 and N-1, then retrieving the elements at those indices and you have your answer.  (Update: reader Martin astutely points out that this is sampling with replacement.  To make this sampling without replacement, one simply needs to note whether or not your sample already pulled that random number and if so, choose a new random number.  This can make the algorithm pretty expensive if the sample size is very close to N though).&lt;br /&gt;&lt;br /&gt;So, let me make the problem harder.  You don't know N (the size of the stream) in advance and you can't index directly into it.  You can count it, but that requires making 2 passes of the data.  You can do better.  There are some heuristics you might try: for example to guess the length and hope to undershoot.  It will either not work in one pass or will not be evenly distributed.&lt;br /&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-size:130%;"&gt;Simple Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A relatively easy and correct solution is to assign a random number to every element as you see them in the stream, and then always keep the top 1,000 numbered elements at all times.  This is similar to how mysql does "ORDER BY RAND()" calls.  This strategy works well, and only requires additionally storing the randomly generated number for each element.&lt;br /&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-size:130%;"&gt;Reservoir Sampling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another, more complex option is reservoir sampling.  First, you want to make a reservoir (array) of 1,000 elements and fill it with the first 1,000 elements in your stream.  That way if you have exactly 1,000 elements, the algorithm works.  This is the base case.&lt;br /&gt;&lt;br /&gt;Next, you want to process the i'th element (starting with i = 1,001) such that at the end of processing that step, the 1,000 elements in your reservoir are randomly sampled amongst the i elements you've seen so far.  How can you do this?  Start with i = 1,001.  With what probability after the 1001'th step should element 1,001 (or any element for that matter) be in the set of 1,000 elements?  The answer is easy: 1,000/1,001.  So, generate a random number between 0 and 1, and if it is less than 1,000/1,001 you should take element 1,001.  In other words, choose to add element 1,001 to your reservoir with probability 1,000/1,001.  If you choose to add it (which you likely will), then replace any element in the reservoir chosen randomly.  I've shown that this produces a 1,000/1,001 chance of selecting the 1,001'th element, but what about the 2nd element in the list?  The 2nd element is definitely in the reservoir at step 1,000 and the probability of it getting removed is the probability of element 1,001 getting selected multiplied by the probability of #2 getting randomly chosen as the replacement candidate.  That probability is 1,000/1,001 * 1/1,000 = 1/1,001.  So, the probability that #2 survives this round is 1 - that or 1,000/1,001.&lt;br /&gt;&lt;br /&gt;This can be extended for the i'th round - keep the i'th element with probability &lt;span style="color:#006600;"&gt;1,000/i&lt;/span&gt; and if you choose to keep it, replace a random element from the reservoir.  It is pretty easy to prove that this works for all values of i using induction.  It obviously works for the i'th element based on the way the algorithm selects the i'th element with the correct probability outright.  The probability any element before this step being in the reservoir is &lt;span style="color:red;"&gt;1,000/(i-1)&lt;/span&gt;.  The probability that they are removed is &lt;span style="color:#006600;"&gt;1,000/i&lt;/span&gt; * 1/1,000 = 1/i.  The probability that each element sticks around given that they are already in the reservoir is &lt;span style="color:#3333ff;"&gt;(i-1)/i&lt;/span&gt; and thus the elements' overall probability of being in the reservoir after i rounds is &lt;span style="color:red;"&gt;1,000/(i-1)&lt;/span&gt; * &lt;span style="color:#3333ff;"&gt;(i-1)/i&lt;/span&gt; = &lt;span style="color:#006600;"&gt;1,000/i&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This ends up a little complex, but works just the same way as the random assigned numbers above.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style=" font-weight: bold;font-size:130%;"&gt;Weighted Reservoir Sampling Variation&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Now take the same problem above but add an extra challenge: How would you sample from a weighted distribution where each element has a given weight associated with it in the stream?  This is sorta tricky.  Pavlos S. Efraimidis figured out the solution in 2005 in a paper titled &lt;a href="http://portal.acm.org/citation.cfm?id=1138834"&gt;Weighted Random Sampling with a Reservoir&lt;/a&gt;.  It works similarly to the assigning a random number solution above.&lt;br /&gt;&lt;br /&gt;As you process the stream, assign each item a "key".  For each item in the stream &lt;i&gt;i&lt;/i&gt;,  let &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z8kF-gc7I/AAAAAAAADRQ/ZAXhvMc_7sk/s1600/k_i.gif" style="padding: 0;" valign="bottom" /&gt; be the item's "key", let &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z9KgePwyI/AAAAAAAADRU/N8ud81VHkQA/s1600/w_i.gif" style="padding: 0;" valign="bottom" /&gt; be the weight of that item and let &lt;img alt="r sub i" border="0" src="http://1.bp.blogspot.com/_s5emCsFnEdE/S9Z9mn5azMI/AAAAAAAADRY/sF-sBuuH7Go/s1600/r_i.gif" style="padding: 0;" valign="bottom" /&gt; be a random number between 0 and 1.  The "key", &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z8kF-gc7I/AAAAAAAADRQ/ZAXhvMc_7sk/s1600/k_i.gif" style="padding: 0;" valign="bottom" /&gt;, is a random number to the n'th root where n is weight of that item in the stream: &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z-MGd2ZmI/AAAAAAAADRc/-_L660dnxTg/s1600/latex.gif" style="padding: 0;" valign="bottom" /&gt;. Now, simply keep the top n elements ordered by their keys, where n is the size of your sample.  Easy.&lt;br /&gt;&lt;br /&gt;To see how this works, lets start with non-weighted elements (ie: weight = 1). &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z9KgePwyI/AAAAAAAADRU/N8ud81VHkQA/s1600/w_i.gif" style="padding: 0;" valign="bottom" /&gt; is always 1, so the key is simply a random number and this algorithm degrades into the simple algorithm mentioned above.&lt;br /&gt;&lt;br /&gt;Now, how does it work with weights?  The probability of choosing i over j is the probability that &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z8kF-gc7I/AAAAAAAADRQ/ZAXhvMc_7sk/s1600/k_i.gif" style="padding: 0;" valign="bottom" /&gt; &amp;gt; &lt;img border="0" src="http://1.bp.blogspot.com/_s5emCsFnEdE/S9aAyFdZxdI/AAAAAAAADRg/OulrwjO3Y0w/s1600/k_j.gif" style="padding: 0;" valign="bottom" /&gt;. &lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z8kF-gc7I/AAAAAAAADRQ/ZAXhvMc_7sk/s1600/k_i.gif" style="padding: 0;" valign="bottom" /&gt; can have any value from 0 - 1.  However, it's more likely to be closer to 1 the higher &lt;i&gt;w&lt;/i&gt; is.  We can see what the distribution of this looks like when comparing to a weight 1 element by integrating &lt;i&gt;k&lt;/i&gt; over all values of random numbers from 0 - 1.  You get something like this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;k&lt;/i&gt; =&lt;a href="http://www.wolframalpha.com/input/?i=integrate[x^(1/n),+{x,+0,+1}]+"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S9aDhGHH1tI/AAAAAAAADRk/1IQ5BfaxJ_E/s1600/integral.gif" valign="middle" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;If &lt;i&gt;w&lt;/i&gt; = 1, &lt;i&gt;k&lt;/i&gt; = 1 / 2.  If &lt;i&gt;w&lt;/i&gt; = 9, &lt;i&gt;k&lt;/i&gt; = 9 / 10.  When replacing against a weight 1 element, an item of weight 5 would have a 50% chance and an element of weight 9 would have a 90% chance.  Similar math works for two elements of non-zero weight.&lt;/div&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-size:130%;"&gt;Distributed Reservoir Sampling Variation&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This is the problem that got me researching the weighted sample above.  In both of the above algorithms, I can process the stream in O(N) time where N is length of the stream, in other words: in a single pass.  If I want to break break up the problem on say 10 machines and solve it close to 10 times faster, how can I do that?&lt;br /&gt;&lt;br /&gt;The answer is to have each of the 10 machines take roughly 1/10th of the input to process and generate their own reservoir sample from their subset of the data using the weighted variation above.  Then, a final process must take the 10 output reservoirs and merge them.&lt;br /&gt;&lt;br /&gt;The trick is that &lt;b&gt;the final process must use the &lt;u&gt;original&lt;/u&gt; "key" weights computed in the first pass&lt;/b&gt;.  For example, If one of your 10 machines processed only 10 items in a size-10 sample, and the other 10 machines each processed 1 million items, you would expect that the one machine with 10 items would likely have smaller keys and hence be less likely to be selected in the final output.  If you recompute keys in the final process, then all of the input items would be treated equally when they shouldn't.&lt;br /&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-size:130%;"&gt;Birds of a Feather&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.theage.com.au/articles/2004/09/09/1094530769493.html" style="text-decoration: none; color: rgb(55, 120, 205); clear: right; float: right; margin-bottom: 1em; margin-left: 1em; "&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_s5emCsFnEdE/S52Dt5OHDOI/AAAAAAAADO8/trxKPkXvwSc/s200/google_jobs.jpg" width="176" style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-width: initial; border-color: initial; position: relative; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: transparent; border-right-color: transparent; border-bottom-color: transparent; border-left-color: transparent; -webkit-box-shadow: rgba(0, 0, 0, 0.199219) 0px 0px 0px; border-top-left-radius: 0px 0px; border-top-right-radius: 0px 0px; border-bottom-right-radius: 0px 0px; border-bottom-left-radius: 0px 0px; background-position: initial initial; background-repeat: initial initial; " /&gt;&lt;/a&gt;If you are one of the handful of people interested in Reservoir Sampling and advanced software algorithms like this, you are the type of person I'd like to see working with me at &lt;a href="http://www.google.com/jobs/" style="text-decoration: none; color: rgb(55, 120, 205); "&gt;Google&lt;/a&gt;.  If you send me your resume (&lt;/span&gt;&lt;a href="mailto:ggrothau@gmail.com" style="text-decoration: none; color: rgb(55, 120, 205); "&gt;ggrothau@gmail.com&lt;/a&gt;), I can make sure it gets in front of the right recruiters and watch to make sure that it doesn't get lost in the pile that we get every day.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-876548025762569322?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/876548025762569322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=876548025762569322' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/876548025762569322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/876548025762569322'/><link rel='alternate' type='text/html' href='http://gregable.com/2007/10/reservoir-sampling.html' title='Reservoir Sampling'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s5emCsFnEdE/S9Z8kF-gc7I/AAAAAAAADRQ/ZAXhvMc_7sk/s72-c/k_i.gif' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-3497902593871395198</id><published>2010-05-13T16:09:00.000-07:00</published><updated>2010-05-13T16:09:18.361-07:00</updated><title type='text'>Google I/O Site Review</title><content type='html'>If you are going to be at Google I/O next week, I'll be on stage for the &lt;a href="http://code.google.com/events/io/2010/sessions/seo-site-review-from-experts.html"&gt;SEO Site Advice from the Experts&lt;/a&gt; Session with Matt Cutts and Tiffany Lane.  It'll be a fast-paced Site Review, lots of fun.  Check us out, Thursday the 20th, 2:15 PM, Room 8.  Matt has put out &lt;a href="http://www.mattcutts.com/blog/seo-site-review/"&gt;the call for sites to review&lt;/a&gt;, ideally get in on the list early.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-3497902593871395198?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/3497902593871395198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=3497902593871395198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3497902593871395198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3497902593871395198'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/05/google-io-site-review.html' title='Google I/O Site Review'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-3993844881399289576</id><published>2010-05-10T12:34:00.000-07:00</published><updated>2010-05-10T12:34:18.584-07:00</updated><title type='text'>Henry Coe, Kelly Lake, Backpacking</title><content type='html'>This past weekend I went backpacking in &lt;a href="http://www.parks.ca.gov/?page_id=561"&gt;Henry Coe&lt;/a&gt; with &lt;a href="http://twitter.com/JeremyShapiro"&gt;JeremyShapiro&lt;/a&gt;, &lt;a href="http://mattcutts.com"&gt;Matt Cutts&lt;/a&gt;, and David Signoff.&lt;br /&gt;&lt;br /&gt;We hiked in on a perfect day from the Hunting Hollow entrance on a gorgeous day, a grueling climb up Middle Steer Ridge Trail, a short stroll along Steer Ridge Road to lunch at Wilson Peak where we saw a deer also relaxing and having lunch.  We backtracked slightly and quickly descended half the elevation we just gained down Serpentine Trail.  Back up on Tule Pond Trail, following the ridge on Wasno Road, then Wagon Road, and then a very steep descent down Kelly Lake Trail to Kelly Lake.  Total distance: roughly 10 miles&lt;br /&gt;&lt;br /&gt;There were 4 parties including ourselves overnighting at Kelly Lake.  Beautiful spot, but lacking for ideal campsites and we weren't the first to arrive.  I think I still prefer having Redfern pond to myself 2 years ago to sharing Kelly Lake with others.  Serenaded by birds and then frogs, our crew played cards and then got a good nights' sleep.&lt;br /&gt;&lt;br /&gt;The next morning, rain clouds started appearing so we packed up camp quickly and headed out.  Our plan was to stick to trails back to Hunting Hollow, but we hit some moderate rain on the return hike and so took a shortcut.  Back up Kelly Lake Trail on the other side, ridge walking on Wasno Road until descending on Dexter Trail which is when the rain hit, and then a moderate descent along Grizzly Gulch Trail until we reached the Coyote Creek park entrance.  From there, only a 2 mile flat walk back to Hunting Hollow Entrance where my car was getting a nice shower.  Total distance: roughly 7 miles.&lt;br /&gt;&lt;br /&gt;I found a similar hike done by another crew, with GPS map and altitude here: &lt;a href="http://trail.motionbased.com/trail/invitation/dashboard.mb?episodePk.pkValue=7796588"&gt;Hunting Hollow to Kelly Lake round trip with GPS&lt;/a&gt;.  That trip was 20 miles with 6800ft of elevation gain/loss.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-3993844881399289576?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/3993844881399289576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=3993844881399289576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3993844881399289576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3993844881399289576'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/05/henry-coe-kelly-lake-backpacking.html' title='Henry Coe, Kelly Lake, Backpacking'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-3025513332156732921</id><published>2010-04-24T16:42:00.000-07:00</published><updated>2010-04-24T16:42:04.894-07:00</updated><title type='text'>Domain'ing is Annoying</title><content type='html'>The way in which domain names are allocated seems broken to me. &amp;nbsp;Speculators register domain names for a very small amount of money ($6/yr for .com's, sometimes pennies for some ccTLDs) and then refuse to give up the rights for anything less than $10,000. &amp;nbsp;The domains are worth more than the registration cost to someone who would actually use them, but less than the squatter price. &amp;nbsp;As a result, &lt;a href="http://greg.com/" rel="nofollow"&gt;excellent domain names&lt;/a&gt;&amp;nbsp;go unused (parked) while good content creators with low budgets end up with &lt;a href="http://xkcd.com/"&gt;stupid domain names&lt;/a&gt; that nobody wants but which are affordable.&lt;br /&gt;&lt;br /&gt;A strawman proposal for fixing this:&lt;br /&gt;Instead of a flat $/yr charge for domain names, charge based on demand. &amp;nbsp;If a user comes along to the registrar and wants to buy an already used domain name, they can file a bid with the registrar. &amp;nbsp;The registrar records and authorizes the charge for the bid, perhaps even taking the money into escrow. &amp;nbsp;At the same time, the current owner is contacted. &amp;nbsp;The current owner can now choose:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Accept the offer, sell the domain name.&lt;/li&gt;&lt;li&gt;Accept an immediate increase in the annual registration fee for that domain name of 5% of the offer price.&lt;/li&gt;&lt;/ol&gt;So for example, I might bid $1,000 for greg.com. &amp;nbsp;The owner of greg.com doesn't have to accept my bid, but if they don't, the registration cost rises to $50/yr. &amp;nbsp;This should make them less inclined to squat. &amp;nbsp;More valuable domain names will end up with a higher registration cost and worthless domain names will end up with a potentially lower registration cost.&lt;br /&gt;&lt;br /&gt;The 5% is just&amp;nbsp;a random number. &amp;nbsp;Tweaks might include a some cap at $500, or having the percentage decrease as the offer increases so that the registration fee for google.com or whatever isn't astronomical. &amp;nbsp;Perhaps reduce the percentage the longer the current owner has owned the domain as changes in identity are undesirable. &amp;nbsp;It also seems like you might want to have registration fee hike exceptions in some cases, such as trademarks. &amp;nbsp;Lots of options available.&lt;br /&gt;&lt;br /&gt;Where should the extra registration money go? &amp;nbsp;The registrars don't deserve most of this. &amp;nbsp;I'd probably put it towards public projects to build better planet-wide network infrastructure (fiber in the ground) or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-3025513332156732921?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/3025513332156732921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=3025513332156732921' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3025513332156732921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3025513332156732921'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/04/domaining-is-annoying.html' title='Domain&apos;ing is Annoying'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-3555077052829751455</id><published>2010-04-13T17:51:00.000-07:00</published><updated>2010-04-13T17:51:20.646-07:00</updated><title type='text'>Preloading Hard Drives with Movies - Sneakernet</title><content type='html'>The financial times has an article yesterday about &lt;a href="http://www.ft.com/cms/s/2/5b4163c8-4426-11df-b327-00144feab49a.html"&gt;Seagate preloading USB hard drives with movies&lt;/a&gt;. &amp;nbsp;Apparently the drives will come with around 20 popular movies already present, but reading between the lines they are encrypted. &amp;nbsp;If you want to watch them, you can do so by buying the decryption key online. &amp;nbsp;I'm sure there is more DRM to it so that you can't easily share the movies, but the basic idea is kinda neat. &amp;nbsp;Essentially, you are bypassing the biggest issue of digital delivery of movies (bandwidth and the latency of waiting for the download) by having the access to the movie controlled by a download of only a few kb encryption key.&lt;br /&gt;&lt;br /&gt;I think this approach has potential beyond what Seagate is doing. &amp;nbsp;Imagine if your Netflix subscription, instead of shipping you DVDs one at a time, just shipped you a hard drive with your entire movie queue on it in encrypted form. &amp;nbsp;When you are ready to view the next movie in the queue, you just log into your netflix account and download the encryption key in a few seconds. &amp;nbsp;Instead of having X DVD's out at a time, you could have X encryption keys per month or something. &amp;nbsp;The advantage is that there's much less shipping involved and you can rearrange your queue however you want and start watching any of the movies immediately with no wait for the mail or slow internet download. &amp;nbsp;Even a HD movie is probably only around 10GB, so a cheap 500GB hard drive should be able to hold around 50 movies, and moore's law will only improve on this.&lt;br /&gt;&lt;br /&gt;Going a step further, using the &lt;a href="http://www.mpaa.org/researchstatistics.asp"&gt;MPAA's own statistics&lt;/a&gt;, there are roughly 600 big movies released to theaters a year, not all that many. &amp;nbsp;At 10GB per movie, that's only 6TB of space required, or 500GB per month. &amp;nbsp;Lets say all of these movies were "finished" at least 1 month before release. &amp;nbsp;You could buy a 500GB drive for way less than the cost of a month of a cable subscription and by sending this back and forth to netflix, you'd have continuous on-demand access to any of the blockbusters the day that they are released and for roughly a month to follow. &amp;nbsp;The producers could simply not sell the decryption keys until the chosen release date.&lt;br /&gt;&lt;br /&gt;This is just the latency/bandwidth tradeoff of using the &lt;a href="http://en.wikipedia.org/wiki/Sneakernet"&gt;sneakernet&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-3555077052829751455?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/3555077052829751455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=3555077052829751455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3555077052829751455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/3555077052829751455'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/04/preloading-hard-drives-with-movies.html' title='Preloading Hard Drives with Movies - Sneakernet'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-997047227233421460</id><published>2010-04-08T23:50:00.000-07:00</published><updated>2010-04-08T23:54:03.157-07:00</updated><title type='text'>Rock Climbing at Red Rock</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_s5emCsFnEdE/S77DISxmSrI/AAAAAAAADQM/Uc4Tiy5o6TY/s1600/4497798435_55e8613f22_o.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S77DISxmSrI/AAAAAAAADQM/Uc4Tiy5o6TY/s400/4497798435_55e8613f22_o.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Cristin and I just returned from an action-packed rock climbing trip/tweetup at &lt;a href="http://www.desertusa.com/redrock/"&gt;Red Rock&lt;/a&gt; outside Las Vegas. &amp;nbsp;We spent 2 days climbing rocks, leaving our hotel around 8am and heading back around 5pm each day. &amp;nbsp;The original plan was to climb for 4 days, but after day 2 we were a bit worn out and took a day off, and on day 4, rain clouds rolled in at about the same time we did so we had to bail and take advantage of the local indoor climbing gym instead where we found several other disappointed red rock climbers-to-be.&lt;br /&gt;&lt;br /&gt;There were about a dozen total climbers in our crew, I met about half of them for the first time on the trip. Hello to  &lt;a href="http://twitter.com/eleddy"&gt;@eleddy&lt;/a&gt;, &lt;a href="http://twitter.com/sudarkoff"&gt;@sudarkoff&lt;/a&gt;, &lt;a href="http://twitter.com/adrienneknits"&gt;@adrienneknits&lt;/a&gt;, &lt;a href="http://twitter.com/rockgrrl"&gt;@rockgrrl&lt;/a&gt;, &lt;a href="http://twitter.com/voden"&gt;@voden&lt;/a&gt;, &lt;a href="http://twitter.com/katiebeth"&gt;@katiebeth&lt;/a&gt;, &lt;a href="http://twitter.com/tiffanymroyal"&gt;@tiffanymroyal&lt;/a&gt;, &lt;a href="http://twitter.com/joshuamontague"&gt;@joshuamontague&lt;/a&gt;, &lt;a href="http://twitter.com/chadcat"&gt;@chadcat&lt;/a&gt;, &lt;a href="http://twitter.com/jeremyshapiro/"&gt;@JeremyShapiro&lt;/a&gt;, and &lt;a href="http://twitter.com/pwcarey"&gt;@pwcarey&lt;/a&gt;, who took the above photo of me above on the 2nd day.&lt;br /&gt;&lt;br /&gt;The trip was fantastic. &amp;nbsp;I'd driven through red rock once before, but this was a different way to experience the park. &amp;nbsp;There were unmarked trails in guidebooks which once followed led to hidden cracks chock full of other climbers, it felt like "the secret world" of Red Rock. &amp;nbsp;This was only our third trip climbing outside of the gym, so it was even more of an experience for us.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_s5emCsFnEdE/S77O1TVWG7I/AAAAAAAADQo/AWXzIHFueDg/s1600/IMG_0711.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_s5emCsFnEdE/S77O1TVWG7I/AAAAAAAADQo/AWXzIHFueDg/s320/IMG_0711.jpg" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;On Day 1, we started out the morning climbing several routes at the &lt;a href="http://www.mountainproject.com/v/nevada/red_rock/second_pullout/105732027"&gt;Magic Bus&lt;/a&gt; area, which is actually one of the less red of the red rocks. &amp;nbsp;A pretty vertical flat face, a great way to warm up. &amp;nbsp;We heard some thunder in the distance, ate some lunch and as the area started to get crowded we headed on to &lt;a href="http://www.mountainproject.com/v/nevada/red_rock/second_pullout/105732030"&gt;Black Corridor&lt;/a&gt;&amp;nbsp;for the afternoon. &amp;nbsp;Black Corridor is a area with two vertical walls facing each other, like if you cut a loaf of bread in half and pulled the halves apart just a little bit. &amp;nbsp;There were a ton of people already here, but there were also a ton of different routes available. &amp;nbsp;It was a perfect afternoon spot as the two walls gave you plenty of shade when you weren't on the rock. &amp;nbsp;I tried a fun route that was giving everyone trouble, a 5.10 (in theory) with a specific move about halfway up that none of us could get past. &amp;nbsp;It required pulling up on a ledge not deep enough to get a whole finger joint onto.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_s5emCsFnEdE/S77O5_as4RI/AAAAAAAADQs/tAXBEJjRlvc/s1600/IMG_1084.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_s5emCsFnEdE/S77O5_as4RI/AAAAAAAADQs/tAXBEJjRlvc/s320/IMG_1084.jpg" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;On Day 2, we hit up &lt;a href="http://www.mountainproject.com/v/nevada/red_rock/first_pullout/105732045"&gt;Panty Wall&lt;/a&gt; in the morning whose base was a wide flat ledge above another vertical cliff, so it was a bit nerve wracking for several of us, myself included, when looking down at the drop below. &amp;nbsp;But the view of the canyon was georgeous and the routes on the wall were lots of fun. &amp;nbsp;For the afternoon, the group decided to head over to Calico Basin, on the flip side of Red Rock's best formation, but technically outside the park. &amp;nbsp;We climbed around on &lt;a href="http://www.mountainproject.com/v/nevada/red_rock/calico_basin/105732024"&gt;Cannibal Crag&lt;/a&gt;, a massive boulder with routes on both sides. &amp;nbsp;Jeremy showed me how to do a pitched route (although only 1 pitch) as well as how to lead belay, as we climbed the route "you are what you eat" with the big crack you can see in the picture to the left.&lt;br /&gt;&lt;br /&gt;There were a few people with camera's going all the time, namely Cristin and &lt;a href="http://thecareyadventures.com/blog/"&gt;Peter&lt;/a&gt;. &amp;nbsp;Lots of photos available for anyone interested. &amp;nbsp;I'm the guy usually in the blue jacket and orange helmet.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/hiddencreekphoto/sets/72157623790442996/"&gt;http://www.flickr.com/photos/hiddencreekphoto/sets/72157623790442996/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/jennifer.mccain/RedRockCanyonClimbing"&gt;http://picasaweb.google.com/jennifer.mccain/RedRockCanyonClimbing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thecareyadventures.com/blog/2010/red-rock-canyon-rock-climbing-tweetup-video/"&gt;http://thecareyadventures.com/blog/2010/red-rock-canyon-rock-climbing-tweetup-video/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Some Red Rock Photos (not climbing):&amp;nbsp;&lt;a href="http://picasaweb.google.com/jennifer.mccain/RedRockCanyonApril2010?feat=email#"&gt;http://picasaweb.google.com/jennifer.mccain/RedRockCanyonApril2010&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div&gt;After we departed Red Rock, Cristin and I took a side trip to Death Valley for 2 nights. &amp;nbsp;We did a couple fun hikes, including one through a canyon with extremely smooth marbled walls that get cut by waterfalls in the rainy months, making for some fun little rock slides. &amp;nbsp;Another hike took us to the base of a small ice melt waterfall at a higher elevation, something I never expected to find in Death Valley. &amp;nbsp;It was literally a desert oasis. &amp;nbsp;Wherever the water flowed there was tons of life, but only a few feet away it was dry desert terrain. &amp;nbsp;There are more photos of death valley here:&amp;nbsp;&lt;a href="http://picasaweb.google.com/jennifer.mccain/DeathValleyApril2010"&gt;http://picasaweb.google.com/jennifer.mccain/DeathValleyApril2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_s5emCsFnEdE/S77O-RxUnOI/AAAAAAAADQw/mgrT2w0NOZg/s1600/IMG_1212.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S77O-RxUnOI/AAAAAAAADQw/mgrT2w0NOZg/s400/IMG_1212.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-997047227233421460?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/997047227233421460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=997047227233421460' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/997047227233421460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/997047227233421460'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/04/rock-climbing-at-red-rock.html' title='Rock Climbing at Red Rock'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s5emCsFnEdE/S77DISxmSrI/AAAAAAAADQM/Uc4Tiy5o6TY/s72-c/4497798435_55e8613f22_o.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-2444813956084818501</id><published>2010-03-20T01:07:00.000-07:00</published><updated>2010-03-20T01:07:27.571-07:00</updated><title type='text'>Bay Area Weekending</title><content type='html'>I've recently found myself telling a few people about how I found out about interesting thing X or Y to do in the CA bay area. &amp;nbsp;It occurred to me that this might be a good topic for a blog post. &amp;nbsp;If you always are looking for things to do, perhaps this might give you a few ideas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.weekendsherpa.com/"&gt;Weekend Sherpa&lt;/a&gt;: Every thursday, the weekend sherpa publishes a newsletter of recommendations of outdoor trips to do in Northern California. &amp;nbsp;I find the site is amazingly well curated, much more so than even similar magazines I've perused on grocery store shelves. &amp;nbsp;For example, this post "&lt;a href="http://www.weekendsherpa.com/newsletter/winter-sequoia-national-park-snowshoe-giant-forest-cross-country-wuksachi-lodge/192"&gt;Land of the Giants&lt;/a&gt;" recently inspired me to take off to Sequoia for the weekend and try my hand at snowshoeing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bahiker.com/"&gt;Bay Area Hiker&lt;/a&gt;: The best single source of information I've found about great hikes in the bay area, primarily day hikes. &amp;nbsp;There are tons of other great websites to look at too, this one just has alot of hikes in one place. &amp;nbsp;Each hike has detailed description including photos, recommendations for time of year, and directions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nps.gov/pore/index.htm"&gt;Point Reyes&lt;/a&gt;: This is the furthest west&amp;nbsp;chunk&amp;nbsp;of coastline in the area, making it a habitat for a variety of sea wildlife that you don't see as much elsewhere. &amp;nbsp;Sea birds coming in to lay eggs, sea lions, etc. &amp;nbsp;The &lt;a href="http://gregable.com/2008/02/whale-watching-in-point-reyes.html"&gt;peak whale watching season&lt;/a&gt; is just beginning now and this is the only place I know where you can see them without getting on a boat, useful if you get seasick like I do. &amp;nbsp;It's also just an extremely pretty chunk of land. &amp;nbsp;It's probably the largest park of this sort within driving distance with so many options for things to do. &amp;nbsp;Tip: An excellent place to stop&amp;nbsp;for grub&amp;nbsp;along the drive is the Coast Cafe in Bolinas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.planetgranite.com/"&gt;Planet Granite&lt;/a&gt;: Not cheap, but if you ever wanted to try rock climbing, this may be one of the best indoor climbing gyms in the country. &amp;nbsp;I've been to about half a dozen different climbing gyms, so I can't personally compare, but I've heard from other folks that the Sunnyvale and SF gyms are really top notch. &amp;nbsp;I wouldn't recommend the Belmont location though. &amp;nbsp;This place rocks. &amp;nbsp;I get a few free guest passes if anyone wants to give it a whirl.&lt;br /&gt;&lt;br /&gt;I guess you can tell fairly easily what kinds of things I like to do on weekends. &amp;nbsp;Any other good suggestions I should be trying?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-2444813956084818501?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/2444813956084818501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=2444813956084818501' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/2444813956084818501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/2444813956084818501'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/03/bay-area-weekending.html' title='Bay Area Weekending'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-7911467644400098615</id><published>2008-11-14T03:51:00.000-08:00</published><updated>2010-03-14T17:48:31.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>PQ Tree Algorithm and Consecutive Ones Problem</title><content type='html'>In &lt;a href="http://www.cs.vt.edu/"&gt;grad school&lt;/a&gt; I ran across an cool problem and an interesting algorithm to solve it.  Your input is a grid of elements, lets say rows 1, 2, 3, 4, 5 and columns A, B, C, D, E.  In addition, you are given a set of "rectangles" which each consist of a subset of the grid's rows and a subset of the grid's columns.  Is there a way to arrange the grid by permuting it's rows and columns such that all the rectangles are present contiguously?&lt;br /&gt;&lt;br /&gt;Imagine a rectangle consisting of rows 2 and 5 and columns A, C, and D.  The grid must be arranged such that row (2, 5) are contiguous and columns (A, C, D) are contiguous.  One rectangle is trivial, multiple rectangles is a challenge.  Take a look at &lt;a href="http://www.almob.org/content/1/1/15/figure/F4" target="_blank"&gt;the figure&lt;/a&gt; which visualizes one of these grids with embedded rectangles.&lt;br /&gt;&lt;br /&gt;I realized the 2D problem decomposes into two separate 1D problems. The rows can be arranged without caring about the columns and vice versa.  Once you reduce the problem to 1D, it turns out that it is a problem known as the Consecutive Ones Problem.  If all you want to do is find an valid ordering, there is even an algorithm to solve the problem.  In my case, there was rarely a perfect ordering, so I had to extend the problem to find the &lt;span style="font-style: italic;"&gt;best&lt;/span&gt; ordering for some definition of &lt;span style="font-style: italic;"&gt;best&lt;/span&gt; (see &lt;a href="http://www.almob.org/content/1/1/15"&gt;this paper&lt;/a&gt; on the subject).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The PQ Tree Algorithm&lt;/h3&gt;&lt;br /&gt;That would be the end of the boring story, except I mentioned that there was a algorithm that solved the perfect ordering problem and it was well-studied.  It turned out that despite it being well studied, it is&amp;nbsp;poorly known and virtually unreferenced on the internet.&lt;br /&gt;&lt;br /&gt;The paper that explained it, &lt;span style="font-style: italic;"&gt;Testing for the consecutive ones property, interval graphs, and graph planarity using PQ-tree algorithms&lt;/span&gt;, came out in 1976.  The paper doesn't exist anywhere on the internet, not even for purchase.  No full description or implementation of the algorithm exists on the internet either. &amp;nbsp;None of this has changed in the 5 years since I looked into this algorithm - still barely any references on the web.  I intend to change that today.&lt;br /&gt;&lt;br /&gt;The algorithm is called the "PQ-Tree Algorithm".  I picked up a copy of the paper in book-form from my local library.  Surprisingly, the problem can be solved in linear time.  It is quite an intricate algorithm.  I think I recall spending 2 weeks doing nothing but implementing this algorithm.&lt;br /&gt;&lt;br /&gt;Lets make sure that you know what the problem is first.  I'll state it simpler than my above 2D problem:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Consecutive Ones Problem&lt;/h3&gt;Imagine that you are having a dinner party and are planning the seating arrangement.  To simplify the problem, imagine your seating as a one-dimensional ordering of your guests: Sue &amp;gt; Fred &amp;gt; Tom &amp;gt; Rudy &amp;gt; Bob &amp;gt; ...  You are trying to choose a seating arrangement that makes the most sense for your guests, and you have a number of constraints that apply to the problem.  Each constraint is represented by a subset of your guests which you want to seat together (consecutively).  So, if one constraint is that Sue, Fred, and Bob sit together, then there are certain permutations that are invalid and certain permutations that are valid:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #274e13;"&gt;Valid&lt;/span&gt;&lt;/b&gt;: Rudy &amp;gt;&amp;nbsp;&lt;b&gt;Sue &amp;gt; Fred &amp;gt; Bob&lt;/b&gt;&amp;nbsp;&amp;gt; Tom&lt;br /&gt;&lt;b&gt;&lt;span style="color: #274e13;"&gt;Valid&lt;/span&gt;&lt;/b&gt;: Tom &amp;gt; Rudy &amp;gt;&amp;nbsp;&lt;b&gt;Bob &amp;gt; Sue &amp;gt; Fred&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #660000;"&gt;Invalid&lt;/span&gt;&lt;/b&gt;: Tom &amp;gt;&amp;nbsp;&lt;b&gt;Bob&lt;/b&gt;&amp;nbsp;&amp;gt; Rudy &amp;gt;&amp;nbsp;&lt;b&gt;Fred &amp;gt; Sue&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Furthermore, there may be many of these types of constraints, so perhaps you have (Sue, Fred, Bob) as one constraint and another might be (Sue, Bob, Tom).  One possible solution would be given as:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Tom &amp;gt; &lt;b&gt;Sue &amp;gt; Bob&lt;/b&gt;&lt;/u&gt;&lt;b&gt; &amp;gt; Fred&lt;/b&gt; &amp;gt; Rudy&lt;br /&gt;&lt;br /&gt;This is the crux of consecutive ones problem, although the consecutive ones problem is formulated a little differently:  Given a binary matrix containing only ones and zeros, reorder the columns such that the ones in every row are consecutive.  The image below illustrates the point:&lt;br /&gt;&lt;br /&gt;&lt;div style="display: block; text-align: left;"&gt;&lt;div style="display: block; margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;a href="http://knol.google.com/k/-/-/2zbou4xzp3j9w/jbcs4n/consecutiveones.jpeg" imageanchor="1"&gt;&lt;img border="0" height="139" src="http://knol.google.com/k/-/-/2zbou4xzp3j9w/jbcs4n/consecutiveones.jpeg" width="420" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;The matrix (a) can be transformed to the matrix (b) be rearranging only the columns in (a).  The matrix (b) has the consecutive ones property (COP) in that the 1 values in each row are consecutive when read in order.  The consecutive ones problem is: Given a matrix (a), determine if it can be converted into a matrix (b) by rearranging columns such that (b) has the consecutive ones property, and if so represent all valid orderings of the columns. &lt;br /&gt;To see that this is the same as the guest seating problem, assign each guest to a column in matrix A.  Each row represents one of the constraints we want to apply to our seating - the columns in that row containing 1's are the guests that we want to seat together.&lt;br /&gt;Not all matrices can be transformed into a COP matrix.  Similarly, some matrices can have many possible orderings.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;My Contributions&lt;/h3&gt;I &lt;a href="https://bioinformatics.cs.vt.edu/~murali/papers/bivoc/"&gt;implemented&lt;/a&gt; this algorithm in grad school.  My implementation then was functional but not high quality, and it was embedded in a larger library.  I've spent considerable spare time here and there over the last couple months rewriting a large part of that code.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://github.com/Gregable/pq-trees/tree/master" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_s5emCsFnEdE/S52Ce8OLtrI/AAAAAAAADO4/WbFFjZBK4KI/s1600/github-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;I've created a project up at &lt;a href="http://github.com/"&gt;github&lt;/a&gt; which tracks the code: &lt;a href="http://github.com/Gregable/pq-trees/tree/master"&gt;PQ Tree Algorithm Implementation&lt;/a&gt;.The code (just a library) should be decent, bug-free, and GPL. The first internet implementation out there.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://knol.google.com/k/greg-grothaus/pq-trees-and-the-consecutive-ones/2zbou4xzp3j9w/4" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_s5emCsFnEdE/S52AJw_SgwI/AAAAAAAADO0/zPUW2MMz3dQ/s1600/knol-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;A full description of the PQ Tree algorithm can be found on knol: &lt;a href="http://knol.google.com/k/greg-grothaus/pq-trees-and-the-consecutive-ones/2zbou4xzp3j9w/4"&gt;PQ Trees and the Consecutive Ones Property&lt;/a&gt;.  I'd recommend checking out the algorithm knol even if just to get a high-level flavor of this interesting algorithm.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you stumble across this page while trying desperately to do some research for your graduate program, I hope this is useful to you.  I ask one small thing of you though.  I spent a good bit of time putting all of this together.  Drop me a comment or &lt;a href="mailto:ggrothau@gmail.com"&gt;email&lt;/a&gt; letting me know how you are using it.  That way I'll know it was worth the effort.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Birds of a Feather&lt;/h3&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.theage.com.au/articles/2004/09/09/1094530769493.html" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_s5emCsFnEdE/S52Dt5OHDOI/AAAAAAAADO8/trxKPkXvwSc/s200/google_jobs.jpg" width="176" /&gt;&lt;/a&gt;&lt;/div&gt;If you are one of the handful of people interested in PQ-Trees and advanced software algorithms like this, you are the type of person I'd like to see working with me at &lt;a href="http://www.google.com/jobs/"&gt;Google&lt;/a&gt;. &amp;nbsp;If you send me your resume (&lt;a href="mailto:ggrothau@gmail.com"&gt;ggrothau@gmail.com&lt;/a&gt;), I can make sure it gets in front of the right recruiters and watch to make sure that it doesn't get lost in the pile that we get every day.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-7911467644400098615?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/7911467644400098615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=7911467644400098615' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/7911467644400098615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/7911467644400098615'/><link rel='alternate' type='text/html' href='http://gregable.com/2008/11/pq-tree-algorithm-and-consecutive-ones.html' title='PQ Tree Algorithm and Consecutive Ones Problem'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s5emCsFnEdE/S52Ce8OLtrI/AAAAAAAADO4/WbFFjZBK4KI/s72-c/github-logo.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-2071946211144950596</id><published>2008-11-11T09:28:00.000-08:00</published><updated>2010-03-05T09:45:07.315-08:00</updated><title type='text'>Feed Reader Recommendations: Boston Big Picture</title><content type='html'>I don't normally recommend blogs for people to check out or subscribe to.  When scanning my own feed reader, most of the blogs I subscribe to are not really fit for a general audience.  That said, there is one blog that I ran across that seems to be a relatively little known gem and probably matches a wide audience of interests.  That blog is the &lt;a href="http://www.boston.com/bigpicture/"&gt;Boston Globe's Big Picture&lt;/a&gt; Blog.  Every few days they post a series of photographs on one particular "story".  These are always global public interest stories, not local boston news or anything.  The thing that sets it apart is the fantastic photography like this one from yesterday's post about Antartica:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.boston.com/bigpicture/2008/11/scenes_from_antarctica.html"&gt;&lt;img src="http://cache.boston.com/universal/site_graphics/blogs/bigpicture/antarctica_11_10/a31.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-2071946211144950596?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/2071946211144950596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=2071946211144950596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/2071946211144950596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/2071946211144950596'/><link rel='alternate' type='text/html' href='http://gregable.com/2008/11/feed-reader-recommendations.html' title='Feed Reader Recommendations: Boston Big Picture'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-6757724263311008697</id><published>2010-02-15T16:21:00.000-08:00</published><updated>2010-03-05T09:43:08.125-08:00</updated><title type='text'>My take on Buzz</title><content type='html'>&lt;div&gt;&lt;div&gt;Imagine that to read this blog, you had to first sign into your Blogger account. And that to read a Wikipedia article, you first had to sign into your Wikipedia account. And, when you want to read your email from your AOL friends, you have to first sign into your AOL account, but to read your email from GMail friends required first signing into your GMail account. And imagine this was the case everywhere. You could even take this further and imagine that to read CNN, you first had to load the CNN browser.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To various degrees this is the current state of microblogging services (or whatever you call them). I can't read my friend's Facebook updates in google reader. I can't read the &lt;a href="http://gregable.com/2008/11/feed-reader-recommendations.html"&gt;Boston Big Picture&lt;/a&gt; in Twitter.  Even if my friends wire up their accounts so that their tweets end up in Facebook, my Facebook replies don't appear in their Twitter stream. It's a big bucket of suckage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a user, I don't care about &lt;i&gt;how&lt;/i&gt; the electricity gets to my house, but I really really care that all my appliances can use that electricity, not just the ones that PG&amp;amp;E made. So I care that someone else cares about the &lt;i&gt;how&lt;/i&gt; and standardizes this. As a publisher, I want to be able to pick my publishing platforms - maybe more than just one (Flickr+Twitter+Blogger) - based on how well their features meet my style. I don't want to have to choose my platform based on where my readers might be. As a reader, I want to pick my reader application(s), like Google Reader, Bloglines, or Facebook, but only have to pick one or maybe two and to pick them based on features and usefulness to me, not based on where the people I'm interested in reading publish their content.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;Switch gears.  Google Buzz launched last week.  We've been trialling it internally at Google for some time now, but I had pretty much tuned it out.  It was just one more social network with mostly inconsequential status updates of which I was overwhelmed with already.  Now though, I realize that I had duped myself.  Buzz is not necessarily just another walled garden (although, there is still that risk).&lt;br /&gt;&lt;br /&gt;Time out.  I am an employee of Google.  I don't work on Buzz, heck I have less to do with it at the time of writing this than most Google employees having largely ignored it for so long.  The opinions in this post, as well as elsewhere in this blog, are my own and not those of my employer.  Seriously.  Nuff Said.&lt;br /&gt;&lt;br /&gt;Buzz &lt;b&gt;could &lt;/b&gt;be a move to a more open standard for microblogging.  This ReadWriteWeb article on how &lt;a href="http://www.readwriteweb.com/archives/how_google_buzz_is_disruptive_open_data_standards.php"&gt;Buzz's API supports Open Data Standards&lt;/a&gt; says it better than I.  I spent some time in the last few days reading up on &lt;a href="http://www.scripting.com/stories/2009/07/10/googlesPubsubhubbub.html"&gt;PubSubHubBub&lt;/a&gt;, &lt;a href="http://www.readwriteweb.com/archives/salmon_protocol_for_distributed_aggregated_content.php"&gt;Salmon&lt;/a&gt;, &lt;a href="http://groups.google.com/group/webfinger/browse_thread/thread/fb56537a0ed36964"&gt;WebFinger&lt;/a&gt;, etc.  I'm no expert, but it's exciting.  Whether Buzz succeeds or not matters little to me, but if this kind of open social networking standard takes off, I think we're all going to be a little bit saner in managing our digital lives.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-6757724263311008697?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/6757724263311008697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=6757724263311008697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6757724263311008697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6757724263311008697'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/02/my-take-on-buzz.html' title='My take on Buzz'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-549778327169236475</id><published>2010-02-26T13:12:00.000-08:00</published><updated>2010-02-26T13:12:43.842-08:00</updated><title type='text'>Battery Voltage Regulation Prediction Software</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_s5emCsFnEdE/S4g3BibYyxI/AAAAAAAADOQ/sKEg_Romsn0/s1600-h/li-ion.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_s5emCsFnEdE/S4g3BibYyxI/AAAAAAAADOQ/sKEg_Romsn0/s200/li-ion.jpg" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It's rare that I can talk about green energy and software issues in one post. &amp;nbsp;Here's some software that someone needs to write. &lt;br /&gt;&lt;br /&gt;Over at "This week in batteries", Venkat Srinivasan explains the&amp;nbsp;&lt;a href="http://thisweekinbatteries.blogspot.com/2010/02/pull-plug-your-battery-will-thank-you.html"&gt;tradeoffs in modern battery charging&lt;/a&gt;. &amp;nbsp;Essentially, the problem is that the higher voltage you charge a battery to, the bigger capacity it has in terms of discharging. &amp;nbsp;However, higher voltages at the same time reduce the lifespan of the battery so that the next charge will have a little less capacity. &amp;nbsp;Virtually all battery chargers choose a fixed voltage to charge up to and then stop charging, and this chosen voltage is a number that gives a good balance between capacity and lifespan, but doesn't really maximize either. &amp;nbsp;From the article:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Operating to 4.1V makes things better and extends the life, 4.0 V is even better and so on. So why don’t battery manufacturers cut the voltage off at, say, 4 V to get better battery life? Because every time you cut this voltage down you decrease the capacity of the battery and its run time. The 4.2V cutoff is a compromise between good run time and decent (read “not pathetic”) life.&lt;/span&gt;&lt;/blockquote&gt;Venkat goes on to suggest that this means you should charge your devices up to the maximum limit and then unplug them, so that they slowly drop a little below the max, to extend lifetime. &amp;nbsp;He also mentions that Lenovo laptops even let you set the charge (as a percentage, not a voltage) if you want to play with these settings yourself.&lt;br /&gt;&lt;br /&gt;This is a problem not just for laptops, but also for cell phones, plug-in cars, or any device that uses a battery. &amp;nbsp;I'm certainly not a battery expert, but it seems to me that there is a better solution out there. &lt;br /&gt;&lt;br /&gt;Most devices using an expensive battery have some amount of processing power and some amount of long-term memory (flash drive, hard drive, etc). &amp;nbsp;Laptop, Cell Phone, and Vehicles certainly fall in to this category. &amp;nbsp;If the device was able to predict roughly how long it would be used before the next recharge, then it would be able to charge to the lowest voltage required to stay alive until the next recharge. &lt;br /&gt;&lt;br /&gt;Humans are creatures of habit, we often keep roughly the same schedule from day to day or week to week. &amp;nbsp;If the device kept a history of these habits, it should be able to predict usage. &amp;nbsp;For example, storing data like:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Plug in timestamp&lt;/li&gt;&lt;li&gt;Unplug timestamp&lt;/li&gt;&lt;li&gt;Running out of juice timestamp&lt;/li&gt;&lt;li&gt;Day of week, time of day&lt;/li&gt;&lt;li&gt;which user is logged in, or how much they weigh on the driver seat sensor&lt;/li&gt;&lt;li&gt;ip address the device is allocated to (or nearby wireless APs)&lt;/li&gt;&lt;li&gt;GPS location&lt;/li&gt;&lt;li&gt;applications that were run&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Using a little bit of simple machine learning, the software could predict how much capacity is needed for the next unplug and chage accordingly. &amp;nbsp;Thus if the laptop is always plugged in at a desk except on the weekend, a low voltage charge could be maintained and then ramped up all the way saturday morning. &amp;nbsp;Or if the car is used for short trips to/from work, but on Friday night is driven to the next city for happy hour with friends, you can keep the voltage high for happy hour and low for the commute. &amp;nbsp;If the device sees a completely new scenario (suddenly turned on in Japan at 3am on a different network), then it might switch temporarily to a high voltage/capacity until enough data comes in to know what to expect in this new scenario.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This approach would maximize both battery life and capacity while keeping the user blissfully unaware.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-549778327169236475?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/549778327169236475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=549778327169236475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/549778327169236475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/549778327169236475'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/02/battery-voltage-regulation-prediction.html' title='Battery Voltage Regulation Prediction Software'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s5emCsFnEdE/S4g3BibYyxI/AAAAAAAADOQ/sKEg_Romsn0/s72-c/li-ion.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-220508464542964280</id><published>2008-01-22T22:05:00.000-08:00</published><updated>2010-02-17T22:25:22.271-08:00</updated><title type='text'>Grid Alternatives - The solar version of Habitat for Humanity</title><content type='html'>Last week I attended a training session for a group known as &lt;a href="http://www.gridalternatives.org/"&gt;Grid Alternatives&lt;/a&gt;.  What they do, basically, is to get volunteers and donations to install solar panels on homes of low income families in the bay area.  &lt;br /&gt;&lt;br /&gt;All the labor is free (volunteers) and the panels are heavily discounted in CA due to various federal, state, and city rebates offered.  They claim for every $1 donated they are able to achieve nearly $3 in construction value.  If I read that correctly, their cost for constructing a solar install is 1/3 a commercial install, due to the rebates and free labor.  They are also &lt;b&gt;actually achieving this&lt;/b&gt;, claiming to have installed 70 homes worth of panels in the last year alone.  &lt;br /&gt;&lt;br /&gt;The training I went to was about 2.5 hours, required no advanced knowledge, and while I don't feel like I could go install a set of panels tomorrow, I do feel like I learned a bit about the process and am comfortable enough to want to volunteer some weekend in the future.  It sounds like their bottleneck is not labor or leadership, but rather money to buy raw materials.  As a person who wishes to put some panels on my home but is unable to because I live in an apartment, I am going to be donating some of my normal donations to these guys this year instead of some of the alternatives.  I like charities like this which are local, make visible, real, understandable changes, and of course it hits upon two of my favorite causes: green power(climate change) and poverty.  If you live in the bay area or even if not, I would highly recommend checking them out.  Well worth a look.  Also definitely get on their one-mailing-per-month mailing list and/or donate a few bucks.  &lt;a href="http://www.gridalternatives.org/"&gt;www.GridAlternatives.Org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update: Feb 17, 2010:&lt;br /&gt;&lt;br /&gt;I asked some questions recently to the team at Grid Alternatives about their financials. &amp;nbsp;Non-profits have to file a tax form, Form 990, every year detailing how they spend their money. &amp;nbsp;Anyone can read these on &lt;a href="http://guidestar.org/"&gt;guidestar.org&lt;/a&gt;, so you can verify much of this stuff yourself. &amp;nbsp;In 2010, they plan on installing 338 solar projects, with an average cost per project of only $7,890. &amp;nbsp;This is after government rebates and includes overhead. &amp;nbsp;Obviously some of the projects are bigger and some are smaller, but the average install is around 2.25 kW. &amp;nbsp; &amp;nbsp;This translates to $22,614 of energy bills saved over the life of the install, a roughly 3x return on the investment, not to mention the additional 90 tons of CO2 not put into the atmosphere (depending on grid mix). &amp;nbsp;Even ignoring the environmental aspect, the economics work out surprisingly well. &amp;nbsp;Thanks to Zach Franklin for the detailed numbers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-220508464542964280?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/220508464542964280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=220508464542964280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/220508464542964280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/220508464542964280'/><link rel='alternate' type='text/html' href='http://gregable.com/2008/01/grid-alternatives-solar-version-of.html' title='Grid Alternatives - The solar version of Habitat for Humanity'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-6936511133116725044</id><published>2010-02-05T11:10:00.000-08:00</published><updated>2010-02-05T11:21:34.500-08:00</updated><title type='text'>Swoopo and stable equilibriums</title><content type='html'>If you've never heard of swoopo.com, it's an "auction" site that allows you to bid on items in 1c increments. Usually the items sell for much much less than they are worth. &amp;nbsp;For example, this&amp;nbsp;&lt;a href="http://www.swoopo.com/auction/177136.html"&gt;1oz gold bar&lt;/a&gt; (worth around $1,400) sold for $216.98. &amp;nbsp;The trick is that you can only bid exactly 1c more than the last bid and simply making a bid costs you $0.60. &amp;nbsp;So, 21,698 bids were made on that gold bar by various people which cost them over $13,018 in total. &amp;nbsp;The winner spent almost $700 in bids themselves. &amp;nbsp;Most people who play this game are losing lots of money.&lt;br /&gt;&lt;br /&gt;A similar (simpler) game is described as an auction for a $20 bill. &amp;nbsp;The rule is that you pay your most recent bid, regardless of whether or not you win. &amp;nbsp;You can argue that it always makes sense for you to bid. &amp;nbsp;Initially, you are bidding $1 for a $20 bill, how awesome is that? &amp;nbsp;However your opponent in the auction can now bid $2 for a $20 bill, which he will definitely do - why wouldn't he? &amp;nbsp;At some point you have bid $19 for this bill, but your opponent recently just bid $18. &amp;nbsp;If he doesn't bid $20, he loses $18 - if he does bid $20 and wins, he comes out even. &amp;nbsp;So bidding $20 seems like the right choice. &amp;nbsp;Unfortunately now you lose $19 bid lost if you don't bid and you lose only $1 if you do bid (bid = $21, but you win $20). &amp;nbsp;So it makes sense for you to actually bid $21 for a $20 bill. &amp;nbsp;This continues forever with the risk that both participants bid hundreds of dollars for this $20 bill.&lt;br /&gt;&lt;br /&gt;I was having a lunch conversation with some folks the other day who argued that the best choice at any turn is to always bid, but that this is a paradox because you will lose your shirt playing this game. &amp;nbsp;I think the paradox is easily resolved. &amp;nbsp;The thing that causes the paradox is the assumption that the best decision is to always bid, which seems on the surface to be the right strategy but in fact is not. &amp;nbsp;If you assume this is the right strategy, this game has no &lt;a href="http://en.wikipedia.org/wiki/Nash_equilibrium"&gt;stable nash equilibrium&lt;/a&gt;, but I claim that the game does in fact have such an equilibrium strategy.&lt;br /&gt;&lt;br /&gt;Imagine your opponent in this game (simplification - the game is a 2 player version of the $20 auction) is one instance of a set of players in the universe of possible players. &amp;nbsp;As such a player, there is a distribution of points in the auction where that player will stop bidding. &amp;nbsp;The number of players that will make it to $1 is high, say 99%, the number of players that make it past $20 is probably somewhat low, and the number of players that make it to $1 million is probably nearly zero. &amp;nbsp;As a result, you can evaluate at each point in the game what is the expected number of additional bids that you will have to make to gain the $20 bill. &amp;nbsp;If this is greater than 10 bids (an increase of $20 in your bidding), then you should not bid. &amp;nbsp;If it is less, then you should bid. &amp;nbsp;Depending on the distribution, you may choose not to even play the game or you may likely choose to play up to a few dollars or so because some reasonable fraction of other players give up early. &amp;nbsp;If you played enough such games, you would expect to come out non-negative however on some individual games you would expect to lose money. &amp;nbsp;My guess is that the real distribution for a $20 auction in the world of opponents would be such that not bidding at all makes sense, but if you make it a $1 million auction, then I would guess that due to finite budgets of your average opponent, it would make sense to bid up to some reasonable number and give up.&lt;br /&gt;&lt;br /&gt;Interestingly, there are some distributions that would suggest you should never stop bidding. &amp;nbsp;For example if the probability that your opponent continues to bid decreases by 50% every time, then at any point in the game, you would expect to have to bid only 2 more times, meaning you should always keep bidding. &amp;nbsp;However, this is fine as long as your estimate of the distribution is correct because the odds of your opponent bidding 10 more times are tiny (1 in 1024). &amp;nbsp;So you are essentially betting on a fair coin toss repeatedly with a 1:10 payoff.&lt;br /&gt;&lt;br /&gt;I have no idea what the distributions are for swoopo auctions. &amp;nbsp;If someone has the dataset, it would be interesting to analyze it and figure out the optimal strategy and see if it ever makes sense to bid (maybe it does in some cases).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-6936511133116725044?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/6936511133116725044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=6936511133116725044' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6936511133116725044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/6936511133116725044'/><link rel='alternate' type='text/html' href='http://gregable.com/2010/02/swoopo-and-stable-equilibriums.html' title='Swoopo and stable equilibriums'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-8631955983186193112</id><published>2009-12-15T20:09:00.000-08:00</published><updated>2009-12-15T20:09:12.575-08:00</updated><title type='text'>rel=canonical part two</title><content type='html'>Google today officially announced support for &lt;a href="http://googlewebmastercentral.blogspot.com/2009/12/handling-legitimate-cross-domain.html"&gt;cross-domain rel=canonicals&lt;/a&gt;. &amp;nbsp;This is a very important step. &amp;nbsp;I talked about &lt;a href="http://gregable.com/2009/02/relcanonical.html"&gt;rel=canonical&lt;/a&gt; when we announced it 10 months ago. &amp;nbsp;This tweak will be very useful in a variety of cases. &amp;nbsp;A few interesting ones:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Any place where you want to move your site to a new domain but can't control server headers. &amp;nbsp;This can be really useful to help &lt;a href="http://googlewebmastercentral.blogspot.com/2009/09/recommendations-for-webmaster-friendly.html"&gt;avoid lock in on free hosts&lt;/a&gt; for example.&lt;/li&gt;&lt;li&gt;Companies that register several domain names as landing pages for offline advertising, a practice often used for tracking performance of the campaign, can now keep users on the original domain but keep spiders going to the right place so Google doesn't end up with 10 copies of the site.&lt;/li&gt;&lt;li&gt;Syndicating content - if your syndication partner agrees - you can now make sure that your "link juice" flows back to the original article in Google.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I think we'll see lots of creative uses of this tweak in the future as we've seen with the original rel=canonical. &amp;nbsp;Let's just hope those creative talents are used for the power of good.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-8631955983186193112?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/8631955983186193112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=8631955983186193112' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/8631955983186193112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/8631955983186193112'/><link rel='alternate' type='text/html' href='http://gregable.com/2009/12/relcanonical-part-two.html' title='rel=canonical part two'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-8599784463557719135</id><published>2009-12-08T15:00:00.000-08:00</published><updated>2009-12-08T15:00:36.858-08:00</updated><title type='text'>Favorite Google Doodle: A fun chrome extension</title><content type='html'>Google &lt;a href="http://googleblog.blogspot.com/2009/12/google-chrome-for-holidays-mac-linux.html"&gt;announced extensions&lt;/a&gt; for Chrome Web Browser today, a much awaited feature for many.  Go try out a few.  If you are looking for recommendations, one quirky fun little extension that I would recommend is the &lt;a href="http://bit.ly/8jxx1K"&gt;Favorite Google Doodle Extension&lt;/a&gt;.  It lets you select your favorite Google Doodle logo from Google's doodling history and set it as the logo for your Google search page whenever Google isn't running a special logo for that day:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://bit.ly/8jxx1K" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/_s5emCsFnEdE/Sx7XlMbkfjI/AAAAAAAADKg/VWfMQ9Nn0oQ/s320/dna.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, today isn't the best day since Google is actually running a special logo today celebrating the cartoonist E.C. Sagar, the man behind Popeye the Sailor. &amp;nbsp;However, if you &lt;a href="http://bit.ly/8jxx1K"&gt;install&lt;/a&gt; and &lt;a href="http://www.google.com/logos/"&gt;choose a logo&lt;/a&gt;&amp;nbsp;today, you'll see it on the search results page, and likely tomorrow (depending on whether or not there is a special logo running then too). &amp;nbsp;I've set might to be this &lt;a href="http://www.google.com/logos/scientific08.gif"&gt;fancy scientific logo&lt;/a&gt; for now. &amp;nbsp;I found some other of my favorites too:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.google.com/logos/tesla09.gif"&gt;July 10, 2009&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/logos/lhc.gif"&gt;Sep 10, 2008&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/logos/edvard_munch.gif"&gt;Dec 12, 2006&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/logos/edvard_munch.gif"&gt;&lt;/a&gt;&lt;a href="http://www.google.com/logos/braille.gif"&gt;Jan 4, 2006&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/logos/braille.gif"&gt;&lt;/a&gt;&lt;a href="http://www.google.com/logos/xprize.gif"&gt;Oct 4, 2004&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/logos/xprize.gif"&gt;&lt;/a&gt;&lt;a href="http://www.google.com/logos/julia.gif"&gt;Feb 3, 2004&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I will admit that I'm undeniably biased as a &lt;a href="http://tiffography.com/"&gt;friend of mine&lt;/a&gt; actually wrote this extension. &amp;nbsp;If you like it, don't forget to rate it too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-8599784463557719135?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/8599784463557719135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=8599784463557719135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/8599784463557719135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/8599784463557719135'/><link rel='alternate' type='text/html' href='http://gregable.com/2009/12/favorite-google-doodle-fun-chrome.html' title='Favorite Google Doodle: A fun chrome extension'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_s5emCsFnEdE/Sx7XlMbkfjI/AAAAAAAADKg/VWfMQ9Nn0oQ/s72-c/dna.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-4822854853844025631</id><published>2008-03-03T00:11:00.000-08:00</published><updated>2009-10-22T00:04:19.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>Life is NP-Hard</title><content type='html'>&lt;span style="font-size:100%;"&gt;I think that this is going to be one of my more interesting blog posts.  It is philosophical in nature though and a bit long, so maybe it's boring, I don't know.  Let me know in the comments if you like it or hate it.  &lt;span style="color:#0000ff;"&gt;&lt;span style="color:#000000;"&gt;Lets get to it shall we?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NP-Hard Problems&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In Software there is a set of Problems called NP-Hard problems.  I think my audience would run screaming if I explained this in technical detail (either they already know it and would be bored or would find it boring in general).  I'll give two examples though:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Subset Sum: Given a list of N integers, determine whether or not any non-empty subset of these integers sums up to zero (or any other number).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Traveling Salesman: Given a map of the world and a list of N cities find the shortest path for a traveling salesman to visit all of these cities.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;The story as I understand it (and I may have this off) was that there were a bunch of really smart algorithms folks working on problems like these two over at Bell Labs(?) back in "the day".  They were trying to find algorithms for solving these problems.  The problem is that the only algorithms they could come up with took exponential time to solve as N grew.  So, if they could solve the traveling salesman problem with 3 cities in 1 second, it might take 2 seconds to solve with 4 cities, 4 seconds to solve with 5 cities, 8 seconds with 6 citites and so on.  By the time you hit 30 cities it takes you over 4 years to solve the problem.  Well before you hit 1,000 cities no computer known to man can solve the problem before the sun explodes. &lt;br /&gt;&lt;br /&gt;Thats a problem.  It's also embarrasing if it is your problem and you can't solve it.  Some folks tried the reverse approach.  After getting tired of trying to find a faster solution, they tried to prove that there was no faster solution.  This is a common approach for this kind of problem, it is good to know that you aren't stupid and you can prove it.  Unfortunately they couldn't prove that there wasn't a faster solution either. &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;div id="g0n_" style="padding: 1em 0pt; text-align: left;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;So, all of these smart folks started talking to each other.  Someone then figured out that their problem was actually equivalent to someone else's - that is if you could solve one you could solve the other.  They started asking around and determined that there were many of these problems and that in fact they were all working on the exact same problem, described in different ways.  For example, the two problems I stated above, the Subset Sum problem and the Traveling Salesman problem, are the same exact problem.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Life is NP-Hard&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;Other than being mathematically the same problem, I see that most NP-Hard problems have some common characterstics:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;There are partial solution, such as &lt;i&gt;&lt;u&gt;a&lt;/u&gt;&lt;/i&gt;  path between all of the citites which may not be &lt;i&gt;&lt;u&gt;the&lt;/u&gt;&lt;/i&gt; path.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;If you have two partial solutions, you can somewhat easily compare them and determine which one is better.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Many things in life have similar properties:  If I look back at my life 1 year ago I can evaluate several things about my life now and my life then and directly compare them.  Wealth is one thing, happiness (to a point) is another that I can do this with.  The only problem is that I can't evaluate what the best possible state could have been today - what would have happened if I did X in the last year instead of the Y that I did.  So, in a sense it is NP-Hard because the number of possible combinations of things in my life make it impossible for me to predict which combination will be the best, but I am somewhat (not completely) able to predict the outcome of a few different options.  If I choose to go spend $100k on a new car, I have a good idea of how much that choice will affect my financially and a good idea of how much it will affect me in happiness.  I don't know exactly, but I have a good idea (hence I don't buy said overpriced car).&lt;br /&gt;&lt;br /&gt;Another example is the economy.  I am not making a political statement, although it might sound a little like that right now.  An economy is a state that can be directly evaluated and compared (the GDP of is $X today and $Y tomorrow), but the complexity of the state that made the economy the way it is makes it impossible to guarantee that it couldn't have been better (or worse).  However, one can with some reasonable accuracy make some predictions about the path.  For example, one might predict that lowering the Federal Interest rate will improve the economy and if that person was an expert, they could have high confidence in the effect of the choice.&lt;br /&gt;&lt;br /&gt;OK, so I can't prove that the economy is mathematically equivalent to the traveling salesmen problem.  I can't even prove that the sum subset problem is equivalent to traveling salesman.  Still, I have a suspicion that they are equivalent or at least close&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;div id="g0n_" style="padding: 1em 0pt; text-align: left;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Solving NP-Hard Problems in Polynomial Time&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;Back to Software for a moment.  It turns out that there is a common strategy for solving these NP-Hard problems.  The strategy doesn't guarantee that you will find the best anwer, or even that you will find a good answer.  But it guarantees to try and in practice usually it works very well.  The strategy has a few different names, but a common name that is pretty layperson descriptive is "&lt;a title="hill climbing" href="http://en.wikipedia.org/wiki/Hill_climbing" id="uh-5"&gt;hill climbing&lt;/a&gt;".  I'm going to steal some of the graphics from that wikipedia article and modify them, because I'm lazy and drawing 3d objects by mouse is kinda hard, so I'd better reference wikipedia.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;img style="margin: 1em 0pt 0pt 1em; width: 395px; height: 165px; float: right;" src="http://docs.google.com/File?id=ajfvpvpb6nc2_25f3fz9t5p" /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Here is my best attempt at a non-technical explanation of hill climbing.  Its actually pretty easy, so don't run away.  Imagine you have one goal in life: namely to get as high &lt;/span&gt;&lt;span style="font-size:100%;"&gt; (altitude not narcotic) &lt;/span&gt;&lt;span style="font-size:100%;"&gt;as possible.  Flying is out and to make things hard you are blind.  But you do have a perfect GPS device that you can press a button on and it will tell you the &lt;/span&gt;&lt;span style="font-size:100%;"&gt;exact height of the point you are standing on now.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;How would you try to get high?  The simplest answer is hill climbing.  Imagine that this image on the right (image here) is your world.  You start out somewhere on this world.  You take a step in any direction and see if you have gotten higher or not.  If not, you step back and try a new direction.  If so, you repeat the process.  So, with every step you get progressively a little bit higher.  If this image is your world, you would eventually get to the top, and it wouldn't take all that long either.  That is hill climbing, and it solves NP-Hard Problems in Polynomial time.  With travelling salesman, for another example, you would start with a random path through all cities, then try swapping the order of two cities in your original path.  If the change gives you a shorter path, keep it, otherwise reverse it and try something else.  It works pretty well.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;img style="margin: 1em 1em 0pt 0pt; width: 399px; height: 203px; float: left;" src="http://docs.google.com/File?id=ajfvpvpb6nc2_27dd4tskgg" /&gt;&lt;span style="font-size:100%;"&gt;The problem with hill climbing is that it doesn't always work perfectly.  Imagine if instead our blind friend lived in the world on the left.  There are two hills here, one being higher than the other.  If our blind friend were to start climbing the left hill, he may very well get to the top of it, declare himself the highest man in the world since he can't climb any further, and he might be very wrong.  How sad.  This phenomenon in hill climbing is called "local maxima".&lt;br /&gt;&lt;br /&gt;These "hills" are present in any problem.  The height of the hill is it's utility: time to travel to all cities, wealth, etc.  The x, y location are the parameters required to achieve that utility, although it is often far more than 2 dimensions that are at play.&lt;br /&gt;&lt;br /&gt;The reason it works is that things are rarely completely random.  Most of the time small changes in a situation have small effects on your utility function and large changes have large affects.  Whether I choose to eat an apple or a banana has little affect on my happiness, but whether I choose to eat ice cream every day for the next month or excercise every day for the next month could have a large affect.  The problem with large changes is that the larger they are, the less I can tell in advance what the outcome will be (remember, I'm blind on this hill).  The ice cream tonight is stepping uphill - I know it will make me happier right now.  Excercise is stepping downhill - I know it will cause pain and make me less happy right now, but it might be stepping downhill for the sake of eventually stepping up onto a much higher hill.  On the other hand, it might not be because the downhill part is so long that I'll give up and walk back up my shorter hill by eating ice cream again.&lt;br /&gt;&lt;br /&gt;Economics are another interesting example.  A free economy, Adam Smith's laws of supply and demand, are a great way to allow hill climbing to work.  If there is more demand for bread than apples, the price of bread increases until farmers decide to plant more wheat and less apples to increase their farm's revenue.  The system prevents itself from going overboard - if the farmer produces too much wheat, it will suddenly become more valuable for him to produce more apples.  Eventually the hill will be climbed when the perfect balance between apples and wheat is reached - and nobody needs to know what that balance is in advance (the "invisible hand" of economics).  The problem with this is that there are local maxima at play in an economy.  What if instead of growing wheat, the farmer could start researching a new apple that tasted twice as good.  For many years, the farmer may be losing money (walking downhill) on this research until that better apple began to materialize.  The longer the downhill stint, the harder it will be to get to a new hill.  What if there exists a cheap way of producing limitless clean energy without coal or oil, but it takes billions of dollars of research money and a decade of research to discover it.  Adam Smith would be hard pressed to get us there.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Self Help&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;So, now I'm given a mathematical basis for self-help material, yay.  Climb Hills, but occassionally look for new ones.  Makes alot of sense, but I find it comforting and useful to think of the world in this way.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PS: If you know the difference between NP-Hard and NP-Complete and caught me mixing them somewhere in there, don't complain in the comments, send me your resume, Google is interested.  My rot13'ed email address is ttebgunh@tznvy.pbz .&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit (10/21/2009):&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;An astute reader pointed out that I did indeed confuse NP-hard and NP-complete, and actually abused the whole notion altogether.  Technically, the TSP problem is I stated is not a classical example, not exactly.  Classically, NP-hard/complete problems are those with binary decisions as output.  So, we aren't usually finding the shortest traveling path, we are answering the question of if the shortest path is less than distance X.  That said, if you could tell me what the shortest path is, I could trivially tell you if it is less than X.&lt;br /&gt;&lt;br /&gt;The class of problems that can be reduced into different versions of each other are NP-complete, whereas NP-hard simply means that it is at least as hard as NP-complete.  This produces a small problem with respect to the blog post.  I really wanted to talk about problems that could be transformed into each other, and problems where you want to optimize, not just determine if an optimization was possible.  The first is NP-Complete, but "Life is NP-Complete" just lacks the same ring as "Life is NP-hard".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-4822854853844025631?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/4822854853844025631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=4822854853844025631' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/4822854853844025631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/4822854853844025631'/><link rel='alternate' type='text/html' href='http://gregable.com/2008/03/i-think-that-this-is-going-to-be-one-of.html' title='Life is NP-Hard'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35584545.post-7623466708999390667</id><published>2009-10-06T17:26:00.000-07:00</published><updated>2009-10-09T12:37:43.003-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>Simple Simhashing</title><content type='html'>A friend and coworker of mine, &lt;a href="http://moultano.blogspot.com/"&gt;Ryan Moulton&lt;/a&gt;, just wrote a very nifty knol called "&lt;a href="http://knol.google.com/k/ryan-moulton/simple-simhashing/3kbzhsxyg4467/6#"&gt;Simple Simhashing&lt;/a&gt;".  If you like software algorithms, it is most certainly worth a read.  Simple simhashing is an algorithm that allows you to take any "thing" and come up with a simhash that should be the same for two "things" in probability relative to how similar those to "things" are.  The really nifty part is that the algorithm is completely local and the properties are provable in an easy to understand way.  This algorithm is &lt;i&gt;actually used&lt;span class="Apple-style-span" style="font-style: normal;"&gt; at Google in a few places, although I'll leave it to you to guess how.&lt;/span&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35584545-7623466708999390667?l=gregable.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gregable.com/feeds/7623466708999390667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=35584545&amp;postID=7623466708999390667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/7623466708999390667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35584545/posts/default/7623466708999390667'/><link rel='alternate' type='text/html' href='http://gregable.com/2009/10/simple-simhashing.html' title='Simple Simhashing'/><author><name>Greg</name><uri>http://www.blogger.com/profile/06692328337754346540</uri><email>ggrothau@gmail.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00622441034791347446'/></author><thr:total>0</thr:total></entry></feed>