<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><id>http://www.tomstocky.com/</id><title type="text">Tom Stocky's blog</title><updated>2010-05-23T22:24:47.939876-07:00</updated><link rel="self" href="http://www.tomstocky.com/atom.xml" title="Tom Stocky's blog" type="application/atom+xml" /><link rel="alternate" href="http://www.tomstocky.com/" title="Tom Stocky's homepage" type="text/html" /><author><name>Tom Stocky</name><email>tom@tomstocky.com</email><uri>http://www.tomstocky.com</uri></author><entry><id>http://www.tomstocky.com/blog/two-random-thoughts</id><published>2010-05-23T22:24:47.939845-07:00</published><updated>2010-05-23T22:24:47.939876-07:00</updated><title>Two random thoughts</title><link href="http://www.tomstocky.com/blog/two-random-thoughts" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
Two random thoughts occurred to me today, random thoughts that are too large for a tweet, but far too unsubstantial for a blog post.  Under normal circumstances.  But it&#39;s been over a year since my last post, so these thoughts can also serve to breathe a bit of life back into this site.
&lt;/p&gt;
&lt;p&gt;
Random thought #1:
&lt;/p&gt;
&lt;p style=&quot;margin-left: 1em;&quot;&gt;
Someone needs to come up with better names for &lt;a href=&quot;http://www.nlm.nih.gov/medlineplus/ency/article/003168.htm&quot;&gt;claw foot&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Hammer_toe&quot;&gt;hammer toe&lt;/a&gt;.  I bought new running shoes today and overheard the sales person warning another customer about the impending doom that would befall her foot. Her face literally dropped when she was told continuing to wear heels would turn her foot into a claw.  Side note, someone should come up with a better name for &lt;a href=&quot;http://en.wikipedia.org/wiki/Rhinoplasty&quot;&gt;rhinoplasty&lt;/a&gt; as well -- I mean, these guys are already self-conscious, do you really need to compare their noses to a rhino&#39;s?
&lt;/p&gt;
&lt;p&gt;
Random thought #2:
&lt;/p&gt;
&lt;p style=&quot;margin-left: 1em;&quot;&gt;
It must be weird sometimes to be a dog owner.  I was in an elevator today and watched multiple people come in and out, greeting the dog that was there, making faces at the dog, talking to the dog, ... all without looking at or even acknowledging the existence of the owner.  That&#39;s gotta get to you after awhile, that your dog might be more approachable and likable than you are.
&lt;/p&gt;</div></content></entry><entry><id>http://www.tomstocky.com/blog/igoogle-theme-how-to</id><published>2009-07-12T13:24:33.265192-07:00</published><updated>2009-07-12T13:24:33.265213-07:00</updated><title>How to create an iGoogle theme</title><link href="http://www.tomstocky.com/blog/igoogle-theme-how-to" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
It&#39;s been awhile since I&#39;ve posted, but I have good excuses!  In the last 3 months I got married, went on my honeymoon, and then moved to Zurich.
&lt;/p&gt;
&lt;p&gt;
I&#39;ve been meaning to try out the &lt;a href=&quot;http://code.google.com/apis/themes/&quot;&gt;iGoogle Themes API&lt;/a&gt; so I used my new home as an excuse to finally do it.  Nothing fancy, I just wanted to change the top header image and leave everything else the same -- pretty straightforward, but I did encounter a few hiccups.  (Btw, there&#39;s also the &lt;a href=&quot;http://www.google.com/ig/tm/creator&quot;&gt;iGoogle Theme Creator&lt;/a&gt; if you don&#39;t feel like fiddling with XML.)
&lt;/p&gt;
&lt;p&gt;
The first step was to find a panoramic image of Zurich that&#39;s available for reuse.  I used Google&#39;s &lt;a href=&quot;http://images.google.com/advanced_image_search&quot;&gt;advanced image search&lt;/a&gt; page, selecting the &amp;quot;labeled for reuse with modification&amp;quot; under &amp;quot;Usage Rights&amp;quot;.  Searching for [&lt;a href=&quot;http://images.google.com/images?as_q=zurich+night+panorama&amp;amp;as_rights=(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial).-(cc_nonderived)&quot;&gt;zurich night panorama&lt;/a&gt;] found &lt;a href=&quot;http://www.flickr.com/photos/paalia/3452977783/&quot;&gt;this amazing photo&lt;/a&gt;, shared under Creative Commons license by &lt;a href=&quot;http://www.flickr.com/people/paalia/&quot;&gt;Paul Stocker (paalia)&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The next step was to create the XML file that represents the theme.  It&#39;s made up of two ConfigMaps, one for meta information and one for attributes:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ConfigMaps&amp;gt;
  &amp;lt;ConfigMap&amp;gt;
    &amp;lt;Meta name=&quot;&lt;b&gt;title&lt;/b&gt;&quot;&amp;gt;Zurich Panorama&amp;lt;/Meta&amp;gt;
    &amp;lt;Meta name=&quot;&lt;b&gt;description&lt;/b&gt;&quot;&amp;gt;Insert description ...&amp;lt;/Meta&amp;gt;
    &amp;lt;Meta name=&quot;&lt;b&gt;author&lt;/b&gt;&quot;&amp;gt;Tom Stocky&amp;lt;/Meta&amp;gt;
    &amp;lt;Meta name=&quot;&lt;b&gt;author_email&lt;/b&gt;&quot;&amp;gt;tom@...&amp;lt;/Meta&amp;gt;
    &amp;lt;Meta name=&quot;&lt;b&gt;thumbnail&lt;/b&gt;&quot;&amp;gt;
      http://www.tomstocky.com/gadgets/zurich_panorama_t.jpg
    &amp;lt;/Meta&amp;gt;
    &amp;lt;Meta name=&quot;&lt;b&gt;screenshot&lt;/b&gt;&quot;&amp;gt;
      http://www.tomstocky.com/gadgets/zurich_panorama_s.jpg
    &amp;lt;/Meta&amp;gt;
  &amp;lt;/ConfigMap&amp;gt;
  &amp;lt;ConfigMap&amp;gt;
    &amp;lt;Attribute name=&quot;&lt;b&gt;header.center_image.url&lt;/b&gt;&quot;&amp;gt;
      http://www.tomstocky.com/gadgets/zurich_panorama.jpg
    &amp;lt;/Meta&amp;gt;
  &amp;lt;/ConfigMap&amp;gt;
&amp;lt;/ConfigMaps&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
The header.center_image should be 175px in height, while the width can be as much as you want -- iGoogle will automatically crop the width based on the user&#39;s window size.  An important constraint is that this image has to be less than 40kB.
&lt;/p&gt;
&lt;p&gt;
The thumbnail image is what appears in the search results of the &lt;a href=&quot;http://www.google.com/ig/directory?q=zurich+panorama&amp;amp;type=themes&quot;&gt;theme directory&lt;/a&gt; and should be 410x70.  The screenshot is what appears on the &lt;a href=&quot;http://www.google.com/ig/directory?type=themes&amp;amp;url=www.tomstocky.com/gadgets/zurich_panorama.xml&quot;&gt;details page&lt;/a&gt; and should be 680x116.
&lt;/p&gt;
&lt;p&gt;
Once you have your XML file hosted somewhere, you can test it by going to &lt;a href=&quot;http://www.google.com/ig&quot;&gt;http://www.google.com/ig&lt;/a&gt; and adding &amp;quot;?skin=http://www.example.com/yourtheme.xml&amp;quot; to the end of the query string.  When I tested my theme, the logo and header text didn&#39;t look great with the image, so I added a few more attributes:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;Attribute name=&quot;&lt;b&gt;header.logo&lt;/b&gt;&quot;&amp;gt;white&amp;lt;/Meta&amp;gt;
    &amp;lt;Attribute name=&quot;&lt;b&gt;header.link_color&lt;/b&gt;&quot;&amp;gt;#eeeeee&amp;lt;/Meta&amp;gt;
    &amp;lt;Attribute name=&quot;&lt;b&gt;header.text_color&lt;/b&gt;&quot;&amp;gt;#bbbbbb&amp;lt;/Meta&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
After that, I &lt;a href=&quot;http://www.google.com/ig/skin_submit&quot;&gt;submitted my theme&lt;/a&gt; to the directory and a few days later it showed up.  Now that it&#39;s there, you can &lt;a href=&quot;http://www.google.com/ig/directory?type=themes&amp;amp;url=www.tomstocky.com/gadgets/zurich_panorama.xml&quot;&gt;add it to your page&lt;/a&gt; if you want:
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.google.com/ig/directory?type=themes&amp;amp;url=www.tomstocky.com/gadgets/zurich_panorama.xml&quot;&gt;&lt;img src=&quot;http://www.tomstocky.com/gadgets/zurich_panorama_t.jpg&quot; width=&quot;410&quot; height=&quot;70&quot; alt=&quot;Zurich Panorama iGoogle Theme&quot; /&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;a href=&quot;http://www.google.com/ig/directory?type=themes&amp;amp;url=www.tomstocky.com/gadgets/zurich_panorama.xml&quot;&gt;&lt;img src=&quot;http://buttons.googlesyndication.com/fusion/add.gif&quot; width=&quot;104&quot; height=&quot;17&quot; alt=&quot;Add to Google&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</div></content><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://www.tomstocky.com/img/t/igoogle-theme-how-to.jpg" height="140" width="300" /></entry><entry><id>http://www.tomstocky.com/blog/mail-from-nephew</id><published>2009-03-04T09:40:44.599062-08:00</published><updated>2009-03-04T09:40:44.599130-08:00</updated><title>Mail from my 5-year-old nephew</title><link href="http://www.tomstocky.com/blog/mail-from-nephew" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
I received a letter in the mail yesterday from my 5-year-old nephew.  He wrote &amp;quot;TOM&amp;quot; on the front of the envelope, with the other parts filled in by his mom.  She wrote a note on the back:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
Hi Tom -&lt;br/&gt;
I have no idea what is in here. It&#39;s all him. He even stole &lt;br/&gt;
a stamp from upstairs and brought the envelope to us.
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;
He signed his name on the back, and stamped the return address a few places as well.  Needless to say, I was excited to receive this envelope.  I was even more excited when I saw what was inside:
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://www.tomstocky.com/img/drawing_3-3-09.jpg&quot;&gt;&lt;img class=&quot;wb&quot; src=&quot;https://www.tomstocky.com/img/drawing_3-3-09_sm.jpg&quot; width=&quot;400&quot; height=&quot;309&quot; alt=&quot;my nephew&#39;s drawing&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I believe that&#39;s me on the right.  (Now is probably the right time to reveal that my superpower is sonar.)  I couldn&#39;t be prouder right now -- not just because I&#39;m uncle to such a talented artist, but because I&#39;m pretty sure I&#39;m the first person to receive mail from him.
&lt;/p&gt;</div></content><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://www.tomstocky.com/img/t/mail-from-nephew.jpg" height="232" width="300" /></entry><entry><id>http://www.tomstocky.com/blog/chips-distribution</id><published>2009-02-04T09:50:32.984930-08:00</published><updated>2009-02-04T09:50:32.984951-08:00</updated><title>My theory on genius and chips distribution</title><link href="http://www.tomstocky.com/blog/chips-distribution" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
I was thinking about genius the other day -- you know, how some individuals have been able to &lt;a href=&quot;http://en.wikipedia.org/wiki/Ludwig_van_Beethoven&quot;&gt;write sonatas even as they&#39;re going deaf&lt;/a&gt;, or &lt;a href=&quot;http://en.wikipedia.org/wiki/Isaac_Newton&quot;&gt;understand how the world works&lt;/a&gt; in ways no one else has, or &lt;a href=&quot;http://en.wikipedia.org/wiki/Nolan_Ryan&quot;&gt;still throw no-hitters at age 44&lt;/a&gt;.  And then I started thinking about skill development in general, how it seems like certain things tend to come more naturally for some, while those same people have a harder time with things that are easy for most everyone else.  Generally speaking, it seems like proficiencies in one area tend to imply deficiencies in others.
&lt;/p&gt;
&lt;p&gt;
That thinking led me to a theory about poker chips.  Actually, it&#39;s more of a metaphor.  And I should add that it&#39;s based on pretty much nothing except my own observation and imagination.  But for some reason, it makes sense to me.
&lt;/p&gt;
&lt;p&gt;
It goes like this.  When each of us is born, we&#39;re given some amount of poker chips.  There&#39;s some average across all people (let&#39;s say it&#39;s 100) and chips distribution follows something approximating a &lt;a href=&quot;http://en.wikipedia.org/wiki/Normal_distribution&quot;&gt;normal curve&lt;/a&gt; with a pretty low standard deviation.  So 95% of the population gets somewhere around 90-110 chips.
&lt;/p&gt;
&lt;p&gt;
But how many chips we get is just one part of it.  There&#39;s also the question of what kind of chips we get.  Some people get more math chips, so calculus comes easier to them; others get more music chips and magically have perfect pitch at the age of 11; others get more empathy chips and either make a lot of friends or become salesmen; and so on.  I imagine the types of chips are actually finer-grained than this, but you get the idea.
&lt;/p&gt;
&lt;p&gt;
The chips we get don&#39;t map directly to our talents.  Rather, they map to our capacity, our potential for talent in those areas.  It&#39;s up to us to then realize that potential.
&lt;/p&gt;
&lt;p&gt;
This &lt;span class=&quot;strike&quot;&gt;theory&lt;/span&gt; metaphor accounts for geniuses, who are only a small subset of the 2.5% with more than 110 chips.  In that group, the real geniuses are the ones who not only get a bigger pile of chips than everyone else, but also get nearly all the same type of chip. Mozart&#39;s 200+ music chips meant he could start &lt;a href=&quot;http://en.wikipedia.org/wiki/Andante_in_C_for_Keyboard_(Mozart)#Andante_in_C.2C_K._1a&quot;&gt;composing at age 5&lt;/a&gt;. Einstein&#39;s 200+ physics chips meant he could intuit the &lt;a href=&quot;http://en.wikipedia.org/wiki/Introduction_to_general_relativity&quot;&gt;general theory of relativity&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
For the rest of us, my sense is it&#39;s more important to figure out what kind of chips we have instead of trying to determine whether our pile has 93 chips or 107.  Because in an area where we have more chips, that means we&#39;ll get a higher return on the time we invest in building that particular skill.  Obviously, self-awareness is no easy feat, but it seems pretty worth the trouble to attain it.
&lt;/p&gt;
&lt;p&gt;
Like I said, this is all just a product of my imagination.  And I&#39;m not sure how far this metaphor will really stretch.  (We may have already reached its limits.)  But it seems right to me at some level, so I thought I&#39;d share.
&lt;/p&gt;
</div></content><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://www.tomstocky.com/img/t/chips-distribution.jpg" height="264" width="300" /></entry><entry><id>http://www.tomstocky.com/blog/no-asshole-rule</id><published>2008-12-31T10:09:30.859341-08:00</published><updated>2008-12-31T10:14:15.868655-08:00</updated><title>Thoughts on The No Asshole Rule</title><link href="http://www.tomstocky.com/blog/no-asshole-rule" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
Robert Sutton&#39;s &lt;a href=&quot;http://www.amazon.com/gp/product/0446526568?ie=UTF8&amp;amp;tag=personalho08b-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0446526568&quot;&gt;The No Asshole Rule&lt;/a&gt; finally made it to the top of my books-to-read queue.  While it gets a bit repetitive at times (as business-type books are prone to do), I think the message is a good one, best summed up by its closing statements:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&amp;quot;Wouldn&#39;t it be wonderful if we could travel through our lives without encountering people who bring us down with their demeaning remarks and actions?  This book is aimed at weeding out those folks and at teaching them when they have stripped others of their esteem and dignity ... it&#39;s your job to help build and shape a civilized workplace. Sure, you already know that. But isn&#39;t it time to do something about it?&amp;quot;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;
That all sounds goods, but the book describes how organizations often glorify assholes.  Oftentimes, the more right you are and the more often you win, the bigger jerk you can be -- success, intelligence, and talent makes you harder to replace, so your destructive behavior is tolerated or even pampered.  There may even be the thought that people are effective &lt;i&gt;because&lt;/i&gt; they&#39;re jerks.
&lt;/p&gt;
&lt;p&gt;
Sutton argues instead that these sorts of people cause more harm than good and recommends ways for organizations to systematically eliminate them.  (He distinguishes between one-off or temporary behavior and a persistent pattern of oppressing, humiliating, de-energizing, and belittling others, particularly those in positions of less power -- the whole &amp;quot;kiss-up, kick-down&amp;quot; routine.)
&lt;/p&gt;
&lt;p&gt;
A few nuggets I gleaned from the book:
&lt;/p&gt;
&lt;ul class=&quot;spaced&quot;&gt;
&lt;li&gt;&amp;quot;Fight as if you are right; listen as if you are wrong.&amp;quot; (courtesy &lt;a href=&quot;http://en.wikipedia.org/wiki/Karl_Weick&quot;&gt;Karl Weick&lt;/a&gt;) Confrontation, disagreements, and direct interaction are important, so teach people how to do it right.&lt;/li&gt;
&lt;li&gt;Make a conspicuous example of the rule-breakers. As &lt;a href=&quot;http://psycnet.apa.org/index.cfm?fa=main.doiLanding&amp;amp;uid=1990-30919-001&quot;&gt;research by Cialdini&lt;/a&gt; and others suggests, people actually respond better to social norms when good behavior has a clear contrast to &amp;quot;deviant&amp;quot; behavior.&lt;/li&gt;
&lt;li&gt;The frequency of &amp;quot;we&amp;quot; vs. &amp;quot;I&amp;quot; is a good test.  &lt;a href=&quot;http://en.wikipedia.org/wiki/Peter_Drucker&quot;&gt;Peter Drucker&lt;/a&gt; once said that the most inspiring and effective leaders he encountered had a few things in common, including, &amp;quot;They thought and said &lt;i&gt;we&lt;/i&gt; instead of &lt;i&gt;I&lt;/i&gt;.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Learned optimism&amp;quot; can help in times when you encounter assholes.  Per &lt;a href=&quot;http://www.amazon.com/gp/product/1400078393?ie=UTF8&amp;amp;tag=personalho08b-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1400078393&quot;&gt;Martin Seligman&#39;s research&lt;/a&gt;, you can become more resilient to these situations by framing difficulties as temporary and not your fault, and as something that will not pervade and ruin the rest of your life.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The book also mentions a research project from the MIT Media Lab called the &lt;a href=&quot;http://www.media.mit.edu/press/jerk-o-meter/&quot;&gt;Jerk-O-Meter&lt;/a&gt; that analyzes tone of voice and speech style to give real-time feedback on whether you&#39;re &amp;quot;being a jerk&amp;quot; on the phone.  It&#39;s not clear that tools like that will prove effective in a broader context, but it can&#39;t hurt to keep trying new things that might increase self-awareness and help us police ourselves from engaging in negative behavior.
&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=personalho08b-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0446526568&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;
&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=personalho08b-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1400078393&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;
&lt;/p&gt;</div></content><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://www.tomstocky.com/img/t/no-asshole-rule.jpg" height="160" width="115" /></entry><entry><id>http://www.tomstocky.com/blog/pilot-cards</id><published>2008-12-23T06:24:43.468515-08:00</published><updated>2008-12-23T06:24:43.468537-08:00</updated><title>Airlines pilots handing out Captain Donut cards on flights?</title><link href="http://www.tomstocky.com/blog/pilot-cards" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
Midway through my flight to Boston the other day, the flight attendants handed each passenger a business card.  Here&#39;s the one I received:
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://www.tomstocky.com/img/pilotcard_side1.jpg&quot;&gt;&lt;img src=&quot;https://www.tomstocky.com/img/pilotcard_side1_sm.jpg&quot; width=&quot;300&quot; height=&quot;171&quot; alt=&quot;pilot card - side 1&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://www.tomstocky.com/img/pilotcard_side2.jpg&quot;&gt;&lt;img src=&quot;https://www.tomstocky.com/img/pilotcard_side2_sm.jpg&quot; width=&quot;300&quot; height=&quot;171&quot; alt=&quot;pilot card - side 2&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This is a first for me and I&#39;m not sure what to make of it.  As the card was delivered, we were told it was &quot;from the captain.&quot; He or someone else took the time to write everyone&#39;s name, seat number, and flight number on there -- using the blank spaces provided, which indicates he&#39;s probably doing this for multiple flights.
&lt;/p&gt;
&lt;p&gt;
In case you missed it, note the &quot;Captain Donut&quot; @aol.com email address and 310 area code phone number. I&#39;m guessing this isn&#39;t an official program United is doing, but perhaps they encourage pilots to make personal connections with customers like this?
&lt;/p&gt;</div></content><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://www.tomstocky.com/img/pilotcard_side2_sm.jpg" height="171" width="300" /></entry><entry><id>http://www.tomstocky.com/blog/vhs-and-cassettes-to-digital</id><published>2008-12-17T08:49:48.325820-08:00</published><updated>2008-12-17T15:23:38.007257-08:00</updated><title>How to Transfer VHS and Cassette Tapes to Digital</title><link href="http://www.tomstocky.com/blog/vhs-and-cassettes-to-digital" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
One of the things on my ever-growing list of weekend projects was transferring over my old VHS and cassette tapes to digital video and audio.  It took my a bit of research to figure out a good way to do this, so I figured I&#39;d share.
&lt;/p&gt;
&lt;p&gt;
Caveat: This isn&#39;t actually comprehensive enough to be a &quot;how to&quot; guide; it&#39;s just one way to do it that happened to work for me.
&lt;/p&gt;
&lt;p&gt;
Let&#39;s start with VHS tapes.  I used a Mac, so these steps are with that in mind:
&lt;/p&gt;
&lt;ol class=&quot;spaced&quot;&gt;
&lt;li&gt;&lt;b&gt;Get an A2D video Converter.&lt;/b&gt; After reading assorted reviews, I narrowed it down to the &lt;a href=&quot;http://desktop.thomsongrassvalley.com/products/videoconversion.php&quot;&gt;Canopus ADVC series&lt;/a&gt; or the &lt;a href=&quot;http://www.elgato.com/elgato/int/mainmenu/products/tuner/250plus/product1.en.html&quot;&gt;EyeTV 250 Plus&lt;/a&gt;. The EyeTV was tempting because it had a built-in TV tuner as well, but in the end I went with the &lt;a href=&quot;http://desktop.thomsongrassvalley.com/products/ADVC110/index.php&quot;&gt;ADVC110&lt;/a&gt; because it&#39;s generally considered to produce higher quality picture quality and A/V synchronization.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Use the FireWire port.&lt;/b&gt; The ADVC110 supports RCA or S-Video input, so you can use whichever your VCR supports. You&#39;ll need to use RCA input for audio. Use the FireWire output and plug that into your computer&#39;s FireWire port.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Capture using iMovie.&lt;/b&gt; In iMovie, flip the switch over to the camera icon and click &quot;import.&quot; Then push play on the VCR. Once the video&#39;s done, stop the importing in iMovie.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Export to QuickTime.&lt;/b&gt; Select &quot;File-&gt;Export&quot; in iMovie and then choose &quot;Expert Settings&quot; under the QuickTime options. In the filename dialog, choose &quot;Options&quot; and select these settings:
&lt;ul class=&quot;ns med&quot; style=&quot;margin-top:.5em; margin-bottom:.5em;&quot;&gt;
&lt;li&gt;Video compression: H.264&lt;/li&gt;
&lt;li&gt;Key frame rate: 30&lt;/li&gt;
&lt;li&gt;Bitrate: 1800 kbits/sec&lt;/li&gt;
&lt;li&gt;Dimensions: 640x480 VGA (deinterlace source video)&lt;/li&gt;
&lt;li&gt;Audio format: AAC&lt;/li&gt;
&lt;li&gt;Sample rate: 44.1 kHz&lt;/li&gt;
&lt;li&gt;Quality: Best (128 kbps)&lt;/li&gt;
&lt;/ul&gt;
There&#39;s a &lt;a href=&quot;http://www.youtube.com/watch?v=rtWjFEPx9Bk&quot;&gt;good video&lt;/a&gt; that walks through these settings. You want to create .mov files -- I tried .avi, .mp4, etc with the built-in codecs and they were all visibly worse and larger file sizes. (I also found &lt;a href=&quot;http://www.danslagle.com/mac/iMovie/qt_plugins/3010.shtml&quot;&gt;this comparison&lt;/a&gt; that shows video clips in various formats.) If you want to create a DVD, you can export directly to &lt;a href=&quot;http://www.apple.com/ilife/idvd/&quot;&gt;iDVD&lt;/a&gt; instead.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
For cassette tapes you don&#39;t need a converter, just an adapter to get your cassette player output into your computer.  Here&#39;s the step-by-step:
&lt;/p&gt;
&lt;ol class=&quot;spaced&quot;&gt;
&lt;li&gt;&lt;b&gt;Install Audacity and the LAME MP3 encoder.&lt;/b&gt; I chose this one because it got universally positive reviews and it&#39;s free. (There are versions for &lt;a href=&quot;http://audacity.sourceforge.net/download/mac&quot;&gt;Mac&lt;/a&gt;, &lt;a href=&quot;http://audacity.sourceforge.net/download/windows&quot;&gt;Windows&lt;/a&gt;, and &lt;a href=&quot;http://audacity.sourceforge.net/download/linux&quot;&gt;Linux&lt;/a&gt;.) The Audacity docs have a good &lt;a href=&quot;http://audacity.sourceforge.net/help/faq?s=install&amp;amp;item=lame-mp3&quot;&gt;how-to&lt;/a&gt; for installing LAME.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Get an RCA-to-Mini adapter.&lt;/b&gt; If you already have an RCA cable handy, you can go with the &lt;a href=&quot;http://www.radioshack.com/product/index.jsp?productId=2103225&quot;&gt;Y-adapter&lt;/a&gt;, or you could get a &lt;a href=&quot;http://www.radioshack.com/product/index.jsp?productId=2290564&quot;&gt;full-on cable&lt;/a&gt;. (This assumes your cassette player has RCA outputs, which it probably does.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Use the &quot;microphone in&quot; port.&lt;/b&gt; Your computer will have a (most likely green) mini-plug input somewhere that&#39;s usually labeled as being for a microphone. Take the RCA cable from your cassette player output, have it adaptify to a mini plug (courtesy #2) and put it in that microphone jack.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Record using Audacity.&lt;/b&gt; After a little fumbling, it&#39;s pretty self-explanatory, but there&#39;s &lt;a href=&quot;http://audacity.sourceforge.net/help/documentation&quot;&gt;good documentation&lt;/a&gt; if you run into any trouble. You&#39;ll probably need to split your recording into separate tracks, crop them appropriately, and perhaps increase or decrease the sound level.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Export to MP3.&lt;/b&gt; This isn&#39;t the only export option, but it&#39;s a good one for importing to iTunes, which then makes it easy to &lt;a href=&quot;http://support.apple.com/kb/TA38263&quot;&gt;burn CDs&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

</div></content></entry><entry><id>http://www.tomstocky.com/blog/adding-mediarss-to-atom</id><published>2008-12-04T10:16:44.623589-08:00</published><updated>2008-12-04T11:08:30.098024-08:00</updated><title>Adding Media RSS thumbnails to an Atom feed</title><link href="http://www.tomstocky.com/blog/adding-mediarss-to-atom" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
&lt;a href=&quot;http://search.yahoo.com/mrss&quot;&gt;Media RSS&lt;/a&gt; continues to get consumed in more and more places, from sites like &lt;a href=&quot;http://friendfeed.com/about/help#rssmedia&quot;&gt;FriendFeed&lt;/a&gt; to embeddable widgets like this &lt;a href=&quot;http://www.google.com/uds/solutions/slideshow/&quot;&gt;slide show&lt;/a&gt; based on the Google AJAX Feed API.
&lt;/p&gt;
&lt;p&gt;
So I thought I&#39;d use it to add thumbnails to &lt;a href=&quot;http://feeds.feedburner.com/tomstocky&quot;&gt;my site&#39;s Atom feed&lt;/a&gt;.  It turned out to be surprisingly easy -- I just had to include a &amp;lt;media:thumbnail&amp;gt; element in each &amp;lt;entry&amp;gt; with an associated image.
&lt;/p&gt;
&lt;p&gt;
For example, this post will appear something like this in the feed:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;entry&amp;gt;
 &amp;lt;id&amp;gt;http://www.tomstocky.com/blog/adding-mediarss-to-atom&amp;lt;/id&amp;gt;
 &amp;lt;published&amp;gt;2008-12-04T10:15:00-08:00&amp;lt;/published&amp;gt;
 &amp;lt;updated&amp;gt;2008-12-04T10:15:00-08:00&amp;lt;/updated&amp;gt;
 &amp;lt;title&amp;gt;Adding Media RSS thumbnails to an Atom feed&amp;lt;/title&amp;gt;
 &amp;lt;link href=&quot;http://www.tomstocky.com/blog/adding-mediarss-to-atom&quot;
   rel=&quot;alternate&quot; type=&quot;text/html&quot; /&amp;gt;
 &amp;lt;content type=&quot;xhtml&quot; xml:base=&quot;http://www.tomstocky.com/&quot;&amp;gt;
  &amp;lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;
   ... content ...
  &amp;lt;/div&amp;gt;
 &amp;lt;/content&amp;gt;
 &lt;b&gt;&amp;lt;media:thumbnail xmlns:media=&quot;http://search.yahoo.com/mrss/&quot;
   url=&quot;http://www.tomstocky.com/img/t/adding-mediarss-to-atom.gif&quot;
   height=&quot;150&quot; width=&quot;300&quot; /&amp;gt;&lt;/b&gt;
&amp;lt;/entry&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
One thing I wasn&#39;t able to track down were the size constraints for these thumbnails.  I assume that consumers of Media RSS have maximum widths and heights in mind for these images, but I couldn&#39;t find anything definitive.  Let me know if you happen to be aware of a max thumbnail size ...
&lt;/p&gt;</div></content><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://www.tomstocky.com/img/t/adding-mediarss-to-atom.gif" height="150" width="300" /></entry><entry><id>http://www.tomstocky.com/blog/reasons-move-to-sf</id><published>2008-11-25T10:06:21.543161-08:00</published><updated>2008-11-25T10:31:35.427923-08:00</updated><title>Reasons to move to San Francisco, according to my 12-year-old nephew</title><link href="http://www.tomstocky.com/blog/reasons-move-to-sf" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
My nephew (yes, the same one who gave me &lt;a href=&quot;http://www.tomstocky.com/blog/marriage-advice&quot;&gt;marriage advice&lt;/a&gt; earlier) has since turned 12.  Recently, he&#39;s been trying to convince some of his relatives to move to San Francisco.
&lt;/p&gt;
&lt;p&gt;
Here&#39;s his top 3 list for doing so:
&lt;/p&gt;
&lt;ol class=&quot;spaced&quot;&gt;
&lt;li&gt;It has enough crime to be interesting; for example, Al Capone and Alcatraz.&lt;/li&gt;
&lt;li&gt;
There are different places to go depending on what kind of weather you like.
&lt;ul class=&quot;ns&quot;&gt;
&lt;li&gt;It&#39;s sunny in the south.&lt;/li&gt;
&lt;li&gt;It&#39;s rainy in the north.&lt;/li&gt;
&lt;li&gt;It&#39;s in the middle in the middle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The pollution blocks the sun from getting in your eyes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Actually, this list is cut short.  There was a 4th reason as well: &quot;I live here!&quot;  And it makes sense that he does, given the convincing arguments.
&lt;/p&gt;</div></content></entry><entry><id>http://www.tomstocky.com/blog/worst-cheese-packaging</id><published>2008-11-18T09:27:14.636186-08:00</published><updated>2008-11-18T09:34:42.977306-08:00</updated><title>Worst cheese packaging ever</title><link href="http://www.tomstocky.com/blog/worst-cheese-packaging" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
On a recent flight, I was hungry enough to purchase one of the snack packs. I couldn&#39;t help but notice the fine print on the cheese packaging.
&lt;/p&gt;
&lt;p&gt;
I&#39;m not sure what&#39;s worse, that they&#39;re calling their product &amp;quot;pasteurized process cheese food&amp;quot; or that they&#39;re headlining it as &amp;quot;Gouda style&amp;quot; with a &amp;quot;Gouda-type flavor.&amp;quot;  In case you&#39;re wondering, according to the ingredients on the back, it was actually Cheddar.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://www.tomstocky.com/img/goudatypeflavor.jpg&quot;&gt;&lt;img src=&quot;https://www.tomstocky.com/img/goudatypeflavor_sm.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; alt=&quot;pasteurized process cheese food with Gouda-type flavor&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
</div></content></entry><entry><id>http://www.tomstocky.com/blog/bad-tactics-prop-8</id><published>2008-11-05T15:32:44.841530-08:00</published><updated>2008-11-05T15:35:44.841530-08:00</updated><title>My take on the bad tactics used by Prop 8 proponents</title><link href="http://www.tomstocky.com/blog/bad-tactics-prop-8" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
Last night restored my faith in the American political system.  Not just because Obama won, but because of &lt;i&gt;how&lt;/i&gt; he won.  I felt he did his best to try to focus the campaign on the actual issues, while his opponents relied more on the &lt;a href=&quot;http://www.democrats.com/the-karl-rove-playbook-for-losing-to-obama&quot;&gt;standard playbook&lt;/a&gt;, even attempting to reduce him to words like &amp;quot;&lt;a href=&quot;http://blogs.abcnews.com/politicalradar/2008/10/palin-invokes-s.html&quot;&gt;socialist&lt;/a&gt;&amp;quot; and &amp;quot;&lt;a href=&quot;http://www.politico.com/blogs/bensmith/1008/Harsh_GOP_robocall_hits_Ayers.html&quot;&gt;terrorist&lt;/a&gt;&amp;quot;.
&lt;/p&gt;
&lt;p&gt;
I felt like Obama did his best to avoid such tactics. I was especially impressed with his response to the whole &lt;a href=&quot;http://en.wikipedia.org/wiki/Jeremiah_Wright_controversy&quot;&gt;Wright controversy&lt;/a&gt;, where he defied conventional wisdom to just brush it under the rug.  Instead, he addressed the issue head on in a &lt;a href=&quot;http://my.barackobama.com/page/content/hisownwords&quot;&gt;speech on race&lt;/a&gt; that demonstrated real respect for Americans&#39; intelligence. In my mind, a win for Obama was also a win for a more intelligent, respectful brand of politics, or at least a step in the right direction.
&lt;/p&gt;
&lt;p&gt;
Unfortunately, my restored faith didn&#39;t last long. I woke up this morning to find &lt;a href=&quot;http://en.wikipedia.org/wiki/California_Proposition_8_(2008)&quot;&gt;Proposition 8&lt;/a&gt; with a current lead for &amp;quot;yes&amp;quot;. I won&#39;t argue against Prop 8 -- people far more qualified than me have already done so.  But I would like to highlight some examples of bad tactics by Prop 8 proponents that may have affected the outcome in an unfortunate way:
&lt;/p&gt;
&lt;ul class=&quot;spaced&quot;&gt;
&lt;li&gt;
&lt;b&gt;Falsely implied support from Obama.&lt;/b&gt;
They &lt;a href=&quot;http://www.politico.com/blogs/bensmith/1108/Obama_used_in_antisamesex_marriage_drive.html&quot;&gt;sent fliers&lt;/a&gt; that used Obama&#39;s image and even &lt;a href=&quot;http://blog.protectmarriageequality.com/2008/11/04/yes-on-8-robo-calls-feature-obamas-voice/&quot;&gt;launched robocalls&lt;/a&gt; that used his voice, all of which gave the impression that Obama supported Prop 8.  In reality, Obama wrote a &lt;a href=&quot;http://alicebtoklas.info/%7Ealiceb/index.php/news-articles-by-date/50-letter-from-barack-obama-to-alice&quot;&gt;letter to Alice&lt;/a&gt; stating:
&lt;blockquote&gt;
&lt;div&gt;
&amp;quot;I oppose the divisive and discriminatory efforts to amend the California Constitution, and similar efforts to amend the U.S. Constitution or those of other states.&amp;quot;
&lt;/div&gt;
&lt;/blockquote&gt;
He also issued an &lt;a href=&quot;http://news.yahoo.com/s/usnw/20081101/pl_usnw/no_on8_reveals_new_ad_showing_obama__schwarzenegger__feinstein_joining_together_calling_for_defeat_of_unfair_initiative&quot;&gt;official statement&lt;/a&gt;:
&lt;blockquote&gt;
&lt;div&gt;
&amp;quot;The Obama-Biden ticket opposes Proposition 8 and similar discriminatory constitutional amendments that could roll back the civil rights he and Sen. Biden strongly believe should be afforded to all Americans.&amp;quot;
&lt;/div&gt;
&lt;/blockquote&gt;
He has reiterated this stance against Prop 8 multiple times (such as this &lt;a href=&quot;http://www.mtv.com/news/articles/1598409/20081102/story.jhtml&quot;&gt;MTV interview&lt;/a&gt;) and even allowed &amp;quot;No On 8&amp;quot; to feature him in &lt;a href=&quot;http://www.youtube.com/watch?v=_eMXdliDGXs&quot;&gt;one of their ads&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Lied about kids and schools.&lt;/b&gt;
From the ProtectMarriage.com &amp;quot;&lt;a href=&quot;http://protectmarriage.com/files/fact_sheet.pdf&quot;&gt;fact sheet&lt;/a&gt;&amp;quot;:
&lt;blockquote&gt;
&lt;div&gt;
&amp;quot;Proposition 8 protects our children from being taught in public schools that same-sex marriage is the same as traditional marriage. In health education classes, state law requires teachers to instruct children as young as kindergarteners about marriage. (Education Code &amp;#167;51890.) If the same-sex marriage ruling is not overturned, teachers will be required to teach young children that there is no difference between gay marriage and traditional marriage.&amp;quot;
&lt;/div&gt;
&lt;/blockquote&gt;
This is a lie, as the State Superintendent has &lt;a href=&quot;http://www.youtube.com/watch?v=CIL7PUl24hE&quot;&gt;made very clear&lt;/a&gt;.  But this lie was repeated up until the very end, including &lt;a href=&quot;http://www.youtube.com/watch?v=0PgjcgqFYP4&quot;&gt;misleading ads&lt;/a&gt; that preyed on parents&#39; fears.
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Threatened companies who donated to &lt;a href=&quot;http://www.eqca.org&quot;&gt;Equality California&lt;/a&gt;.&lt;/b&gt;
Some might even call it extortion. They &lt;a href=&quot;http://ap.google.com/article/ALeqM5hZmLBrL36NObNyMR0ghXN7vB5hYwD940GN1G0&quot;&gt;wrote letters&lt;/a&gt; to these companies requesting a donation to their cause, adding:
&lt;blockquote&gt;
&lt;div&gt;
&amp;quot;Were you to elect not to donate comparably, it would be a clear indication that you are in opposition to traditional marriage. You would leave us no other reasonable assumption. The names of any companies and organizations that choose not to donate in like manner to ProtectMarriage.com but have given to Equality California will be published. It is only fair for Proposition 8 supporters to know which companies and organizations oppose traditional marriage.&amp;quot;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I&#39;m disappointed that tactics like these are effective.  I&#39;d like to see American politics evolve to a point where educating voters becomes the most effective way to win campaigns.  The only way to get there is if lying and fear mongering stop working.
&lt;/p&gt;
&lt;p&gt;
Last night made me hopeful that we might be turning a corner toward this end.  But today has demonstrated that we still have a long way to go.  I realize &lt;a href=&quot;http://www.noonprop8.com/headlines/statement-by-no-on-prop-8-campaign-on-election-status/&quot;&gt;it&#39;s not over yet&lt;/a&gt;, but the fact that there&#39;s a &lt;a href=&quot;http://www.latimes.com/news/local/politics/cal/la-2008election-california-results,0,1293859.htmlstory?view=8&quot;&gt;current lead&lt;/a&gt; for &amp;quot;yes&amp;quot; shows that there are still quicker paths to political gains than educating voters and respecting their intelligence.
&lt;/p&gt;</div></content></entry><entry><id>http://www.tomstocky.com/blog/friendfeed-api-app-engine</id><published>2008-10-29T09:29:08.522290-07:00</published><updated>2008-10-29T09:56:24.080201-07:00</updated><title>Using the FriendFeed API with App Engine</title><link href="http://www.tomstocky.com/blog/friendfeed-api-app-engine" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
The &lt;a href=&quot;http://friendfeed.com/api/&quot;&gt;FriendFeed API&lt;/a&gt; has a Python client library, so I thought I&#39;d try it out with &lt;a href=&quot;http://code.google.com/appengine&quot;&gt;App Engine&lt;/a&gt;.  It took a few tweaks to &lt;a href=&quot;http://code.google.com/p/friendfeed-api/source/browse/trunk/python/friendfeed.py&quot;&gt;friendfeed.py&lt;/a&gt;, but it was pretty easy to get everything working.
&lt;/p&gt;
&lt;p&gt;
First, I had to change the import line for simplejson:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#import simplejson
&lt;b&gt;from django.utils import simplejson&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Second, I needed to switch to using App Engine&#39;s &lt;a href=&quot;http://code.google.com/appengine/docs/urlfetch/overview.html&quot;&gt;URL Fetch API&lt;/a&gt; for the HTTP requests:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from google.appengine.api import urlfetch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
This required a few adjustments to the FriendFeed class&#39; _fetch() method. I moved the auth check to the top because it flowed a bit better and changed one line in that clause:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;b&gt;headers = {}&lt;/b&gt;
if self.auth_nickname and self.auth_key:
  pair = &quot;%s:%s&quot; % (self.auth_nickname, self.auth_key)
  token = base64.b64encode(pair)
  #request.add_header(&quot;Authorization&quot;, &quot;Basic %s&quot; % token)
  &lt;b&gt;headers[&#39;Authorization&#39;] = &#39;Basic %s&#39; % token&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Then I changed the post_args lines:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if post_args is not None:
  #request = urllib2.Request(url, urllib.urlencode(post_args))
  &lt;b&gt;headers[&#39;Content-Type&#39;] = &#39;application/x-www-form-urlencoded&#39;
  result = urlfetch.fetch(url, urllib.urlencode(post_args),
                          urlfetch.POST, headers)&lt;/b&gt;
else:
  #request = urllib2.Request(url)
  &lt;b&gt;result = urlfetch.fetch(url, headers=headers)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
And then one last change to fetch the data:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#stream = urllib2.urlopen(request)
#data = stream.read()
&lt;b&gt;data = result.content&lt;/b&gt;
#stream.close()
return parse_json(data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
With those changes in place, everything seems to work fine.  I haven&#39;t done any real testing, but it worked for reading public and private feeds, as well as posting a new entry.
&lt;/p&gt;
&lt;p&gt;
I used the API to pull in FriendFeed likes and comments for each blog post.  I did this by searching for the post&#39;s title and getting back the ID if the post URLs match:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;service = friendfeed.FriendFeed()
feed = service.search(&#39;who:tom service:blog %s&#39; % title)
for entry in feed[&#39;entries&#39;]:
  if entry[&#39;link&#39;] == &#39;http://www.tomstocky.com/blog/%s&#39; % slug:
    ffid = entry[&#39;id&#39;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
With that ID, I can then pull in the likes and comments for the post:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feed = service._fetch_feed(&#39;/api/feed/entry/&#39; + ffid)
entry = feed[&#39;entries&#39;][0]
likes = entry[&#39;likes&#39;]
comments = entry[&#39;comments&#39;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
When those are passed to my &lt;a href=&quot;http://code.google.com/appengine/docs/gettingstarted/templates.html&quot;&gt;template&lt;/a&gt;, the end result is what now appear below each post on the &lt;a href=&quot;https://www.tomstocky.com/&quot;&gt;homepage&lt;/a&gt;:&lt;br/&gt;
&lt;a href=&quot;https://www.tomstocky.com/img/ff/ffinfoscreenshot.gif&quot;&gt;&lt;img src=&quot;https://www.tomstocky.com/img/ff/ffinfoscreenshot_sm.gif&quot; height=&quot;200&quot; width=&quot;400&quot; class=&quot;wb&quot; style=&quot;margin-top:.5em&quot; alt=&quot;screenshot of FriendFeed info&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</div></content></entry><entry><id>http://www.tomstocky.com/blog/visit-to-hcps</id><published>2008-10-21T22:28:02.072678-07:00</published><updated>2008-10-29T00:54:35.112599-07:00</updated><title>Visit to Hanover County Public Schools</title><link href="http://www.tomstocky.com/blog/visit-to-hcps" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
Last week, Avni and I met with the Instructional Technology team for &lt;a href=&quot;http://www.hcps.us&quot;&gt;Hanover County Public Schools&lt;/a&gt;.  Together we came up with some interesting ideas for how Google might be useful in the classroom, many of which had never occurred to me before:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Collaborative writing assignments and classroom homepages using &lt;a href=&quot;http://www.google.com/a/help/intl/en/edu/included.html&quot;&gt;Google Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Research activities with &lt;a href=&quot;http://www.google.com/books&quot;&gt;book search&lt;/a&gt; and &lt;a href=&quot;http://www.google.com/patents&quot;&gt;patents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using &quot;filetype:kmz&quot; to find interesting KML files for things like the &lt;a href=&quot;http://www.google.com/search?q=civil+war+battles+filetype:kmz&quot;&gt;Civil War battles&lt;/a&gt; (viewable in Google Earth)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/support/toolbar/bin/answer.py?answer=20871&amp;amp;topic=15367&quot;&gt;Translate&lt;/a&gt; and &lt;a href=&quot;http://www.google.com/support/toolbar/bin/answer.py?answer=32703&amp;amp;topic=15470&quot;&gt;spell check&lt;/a&gt; in the &lt;a href=&quot;http://toolbar.google.com/&quot;&gt;Google Toolbar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Searching with a &lt;a href=&quot;http://code.google.com/apis/customsearch/docs/start.html&quot;&gt;custom search engine&lt;/a&gt; designed for a specific grade level&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
They also introduced me to the &lt;a href=&quot;http://www.google.com/educators/posters.html&quot;&gt;posters&lt;/a&gt; and &lt;a href=&quot;http://www.google.com/educators/activities.html&quot;&gt;activities&lt;/a&gt; described on Google&#39;s &lt;a href=&quot;http://www.google.com/educators/tools.html&quot;&gt;education site&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I was impressed with how progressive they were in terms of bringing technology into the classroom.  We&#39;re talking about K-12 students, so I asked about how to prevent students from goofing off or playing games.  Their response was that, while that&#39;s a valid concern, the greater risk was having schools lag in technology adoption and letting fear stifle innovation.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://www.tomstocky.com/img/hcps_10-17-08.jpg&quot;&gt;&lt;img src=&quot;https://www.tomstocky.com/img/hcps_10-17-08_sm.jpg&quot; alt=&quot;HCPS team&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</div></content></entry><entry><id>http://www.tomstocky.com/blog/marriage-advice</id><published>2008-10-09T18:51:25.081626-07:00</published><updated>2008-10-29T00:54:40.351460-07:00</updated><title>Marriage advice from an 11-year-old</title><link href="http://www.tomstocky.com/blog/marriage-advice" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
Getting engaged has spurred a lot of marriage advice coming my way.  I don&#39;t mind it at all -- it&#39;s actually great to hear people&#39;s perspective and the insights that only experience can bring.
&lt;/p&gt;
&lt;p&gt;
But the best guidance I&#39;ve received to date came from my 11-year-old (soon to be) nephew.  He explained that it really comes down to 3 things:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read lots of books.&lt;/li&gt;
&lt;li&gt;Wear lots of deodorant.&lt;/li&gt;
&lt;li&gt;If you sleep diagonally, get your own bed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
No doubt, he&#39;s wise beyond his years.
&lt;/p&gt;</div></content></entry><entry><id>http://www.tomstocky.com/blog/first-post</id><published>2008-10-03T17:46:49.552358-07:00</published><updated>2008-10-29T00:54:44.170834-07:00</updated><title>First post</title><link href="http://www.tomstocky.com/blog/first-post" rel="alternate" type="text/html" /><content type="xhtml" xml:base="http://www.tomstocky.com/"><div xmlns="http://www.w3.org/1999/xhtml">&lt;p&gt;
I started out creating this blog to see how hard it would be to write a blog app on &lt;a href=&quot;http://code.google.com/appengine&quot;&gt;Google App Engine&lt;/a&gt;.  I was part of the team that launched App Engine, so I&#39;ve built a bunch of sample apps with it, but I thought it would be nice to have one running live that I could continue to play around with.
&lt;/p&gt;
&lt;p&gt;
As &lt;a href=&quot;http://bret.appspot.com/entry/experimenting-google-app-engine&quot;&gt;Bret&lt;/a&gt; and others have pointed out, it was remarkably simple, and now this site will hopefully serve as a good place to experiment with various APIs.  For example, my &lt;a href=&quot;https://www.tomstocky.com/books&quot;&gt;reading list&lt;/a&gt; page is pulling data from a Google Spreadsheet using the &lt;a href=&quot;http://code.google.com/apis/spreadsheets/overview.html&quot;&gt;Spreadsheets API&lt;/a&gt; (similar to the way that&#39;s described in &lt;a href=&quot;http://code.google.com/appengine/articles/gdata.html&quot;&gt;this article&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
Per &lt;a href=&quot;http://www.youtube.com/watch?v=oG6Ac7d-Nx8&quot;&gt;Kevin Gibbs&lt;/a&gt;&#39; suggestion, that page also uses the &lt;a href=&quot;http://code.google.com/appengine/docs/memcache/usingmemcache.html&quot;&gt;Memcache API&lt;/a&gt; in combination with the datastore so it only needs to hit the spreadsheet when there&#39;s a change.  Basically, when caching the page, I store it in memcache:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;memcache.set(pagename, data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
And then also in the datastore:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ct = CachedText(pagename = pagename,
                content = data)
ct.put()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Which means I have a fallback when memcache misses:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;data = memcache.get(pagename)
if not data:
  query = db.Query(CachedText)
  query.filter(&#39;pagename =&#39;, pagename)
  ct = query.get()
  data = ct.content
return data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
I&#39;m using &lt;a href=&quot;http://tomstocky.disqus.com&quot;&gt;Disqus&lt;/a&gt; for the comments, and I&#39;m hoping to find time to use the &lt;a href=&quot;http://apiwiki.twitter.com&quot;&gt;Twitter API&lt;/a&gt; soon as well.
&lt;/p&gt;
&lt;p&gt;
This blog will also be a place to share my thoughts -- I&#39;m not sure what exactly will come of it, but it&#39;s been fun so far.
&lt;/p&gt;</div></content></entry></feed>
