<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3174686716735347205</atom:id><lastBuildDate>Thu, 15 Dec 2011 13:52:36 +0000</lastBuildDate><category>Me</category><category>Windows XP</category><category>April Fools' Day</category><category>Relationship Taxonomy</category><category>GooglePlus</category><category>ChromeLite</category><category>privacy</category><category>interfaces</category><category>AdWords</category><category>software development</category><category>exceptions</category><category>Google Translate Gadget</category><category>SimpleGWT</category><category>gwtc</category><category>GoogleCL</category><category>coding practices</category><category>HasValue</category><category>GMail Motion</category><category>GMail</category><category>Charlottesville</category><category>scripting</category><category>Google+</category><category>Helvetiva</category><category>GWT 1.6</category><category>Virginia</category><category>GPE</category><category>GPlus</category><category>Google Chrome Browser</category><category>Isaac Truett</category><category>Blogger</category><category>Nook</category><category>Cr-48</category><category>AdSense</category><category>Google Analytics</category><category>Google Plus</category><category>gwtNature</category><category>Eclipse</category><category>build scripts</category><category>GwtCompilerTask</category><category>developer conference</category><category>Hyalinobatrachium pellucidum</category><category>glass frog</category><category>Python</category><category>GWT Eclipse Plugin</category><category>Twitter</category><category>GWT</category><category>Voice-alyzer</category><category>code aesthetics</category><category>SCEA certification</category><category>Feedburner</category><category>beCamp2011</category><category>AppEngine</category><category>WinXP</category><category>Meow Me Now</category><category>web applications</category><category>Circles</category><category>Android Scripting Environment</category><category>Google Sites</category><category>SOA</category><category>cofoja</category><category>Google Profiles</category><category>Google Search</category><category>Google Chrome OS</category><category>GWT Incubator</category><category>Picasa</category><category>social networking</category><category>Google Plugin for Eclipse</category><category>exception handling</category><category>ChromeOS</category><category>Chrome</category><category>peer review</category><category>ebook reader</category><category>services</category><category>beauty</category><category>Autocompleter</category><category>G+</category><category>Android</category><category>Google I/O</category><category>Facebook</category><category>TODO</category><category>code review</category><category>GTUG</category><category>Richmond JUG</category><category>Google Webmaster Tools</category><category>Chromercise</category><category>Google Apps Scripts</category><category>Google Web Toolkit</category><category>main</category><category>programming</category><category>SimpleJDBC</category><category>GAE</category><category>contract programming</category><category>Java</category><category>OO</category><category>Google</category><category>Google App Engine</category><category>null</category><category>Open Source</category><category>RVA</category><category>Command</category><category>App Engine</category><category>NullPointerException</category><category>static initialization</category><category>Google CL</category><category>Real Time</category><category>WebGL</category><category>Futsal</category><category>command line</category><category>Google Body Browser</category><category>Ant</category><title>public int</title><description>A whole number between -2&lt;sup&gt;31&lt;/sup&gt; and 2&lt;sup&gt;31&lt;/sup&gt;-1. Or, thoughts on technology, life as a software engineer, and other miscellany. Isaac Truett is not a journalist, a doctor, or a lawyer. This is not news or medical or legal advice. See your doctor to determine if advice in this blog is right for you. Consult a lawyer licensed to practice in your locality for legal advice. For news, you're on your own.</description><link>http://publicint.blogspot.com/</link><managingEditor>noreply@blogger.com (Isaac Truett)</managingEditor><generator>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PublicInt" /><feedburner:info uri="publicint" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-190393540045190824</guid><pubDate>Wed, 05 Oct 2011 16:00:00 +0000</pubDate><atom:updated>2011-10-05T12:12:07.144-04:00</atom:updated><title>Supporting You Are Not So Smart</title><description>&lt;p&gt;I've been following the &lt;a href="http://youarenotsosmart.com/"&gt;You Are Not So Smart&lt;/a&gt; blog for a while now and frequently share its posts on &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt;. The author, David McRaney, writes about human thought and behavior, drawing on research conducted over the last several decades. David describes it as "a blog devoted to self delusion and irrational thinking." It's a great read and I highly recommend it. There's a book coming out soon and I think this is a cause, and a creative professional, worth supporting, so I'm including the book's &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; trailer below. Doesn't hurt that he's offering bribes for posting the video! It's only 3:37 long and well worth watching.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/DJ2T4-rUUcs" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;And a quick note for readers in the Richmond, VA area: I will be presenting &lt;i&gt;Building Optimized Rich Web Applications with Java, an introduction to Google Web Toolkit&lt;/i&gt; at the&lt;a href="http://rva.gtugs.org/"&gt; Richmond, VA Google Technology Users Group&lt;/a&gt; tomorrow. It's not too late to sign up for the meeting, which is free to attend. &lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-190393540045190824?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NSmAN73f4xGgimjaDBtAz_z9Hog/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NSmAN73f4xGgimjaDBtAz_z9Hog/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NSmAN73f4xGgimjaDBtAz_z9Hog/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NSmAN73f4xGgimjaDBtAz_z9Hog/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/a3BPnsQuIsg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/a3BPnsQuIsg/supporting-you-are-not-so-smart.html</link><author>noreply@blogger.com (Isaac Truett)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/DJ2T4-rUUcs/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/10/supporting-you-are-not-so-smart.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-677277480830690303</guid><pubDate>Fri, 30 Sep 2011 01:16:00 +0000</pubDate><atom:updated>2011-09-29T21:26:38.291-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Analytics</category><category domain="http://www.blogger.com/atom/ns#">Real Time</category><title>Google Analytics in Real Time</title><description>I just got accepted to the &lt;a href="http://analytics.blogspot.com/2011/09/whats-happening-on-your-site-right-now.html"&gt;Google Analytics Real-Time&lt;/a&gt; beta. So, now I need everyone to go browse my blog so I have some real-time data to look at! And get your friends to come by, too. In the name of load testing, you know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-677277480830690303?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kTwwM0zrPec6Z6l0Nn1eK0-DIqY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kTwwM0zrPec6Z6l0Nn1eK0-DIqY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kTwwM0zrPec6Z6l0Nn1eK0-DIqY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kTwwM0zrPec6Z6l0Nn1eK0-DIqY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/eAD5XhKTxxU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/eAD5XhKTxxU/google-analytics-in-real-time.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/09/google-analytics-in-real-time.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-2857351381204664809</guid><pubDate>Mon, 19 Sep 2011 21:00:00 +0000</pubDate><atom:updated>2011-09-19T17:00:04.273-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GWT</category><category domain="http://www.blogger.com/atom/ns#">Virginia</category><category domain="http://www.blogger.com/atom/ns#">beCamp2011</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><category domain="http://www.blogger.com/atom/ns#">Charlottesville</category><category domain="http://www.blogger.com/atom/ns#">ChromeOS</category><title>Charlottesville, VA beCamp 2011</title><description>&lt;p&gt;Wow, what a great weekend at &lt;a href="http://barcamp.org/w/page/38835401/beCamp2011"&gt;beCamp&lt;/a&gt; this year! I missed the setup and introductions because work kept me late Friday night, but I made it in time for proposing session topics (and pizza, of course). Running a session on &lt;a href="http://code.google.com/p/google-web-toolkit/"&gt;Google Web Toolkit&lt;/a&gt; last year was a big thrill for me. I proposed GWT again, and ChromeOS, hoping to talk about &lt;a href="http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html"&gt;my experiences with my Cr-48&lt;/a&gt; since December. My GWT session got the same number of votes as last year, despite attendance being down something like 40% this year. Go me! ChromeOS didn't make the cut.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;My first experience as a conference speaker was at beCamp 2010. In the spirit of the event, I proposed a session on GWT despite having no slides or other materials prepared. I got votes. I got scheduled. When I found myself in front of a dozen people with nothing prepared, I just started talking. I like GWT. I love using it. So, I went with that. What is GWT? Why do I use it? What do I love about it? That's what I talked about. And people asked questions. Lots of questions. I answered as many as I could as well as I could. People thanked me. This speaking thing wasn't so bad after all. I was even asked to give a presentation on GWT to the Richmond, VA Java User Group. I agreed. I obviously had a lot to say on the subject, and based on the response I was getting, people wanted to hear it. So I set about building slides for a presentation. I did my research. And in October 2010, I presented to about 25 people at the RJUG meeting. Nerves and a few technical issues aside, it went well. Now here I was, back at beCamp the following year, giving the presentation again. And people liked it. That feels good.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I gave the presentation using my Cr-48, only slightly disappointed that nobody wanted to hear about that too. But then after the session, I was approached. What was that notebook I used for the presentation? Oh, that's my Cr-48, a prototype Chromebook. I knew from the voting the night before that at least a couple of people were interested, so I was glad one of them had picked me out of the crowd later to talk about it. Then at lunch, more people gathered around interested in seeing it. Should I have put "Chromebook" on the topic card instead of "ChromeOS?" Are people more interested in the hardware than the operating system, or just more interested in seeing it in action? I'll propose the topic again next year, maybe under a different heading. I'll probably still be using the Cr-48 anyway, so if you're there and you want a look at it, come up and ask!&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Thanks again to the organizer, Eric Pugh, all the sponsors, and everyone else who made beCamp 2011 possible. See you next year!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-2857351381204664809?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Yb9yNlwoeSpAEqrMh_BpDtnsp50/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Yb9yNlwoeSpAEqrMh_BpDtnsp50/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Yb9yNlwoeSpAEqrMh_BpDtnsp50/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Yb9yNlwoeSpAEqrMh_BpDtnsp50/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/t13XcfclJVw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/t13XcfclJVw/charlottesville-va-becamp-2011.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/09/charlottesville-va-becamp-2011.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-887452165623426941</guid><pubDate>Thu, 11 Aug 2011 20:30:00 +0000</pubDate><atom:updated>2011-08-12T10:20:22.600-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Apps Scripts</category><category domain="http://www.blogger.com/atom/ns#">GMail</category><category domain="http://www.blogger.com/atom/ns#">TODO</category><title>GMail TODO Script</title><description>&lt;p&gt;
After reading &lt;a href="http://googleappsdeveloper.blogspot.com/2011/07/gmail-snooze-with-apps-script.html"&gt;GMail Snooze with Apps Script&lt;/a&gt; I thought "Gosh, that's &lt;em&gt;almost&lt;/em&gt; what I need to make GMail my go-to TODO list platform." Well, I finally sat down and closed the gap.
&lt;/p&gt;

&lt;pre class="code"&gt;
var MARK_UNREAD = true;
var MARK_IMPORTANT = true;
var ADD_TODO_LABEL = true;
var TIMEZONE = "EST";

function setup() {
  if (ADD_TODO_LABEL) {
    GmailApp.createLabel("TODO");
  }
}

function reviveTODOs() {
  var todayString = Utilities.formatDate(new Date(),
     TIMEZONE, "yyyy/MM/dd");
  var todaysLabel = 
     GmailApp.getUserLabelByName(todayString);  
  var page = null;

  // Get threads in "pages" of 100 at a time
  while(todaysLabel 
      &amp;&amp; (!page || page.length == 100)) {
    page = todaysLabel.getThreads(0, 100);

    if (page.length &gt; 0) {
      GmailApp.moveThreadsToInbox(page);
      
      if (MARK_UNREAD) {
        GmailApp.markThreadsUnread(page);
      }

      if (MARK_IMPORTANT) {
        GmailApp.markThreadsImportant(page);
      }
      
      if (ADD_TODO_LABEL) {
        GmailApp.getUserLabelByName("TODO")
          .addToThreads(page);
      }          
    }     
  }
}
&lt;/pre&gt;
&lt;p&gt;
Instead of using "Snooze x Days" labels, I use date labels like "2011/08/11" to remind myself to follow up on bills, respond to emails, etc. With this modified version of &lt;a href="http://www.google.com/profiles/goldfeder"&gt;Corey Goldfeder&lt;/a&gt;'s script, I don't have to remember to check those labels, they just pop back into my inbox automatically. I had a little problem with the markThreadsImportant call not seeming to work. Don't know what's up with that. But otherwise, it has performed well so far in testing.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Update:&lt;/b&gt; Be sure to set the timezone that the script will run in and the timezone used to format date labels to the same timezone. See &lt;a href="http://code.google.com/googleapps/appsscript/guide_events.html#TimeTriggers"&gt;Using Time-Driven Triggers&lt;/a&gt;.
&lt;p&gt;
Like this script? Have your own variation? Please share!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-887452165623426941?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5uZ8ZtWq5xp39cnJgCe6tb-fYVI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5uZ8ZtWq5xp39cnJgCe6tb-fYVI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5uZ8ZtWq5xp39cnJgCe6tb-fYVI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5uZ8ZtWq5xp39cnJgCe6tb-fYVI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/vMmErCwB1jw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/vMmErCwB1jw/gmail-todo-script.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/08/gmail-todo-script.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-7801950672015819463</guid><pubDate>Sat, 06 Aug 2011 14:45:00 +0000</pubDate><atom:updated>2011-08-10T09:48:03.569-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GTUG</category><category domain="http://www.blogger.com/atom/ns#">RVA</category><title>RVA GTUG - August 2011 Meeting</title><description>&lt;p&gt;
I'm thrilled to announce that on Thursday the Richmond, VA Google Technology User Group met for the first time. It was fantastic seeing familiar faces and also meeting some other Google enthusiasts for the first time. This is my first experience as a community organizer, so I'm excited to see how things will develop from here. We have good people who believe in the group and I'm confident we'll continue strong. Thank you to all of our members!
&lt;/p&gt;
&lt;p&gt;
Special thanks to &lt;a href="http://www.genworth.com/"&gt;Genworth Financial&lt;/a&gt; for supporting the local Google developer community by letting us meet in their offices here in Richmond. If you or your organization would like to support this community, please contact me through &lt;a href="http://www.google.com/profiles/itruett"&gt;my Google Profile&lt;/a&gt; or &lt;a href="https://groups.google.com/forum/#!forum/rva-gtug"&gt;the RVA GTUG Google Group&lt;/a&gt; forum.
&lt;/p&gt;
&lt;p&gt;
Anyone interested in membership in the RVA GTUG, please &lt;a href="https://groups.google.com/forum/#!forum/rva-gtug"&gt;join the Google Group&lt;/a&gt; and introduce yourself. If you are interested in developing with Google technologies but aren't local to Richmond, VA, you can find over 260 other active and incubating GTUG chapters at &lt;a href="http://www.gtugs.org/"&gt;gtugs.org&lt;/a&gt;. 
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-7801950672015819463?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_FsKYZ9lX4tpW_BZ3ikd7JDfx_w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_FsKYZ9lX4tpW_BZ3ikd7JDfx_w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_FsKYZ9lX4tpW_BZ3ikd7JDfx_w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_FsKYZ9lX4tpW_BZ3ikd7JDfx_w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/wRkVeq64xSc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/wRkVeq64xSc/rva-gtug-august-meeting.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/08/rva-gtug-august-meeting.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-6072529316322844651</guid><pubDate>Wed, 27 Jul 2011 02:00:00 +0000</pubDate><atom:updated>2011-07-26T22:03:04.954-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">social networking</category><category domain="http://www.blogger.com/atom/ns#">Relationship Taxonomy</category><category domain="http://www.blogger.com/atom/ns#">Google+</category><category domain="http://www.blogger.com/atom/ns#">GPlus</category><category domain="http://www.blogger.com/atom/ns#">G+</category><category domain="http://www.blogger.com/atom/ns#">Circles</category><category domain="http://www.blogger.com/atom/ns#">GooglePlus</category><title>Going in Circles with Google+</title><description>&lt;h2&gt;My Circle Problem&lt;/h2&gt;
&lt;p&gt;
Trying to create Circles in &lt;a href="http://plus.google.com/"&gt;Google+&lt;/a&gt; can get confusing. The taxonomy of relationships - or at least my relationships - is very, very complicated. Let's start with a Circle for friends - but not all friends are the same, really, so let's make that close friends and acquaintances, two Circles - then a Circle for family. But who actually treats all family members equally when it comes to sharing? Immediate family, extended family, in-laws, etc... more Circles. Now co-workers, people I met years ago at a conference, people I've never met but sometimes care what they have to share, etc...
&lt;/p&gt;
&lt;p&gt;
Relationship taxonomy is too complex! And then I have to decide, when I go to share something, is this for my close friends? My immediate family? My in-laws? Well... yes, some of them. Not all of them. But I can't be bothered to name each individual, that's what the Circles are for!
&lt;/p&gt;

&lt;h2&gt;My Circle Solution&lt;/h2&gt;
&lt;p&gt;Create Circles based on content you share, not relationships.&lt;/p&gt;

&lt;p&gt;
What does that mean? It means, think of something you share - say, vacation photos. Now make a "Vacation Photos" Circle and add to that all the people you like to share those photo with: your parents, siblings, most of your close friends, the in-laws you like, and so on. Now make one for news about your garden, your stamp collection, or whatever other hobby you have, group you are affiliated with, etc. Add people who share that hobby, affiliation, or interest. See how this goes? Repeat as necessary. Now, when you go to share, you just pick the Circle you built for that topic.
&lt;/p&gt;

&lt;p&gt;
I have one other circle, "Following" which is for all the people I want to subscribe to posts from, but probably won't share with directly. I can't see myself ever using the "My Circles" or "Extended Circles" sharing options - why not just make it public? If you "Follow" anyone like I do, and I expect anyone coming from Twitter will be into that habit, then "My Circles" or "Extended Circles" might as well be public.

&lt;h2&gt;Oh, and the redesign&lt;/h2&gt;
&lt;p&gt;
I'm the first to admit, I'm not much of a graphic artist. I always tell my project managers to hire a professional designer so we can get great looking web sites. They never listen, so I get a fair bit of design experience in the trenches. At least, I learn some of the technical side of it. I still can't get the aesthetic bits the way I want them to save my life. So, I finally sat down and redesigned the Blogger template used on this blog. The look is based on another site I'm doing for myself, my first real personal web site. I'll probably write more about that later. It's a slow work in progress. In the mean time, enjoy the new look here. Or don't. Feel free to leave comments. I won't be offended.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-6072529316322844651?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dpKQcWbjCEuELgBCoX9i72pi44w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dpKQcWbjCEuELgBCoX9i72pi44w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dpKQcWbjCEuELgBCoX9i72pi44w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dpKQcWbjCEuELgBCoX9i72pi44w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/Vve1LXWkI4E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/Vve1LXWkI4E/going-in-circles-with-google.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/07/going-in-circles-with-google.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-7423435392102660143</guid><pubDate>Thu, 30 Jun 2011 19:37:00 +0000</pubDate><atom:updated>2011-06-30T15:37:07.283-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google+</category><category domain="http://www.blogger.com/atom/ns#">Google Plus</category><category domain="http://www.blogger.com/atom/ns#">privacy</category><category domain="http://www.blogger.com/atom/ns#">Picasa</category><title>Update on Picasa album re-sharing and Google+</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-U6EQcdF3nHQ/TgzON0o0-LI/AAAAAAAACrs/ZVJuCaDqcWQ/s1600/picasa-notice.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="77" width="475" src="http://2.bp.blogspot.com/-U6EQcdF3nHQ/TgzON0o0-LI/AAAAAAAACrs/ZVJuCaDqcWQ/s320/picasa-notice.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
This is the notice displayed on &lt;a href="https://picasaweb.google.com/home"&gt;Picasa Web Albums&lt;/a&gt; since joining Google+. It reads:
&lt;/p&gt;
&lt;p&gt;
&lt;blockquote&gt;You've recently joined Google+. Note the following changes to Picasa Web Albums:
&lt;ul&gt;
    &lt;li&gt;Albums you've shared can in turn be tagged and shared by others.&lt;/li&gt;
    &lt;li&gt;For new albums, anyone an album is shared with can see who else it is shared with.&lt;/li&gt;
    &lt;li&gt;When you tag someone, they receive a notification and can see the photo and the related album.&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;/p&gt;
&lt;p&gt;
I understand that sharing transparency and re-sharing are features that make Picasa albums more social, but I would really appreciate the option to turn them off. Sometimes I want to be less social. There's already re-sharing controls for individual posts on Google+. Why do you need to open up my albums too?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-7423435392102660143?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W42Iela_QTmb6YOapLE5ylaP-cg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W42Iela_QTmb6YOapLE5ylaP-cg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W42Iela_QTmb6YOapLE5ylaP-cg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W42Iela_QTmb6YOapLE5ylaP-cg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/N5_An8HMK5k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/N5_An8HMK5k/update-on-picasa-album-re-sharing-and.html</link><author>noreply@blogger.com (Isaac Truett)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-U6EQcdF3nHQ/TgzON0o0-LI/AAAAAAAACrs/ZVJuCaDqcWQ/s72-c/picasa-notice.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/06/update-on-picasa-album-re-sharing-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-3369464627794682847</guid><pubDate>Thu, 30 Jun 2011 15:26:00 +0000</pubDate><atom:updated>2011-06-30T11:26:15.065-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">social networking</category><category domain="http://www.blogger.com/atom/ns#">Google+</category><category domain="http://www.blogger.com/atom/ns#">GooglePlus</category><category domain="http://www.blogger.com/atom/ns#">privacy</category><title>Google+ Invites: Here This Evening, Gone by Morning</title><description>&lt;p&gt;
I sent out my first invites for &lt;a href="http://plus.google.com"&gt;Google+&lt;/a&gt; last night. I posted about it and expected I'd invite a few more people in the morning, only to wake up and find the invite option was gone. &lt;a href="https://plus.google.com/107117483540235115863/posts/PhJFJqLyRnm"&gt;According to Vic Gundotra&lt;/a&gt; invites were switched off due to "insane demand." Hopefully we'll see them on again soon.
&lt;/p&gt;

&lt;p&gt;
So far, I'm quite happy with Google+. The privacy model makes sharing scope much more prominent than other social networking sites (why name names?). It's easy to tell who a post will be shared with and I can change that scope as I see fit using "circles" (a.k.a., groups, lists, etc.). +1 is already implemented, of course. I'm looking forward to trying a "hangout" group video chat once a few more of my friends are on board.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-3369464627794682847?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/M0snb-mAea6f6Bvx0WtJCwQt3Y8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M0snb-mAea6f6Bvx0WtJCwQt3Y8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/M0snb-mAea6f6Bvx0WtJCwQt3Y8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M0snb-mAea6f6Bvx0WtJCwQt3Y8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/conDd0uIxfY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/conDd0uIxfY/google-invites-here-this-evening-gone.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/06/google-invites-here-this-evening-gone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-2985774743295323367</guid><pubDate>Tue, 28 Jun 2011 19:20:00 +0000</pubDate><atom:updated>2011-06-28T16:01:39.400-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">social networking</category><category domain="http://www.blogger.com/atom/ns#">Google+</category><category domain="http://www.blogger.com/atom/ns#">Google Plus</category><category domain="http://www.blogger.com/atom/ns#">Google Profiles</category><category domain="http://www.blogger.com/atom/ns#">privacy</category><category domain="http://www.blogger.com/atom/ns#">Picasa</category><title>Google+ Me</title><description>&lt;p&gt;
I received an invite to &lt;a href="http://googleblog.blogspot.com/2011/06/introducing-google-project-real-life.html"&gt;Google+&lt;/a&gt; (Google's latest foray into social networking) this afternoon, just hours after it was announced. My first impression is that they're going to need to tighten up the default privacy settings. Just getting through the signup process meant agreeing to have my &lt;a href="http://picasaweb.google.com/"&gt;Picasa&lt;/a&gt; photos and videos displayed on my &lt;a href="http://profiles.google.com/"&gt;Google Profile&lt;/a&gt; page (which I immediately went to and turned these things off). And although my "circles" are empty initially, these are also displayed on my profile by default. Turned that off too. One thing I can't seem to turn off is that joining Google+ made it so that people I share my Picasa content with can then share that content with others. Not cool, Google. Give me back control of my content. I realize it's impossible to actually prevent my content from reaching third parties after I share it (shoulder-surfing, save, etc.) but I should have the option of whether to let other people re-share my photos and videos through Picasa.
&lt;/p&gt;
&lt;p&gt;
I'm still looking around, but I haven't found a way yet to invite anyone else to join Google+. So, unless my friends and family sign up and get invited (unlikely given past experiences) I may be alone here for quite a while. On the plus side (pun absolutely intended) it says that non-Google+ users I add to my circles will still be able to receive links to content I share, they just can't interact with it the way a Google+ user could. Oh, well.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-2985774743295323367?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Y7MJQXLGLichxHbyJrgrFLneLp0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y7MJQXLGLichxHbyJrgrFLneLp0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Y7MJQXLGLichxHbyJrgrFLneLp0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Y7MJQXLGLichxHbyJrgrFLneLp0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/sCADi0HfLoA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/sCADi0HfLoA/google-me.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>2</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/06/google-me.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-2283260498764074898</guid><pubDate>Wed, 13 Apr 2011 01:32:00 +0000</pubDate><atom:updated>2011-04-12T21:32:58.552-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">static initialization</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">main</category><title>The Main() Conspiracy</title><description>&lt;h3&gt;Typical Java&lt;/h3&gt;
&lt;p&gt;
I was browsing &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; this evening when I came across &lt;a href="http://stackoverflow.com/questions/5642802/the-program-terminate-queston"&gt; this question&lt;/a&gt;. The question itself isn't anything special, but the quote from the &lt;a href="http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html"&gt;Thread JavaDoc&lt;/a&gt; caught my eye:
&lt;/p&gt;
&lt;p&gt;
"When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which typically calls the method named main of some designated class)."
&lt;/p&gt;
&lt;p&gt;
"Typically" calls main()? I mean, sure, you could call &lt;span class="code"&gt;java SomeClassWithoutAMainMethod&lt;/span&gt; and the JVM would start up, cough, and die. But that hardly seems worth a parenthetical shout out in the JavaDocs, right? There's got to be more to it than that.
&lt;/p&gt;
&lt;h3&gt;Static Initialization&lt;/h3&gt;
&lt;p&gt;
So, how can we write a Java program that runs without a main() method ever being called? We'll need code that exists outside of a named method that we can get to run before the JVM discovers the main method is missing. What happens before main() is called? The class that is supposed to contain main() gets loaded. And how do you run code when a class is loaded? Static initialization!
&lt;/p&gt;
&lt;pre class="code"&gt;
public class Mainless {
        static {
                System.out.println("Mainless!");
                System.exit(0);
        }
}
&lt;/pre&gt;
&lt;p&gt;
And there you have it: a Java program with no main() method. The &lt;a href="http://download.oracle.com/javase/tutorial/java/javaOO/initial.html"&gt;static initialization block&lt;/a&gt; runs when the Mainless class is loaded, before the JVM tries to call main (which, you'll note, doesn't exist). "But wait," you say, "I was taught in Java 101 that every program has a main() method!" And like much of what we learn in school, that isn't strictly true. Why the conspiracy to keep Java developers writing &lt;span class="code"&gt;public static void main(String[] args)&lt;/span&gt;? Well, it does have practical uses. For example, you can't pass arguments to the static initialization block. You could set environment variables before running Mainless and access those variables, but that's just ugly. And, you have to call &lt;span class="code"&gt;System.exit()&lt;/span&gt; at some point or you'll get an error message about the missing main() method.
&lt;/p&gt;
&lt;h3&gt;The big question: why?&lt;/h3&gt;
&lt;p&gt;
But, is there any point to this? Not as far as I can tell. There's no practical use of this technique that I know of. You save a little bit of typing and get an obscure piece of code that might confuse a lot of Java developers. And I'm sure somebody, somewhere, uses this fact in an obnoxious "gotcha" interview question. I hate those. 
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-2283260498764074898?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6e1HIUAMYS-VwTD5r2L76-Y-fHA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6e1HIUAMYS-VwTD5r2L76-Y-fHA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6e1HIUAMYS-VwTD5r2L76-Y-fHA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6e1HIUAMYS-VwTD5r2L76-Y-fHA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/Ng1djQ2qwGI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/Ng1djQ2qwGI/main-conspiracy.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/04/main-conspiracy.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-4642004607145619836</guid><pubDate>Fri, 01 Apr 2011 20:30:00 +0000</pubDate><atom:updated>2011-07-14T21:42:24.968-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">April Fools' Day</category><category domain="http://www.blogger.com/atom/ns#">ChromeLite</category><category domain="http://www.blogger.com/atom/ns#">Helvetiva</category><category domain="http://www.blogger.com/atom/ns#">Voice-alyzer</category><category domain="http://www.blogger.com/atom/ns#">Meow Me Now</category><category domain="http://www.blogger.com/atom/ns#">Chromercise</category><category domain="http://www.blogger.com/atom/ns#">Autocompleter</category><category domain="http://www.blogger.com/atom/ns#">GMail Motion</category><title>In case you missed April 1st</title><description>&lt;p&gt;
In case you missed April Fools' Day today, here's a recap of some of the foolery that came my way:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mail.google.com/mail/help/motion.html"&gt;GMail Motion&lt;/a&gt; - waaaay too much work&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.chromercise.com/"&gt;Chromercise!&lt;/a&gt; - but will they actually ship the finger sweat bands?&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/1131053125/ref=pe_143810_19388080_snp_dp"&gt;Mario Puzo's Campaigns of the Civil War&lt;/a&gt; - shoddy, looks like it was thrown together at the last minute&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.chromium.org/2011/04/taking-chrome-to-lite-speeds.html"&gt;ChromeLite&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thinkgeek.com/whats-new/"&gt;ThinkGeek&lt;/a&gt; - there isn't much of a difference between the April Fools' Day gags and the real products.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://buzz.blogger.com/2011/04/google-to-acquire-blogger.html"&gt;Google to Acquire Blogger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/search?q=helvetica"&gt;[Helvetica]&lt;/a&gt; - font people are... yeah.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/intl/en/jobs/uslocations/mountain-view/autocompleter/index.html"&gt;Autocompleter&lt;/a&gt; - one job at Google I would not accept&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googlevoiceblog.blogspot.com/2011/04/introducing-voice-alyzer.html"&gt;Voice-alyzer&lt;/a&gt; - Not as good as Mail Goggles&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googlecode.blogspot.com/2011/04/sessions-updated-for-google-io-2011.html"&gt;Google I/O 2011 Sessions&lt;/a&gt; - guess I'm not missing much afterall!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://googlemobile.blogspot.com/2011/04/meow-me-now.html"&gt;Meow Me Now&lt;/a&gt; - you know someone would actually use this&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-4642004607145619836?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rk7OkU8dBrq1qjPPQxlPe6sDZGo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rk7OkU8dBrq1qjPPQxlPe6sDZGo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rk7OkU8dBrq1qjPPQxlPe6sDZGo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rk7OkU8dBrq1qjPPQxlPe6sDZGo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/5luCZ906mPw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/5luCZ906mPw/in-case-you-missed-april-1st.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/04/in-case-you-missed-april-1st.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-8760537077984263723</guid><pubDate>Sat, 05 Feb 2011 01:05:00 +0000</pubDate><atom:updated>2011-02-04T20:05:38.641-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">contract programming</category><category domain="http://www.blogger.com/atom/ns#">cofoja</category><category domain="http://www.blogger.com/atom/ns#">Google</category><title>Cofoja - Java Annotations for Contract Programming</title><description>&lt;p&gt;
This afternoon, &lt;a href="http://google-opensource.blogspot.com/2011/02/contracts-for-java.html"&gt;Google announced another open source tool for Java developers&lt;/a&gt;. From the examples they give, it looks like Contracts for Java, or "&lt;a href="http://code.google.com/p/cofoja/"&gt;cofoja&lt;/a&gt;" is assertions for abstract methods. Interesting. Looking forward to trying this on my next Java project.  
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-8760537077984263723?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CA0FLW0k4qJAEdAQd4YLYkLiW5Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CA0FLW0k4qJAEdAQd4YLYkLiW5Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CA0FLW0k4qJAEdAQd4YLYkLiW5Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CA0FLW0k4qJAEdAQd4YLYkLiW5Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/sXQ5_WLINFs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/sXQ5_WLINFs/cofoja-java-annotations-for-contract.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/02/cofoja-java-annotations-for-contract.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-779366686801566447</guid><pubDate>Thu, 03 Feb 2011 19:22:00 +0000</pubDate><atom:updated>2011-02-03T14:26:15.484-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Blogger</category><category domain="http://www.blogger.com/atom/ns#">Android</category><title>Obligatory First Post From Blogger Android App</title><description>&lt;div&gt;&lt;p&gt;Oh, right... content. Okay. I'm posting from the new Blogger Android app. I was going to link the blog announcement, but I don't see a way to add a link here. Oops.&lt;/p&gt;
&lt;p&gt;This is a picture of a door, taken while I am writing this. Wait, where is the picture going to appear in the post? I can't tell! So... this app needs work. Oh, well.&lt;/p&gt;
&lt;br/&gt;&lt;img src='http://lh5.ggpht.com/_PCMQWAik1DU/TUsAiW1gwMI/AAAAAAAACjs/cj8RcLz5gYU/1296760782001.png' /&gt;&lt;/div&gt;

&lt;p&gt;
&lt;i&gt;Update&lt;/i&gt;: Back at the desktop, here's the link to &lt;a href="http://buzz.blogger.com/2011/02/introducing-blogger-android-app.html"&gt;the new Blogger Android app&lt;/a&gt;. And it appears that pictures show up at the end of the post. Enjoy the door.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-779366686801566447?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6syMZfV91xf-9aYACUubjSsnHR4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6syMZfV91xf-9aYACUubjSsnHR4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6syMZfV91xf-9aYACUubjSsnHR4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6syMZfV91xf-9aYACUubjSsnHR4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/FMpy-ey6O6E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/FMpy-ey6O6E/obligatory-first-post-from-blogger.html</link><author>noreply@blogger.com (Isaac Truett)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_PCMQWAik1DU/TUsAiW1gwMI/AAAAAAAACjs/cj8RcLz5gYU/s72-c/1296760782001.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/02/obligatory-first-post-from-blogger.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-3399374425050976043</guid><pubDate>Wed, 26 Jan 2011 17:10:00 +0000</pubDate><atom:updated>2011-01-26T12:10:00.727-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Feedburner</category><category domain="http://www.blogger.com/atom/ns#">Twitter</category><title>public int Twitter</title><description>&lt;p&gt;
If you would like to get your public int updates via Twitter, you can now follow &lt;a href="http://twitter.com/#!/publicintblog"&gt;@publicintblog&lt;/a&gt;. In addition to the automated new post feed from &lt;a href="http://feedburner.google.com/"&gt;Feedburner&lt;/a&gt;, I may tweet other little tidbits I find that don't warrant a whole blog post.
&lt;/p&gt;
&lt;p&gt;
See you in short form.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-3399374425050976043?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/naWTUZKzA00t0nBCHaTSHhqeecE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/naWTUZKzA00t0nBCHaTSHhqeecE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/naWTUZKzA00t0nBCHaTSHhqeecE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/naWTUZKzA00t0nBCHaTSHhqeecE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/cHhkdmqbaJM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/cHhkdmqbaJM/public-int-twitter.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/01/public-int-twitter.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-1081244888968852857</guid><pubDate>Sat, 15 Jan 2011 03:52:00 +0000</pubDate><atom:updated>2011-07-14T23:03:02.122-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Body Browser</category><category domain="http://www.blogger.com/atom/ns#">WebGL</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><title>WebGL on Cr-48</title><description>&lt;p&gt;
Google released the first Chrome OS updates of 2011 to the Cr-48 today. The new version on the development channel includes Chrome browser version 10.0.634.1. Chrome 10 has (among other new features) WebGL support, which I've been eager to try on the Cr-48. The results, I'm afraid, have been disappointing so far.
&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://webglsamples.googlecode.com/hg/aquarium/aquarium.html
"&gt;WebGL Aquarium&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
If you've seen WebGL, then you've probably seen this demo. You've probably also seen it produce surprising frame rates for browser-based 3D graphics. The hardware in the Cr-48, I suspect, just isn't up to the job. Even with only one fish in the tank, I got a depressing one frame per second. I think one was being generous.
&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://bodybrowser.googlelabs.com/body.html#ui=1,0&amp;opa=s:0.67,m:1,sk:1,c:1,o:1,ci:1,n:1&amp;sel=&amp;lab=&amp;nav=-2.97,136.8,160"&gt;Body Browser&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
I love this one - just not on the Cr-48. The app isn't just slow, like the aquarium demo, it's unusable. But definitely check it out for yourself if you haven't already. It's very cool.
&lt;/p&gt;


&lt;p&gt;
I am hopeful that WebGL performance on the Cr-48 will improve. Chrome has already done a lot to improve browser performance and I expect that will continue. The Cr-48 will probably never run the next generation of web-based 3D games, but I expect that commercial Chrome OS products will have more powerful hardware. 
&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-1081244888968852857?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6uLXmQolcqwx-crzcNSRUeAqjpk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6uLXmQolcqwx-crzcNSRUeAqjpk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6uLXmQolcqwx-crzcNSRUeAqjpk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6uLXmQolcqwx-crzcNSRUeAqjpk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/tq7vN43TaBA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/tq7vN43TaBA/webgl-on-cr-48.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2011/01/webgl-on-cr-48.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-6890141350861232103</guid><pubDate>Wed, 15 Dec 2010 01:25:00 +0000</pubDate><atom:updated>2010-12-14T20:27:20.232-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><title>Google Chrome OS - Not Everything to Everyone</title><description>&lt;p&gt;
Over the weekend I read a few articles on why &lt;a href="http://www.google.com/chromeos/"&gt;Google's Chrome OS&lt;/a&gt; will be (or even already is!) a "failure." The common thread running through these supposedly fatal flaws was a misconception of the fundamental reasons for Chrome OS. It doesn't do everything because it doesn't need to do everything. 
&lt;/p&gt;

&lt;h3&gt;A 98% solution&lt;/h3&gt;

&lt;p&gt;
I have been &lt;a href="http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html"&gt;using a Chrome OS Cr-48 netbook as my primary computer&lt;/a&gt; since I turned it on Thursday evening. I spend most of my personal computer time on the web. At a guess, I can probably meet 98% of my computing needs in the cloud so adjusting to the web-focused OS has been easy. I check email, catch up on the news, keep my calendar, grab a weather forecast, listen to music, and even place phone calls online. If you spend most of your computer time playing the latest first-person shooters, then Chrome OS is probably not a good choice for your primary computer.
&lt;/p&gt;

&lt;h3&gt;No Drive&lt;/h3&gt;

&lt;p&gt;
The Cr-48 has no hard disk or DVD drive, which I've seen decried as a critical deficiency. This is only reference hardware, of course, but I have no reason to believe that a commercial product running Chrome OS would need to have them either. There is a small solid-state drive that web apps can use for local/offline storage. There's also an SD card slot that users can fill to store  downloads. I could see a user possibly wanting to pop in a DVD with home videos or photos to upload or watch, and that may be supported eventually with a USB DVD drive. Cutting out these non-essential drives will make Chrome OS products smaller and less expensive, which seem like obvious wins to me.
&lt;/p&gt;

&lt;h3&gt;Chrome OS vs. Android&lt;/h3&gt;

&lt;p&gt;
The fact that Google is backing two separate, yet in some ways similar, operating systems seems to confuse some people. This is in part because the two overlap: Android typically runs on phones and tablets; Chrome OS is designed to run on anything from desktop PCs to tablets.
&lt;/p&gt;

&lt;p&gt;
I've had an Android phone for a few months. Before the Cr-48 came along, I would check email, Google Reader, Facebook, and run the occasional Google search on my phone. The Cr-48 running Chrome OS has certainly stolen much of that activity. It's easy to have the netbook sitting next to me while I work, and I can keep it within reach on the coffee table if I'm watching TV or playing video games. Each device (and OS) has its place and I appreciate having the choice of which to use when their features ovarlap.
&lt;/p&gt;

&lt;h3&gt;Chrome OS &amp;lt;3 Android&lt;/h3&gt;

&lt;p&gt;
What I would love to see is more interaction between Android and Chrome OS devices. &lt;a href="https://chrome.google.com/extensions/detail/oadboiipflhobonjjffjbfekfjcgkhco"&gt;Chrome to Phone&lt;/a&gt; is a great start. But imagine if you could sit down at any Chrome OS computer anywhere in the world - say, a friend's netbook or a kiosk in a public library - and connect your phone to the USB port. The phone would prompt you to authorize the connection, and then start acting as a proxy for Chrome OS. The computer would treat you as a guest, preventing anything you do from leaving a mark on the computer after you log off and your phone, which has already authenticated your Google account, is handling all the sensitive transactions and keeping your passwords safe. If the two devices were programmed to work together properly, things like OAuth attempts could be  intercepted on the phone. Instead of typing a password on the computer you're using as a guest, you would type it on your trusted Android device. Any information you access, such as a private email, would of course still reach the computer and be vulnerable if the computer has been compromised. Or if someone is standing behind you. But that seems a lot safer, to me, than typing your password into a shared or public computer.
&lt;/p&gt;

&lt;p&gt;
Let's take that idea into the business world. Now, instead of you not trusting the computer it's the computer that doesn't trust you. If you could use your Android phone (or other device) as an access card, then any computer in the office could be your computer. No more suits walking the halls carrying laptops! Your IT department installs security software on the company's Android devices and Chrome OS workstations so that you can plug into any computer in the office and pick up working on that proposal document where you left off at your desk. When you unplug your phone, the computer locks up again and forgets about you before you've turned around. Your document, instead of being on the phone or on a hard disk in your cubicle, is tucked away safely in your company's private cloud.
&lt;/p&gt;

&lt;p&gt;
But back to reality, here are a few more things I've been doing with Chrome OS:
&lt;/p&gt;

&lt;h3&gt;Jailbreak!&lt;/h3&gt;

&lt;p&gt;
I found the &lt;a href="http://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information"&gt;secret switch&lt;/a&gt; in the battery compartment. I flipped it to see what would happen, but I haven't gone all the way to turning on developer mode yet. I'm still enjoying seeing what it can do right out of the box.
&lt;/p&gt;

&lt;h3&gt;Apps&lt;/h3&gt;

&lt;p&gt;
I installed a few apps from the &lt;a href="https://chrome.google.com/webstore"&gt;Chrome Web Store&lt;/a&gt;, which is how you add features to your Chrome OS experience (short of developer mode; see above).
&lt;/p&gt;

&lt;p&gt;
I've found &lt;a href="https://chrome.google.com/webstore/detail/kjebfhglflhjjjiceimfkgicifkhjlnm"&gt;Scratchpad&lt;/a&gt; to be useful - I have been using it to keep notes on what I want to try on the Cr-48 and what I want to write about here.
&lt;/p&gt;

&lt;p&gt;
Streaming HD radio with the &lt;a href="http://www.npr.org/webapp"&gt;NPR App&lt;/a&gt; produced mixed results. The app is slow to respond to clicks and it takes too many clicks to do simple things, like start playing my local NPR station even after I'd added it to my "favorites." It also doesn't handle having the lid closed while live streaming. When I open up again, it starts playing for a while (clearing the buffer, I assume) and then it just stops. I have to refresh the page to get it started again. On a positive note, streaming audio didn't seem to interfere with other activities, like checking email and editing documents. Chrome OS handled multitasking well.
&lt;/p&gt;

&lt;h3&gt;Writing more&lt;/h3&gt;

&lt;p&gt;
I'm sure it says something about how much I like using the Cr-48 that I've written more blog posts on it in the last week than I usually write in a month. It isn't just having something to write about; the Cr-48 is easy and convenient to write with.
&lt;/p&gt;

&lt;p&gt;
I'm still hoping to find a screen reader that works on Chrome OS, and I need to try video chat. Any other suggestions?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-6890141350861232103?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pRFBjWkkkgv2hkUIwVdvexZR75c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pRFBjWkkkgv2hkUIwVdvexZR75c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pRFBjWkkkgv2hkUIwVdvexZR75c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pRFBjWkkkgv2hkUIwVdvexZR75c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/snnXeKW0-DQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/snnXeKW0-DQ/google-chrome-os-not-everything-to.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/12/google-chrome-os-not-everything-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-3059598539457764228</guid><pubDate>Fri, 10 Dec 2010 22:24:00 +0000</pubDate><atom:updated>2010-12-10T17:24:45.046-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><title>Cr-48: Day 2 with my Chrome OS netbook</title><description>&lt;p&gt;
As I wrote yesterday, &lt;a href="http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html"&gt;I have a new Cr-48&lt;/a&gt; netbook as part of &lt;a href="http://www.google.com/chromeos/pilot-program-cr48.html"&gt;Google's Chrome OS pilot program&lt;/a&gt;. I've tried several new things with my Cr-48 today, which I want to share with you all.
&lt;/p&gt;

&lt;h3&gt;Basic Black++&lt;/h3&gt;
&lt;p&gt;
You've probably seen already that the Cr-48 is black (try the link above if you haven't seen it yet). I have nothing against black. Black is cool. And the Cr-48 is &lt;em&gt;very&lt;/em&gt; black. Google kindly included a colorful sticker to add a little style to that very black black. That sticker and a couple of others I had lying around personalize my new toy nicely. (If anyone from Google is reading: I need more Googley stickers, and I won't even charge you for the ad space! May I humbly suggest one that reads "Ask me about Chrome OS"?)
&lt;/p&gt;

&lt;img src="http://lh4.ggpht.com/_PCMQWAik1DU/TQKW7ujTx9I/AAAAAAAACi4/XVcBXONwMIQ/s288/IMAG0093.jpg" /&gt;

&lt;p&gt;
This isn't a great picture because: a) I'm not a great photographer and b) it was taken with a camera phone. I uploaded it from my Android phone directly to &lt;a href="http://picasaweb.google.com/"&gt;Picasa&lt;/a&gt; and did what I could with Picnik to crop and clean it up on my Cr-48.
&lt;/p&gt;

&lt;h3&gt;External monitor wonkiness&lt;/h3&gt;
&lt;p&gt;
I hooked up an old monitor and a couple of USB peripherals to my Cr-48 to see how those devices would work with it.
&lt;/p&gt;

&lt;p&gt;
The monitor worked, sorta. I plugged it in and hit the "mirroring" key, which made the display on my Cr-48 go blank. But the image that appeared on my monitor wasn't quite right. I expected stretching or a letterbox since the monitor wasn't widescreen. What I got was a letterbox copy of the Cr-48's display, but it was vertically aligned on the bottom of the screen, instead of the middle. It also looked pinched. A while later I shutdown and stepped away from the Cr-48, leaving the monitor hooked up. When I powered up again, both the Cr-48 and the monitor displayed the screen image, and the monitor was adjusted properly for the different aspect ratio. This is more like it! But I couldn't leave well enough alone, so I unplugged the monitor and hit the mirroring key again. The display on the Cr-48 came back. I plugged in the monitor and hit the mirroring key yet again. The display switched to the monitor. I continued to fiddle with it for a while but I couldn't figure out how to get them both to display again without shutting down the Cr-48. So, this feature needs a little tweaking.

&lt;p&gt;
The mouse worked exactly as expected. No drivers to install.
&lt;/p&gt;

&lt;p&gt;
I was hoping that I could at least browse audio/visual media with the USB card reader, but no such luck. It didn't seem to recognize the device at all. Not sure if this is supposed to be supported yet. The Cr-48 does include an SD card reader, which is probably the most common form factor in use today. I would guess that's all the card reading most users would need.
&lt;/p&gt;

&lt;h3&gt;Watching high def video&lt;/h3&gt;
&lt;p&gt;
I visited &lt;a href="http://www.thedailyshow.com/"&gt;The Daily Show&lt;/a&gt; to try high definition video streaming. The playback was a little choppy in places, but I don't know if that was down to hardware or software. After I had the video full-screen for a while, the playback controls stopped responding to clicks and I couldn't pause. I alt-tabbed out and the audio kept playing, but then I couldn't get back in to the window with the full-screen video. The tab that launched the video just showed a black box, where I would have expected the video to return to it's non-full-screen state. Closing that tab stopped the audio playback.
&lt;/p&gt;

&lt;p&gt;
I also watched &lt;a href="http://www.youtube.com/watch?v=uQzAUaZ26co"&gt;Chrome Event 12/07/2010&lt;/a&gt; on &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt;. That worked well.
&lt;/p&gt;

&lt;p&gt;
And even though I had already read that it wouldn't work, I went to &lt;a href="http://www.netflix.com/"&gt;Netflix&lt;/a&gt; to try streaming a movie. They don't support Chrome OS yet. I have heard that there's an Android streaming solution in the works, which I can't wait to try.
&lt;/p&gt;

&lt;h3&gt;Best feature ever&lt;/h3&gt;
&lt;p&gt;
I love this one: pressing ctrl+alt+/ opens an on screen keyboard. Big deal, right? It isn't like this thing has a touchscreen (or does it...? I haven't actually touched the screen). The cool part is that the labels on the keys change as you press and release the modifier keys (shift, ctrl, alt). That is just so awesomely useful. Why doesn't every application do that? Note to Google: ctrl+alt+c needs more cowbell.
&lt;/p&gt;


&lt;h3&gt;Chrome Web Store&lt;/h3&gt;
&lt;p&gt;
I have looked at the &lt;a href="https://chrome.google.com/webstore?hl=en-US"&gt;Chrome Web Store&lt;/a&gt; a couple of times and even installed an app from it, but I haven't really used the store enough to give a reasonable evaluation. Maybe I'll be able to do another post about that this weekend.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-3059598539457764228?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3Q_99eloZTRPEiQ02EPgbvgG-Ic/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3Q_99eloZTRPEiQ02EPgbvgG-Ic/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3Q_99eloZTRPEiQ02EPgbvgG-Ic/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3Q_99eloZTRPEiQ02EPgbvgG-Ic/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/LnJRoLQ8-VY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/LnJRoLQ8-VY/cr-48-day-2-with-my-chrome-os-netbook.html</link><author>noreply@blogger.com (Isaac Truett)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_PCMQWAik1DU/TQKW7ujTx9I/AAAAAAAACi4/XVcBXONwMIQ/s72-c/IMAG0093.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/12/cr-48-day-2-with-my-chrome-os-netbook.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-171398700916760872</guid><pubDate>Fri, 10 Dec 2010 01:32:00 +0000</pubDate><atom:updated>2010-12-10T17:26:51.631-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google Chrome Browser</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><title>Got my Chrome Pilot's License</title><description>&lt;p&gt;
I'm writing this post from my new &lt;a href="http://www.google.com/chromeos/pilot-program.html"&gt;Cr-48 Chrome OS netbook&lt;/a&gt;. I love it. It's very light (3.8 lbs, according to &lt;a href="http://www.google.com/chromeos/pilot-program-cr48.html"&gt;the pilot program's website&lt;/a&gt;). The keyboard feels good; the individual keys are large, which is made possible by the removal of the function keys, the "lock" keys, the number pad, and other non-essentials. The screen is bright. I'm not thrilled with the touchpad yet, but I always need a while to get used to them.
&lt;/p&gt;
&lt;p&gt;
But that's all hardware. What about the software? Well, it's Chrome. After logging in you see the &lt;a href="http://www.google.com/chrome"&gt;Google Chrome browser&lt;/a&gt;. That's where I spend most of my time anyway, so it's familiar and intuitive to use for me. Chrome OS even imported all of my bookmarks, extensions, etc. that I sync on my other computers running the Chrome browser.
&lt;/p&gt;
&lt;p&gt;
I'm looking forward to exploring Chrome OS further. If anyone from Google is reading: thank you!
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; See what I had to say after &lt;a href="http://publicint.blogspot.com/2010/12/cr-48-day-2-with-my-chrome-os-netbook.html"&gt;day two with my Cr-48&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-171398700916760872?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xxv8HvAk2t_TyE9mIZa6stjMdIo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xxv8HvAk2t_TyE9mIZa6stjMdIo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xxv8HvAk2t_TyE9mIZa6stjMdIo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xxv8HvAk2t_TyE9mIZa6stjMdIo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/QuO--e5coqI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/QuO--e5coqI/got-my-chrome-pilots-license.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>2</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-1091288308555609774</guid><pubDate>Thu, 21 Oct 2010 21:30:00 +0000</pubDate><atom:updated>2010-10-22T08:50:16.337-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GAE</category><category domain="http://www.blogger.com/atom/ns#">GWT</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">GPE</category><category domain="http://www.blogger.com/atom/ns#">Google App Engine</category><category domain="http://www.blogger.com/atom/ns#">Google Web Toolkit</category><category domain="http://www.blogger.com/atom/ns#">Richmond JUG</category><category domain="http://www.blogger.com/atom/ns#">Google Plugin for Eclipse</category><title>Richmond Java User Group - October</title><description>&lt;div&gt;
I gave a presentation on &lt;a href="http://code.google.com/p/webtoolkit/"&gt;GWT&lt;/a&gt; at the &lt;a href="http://www.richmondjug.com/"&gt;Richmond JUG&lt;/a&gt; last night. There were about 20 people in attendance. Apart from some technical difficulties while demonstrating debugging in Development Mode, everything went well. We looked at the Google Plugin for Eclipse, some example GWT code created by the New Web Application wizard, and also briefly discussed Google App Engine.
&lt;/div&gt;

&lt;div&gt;
I enjoyed having a chance to speak about a subject that is very exciting for me. I want to thank Remi Pelletier, Chris Allport, and the rest of the RJUG steering committee for organizing this and other RJUG events, and giving me a chance to speak. Thanks also to everyone who attended, listened, and asked questions. 
&lt;/div&gt;

&lt;div&gt;
I have granted access on Google Docs to &lt;a href="https://docs.google.com/present/view?id=0Ae51rFz0ggSfZGZyamdiMjlfNzlmZDh0anFjZw&amp;hl=en&amp;authkey=CIiBkfMC"&gt;a copy of the presentation&lt;/a&gt; I gave for anyone who wants to see it.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-1091288308555609774?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KysOm1EZCEWBGDq_xjxV3ojf5LY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KysOm1EZCEWBGDq_xjxV3ojf5LY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KysOm1EZCEWBGDq_xjxV3ojf5LY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KysOm1EZCEWBGDq_xjxV3ojf5LY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/XfVuSNcL1rs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/XfVuSNcL1rs/i-gave-presentation-on-gwt-at-richmond.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/10/i-gave-presentation-on-gwt-at-richmond.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-826021303239124557</guid><pubDate>Sat, 26 Jun 2010 01:08:00 +0000</pubDate><atom:updated>2011-09-19T14:48:16.326-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android Scripting Environment</category><category domain="http://www.blogger.com/atom/ns#">GoogleCL</category><category domain="http://www.blogger.com/atom/ns#">Google CL</category><category domain="http://www.blogger.com/atom/ns#">command line</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">scripting</category><title>Build a Talking Calendar with GoogleCL and Android Scripting Environment</title><description>&lt;p&gt;At the end of my post on how to &lt;a href="http://publicint.blogspot.com/2010/06/setup-googlecl-on-winxp.html"&gt;Setup GoogleCL on WinXP&lt;/a&gt; I joked about running &lt;a href="http://code.google.com/p/googlecl/"&gt;GoogleCL&lt;/a&gt;, Google's new command line tool for accessing Google service, on the Android OS. Trying to make that joke a reality, I found the &lt;a href="http://code.google.com/p/android-scripting/"&gt;Android Scripting Environment&lt;/a&gt; project which allows running Python scripts on Android - step one: accomplished. &lt;/p&gt;&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; this is not for the faint of heart. The instructions that follow will require you to not only install software on your Android device, but also to download &lt;span style="text-decoration:line-through"&gt;and modify Python&lt;/span&gt; source code. I will assume that you are capable of using SVN to get source code from code.google.com &lt;span style="text-decoration:line-through"&gt;and applying a .patch file&lt;/span&gt;. And you'll probably end up having to type on a really tiny keyboard at some point. Don't say I didn't warn you. &lt;/p&gt;&lt;h2&gt;Install Android Scripting Environment (ASE)&lt;/h2&gt;&lt;p&gt;The easiest way to install ASE is to open up the &lt;a href="http://code.google.com/p/android-scripting/"&gt;ASE home page&lt;/a&gt; on your PC and scan the barcode. &lt;/p&gt;&lt;h2&gt;Hack GoogleCL&lt;/h2&gt;&lt;h3&gt;Note: this change is now in trunk and won't be necessary in the 0.9.8 release. &lt;/h3&gt;&lt;p&gt;Now grab the source code for GoogleCL (&lt;a href="http://code.google.com/p/googlecl/source/checkout"&gt;see here&lt;/a&gt;). &lt;/p&gt;&lt;p class="oldVersion"&gt;I needed to apply a small patch to get my setup to work with the 0.9.7 release. &lt;/p&gt;&lt;h3 class="oldVersion"&gt;The Patch&lt;/h3&gt;&lt;pre class="oldVersion code" style="font-size:0.7em"&gt;Index: src/googlecl/__init__.py
===================================================================
--- src/googlecl/__init__.py (revision 299)
+++ src/googlecl/__init__.py (working copy)
@@ -156,7 +156,7 @@
   import pickle
   token_path = os.path.join(GOOGLE_CL_DIR, TOKENS_FILENAME_FORMAT % user)
   if os.path.exists(token_path):
-    with open(token_path, 'r') as token_file:
+    with open(token_path, 'rb') as token_file:
       token_dict = pickle.load(token_file)
     try:
       token = token_dict[service.lower()]
@@ -184,7 +184,7 @@
   token_path = os.path.join(GOOGLE_CL_DIR, TOKENS_FILENAME_FORMAT % user)
   success = False
   if os.path.exists(token_path):
-    with open(token_path, 'r+') as token_file:
+    with open(token_path, 'rb+') as token_file:
       token_dict = pickle.load(token_file)
       try:
         del token_dict[service.lower()]
@@ -236,12 +236,12 @@
   import stat
   token_path = os.path.join(GOOGLE_CL_DIR, TOKENS_FILENAME_FORMAT % user)
   if os.path.exists(token_path):
-    with open(token_path, 'r') as token_file:
+    with open(token_path, 'rb') as token_file:
       token_dict = pickle.load(token_file)
   else:
     token_dict = {}
   token_dict[service] = token 
-  with open(token_path, 'w') as token_file:
+  with open(token_path, 'wb') as token_file:
     # Ensure only the owner of the file has read/write permission
     os.chmod(token_path, stat.S_IRUSR | stat.S_IWUSR)
     pickle.dump(token_dict, token_file)
&lt;/pre&gt;&lt;p class="oldVersion"&gt;I made it small on purpose because it's hard to read anyway. Hopefully, this way you'll be able to select it all and copy it easily. Apply the patch to your GoogleCL code. &lt;/p&gt;&lt;p class="oldVersion"&gt;The patch makes GoogleCL open the auth token file in binary mode. I needed this because later I'll be copying a token file from my desktop to my phone. Without the patch, the phone rejected token the file. &lt;/p&gt;&lt;h2&gt;Install GoogleCL&lt;/h2&gt;&lt;p&gt;Now you need to copy your GoogleCL source onto the phone. Your Android phone may vary. On mine, I just connect to my desktop computer via USB and select "Disk Drive" as the USB connection type. This mounts the phone's storage as two removable disks. You can also remove the SD card from your phone and put it in a reader connected to your computer, since it's the card we're putting files on. &lt;/p&gt;&lt;p&gt;Find ase/extras/python/ on your SD card. This directory should contain a number of Python modules already, such as gdata and xml. Copy your googlecl/src/googlecl in next to them. Also copy googlecl/src/google to ase/scripts/google.py. You'll use this later when you write your talking calendar scripts. &lt;/p&gt;&lt;h2&gt;Write a Script to Call GoogleCL&lt;/h2&gt;&lt;p&gt;This script changes your HOME dir to /sdcard so that GoogleCL can write your .googlecl configuration file. I wasn't able to figure out how to let GoogleCL write to the default HOME location. The other settings are what ASE uses when it runs Python scripts. I don't know how many of them are required to actually make this work, and I haven't felt like fiddling with it too much since it's working. &lt;/p&gt;&lt;p&gt;Replace &lt;b&gt;[USERNAME]&lt;/b&gt; with your Google account username and save it as ase/scripts/calendar_today.sh. &lt;/p&gt;&lt;pre class="code"&gt;#!/bin/bash 
export HOME=/sdcard 
export TEMP="/sdcard/ase/extras/pythontmp" 
export PYTHONHOME="/data/data/com.google.ase/python" 
export PYTHONPATH="/sdcard/ase/extras/python:/sdcard/ase/scripts/"
/data/data/com.google.ase/python/bin/python /sdcard/ase/scripts/google.py 
    --user [USERNAME] calendar list --date `date +%Y-%m-%d`
&lt;/pre&gt;&lt;h2&gt;Make It Talk&lt;/h2&gt;&lt;p&gt;I love this part because it's so easy with Android. This script calls the one above and passes the output to the phone's text-to-speech service. Save it as ase/scripts/say_calendar.py. &lt;/p&gt;&lt;pre class="code"&gt;import android 
import subprocess  
p = subprocess.Popen(
        ['/system/bin/sh',  '/sdcard/ase/scripts/calendar_today.sh'],
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE)
output, errors = p.communicate()
print errors 
print output 
droid = android.Android() 
droid.ttsSpeak(output)
&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Important Note for Windows Users:&lt;/b&gt; be sure to convert any files written on Windows to UNIX line endings before copying them to your phone. If you need to, you can also open up the files on your phone and remove the extra line end characters there. ASE has a file editor built in and I use ASTRO for editing other files. &lt;/p&gt;&lt;h2&gt;Preauthentication&lt;/h2&gt;&lt;p&gt;I couldn't get the GoogleCL OAuth process to work on my phone. When I returned to ASE from completing the auth process in the browser the script had already stopped running, interrupting the authentication. I got around that by preparing a auth token file on my desktop and copying it to the phone. &lt;/p&gt;&lt;p&gt;Using your modified copy of GoogleCL on the desktop, authenticate to each of the services you want to use from your phone. Then take the access_tok_[username] file from the .googlecl directory under your home directory and put that file in /sdcard/.googlecl/ on your phone. &lt;/p&gt;&lt;p&gt;Dismount your phone's drives from your desktop, or reinstall the SD card in your phone. &lt;/p&gt;&lt;h2&gt;Make It So&lt;/h2&gt;&lt;p&gt;Now, assuming you've followed my instructions exactly and I haven't left out anything important, you should be able to: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Open up ASE on your phone&lt;/li&gt;
&lt;li&gt;Select Menu-&gt;View-&gt;Interpreters&lt;/li&gt;
&lt;li&gt;Select Menu-&gt;Add-&gt;Python&lt;/li&gt;
&lt;li&gt;Press back to return to the list of scripts&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You should see a number of scripts listed, including the ones you just wrote. Select say_calendar.py. Your calendar entries for today should be displayed and the phone should speak them soon after. Now, it may not sound the way you expect - the TTS isn't perfect. But I think that's pretty good for a few minutes setting up some free scripting tools. &lt;/p&gt;&lt;p&gt;I would like to extend a very big thank you to Jason Holt and Tom Miller. Their encouragement and advice made this possible. Thanks, guys. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-826021303239124557?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E9wucHW2axcRk7P9Eic2eOoI6oE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E9wucHW2axcRk7P9Eic2eOoI6oE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E9wucHW2axcRk7P9Eic2eOoI6oE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E9wucHW2axcRk7P9Eic2eOoI6oE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/xScUcD7XwDg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/xScUcD7XwDg/build-talking-calendar-with-googlecl.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>6</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/06/build-talking-calendar-with-googlecl.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-2568309914985828504</guid><pubDate>Mon, 21 Jun 2010 20:04:00 +0000</pubDate><atom:updated>2010-10-27T15:04:29.532-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GoogleCL</category><category domain="http://www.blogger.com/atom/ns#">Google CL</category><category domain="http://www.blogger.com/atom/ns#">command line</category><category domain="http://www.blogger.com/atom/ns#">scripting</category><title>Fixing a bad habit with GoogleCL</title><description>&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;
I have a bad habit to confess. When I'm on the telephone and I need to write something down, I don't reach for paper and pencil. Instead, I open Notepad. I take my notes and save the file on my desktop where I can easily find it later. Information preserved! But that file is just sitting on my hard drive on my home PC. For a modern, cloud-connected individual such as myself, this is bad. I can't read that note from my Android phone, from my laptop, or even from the PC in the other room. Because it's on &lt;i&gt;that&lt;/i&gt; hard drive.
&lt;/p&gt;
&lt;p&gt;
This isn't long-term storage. I usually don't need the notes for long and I trash them within a few hours or days. If they have information of greater value, I'll copy the text into Google Docs where I can get it later. But what if I need that file before it gets deleted and I'm not sitting at my computer?
&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;
Sure, I could open up Chrome, navigate to Google Docs, and create a new document to take my notes. But that takes a lot longer than win+r &gt; notepad. Enter GoogleCL:
&lt;/p&gt;
&lt;p class="code"&gt;
google docs edit --format "txt" --editor "notepad" --title "notes"
&lt;/p&gt;
&lt;p&gt;
On Friday I wrote about &lt;a href="/2010/06/setup-googlecl-on-winxp.html"&gt;setting up GoogleCL on Windows&lt;/a&gt;. After that setup, I can use the above command to edit a text file named "notes" that resides in Google Docs. The file is automatically downloaded and displayed in Notepad or any other editor. After saving my changes and closing Notepad, the file is uploaded to Google Docs again. Pretty slick.
&lt;/p&gt;
&lt;p&gt;
Now I just need to turn that command into something more manageable.
&lt;/p&gt;
&lt;p class="code"&gt;
@ECHO OFF&lt;br /&gt;
SET filename=%*&lt;br /&gt;
&lt;br /&gt;
IF "%filename%" EQU "" (&lt;br /&gt;
 ECHO File name: &lt;br /&gt;
 SET /p filename=&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
google docs edit --format "txt" --editor "notepad" --title "%filename%"
&lt;/p&gt;
&lt;p&gt;I called it "gd.cmd" -- "gd" for "Google Docs" should be quick to type and easy to remember. That script will take an argument for the file name and even prompt me if I don't give a file name initially. You can change the --editor option and even the --format if you don't like plain text.
&lt;/p&gt;
&lt;p&gt;There's also a --folder option which I expected would let me keep my notes in a folder in Google Docs. Well, it does look in that folder but if it doesn't find the file, it will create the file &lt;i&gt;outside&lt;/i&gt; of the folder, so that next time it still won't find it! I opened &lt;a href="http://code.google.com/p/googlecl/issues/detail?id=133"&gt;issue #133&lt;/a&gt; to see about fixing that. 
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-2568309914985828504?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7sMdbUXLvOTbj1w2dgxWDDEAHrc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sMdbUXLvOTbj1w2dgxWDDEAHrc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7sMdbUXLvOTbj1w2dgxWDDEAHrc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sMdbUXLvOTbj1w2dgxWDDEAHrc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/Y6-GUfkUpg0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/Y6-GUfkUpg0/fixing-bad-habit-with-googlecl.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/06/fixing-bad-habit-with-googlecl.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-2295771625186952719</guid><pubDate>Fri, 18 Jun 2010 20:30:00 +0000</pubDate><atom:updated>2010-10-27T15:04:59.750-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GoogleCL</category><category domain="http://www.blogger.com/atom/ns#">Google CL</category><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">command line</category><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">WinXP</category><category domain="http://www.blogger.com/atom/ns#">Windows XP</category><title>Setup GoogleCL on WinXP</title><description>&lt;p style="font-style:italic"&gt;UPDATE: These instructions were originally written for version 0.9.5. I have started updating them with differences found in the newer 0.9.7 version of GoogleCL. If you find more differences I should mention, please leave a comment. Thanks!
&lt;p&gt;
&lt;a href="http://google-opensource.blogspot.com/2010/06/introducing-google-command-line-tool.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+GoogleOpenSourceBlog+(Google+Open+Source+Blog)"&gt;Google just announced their new command line utility for Google services&lt;/a&gt;. The &lt;i&gt;&lt;a href="http://code.google.com/p/googlecl/"&gt;GoogleCL&lt;/a&gt;&lt;/i&gt; project is an Open Source project hosted on &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt;. Although the project page is obviously slanted toward Linux, I figured it's Python so it shouldn't be too hard to run on Windows too. Here's what I had to do to get things setup on Windows XP Professional SP3.
&lt;/p&gt;
&lt;h2&gt;First some downloads:&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://python.org/download/"&gt;Python&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/gdata-python-client/"&gt;Google Data API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/googlecl/"&gt;Google Command Line&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Note: GoogleCL requires Python 2.5 or 2.6.
&lt;/p&gt;
&lt;h2&gt;Install Python&lt;/h2&gt;
&lt;p&gt;
Run the .msi file to install Python. I installed to &lt;span class="code"&gt;C:\dev\Python\Python25&lt;/span&gt; and I added &lt;span class="code"&gt;C:\dev\Python\Python25&lt;/span&gt; to my &lt;span class="code"&gt;PATH&lt;/span&gt; for easier command line access to &lt;span class="code"&gt;python.exe&lt;/span&gt;.
&lt;/p&gt;
&lt;h2&gt;Install Google Data API&lt;/h2&gt;
&lt;p&gt;
I unzipped &lt;span class="code"&gt;gdata-2.0.10.zip&lt;/span&gt; to &lt;span class="code"&gt;C:\dev\Python\gdata-2.0.10&lt;/span&gt; and ran &lt;span class="code"&gt;setup.py install&lt;/span&gt; from &lt;span class="code"&gt;C:\dev\Python\gdata-2.0.10&lt;/span&gt;. No problems encountered there.
&lt;/p&gt;
&lt;p class="code"&gt;
C:\dev\Python\gdata-2.0.10&gt;setup.py install
&lt;/p&gt;
&lt;h2&gt;Install GoogleCL&lt;/h2&gt;
&lt;p&gt;
I unzipped &lt;span class="code"&gt;googlecl-0.9.5.tar.gz&lt;/span&gt; to &lt;span class="code"&gt;C:\dev\Python\googlecl-0.9.5&lt;/span&gt; and ran &lt;span class="code"&gt;setup.py install&lt;/span&gt; from &lt;span class="code"&gt;C:\dev\Python\googlecl-0.9.5&lt;/span&gt;. Again, no problems.
&lt;/p&gt;
&lt;p class="code"&gt;
C:\dev\Python\googlecl-0.9.5&gt;setup.py install
&lt;/p&gt;
&lt;h2&gt;Write a "google" script&lt;/h2&gt;
&lt;p&gt;
Next I wanted a "google" command that would be as easy to run from the Windows command line as the Linux examples were. I wrote this google.cmd file and put it on my PATH:
&lt;/p&gt;
&lt;p class="code"&gt;
@echo off&lt;br /&gt;
SET googlecl_home=C:\dev\Python\googlecl-0.9.5\src&lt;br /&gt;
&lt;br /&gt;
python %googlecl_home%\google %*&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Now, running &lt;span class="code"&gt;google docs list&lt;/span&gt; got me a prompt for my user name. But instead of prompting for a password, GoogleCL uses OAuth. This is the message I got:
&lt;/p&gt;
&lt;h3&gt;Note: this was true as of GoogleCL v0.9.5 - &lt;a href="#0.9.7BrowserAuth"&gt;see below for v0.9.7&lt;/a&gt;&lt;/h3&gt;
&lt;p class="code oldVersion"&gt;
(Hint: You can automatically launch your browser by adding "auth_browser = &lt;browser&gt;" to your config file under the GENERAL section, or define the BROWSER environment variable.)&lt;br /&gt;
&lt;br /&gt;
Please log in and/or grant access via your browser at&lt;br /&gt;
https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=[token removed]&lt;br /&gt;
then hit enter.
&lt;/p&gt;
&lt;p class="oldVersion"&gt;
Well, obviously that wouldn't do. &lt;span style="text-decoration: line-through"&gt;It would have been nice if it had told me where to find that config file, but it wasn't hard to locate.&lt;/span&gt; As alert reader Brian B. pointed out, the first time you run GoogleCL it will try to locate the config file and if it doesn't find one, it will tell you the path and create the file for you. Mine was in &lt;span class="code"&gt;C:\Documents and Settings\itruett\.googlecl&lt;/span&gt;.
&lt;/p&gt;
&lt;p class="oldVersion"&gt;
The path for my browser, &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;, is a little less intuitive. I found it, and added this to my GoogleCL config file:
&lt;/p&gt;
&lt;p class="code oldVersion"&gt;
auth_browser = C:\Documents and Settings\itruett\Local Settings\Application Data\Google\Chrome\Application\chrome.exe
&lt;/p&gt;
&lt;p class="oldVersion"&gt;
The next time I ran GoogleCL, Chrome launched and showed me the authorization page. A couple of clicks and that was done. I had to authorize once for each Google service.
&lt;/p&gt;
&lt;h3&gt;&lt;a name="0.9.7BrowserAuth"&gt;Update: v0.9.7 Browser Authorization&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
The first time you try to access each service, GoogleCL will display this message:
&lt;/p&gt;
&lt;p class="code"&gt;
Please log in and/or grant access via your browser at&lt;br /&gt;
https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=[token removed]&lt;br /&gt;
then hit enter.
&lt;/p&gt;
&lt;p&gt;
GoogleCL will launch your default browser to the authorization page where you can grant your approval. You only need to do this once for each service.
&lt;/p&gt;
&lt;p&gt;
Version 0.9.5 required auth_browser to be set in your GoogleCL config file in order to launch the browser automatically. Reader Joe Ledvina reported that auth_browser causes problems with version 0.9.7. Removing auth_browser will allow your default browser to launch. I believe this to be a bug and reported it as such in a comment to &lt;a href="http://code.google.com/p/googlecl/issues/detail?id=51"&gt;issue #51&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
One complaint I have about the authorizations is that they just show up as "anonymous" in &lt;a href="https://www.google.com/accounts/IssuedAuthSubTokens"&gt;My Account&lt;/a&gt;. If I use GoogleCL for the same account from two different computers, I don't know how I'd be able to tell the difference if I wanted to revoke access for one of them.
&lt;/p&gt;
&lt;p&gt;
No, unfortunately I did not write this post offline and then submit it with GoogleCL. Maybe next time. Now I wonder if I can get it to run on Android.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-2295771625186952719?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7KBlVCQq67PS021EmIAbCkZKTOM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7KBlVCQq67PS021EmIAbCkZKTOM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7KBlVCQq67PS021EmIAbCkZKTOM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7KBlVCQq67PS021EmIAbCkZKTOM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/D6uz2DhR_X8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/D6uz2DhR_X8/setup-googlecl-on-winxp.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>36</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/06/setup-googlecl-on-winxp.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-776546105808381397</guid><pubDate>Thu, 22 Apr 2010 21:32:00 +0000</pubDate><atom:updated>2010-04-22T17:32:25.747-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SOA</category><category domain="http://www.blogger.com/atom/ns#">services</category><category domain="http://www.blogger.com/atom/ns#">interfaces</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Richmond JUG</category><category domain="http://www.blogger.com/atom/ns#">OO</category><title>Richmond JUG April 21st</title><description>&lt;p&gt;
I went to my second Java User Group meeting last night. Kevin Smith gave a talk on Service-oriented Architecture (SOA) security. He talked about using interceptors and about access control based on services, requests, or individual records (or even individual pieces of data), and about loose coupling. And that's really what it all comes down to: loose coupling. All the buzz, hype, and mania over SOA really just boils down to the simple practice of not tying all of your code up in knots. Write little pieces of code that do one thing and anywhere one piece depends on another piece, use a layer of abstraction (an &lt;em&gt;interface&lt;/em&gt; in the Object-oriented world or a &lt;em&gt;service&lt;/em&gt; in SOA-speak) so that component A isn't tied to the implementation of component B, but rather to a specification that could be satisfied by components C or D instead. When the components don't depend on each other directly, it's more likely you'll be able to reuse one or more of them later.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-776546105808381397?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vrztGeLC3pcv_CVx3NsEH_-nFYw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vrztGeLC3pcv_CVx3NsEH_-nFYw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vrztGeLC3pcv_CVx3NsEH_-nFYw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vrztGeLC3pcv_CVx3NsEH_-nFYw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/-ZPnmQK3RC4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/-ZPnmQK3RC4/richmond-jug-april-21st.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/04/richmond-jug-april-21st.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-1132549631864328246</guid><pubDate>Thu, 18 Feb 2010 03:36:00 +0000</pubDate><atom:updated>2010-02-17T22:36:47.044-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GWT</category><category domain="http://www.blogger.com/atom/ns#">SimpleJDBC</category><category domain="http://www.blogger.com/atom/ns#">SimpleGWT</category><category domain="http://www.blogger.com/atom/ns#">Richmond JUG</category><category domain="http://www.blogger.com/atom/ns#">SCEA certification</category><title>Richmond JUG</title><description>&lt;p&gt;
I drove into the city this evening for a meeting of the &lt;a href="http://www.richmondjug.com/"&gt;Richmond Java User Group&lt;/a&gt;. The topic was Sun Certified Enterprise Architect certification. It was a fine presentation with a lot of good points. The speaker was pro, of course, while I remain pretty firmly anti.
&lt;/p&gt;
&lt;p&gt;
The speaker, Andy Pemberton, suggested that it's probably best to pursue certification for personal growth rather then any hope of financial benefit. The "value" of the certification is going to depend on where you work, and may not be worth anything in some organizations. But the knowledge acquired in obtaining the certification should be valuable anywhere. I think I can agree with that.
&lt;/p&gt;
&lt;p&gt;
Andy said that the certification exam is a good motivation. It drives you to do the studying necessary to pass. I can agree with that too. But it also costs money. Not just books and the time to read them, but something like $900.00 to sit for the exam. That's a lot of money, at least to me. I can't justify spending that much money on the exam, especially when it isn't necessary to acquire the knowledge. You don't get feedback from the exam, just practice.
&lt;/p&gt;
&lt;p&gt;
So what would I do for motivation? Open Source. If you want to learn something new and get a chance to practice it, why not join an Open Source project that uses the technology you want to learn? Or if one doesn't exist, start your own. The SCEA exam involves designing a software solution to a fictitious business problem. Why not find a real problem and write a real software solution, and then release it for free?
&lt;/p&gt;
&lt;p&gt;
I have two Open Source projects that I started myself to explore ideas and write a little code: &lt;a href="http://code.google.com/p/simple-gwt/"&gt;SimpleGWT&lt;/a&gt; and &lt;a href="http://code.google.com/p/simple-jdbc/"&gt;SimpleJDBC&lt;/a&gt;. As the names suggest, both are built on the theme of simple APIs for building real world software. I also participate in the &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; project as a community member and occasional code contributer. I think I get more out of these hobbies than I would out of a certification exam.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-1132549631864328246?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FZlAyH6woYDxZb6Ya_hfNxe21eo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FZlAyH6woYDxZb6Ya_hfNxe21eo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FZlAyH6woYDxZb6Ya_hfNxe21eo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FZlAyH6woYDxZb6Ya_hfNxe21eo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/mP4PxfvNofQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/mP4PxfvNofQ/richmond-jug.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2010/02/richmond-jug.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-7569872086556568116</guid><pubDate>Wed, 21 Oct 2009 01:03:00 +0000</pubDate><atom:updated>2009-10-20T21:20:42.464-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Nook</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">ebook reader</category><title>Nook what the cat dragged in!</title><description>&lt;p&gt;
I must admit, I kinda want a &lt;a href="http://www.barnesandnoble.com/nook/"&gt;Nook&lt;/a&gt;. I was never too keen on the &lt;a href="http://amazon.com/kindle"&gt;Kindle&lt;/a&gt;, but this new offering from B&amp;amp;N appeals to me on a number of levels. 
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Wi-Fi to download books off my home network, useful since I live just outside AT&amp;amp;T's 3G coverage area&lt;/li&gt;
  &lt;li&gt;Expandable storage, giving me both unlimited capacity AND the ability to backup my digital purchases&lt;/li&gt;
  &lt;li&gt;Support for more file formats&lt;/li&gt;
  &lt;li&gt;Replaceable battery. I always worry about devices, especially expensive ones, that I can't replace the battery in on my own. I would prefer a standard-sized rechargeable battery, but I'll take this.&lt;/li&gt;
  &lt;li&gt;And, of course, the geek appeal of &lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I'm rarely an impulsive gadget buyer, but if I get through the holidays without receiving one of these then the first after-Christmas sale just might tip the scales for me.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3174686716735347205-7569872086556568116?l=publicint.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-hekXYOv7CVn9H9Adu9E-fVLRFo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-hekXYOv7CVn9H9Adu9E-fVLRFo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-hekXYOv7CVn9H9Adu9E-fVLRFo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-hekXYOv7CVn9H9Adu9E-fVLRFo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PublicInt/~4/FAjavY1IsaQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/PublicInt/~3/FAjavY1IsaQ/nook-what-cat-dragged-in.html</link><author>noreply@blogger.com (Isaac Truett)</author><thr:total>0</thr:total><feedburner:origLink>http://publicint.blogspot.com/2009/10/nook-what-cat-dragged-in.html</feedburner:origLink></item></channel></rss>

