<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3174686716735347205</atom:id><lastBuildDate>Fri, 29 Aug 2025 09:03:04 +0000</lastBuildDate><category>programming</category><category>GWT</category><category>Java</category><category>Cr-48</category><category>Android</category><category>GWT Incubator</category><category>Google Chrome OS</category><category>Google Web Toolkit</category><category>Google+</category><category>GAE</category><category>Google Analytics</category><category>Google CL</category><category>Google I/O</category><category>GoogleCL</category><category>Richmond JUG</category><category>command line</category><category>interfaces</category><category>privacy</category><category>social networking</category><category>software development</category><category>Chrome</category><category>ChromeOS</category><category>Eclipse</category><category>Google Plus</category><category>Google Profiles</category><category>GooglePlus</category><category>Picasa</category><category>Python</category><category>build scripts</category><category>coding practices</category><category>scripting</category><category>AdSense</category><category>AdWords</category><category>Android Scripting Environment</category><category>Ant</category><category>App Engine</category><category>AppEngine</category><category>April Fools&#39; Day</category><category>Autocompleter</category><category>Blogger</category><category>Charlottesville</category><category>ChromeLite</category><category>Chromebook</category><category>Chromercise</category><category>Circles</category><category>Command</category><category>Facebook</category><category>Feedburner</category><category>Futsal</category><category>G+</category><category>GMail</category><category>GMail Motion</category><category>GPE</category><category>GPlus</category><category>GTUG</category><category>GWT 1.6</category><category>GWT Eclipse Plugin</category><category>Google</category><category>Google App Engine</category><category>Google Apps Scripts</category><category>Google Body Browser</category><category>Google Chrome Browser</category><category>Google Plugin for Eclipse</category><category>Google Search</category><category>Google Sites</category><category>Google Translate Gadget</category><category>Google Webmaster Tools</category><category>GwtCompilerTask</category><category>HasValue</category><category>Helvetiva</category><category>Hyalinobatrachium pellucidum</category><category>Isaac Truett</category><category>Me</category><category>Meow Me Now</category><category>Nook</category><category>NullPointerException</category><category>OO</category><category>Open Source</category><category>RVA</category><category>Real Time</category><category>Relationship Taxonomy</category><category>SCEA certification</category><category>SOA</category><category>SimpleGWT</category><category>SimpleJDBC</category><category>TODO</category><category>Twitter</category><category>Virginia</category><category>Voice-alyzer</category><category>WebGL</category><category>WinXP</category><category>Windows XP</category><category>beCamp2011</category><category>beauty</category><category>code aesthetics</category><category>code review</category><category>cofoja</category><category>contract programming</category><category>developer conference</category><category>ebook reader</category><category>exception handling</category><category>exceptions</category><category>glass frog</category><category>gwtNature</category><category>gwtc</category><category>habits</category><category>main</category><category>null</category><category>peer review</category><category>services</category><category>static initialization</category><category>web applications</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&#39;re on your own.</description><link>http://publicint.blogspot.com/</link><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><generator>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-3445804231128584978</guid><pubDate>Thu, 05 Apr 2018 22:38:00 +0000</pubDate><atom:updated>2018-04-05T18:38:01.324-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software development</category><title>How Rock Stars Killed The Engineering Team</title><description>&lt;h2&gt;
Ziggy played guitar&lt;/h2&gt;
&lt;br /&gt;
In late 2016, I wrote a slide deck. Or maybe it’s more accurate to say that I re-wrote -- no, I &lt;i&gt;adapted &lt;/i&gt;-- a song. As a presentation slide deck. You know, as one does.&lt;br /&gt;
&lt;br /&gt;
Over the next year and some change, however, I never delivered the presentation to an audience. I never... felt comfortable delivering the presentation to an audience. I wasn’t unaccustomed to public speaking. I’ve done plenty of presentations over the years I’ve been a professional software developer. I’ve presented to my teams, to my bosses, to my clients, to my customers, to the CEO, the president, to conferences (usually when I was on the schedule… once when I wasn’t). To adults. To children. Just never… to &lt;i&gt;music&lt;/i&gt;. So I adapt (again).&lt;br /&gt;
&lt;br /&gt;
David Bowie’s &lt;i&gt;Ziggy Stardust&lt;/i&gt; tells the story of a rock-and-roll frontman whose self-absorbed braggadocio &lt;i&gt;alienated &lt;/i&gt;(haha -- it’s a joke because… well, just read about the album), and ultimately destroyed, the band. Basically. David says it better, so &lt;a href=&quot;https://play.google.com/music/m/Tsp3koev2ornnhqlja7pln4efmi?t=Ziggy_Stardust_2012_Remastered_Version_-_David_Bowie&quot;&gt;listen to the song&lt;/a&gt;. I’ll wait.&lt;br /&gt;
&lt;br /&gt;
3 minutes 13 seconds, 3 minutes 14… you’re back? Great. Where was I? Right. Ziggy. A Rock Star. Like those software job postings are always asking for. Wizards. Ninjas. Rock Stars. But is that what we want? Do we want to work on a team with someone who thinks they’re &lt;i&gt;the nazz&lt;/i&gt;, parading their &lt;i&gt;god-given ass&lt;/i&gt; around the office carrying a southpaw guitar? (Seriously, if you haven’t heard the song, then these references will make no sense at all. Go look up &lt;a href=&quot;https://www.google.com/search?q=ziggy+stardust+lyrics&quot;&gt;the lyrics&lt;/a&gt;, at least.)&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Jamming good&lt;/h2&gt;
&lt;br /&gt;
We’ve all worked with someone who seems to know everything. Or acts like a know-it-all, anyway. Maybe they do their work really quickly. Or they come up with elaborate solutions, explaining how the problem is really complex, and how clever they had to be to solve it. They may be unconventional, do things differently. Management likes them, even though they’re… eccentric. They get accolades. They get attention. Still… something is off.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Made it too far&lt;/h2&gt;
&lt;br /&gt;
When one person has all the answers, other people lose their voice. The prominence and importance of one person is raised at the expense of others. These Rock Stars accomplish more than they should, and at too great a cost. They are toxic and should be considered ultimately harmful to the long-term health of a team.&lt;br /&gt;
&lt;br /&gt;
The Rock Star will attract fans, groupies, other engineers who want to be like them. &lt;i&gt;‘Cause we all just wanna be big rock stars&lt;/i&gt; -- wait, &lt;a href=&quot;https://www.youtube.com/watch?v=_1hgVcNzvzY&quot;&gt;wrong song&lt;/a&gt;. There will be people who admire the star’s work, who want their attention, who are eager to please them.&lt;br /&gt;
&lt;br /&gt;
Others will chafe under the friction caused by the dissonance. They may be vocal with their objections, which will make them unpopular with management who appreciate the star and just wish everyone else could be more like him.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Should we crush his sweet hands?&lt;/h2&gt;
&lt;br /&gt;
A few people will work actively to undermine the star. This could take the form of withholding critical information, failing to call out risks, or of keeping quiet when a potential solution or improvement presents itself. The supporting members don’t feel like part of the team anymore.&lt;br /&gt;
&lt;br /&gt;
The Rock Star will fight any challenge to his (we’ll save the discussion around gendered pronoun usage regarding egomaniacs for another blog post, mmkay?) dominance, trying to stay on top of the hill. He will denigrate, deny, deceive, and destroy in his struggle to remain relevant. In the Rock Star’s mind, his history of “success” enforces the idea that he is right, that challenges and objections are from small-minded people, jealous of his success, or simply less skilled and unable to see “The Truth” as he does. Even if the Rock Star has a good point, it may not be accepted by those he alienates.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
But boy could he play guitar&lt;/h2&gt;
&lt;br /&gt;
Any personnel manager or HR professional should be triggered by the phrase “but he does such good work.” The Rock Star will cross a line sooner or later. Passive-aggressive bullying, or even overt abuse of others is a natural progression from the egotism combined with resistance and criticism. Don’t enable this behavior. Stamp it out quickly before it’s too late. &lt;br /&gt;
&lt;br /&gt;
Before drastic measures are required.&lt;br /&gt;
&lt;br /&gt;
Before it breaks up the band.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Oh, yeah&lt;/h2&gt;
&lt;br /&gt;
For all you engineers: don’t try to be a star. Be a catalyst. Start something wonderful -- be an instigator! Be someone who makes your team more than the sum of its parts. Everyone has a role to play, and that includes having a leader sometimes. Sometimes that might be you. Sometimes other people get the spotlight. Raise your voice in support of your teammates when it’s their turn to shine.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Ziggy played guitar&lt;/h2&gt;
&lt;br /&gt;
I wrote code. Increasingly, lately, I coach others through writing their code. When they ask a question, I lead them down a path to answering it themselves. I play rhythm, not the solos, trying to keep everyone on the beat, and in harmony. It takes getting used to. It takes practicing a new set of skills, and new approaches to situations. In the end, though, we all sound better when the band plays together. I don’t need to ham it up, to showboat, to impress anyone.  I improvise. I adapt.&lt;br /&gt;
&lt;br /&gt;
Still... just maybe, if I can ever get the slides to sync up with the music, maybe I’ll be &lt;i&gt;the special man &lt;/i&gt;for three and a quarter minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Special thanks to my good friend &lt;a href=&quot;https://mike-bland.com/&quot;&gt;Mike Bland&lt;/a&gt; for his insight, thoughtful critique, and encouragement that led to this blog post, among other things.&lt;/i&gt;</description><link>http://publicint.blogspot.com/2018/04/how-rock-stars-killed-engineering-team.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-4394848977488674570</guid><pubDate>Wed, 27 Nov 2013 20:53:00 +0000</pubDate><atom:updated>2013-11-27T15:53:57.585-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">build scripts</category><category domain="http://www.blogger.com/atom/ns#">software development</category><title>Spectrum of Integration Automation</title><description>&lt;blockquote&gt;
&lt;br /&gt;
“Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.”&lt;br /&gt;
&lt;cite&gt;-- Martin Fowler, &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;http://martinfowler.com/articles/continuousIntegration.html&lt;/a&gt;&lt;/cite&gt;&lt;/blockquote&gt;
&lt;br /&gt;
In software development there is a spectrum of the degree to which a project team can automate integration of components, bug fixes, enhancements, and new features into a complete software product. In a 2000 article (revised in 2006), &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;Martin Fowler describes the then-current state of this automation using the term Continuous Integration&lt;/a&gt;. &lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;Fowler describes the tools and processes used to achieve this automation and the benefits of achieving Continuous Integration. Since then, many more tools and processes have entered the industry and it is becoming harder to fit all automated software development projects into a single definition of Continuous Integration. To help facilitate analysis and conversation around software development automation, I want to offer a set of terms describing various features of automation, how those features can be combined to achieve different levels of automation, and the benefits derived from each.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Features of Automation&lt;/h3&gt;
&lt;h4&gt;
Reproducible Builds&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Builds are conducted from a version-controlled source of truth using a scripted process.&lt;/li&gt;
&lt;li&gt;Provides traceability and accountability for every build of the system.&lt;/li&gt;
&lt;li&gt;Previous builds can be reproduced with precision by another developer at a later point in time.&lt;/li&gt;
&lt;li&gt;Enables troubleshooting of production issues outside of the production environment.&lt;/li&gt;
&lt;li&gt;Eliminates the risk associated with variability of a manual build.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Automated Builds&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Builds happen without manual intervention, reducing cost and freeing resources.&lt;/li&gt;
&lt;li&gt;Build-time failures are identified quickly, reducing the cost of remediation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Automated Unit Testing&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fails the build if individual components do not pass tests of basic functions.&lt;/li&gt;
&lt;li&gt;Logical and functional failures in components are identified quickly, reducing the cost of remediation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Automated Qualitative Analysis&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Every successful build is analyzed for standards compliance, common coding mistakes, and security vulnerabilities.&lt;/li&gt;
&lt;li&gt;Quality and technical debt can be tracked and managed to reduce the ongoing cost of maintenance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Automated System Testing&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Comprehensive testing that fails the build if components are not integrating properly when running in a simulated production environment.&lt;/li&gt;
&lt;li&gt;Identifies runtime functional errors quickly, reducing the cost of remediation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Automated Delivery&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Successful builds are automatically deployed to selected environments for manual exploratory and user acceptance testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoiTZnhZjrvHPq6kmeiCRPl64NZ6jsuhPPHVH_yLnEIAxAJn6r5CLHCOH9Y_w45o5GZsLGdsCVuy6-Z0yCa8D_5Z-ZzdbMaAI3a472wOR0cbziFoFJiYxcQ3_F0ZMoIuBdIt03ziWaavQp/s1600/ContinuousIntegration.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;148&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoiTZnhZjrvHPq6kmeiCRPl64NZ6jsuhPPHVH_yLnEIAxAJn6r5CLHCOH9Y_w45o5GZsLGdsCVuy6-Z0yCa8D_5Z-ZzdbMaAI3a472wOR0cbziFoFJiYxcQ3_F0ZMoIuBdIt03ziWaavQp/s640/ContinuousIntegration.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Automation features at various levels&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;
Levels of Automations&lt;/h3&gt;
&lt;h4&gt;
Manual&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;No automation.&lt;/li&gt;
&lt;li&gt;Builds are created by IDE export features, manually from the command line, or through other processes that are subject to human error and environmental variability.&lt;/li&gt;
&lt;li&gt;“It builds on my machine” is a common refrain.&lt;/li&gt;
&lt;li&gt;It is impossible to precisely reproduce a previous build with any reliability.&lt;/li&gt;
&lt;li&gt;Automated tests (e.g. JUnit, Selenium) may exist, but they are not run consistently and automatically.&lt;/li&gt;
&lt;li&gt;Individual developers may apply quality analysis tools, although inconsistently and with no formal enforcement mechanism.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Scripted&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Builds are automated using a scriptable/configurable build tool: Ant, Buck, Gradle, Make, Maven, etc.&lt;/li&gt;
&lt;li&gt;Build script may include running automated tests and qualitative analysis, but still lacks systematic formal enforcement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Automated Integration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Builds are triggered automatically (typically nightly).&lt;/li&gt;
&lt;li&gt;Automated tests (if present) are run.&lt;/li&gt;
&lt;li&gt;Qualitative analysis may be performed.&lt;/li&gt;
&lt;li&gt;Enforcement of testing and quality standards is now possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Continuous Integration&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Developers integrate their changes into a central repository daily.&lt;/li&gt;
&lt;li&gt;Builds are triggered continuously as changes come in.&lt;/li&gt;
&lt;li&gt;Automated testing and analysis provide immediate feedback if breaking changes are introduced.&lt;/li&gt;
&lt;li&gt;May include some level of automated system testing.&lt;/li&gt;
&lt;li&gt;If deployment has been automated, CI should include automatically delivery of each build to a shared testing environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
Continuous Delivery&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;A combination of rigorous standards compliance, up-front peer review, and automated testing at the unit and system level is sufficient that the team is comfortable promoting changes as soon as the lights turn green.&lt;/li&gt;
&lt;li&gt;Builds and deployments are fully automated.&lt;/li&gt;
&lt;li&gt;Any build that passes a final round of user acceptance testing can be promoted to production with a single click.&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://publicint.blogspot.com/2013/11/spectrum-of-integration-automation.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoiTZnhZjrvHPq6kmeiCRPl64NZ6jsuhPPHVH_yLnEIAxAJn6r5CLHCOH9Y_w45o5GZsLGdsCVuy6-Z0yCa8D_5Z-ZzdbMaAI3a472wOR0cbziFoFJiYxcQ3_F0ZMoIuBdIt03ziWaavQp/s72-c/ContinuousIntegration.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-8033002812641400279</guid><pubDate>Wed, 06 Mar 2013 02:18:00 +0000</pubDate><atom:updated>2013-03-05T21:22:14.380-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">habits</category><title>How Habits Steal Your Time (If You Let Them)</title><description>&lt;a href=&quot;http://www.ht2.co.uk/ben/wp-content/uploads/2009/08/cartoon-gary_larson-nature_abhors_vacuum-227x300.jpg&quot; imageanchor=&quot;1&quot; rel=&quot;nofollow&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.ht2.co.uk/ben/wp-content/uploads/2009/08/cartoon-gary_larson-nature_abhors_vacuum-227x300.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;
Filling The Void in Your Schedule&lt;/h2&gt;
I made a casual reference this morning to how my habits and routines tend to expand to fill whatever &quot;free time&quot; I might otherwise have, causing me to defer other non-routine activities because &quot;I don&#39;t have time.&quot; I don&#39;t even recall what my original point was at the time, but the idea that habits expand to fill a void in your schedule resonated with my audience. Time, essentially, is a scarce commodity, and &quot;free time&quot; is even rarer, so I find I have a natural tendency to allocate that time to familiar, comfortable, habitual leisure activities. Apparently, other people do this, too - or something like it. But often the non-routine activities that I put off nag at me. Maybe it is a chore I don&#39;t feel like doing, or a new and exciting leisure activity that might interest me but I&#39;m putting off trying it out of habit. I do what is easy and familiar in the moment - &amp;nbsp;follow the path of least resistance.&lt;br /&gt;
&lt;br /&gt;
&lt;a class=&quot;g-profile&quot; href=&quot;http://plus.google.com/103296757381930275313&quot; target=&quot;_blank&quot;&gt;David McRaney&lt;/a&gt;&amp;nbsp;explains it very nicely, in the context of &lt;a href=&quot;http://youarenotsosmart.com/2010/10/27/procrastination/&quot;&gt;procrastination&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;background-color: white; color: #666666; font-family: &#39;Palatino Linotype&#39;, &#39;Book Antiqua&#39;, Palatino, serif; font-size: 14px; line-height: 21px;&quot;&gt;&quot;This is why your Netflix queue is full of great films you keep passing over for “Family Guy.” With Netflix, the choice of what to watch right now and what to watch later is like candy bars versus carrot sticks. When you are planning ahead, your better angels point to the nourishing choices, but in the moment you go for what tastes good.&quot;&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
Habit and routine taste good. Really, really good - to me, anyway. Habits are really powerful, and developing good habits (say, brushing your teeth) is a useful life skill. Indulging yourself, in moderation, is a good thing to do, too, so it is natural to find a free moment and think &quot;I should go engage in my favorite leisure activity, indulge myself while I have a chance.&quot; But when those indulgences - those leisure activities - take on the form of habits, and you&#39;re just engaging in them because it is your normal routine, then there might be a problem: your routine might be expanding to fill a void in your schedule.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Horror_vacui_(physics)&quot;&gt;Nature abhors a vacuum&lt;/a&gt;. Gary Larson wrote that. So go out, break from routine, find something new, do something nice - and different - for yourself (or someone else). Take a walk on The Far Side.</description><link>http://publicint.blogspot.com/2013/03/how-habits-steal-your-time-if-you-let.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3174686716735347205.post-3199487034763839334</guid><pubDate>Wed, 30 May 2012 01:29:00 +0000</pubDate><atom:updated>2012-05-29T21:29:39.203-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Chromebook</category><category domain="http://www.blogger.com/atom/ns#">ChromeOS</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><title>Chrome OS v20</title><description>&lt;p&gt;I just updated my Cr-48 to &lt;a href=&quot;http://googleblog.blogspot.com/2012/05/next-step-in-chrome-os-journey.html&quot;&gt;the latest version of Chrome OS&lt;/a&gt; - version 20, for those who are counting such things. Although the default mode still appears to be the familiar full-screen browser look, there&#39;s also a more desktop-ish mode available, complete with wallpaper.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Unfortunately, I fear that the days of the Cr-48 are numbered; this fancy new OS version seems to be testing the limits of my prototype hardware and page rendering is quite slow.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Oh, look, there&#39;s another update. Always fun to discover new stuff, but I wish these things came with change logs. Time to restart!&lt;br /&gt;
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2012/05/i-just-updated-my-cr-48-to-latest.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><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&#39;ve been following the &lt;a href=&quot;http://youarenotsosmart.com/&quot;&gt;You Are Not So Smart&lt;/a&gt; blog for a while now and frequently share its posts on &lt;a href=&quot;http://www.google.com/reader/&quot;&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 &quot;a blog devoted to self delusion and irrational thinking.&quot; It&#39;s a great read and I highly recommend it. There&#39;s a book coming out soon and I think this is a cause, and a creative professional, worth supporting, so I&#39;m including the book&#39;s &lt;a href=&quot;http://www.youtube.com/&quot;&gt;YouTube&lt;/a&gt; trailer below. Doesn&#39;t hurt that he&#39;s offering bribes for posting the video! It&#39;s only 3:37 long and well worth watching.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/DJ2T4-rUUcs&quot; frameborder=&quot;0&quot; 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=&quot;http://rva.gtugs.org/&quot;&gt; Richmond, VA Google Technology Users Group&lt;/a&gt; tomorrow. It&#39;s not too late to sign up for the meeting, which is free to attend. &lt;br /&gt;
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/10/supporting-you-are-not-so-smart.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/DJ2T4-rUUcs/default.jpg" height="72" width="72"/><thr:total>0</thr:total></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=&quot;http://analytics.blogspot.com/2011/09/whats-happening-on-your-site-right-now.html&quot;&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.</description><link>http://publicint.blogspot.com/2011/09/google-analytics-in-real-time.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">beCamp2011</category><category domain="http://www.blogger.com/atom/ns#">Charlottesville</category><category domain="http://www.blogger.com/atom/ns#">ChromeOS</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><category domain="http://www.blogger.com/atom/ns#">GWT</category><category domain="http://www.blogger.com/atom/ns#">Virginia</category><title>Charlottesville, VA beCamp 2011</title><description>&lt;p&gt;Wow, what a great weekend at &lt;a href=&quot;http://barcamp.org/w/page/38835401/beCamp2011&quot;&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=&quot;http://code.google.com/p/google-web-toolkit/&quot;&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=&quot;http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html&quot;&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&#39;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&#39;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&#39;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&#39;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 &quot;Chromebook&quot; on the topic card instead of &quot;ChromeOS?&quot; Are people more interested in the hardware than the operating system, or just more interested in seeing it in action? I&#39;ll propose the topic again next year, maybe under a different heading. I&#39;ll probably still be using the Cr-48 anyway, so if you&#39;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;</description><link>http://publicint.blogspot.com/2011/09/charlottesville-va-becamp-2011.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">GMail</category><category domain="http://www.blogger.com/atom/ns#">Google Apps Scripts</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=&quot;http://googleappsdeveloper.blogspot.com/2011/07/gmail-snooze-with-apps-script.html&quot;&gt;GMail Snooze with Apps Script&lt;/a&gt; I thought &quot;Gosh, that&#39;s &lt;em&gt;almost&lt;/em&gt; what I need to make GMail my go-to TODO list platform.&quot; Well, I finally sat down and closed the gap.
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
var MARK_UNREAD = true;
var MARK_IMPORTANT = true;
var ADD_TODO_LABEL = true;
var TIMEZONE = &quot;EST&quot;;

function setup() {
  if (ADD_TODO_LABEL) {
    GmailApp.createLabel(&quot;TODO&quot;);
  }
}

function reviveTODOs() {
  var todayString = Utilities.formatDate(new Date(),
     TIMEZONE, &quot;yyyy/MM/dd&quot;);
  var todaysLabel = 
     GmailApp.getUserLabelByName(todayString);  
  var page = null;

  // Get threads in &quot;pages&quot; 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(&quot;TODO&quot;)
          .addToThreads(page);
      }          
    }     
  }
}
&lt;/pre&gt;
&lt;p&gt;
Instead of using &quot;Snooze x Days&quot; labels, I use date labels like &quot;2011/08/11&quot; to remind myself to follow up on bills, respond to emails, etc. With this modified version of &lt;a href=&quot;http://www.google.com/profiles/goldfeder&quot;&gt;Corey Goldfeder&lt;/a&gt;&#39;s script, I don&#39;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&#39;t know what&#39;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=&quot;http://code.google.com/googleapps/appsscript/guide_events.html#TimeTriggers&quot;&gt;Using Time-Driven Triggers&lt;/a&gt;.
&lt;p&gt;
Like this script? Have your own variation? Please share!
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/08/gmail-todo-script.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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&#39;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&#39;m excited to see how things will develop from here. We have good people who believe in the group and I&#39;m confident we&#39;ll continue strong. Thank you to all of our members!
&lt;/p&gt;
&lt;p&gt;
Special thanks to &lt;a href=&quot;http://www.genworth.com/&quot;&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=&quot;http://www.google.com/profiles/itruett&quot;&gt;my Google Profile&lt;/a&gt; or &lt;a href=&quot;https://groups.google.com/forum/#!forum/rva-gtug&quot;&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=&quot;https://groups.google.com/forum/#!forum/rva-gtug&quot;&gt;join the Google Group&lt;/a&gt; and introduce yourself. If you are interested in developing with Google technologies but aren&#39;t local to Richmond, VA, you can find over 260 other active and incubating GTUG chapters at &lt;a href=&quot;http://www.gtugs.org/&quot;&gt;gtugs.org&lt;/a&gt;. 
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/08/rva-gtug-august-meeting.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">Circles</category><category domain="http://www.blogger.com/atom/ns#">G+</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#">GPlus</category><category domain="http://www.blogger.com/atom/ns#">Relationship Taxonomy</category><category domain="http://www.blogger.com/atom/ns#">social networking</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=&quot;http://plus.google.com/&quot;&gt;Google+&lt;/a&gt; can get confusing. The taxonomy of relationships - or at least my relationships - is very, very complicated. Let&#39;s start with a Circle for friends - but not all friends are the same, really, so let&#39;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&#39;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&#39;t be bothered to name each individual, that&#39;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 &quot;Vacation Photos&quot; 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, &quot;Following&quot; which is for all the people I want to subscribe to posts from, but probably won&#39;t share with directly. I can&#39;t see myself ever using the &quot;My Circles&quot; or &quot;Extended Circles&quot; sharing options - why not just make it public? If you &quot;Follow&quot; anyone like I do, and I expect anyone coming from Twitter will be into that habit, then &quot;My Circles&quot; or &quot;Extended Circles&quot; might as well be public.

&lt;h2&gt;Oh, and the redesign&lt;/h2&gt;
&lt;p&gt;
I&#39;m the first to admit, I&#39;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&#39;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&#39;m doing for myself, my first real personal web site. I&#39;ll probably write more about that later. It&#39;s a slow work in progress. In the mean time, enjoy the new look here. Or don&#39;t. Feel free to leave comments. I won&#39;t be offended.
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/07/going-in-circles-with-google.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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 Plus</category><category domain="http://www.blogger.com/atom/ns#">Google+</category><category domain="http://www.blogger.com/atom/ns#">Picasa</category><category domain="http://www.blogger.com/atom/ns#">privacy</category><title>Update on Picasa album re-sharing and Google+</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr6kFC6IXg2wSVtxXItmlPb5szUrHEqqfjnDcF_DrVq9DlYoHfatVQCGq8ViSrmsrvX4YSDx7_QHILXkK1RvOPd5YqscW6ffjJ6KXWnYCnMlnc5gfIYkh3fRKryAIVny3_JNuhwCye5XSW/s1600/picasa-notice.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;77&quot; width=&quot;475&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr6kFC6IXg2wSVtxXItmlPb5szUrHEqqfjnDcF_DrVq9DlYoHfatVQCGq8ViSrmsrvX4YSDx7_QHILXkK1RvOPd5YqscW6ffjJ6KXWnYCnMlnc5gfIYkh3fRKryAIVny3_JNuhwCye5XSW/s320/picasa-notice.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
This is the notice displayed on &lt;a href=&quot;https://picasaweb.google.com/home&quot;&gt;Picasa Web Albums&lt;/a&gt; since joining Google+. It reads:
&lt;/p&gt;
&lt;p&gt;
&lt;blockquote&gt;You&#39;ve recently joined Google+. Note the following changes to Picasa Web Albums:
&lt;ul&gt;
    &lt;li&gt;Albums you&#39;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&#39;s already re-sharing controls for individual posts on Google+. Why do you need to open up my albums too?
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/06/update-on-picasa-album-re-sharing-and.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr6kFC6IXg2wSVtxXItmlPb5szUrHEqqfjnDcF_DrVq9DlYoHfatVQCGq8ViSrmsrvX4YSDx7_QHILXkK1RvOPd5YqscW6ffjJ6KXWnYCnMlnc5gfIYkh3fRKryAIVny3_JNuhwCye5XSW/s72-c/picasa-notice.png" height="72" width="72"/><thr:total>1</thr:total></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#">Google+</category><category domain="http://www.blogger.com/atom/ns#">GooglePlus</category><category domain="http://www.blogger.com/atom/ns#">privacy</category><category domain="http://www.blogger.com/atom/ns#">social networking</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=&quot;http://plus.google.com&quot;&gt;Google+&lt;/a&gt; last night. I posted about it and expected I&#39;d invite a few more people in the morning, only to wake up and find the invite option was gone. &lt;a href=&quot;https://plus.google.com/107117483540235115863/posts/PhJFJqLyRnm&quot;&gt;According to Vic Gundotra&lt;/a&gt; invites were switched off due to &quot;insane demand.&quot; Hopefully we&#39;ll see them on again soon.
&lt;/p&gt;

&lt;p&gt;
So far, I&#39;m quite happy with Google+. The privacy model makes sharing scope much more prominent than other social networking sites (why name names?). It&#39;s easy to tell who a post will be shared with and I can change that scope as I see fit using &quot;circles&quot; (a.k.a., groups, lists, etc.). +1 is already implemented, of course. I&#39;m looking forward to trying a &quot;hangout&quot; group video chat once a few more of my friends are on board.
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/06/google-invites-here-this-evening-gone.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">Google Plus</category><category domain="http://www.blogger.com/atom/ns#">Google Profiles</category><category domain="http://www.blogger.com/atom/ns#">Google+</category><category domain="http://www.blogger.com/atom/ns#">Picasa</category><category domain="http://www.blogger.com/atom/ns#">privacy</category><category domain="http://www.blogger.com/atom/ns#">social networking</category><title>Google+ Me</title><description>&lt;p&gt;
I received an invite to &lt;a href=&quot;http://googleblog.blogspot.com/2011/06/introducing-google-project-real-life.html&quot;&gt;Google+&lt;/a&gt; (Google&#39;s latest foray into social networking) this afternoon, just hours after it was announced. My first impression is that they&#39;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=&quot;http://picasaweb.google.com/&quot;&gt;Picasa&lt;/a&gt; photos and videos displayed on my &lt;a href=&quot;http://profiles.google.com/&quot;&gt;Google Profile&lt;/a&gt; page (which I immediately went to and turned these things off). And although my &quot;circles&quot; are empty initially, these are also displayed on my profile by default. Turned that off too. One thing I can&#39;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&#39;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&#39;m still looking around, but I haven&#39;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&#39;t interact with it the way a Google+ user could. Oh, well.
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/06/google-me.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>2</thr:total></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#">Java</category><category domain="http://www.blogger.com/atom/ns#">main</category><category domain="http://www.blogger.com/atom/ns#">static initialization</category><title>The Main() Conspiracy</title><description>&lt;h3&gt;Typical Java&lt;/h3&gt;
&lt;p&gt;
I was browsing &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;StackOverflow&lt;/a&gt; this evening when I came across &lt;a href=&quot;http://stackoverflow.com/questions/5642802/the-program-terminate-queston&quot;&gt; this question&lt;/a&gt;. The question itself isn&#39;t anything special, but the quote from the &lt;a href=&quot;http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html&quot;&gt;Thread JavaDoc&lt;/a&gt; caught my eye:
&lt;/p&gt;
&lt;p&gt;
&quot;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).&quot;
&lt;/p&gt;
&lt;p&gt;
&quot;Typically&quot; calls main()? I mean, sure, you could call &lt;span class=&quot;code&quot;&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&#39;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&#39;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=&quot;code&quot;&gt;
public class Mainless {
        static {
                System.out.println(&quot;Mainless!&quot;);
                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=&quot;http://download.oracle.com/javase/tutorial/java/javaOO/initial.html&quot;&gt;static initialization block&lt;/a&gt; runs when the Mainless class is loaded, before the JVM tries to call main (which, you&#39;ll note, doesn&#39;t exist). &quot;But wait,&quot; you say, &quot;I was taught in Java 101 that every program has a main() method!&quot; And like much of what we learn in school, that isn&#39;t strictly true. Why the conspiracy to keep Java developers writing &lt;span class=&quot;code&quot;&gt;public static void main(String[] args)&lt;/span&gt;? Well, it does have practical uses. For example, you can&#39;t pass arguments to the static initialization block. You could set environment variables before running Mainless and access those variables, but that&#39;s just ugly. And, you have to call &lt;span class=&quot;code&quot;&gt;System.exit()&lt;/span&gt; at some point or you&#39;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&#39;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&#39;m sure somebody, somewhere, uses this fact in an obnoxious &quot;gotcha&quot; interview question. I hate those. 
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/04/main-conspiracy.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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&#39; Day</category><category domain="http://www.blogger.com/atom/ns#">Autocompleter</category><category domain="http://www.blogger.com/atom/ns#">ChromeLite</category><category domain="http://www.blogger.com/atom/ns#">Chromercise</category><category domain="http://www.blogger.com/atom/ns#">GMail Motion</category><category domain="http://www.blogger.com/atom/ns#">Helvetiva</category><category domain="http://www.blogger.com/atom/ns#">Meow Me Now</category><category domain="http://www.blogger.com/atom/ns#">Voice-alyzer</category><title>In case you missed April 1st</title><description>&lt;p&gt;
In case you missed April Fools&#39; Day today, here&#39;s a recap of some of the foolery that came my way:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mail.google.com/mail/help/motion.html&quot;&gt;GMail Motion&lt;/a&gt; - waaaay too much work&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.chromercise.com/&quot;&gt;Chromercise!&lt;/a&gt; - but will they actually ship the finger sweat bands?&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/1131053125/ref=pe_143810_19388080_snp_dp&quot;&gt;Mario Puzo&#39;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=&quot;http://blog.chromium.org/2011/04/taking-chrome-to-lite-speeds.html&quot;&gt;ChromeLite&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thinkgeek.com/whats-new/&quot;&gt;ThinkGeek&lt;/a&gt; - there isn&#39;t much of a difference between the April Fools&#39; Day gags and the real products.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://buzz.blogger.com/2011/04/google-to-acquire-blogger.html&quot;&gt;Google to Acquire Blogger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/search?q=helvetica&quot;&gt;[Helvetica]&lt;/a&gt; - font people are... yeah.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/intl/en/jobs/uslocations/mountain-view/autocompleter/index.html&quot;&gt;Autocompleter&lt;/a&gt; - one job at Google I would not accept&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://googlevoiceblog.blogspot.com/2011/04/introducing-voice-alyzer.html&quot;&gt;Voice-alyzer&lt;/a&gt; - Not as good as Mail Goggles&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://googlecode.blogspot.com/2011/04/sessions-updated-for-google-io-2011.html&quot;&gt;Google I/O 2011 Sessions&lt;/a&gt; - guess I&#39;m not missing much afterall!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://googlemobile.blogspot.com/2011/04/meow-me-now.html&quot;&gt;Meow Me Now&lt;/a&gt; - you know someone would actually use this&lt;/li&gt;
&lt;/ul&gt;</description><link>http://publicint.blogspot.com/2011/04/in-case-you-missed-april-1st.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">cofoja</category><category domain="http://www.blogger.com/atom/ns#">contract programming</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=&quot;http://google-opensource.blogspot.com/2011/02/contracts-for-java.html&quot;&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 &quot;&lt;a href=&quot;http://code.google.com/p/cofoja/&quot;&gt;cofoja&lt;/a&gt;&quot; is assertions for abstract methods. Interesting. Looking forward to trying this on my next Java project.  
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/02/cofoja-java-annotations-for-contract.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">Android</category><category domain="http://www.blogger.com/atom/ns#">Blogger</category><title>Obligatory First Post From Blogger Android App</title><description>&lt;div&gt;&lt;p&gt;Oh, right... content. Okay. I&#39;m posting from the new Blogger Android app. I was going to link the blog announcement, but I don&#39;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&#39;t tell! So... this app needs work. Oh, well.&lt;/p&gt;
&lt;br/&gt;&lt;img src=&#39;http://lh5.ggpht.com/_PCMQWAik1DU/TUsAiW1gwMI/AAAAAAAACjs/cj8RcLz5gYU/1296760782001.png&#39; /&gt;&lt;/div&gt;

&lt;p&gt;
&lt;i&gt;Update&lt;/i&gt;: Back at the desktop, here&#39;s the link to &lt;a href=&quot;http://buzz.blogger.com/2011/02/introducing-blogger-android-app.html&quot;&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;</description><link>http://publicint.blogspot.com/2011/02/obligatory-first-post-from-blogger.html</link><author>noreply@blogger.com (Anonymous)</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></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=&quot;http://twitter.com/#!/publicintblog&quot;&gt;@publicintblog&lt;/a&gt;. In addition to the automated new post feed from &lt;a href=&quot;http://feedburner.google.com/&quot;&gt;Feedburner&lt;/a&gt;, I may tweet other little tidbits I find that don&#39;t warrant a whole blog post.
&lt;/p&gt;
&lt;p&gt;
See you in short form.
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2011/01/public-int-twitter.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">Cr-48</category><category domain="http://www.blogger.com/atom/ns#">Google Body Browser</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><category domain="http://www.blogger.com/atom/ns#">WebGL</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&#39;ve been eager to try on the Cr-48. The results, I&#39;m afraid, have been disappointing so far.
&lt;/p&gt;

&lt;h3&gt;&lt;a href=&quot;http://webglsamples.googlecode.com/hg/aquarium/aquarium.html
&quot;&gt;WebGL Aquarium&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;
If you&#39;ve seen WebGL, then you&#39;ve probably seen this demo. You&#39;ve probably also seen it produce surprising frame rates for browser-based 3D graphics. The hardware in the Cr-48, I suspect, just isn&#39;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=&quot;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&quot;&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&#39;t just slow, like the aquarium demo, it&#39;s unusable. But definitely check it out for yourself if you haven&#39;t already. It&#39;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;</description><link>http://publicint.blogspot.com/2011/01/webgl-on-cr-48.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">Android</category><category domain="http://www.blogger.com/atom/ns#">Cr-48</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</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=&quot;http://www.google.com/chromeos/&quot;&gt;Google&#39;s Chrome OS&lt;/a&gt; will be (or even already is!) a &quot;failure.&quot; The common thread running through these supposedly fatal flaws was a misconception of the fundamental reasons for Chrome OS. It doesn&#39;t do everything because it doesn&#39;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=&quot;http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html&quot;&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&#39;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&#39;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&#39;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&#39;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&#39;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=&quot;https://chrome.google.com/extensions/detail/oadboiipflhobonjjffjbfekfjcgkhco&quot;&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&#39;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&#39;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&#39;s take that idea into the business world. Now, instead of you not trusting the computer it&#39;s the computer that doesn&#39;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&#39;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&#39;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&#39;s private cloud.
&lt;/p&gt;

&lt;p&gt;
But back to reality, here are a few more things I&#39;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=&quot;http://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information&quot;&gt;secret switch&lt;/a&gt; in the battery compartment. I flipped it to see what would happen, but I haven&#39;t gone all the way to turning on developer mode yet. I&#39;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=&quot;https://chrome.google.com/webstore&quot;&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&#39;ve found &lt;a href=&quot;https://chrome.google.com/webstore/detail/kjebfhglflhjjjiceimfkgicifkhjlnm&quot;&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=&quot;http://www.npr.org/webapp&quot;&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&#39;d added it to my &quot;favorites.&quot; It also doesn&#39;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&#39;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&#39;m sure it says something about how much I like using the Cr-48 that I&#39;ve written more blog posts on it in the last week than I usually write in a month. It isn&#39;t just having something to write about; the Cr-48 is easy and convenient to write with.
&lt;/p&gt;

&lt;p&gt;
I&#39;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;</description><link>http://publicint.blogspot.com/2010/12/google-chrome-os-not-everything-to.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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#">Cr-48</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><title>Cr-48: Day 2 with my Chrome OS netbook</title><description>&lt;p&gt;
As I wrote yesterday, &lt;a href=&quot;http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html&quot;&gt;I have a new Cr-48&lt;/a&gt; netbook as part of &lt;a href=&quot;http://www.google.com/chromeos/pilot-program-cr48.html&quot;&gt;Google&#39;s Chrome OS pilot program&lt;/a&gt;. I&#39;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&#39;ve probably seen already that the Cr-48 is black (try the link above if you haven&#39;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&#39;t even charge you for the ad space! May I humbly suggest one that reads &quot;Ask me about Chrome OS&quot;?)
&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ4xB-EEpcJa_7-9YZLXyPqZ0j7DTcXYiTAXIvkmWzy6DYSO4DyzI6PdWn-AhW-TcdboyDLKjIGkKeBNf8IOgBOtDq0Kcq7gSNHOliaC6KcPu6bxy7R6LSdaz5RK_LXu78tm2WSQWvdFOp/s288/IMAG0093.jpg&quot; /&gt;

&lt;p&gt;
This isn&#39;t a great picture because: a) I&#39;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=&quot;http://picasaweb.google.com/&quot;&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 &quot;mirroring&quot; key, which made the display on my Cr-48 go blank. But the image that appeared on my monitor wasn&#39;t quite right. I expected stretching or a letterbox since the monitor wasn&#39;t widescreen. What I got was a letterbox copy of the Cr-48&#39;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&#39;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&#39;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&#39;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&#39;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=&quot;http://www.thedailyshow.com/&quot;&gt;The Daily Show&lt;/a&gt; to try high definition video streaming. The playback was a little choppy in places, but I don&#39;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&#39;t pause. I alt-tabbed out and the audio kept playing, but then I couldn&#39;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&#39;s non-full-screen state. Closing that tab stopped the audio playback.
&lt;/p&gt;

&lt;p&gt;
I also watched &lt;a href=&quot;http://www.youtube.com/watch?v=uQzAUaZ26co&quot;&gt;Chrome Event 12/07/2010&lt;/a&gt; on &lt;a href=&quot;http://www.youtube.com/&quot;&gt;YouTube&lt;/a&gt;. That worked well.
&lt;/p&gt;

&lt;p&gt;
And even though I had already read that it wouldn&#39;t work, I went to &lt;a href=&quot;http://www.netflix.com/&quot;&gt;Netflix&lt;/a&gt; to try streaming a movie. They don&#39;t support Chrome OS yet. I have heard that there&#39;s an Android streaming solution in the works, which I can&#39;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&#39;t like this thing has a touchscreen (or does it...? I haven&#39;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&#39;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=&quot;https://chrome.google.com/webstore?hl=en-US&quot;&gt;Chrome Web Store&lt;/a&gt; a couple of times and even installed an app from it, but I haven&#39;t really used the store enough to give a reasonable evaluation. Maybe I&#39;ll be able to do another post about that this weekend.
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2010/12/cr-48-day-2-with-my-chrome-os-netbook.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ4xB-EEpcJa_7-9YZLXyPqZ0j7DTcXYiTAXIvkmWzy6DYSO4DyzI6PdWn-AhW-TcdboyDLKjIGkKeBNf8IOgBOtDq0Kcq7gSNHOliaC6KcPu6bxy7R6LSdaz5RK_LXu78tm2WSQWvdFOp/s72-c/IMAG0093.jpg" height="72" width="72"/><thr:total>4</thr:total></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#">Cr-48</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome Browser</category><category domain="http://www.blogger.com/atom/ns#">Google Chrome OS</category><title>Got my Chrome Pilot&#39;s License</title><description>&lt;p&gt;
I&#39;m writing this post from my new &lt;a href=&quot;http://www.google.com/chromeos/pilot-program.html&quot;&gt;Cr-48 Chrome OS netbook&lt;/a&gt;. I love it. It&#39;s very light (3.8 lbs, according to &lt;a href=&quot;http://www.google.com/chromeos/pilot-program-cr48.html&quot;&gt;the pilot program&#39;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 &quot;lock&quot; keys, the number pad, and other non-essentials. The screen is bright. I&#39;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&#39;s all hardware. What about the software? Well, it&#39;s Chrome. After logging in you see the &lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Google Chrome browser&lt;/a&gt;. That&#39;s where I spend most of my time anyway, so it&#39;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&#39;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=&quot;http://publicint.blogspot.com/2010/12/cr-48-day-2-with-my-chrome-os-netbook.html&quot;&gt;day two with my Cr-48&lt;/a&gt;.
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2010/12/got-my-chrome-pilots-license.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>2</thr:total></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#">Google App Engine</category><category domain="http://www.blogger.com/atom/ns#">Google Plugin for Eclipse</category><category domain="http://www.blogger.com/atom/ns#">Google Web Toolkit</category><category domain="http://www.blogger.com/atom/ns#">GPE</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#">Richmond JUG</category><title>Richmond Java User Group - October</title><description>&lt;div&gt;
I gave a presentation on &lt;a href=&quot;http://code.google.com/p/webtoolkit/&quot;&gt;GWT&lt;/a&gt; at the &lt;a href=&quot;http://www.richmondjug.com/&quot;&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=&quot;https://docs.google.com/present/view?id=0Ae51rFz0ggSfZGZyamdiMjlfNzlmZDh0anFjZw&amp;hl=en&amp;authkey=CIiBkfMC&quot;&gt;a copy of the presentation&lt;/a&gt; I gave for anyone who wants to see it.
&lt;/div&gt;</description><link>http://publicint.blogspot.com/2010/10/i-gave-presentation-on-gwt-at-richmond.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></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</category><category domain="http://www.blogger.com/atom/ns#">Android Scripting Environment</category><category domain="http://www.blogger.com/atom/ns#">command line</category><category domain="http://www.blogger.com/atom/ns#">Google CL</category><category domain="http://www.blogger.com/atom/ns#">GoogleCL</category><category domain="http://www.blogger.com/atom/ns#">programming</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=&quot;http://publicint.blogspot.com/2010/06/setup-googlecl-on-winxp.html&quot;&gt;Setup GoogleCL on WinXP&lt;/a&gt; I joked about running &lt;a href=&quot;http://code.google.com/p/googlecl/&quot;&gt;GoogleCL&lt;/a&gt;, Google&#39;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=&quot;http://code.google.com/p/android-scripting/&quot;&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=&quot;text-decoration:line-through&quot;&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=&quot;text-decoration:line-through&quot;&gt;and applying a .patch file&lt;/span&gt;. And you&#39;ll probably end up having to type on a really tiny keyboard at some point. Don&#39;t say I didn&#39;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=&quot;http://code.google.com/p/android-scripting/&quot;&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&#39;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=&quot;http://code.google.com/p/googlecl/source/checkout&quot;&gt;see here&lt;/a&gt;). &lt;/p&gt;&lt;p class=&quot;oldVersion&quot;&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=&quot;oldVersion&quot;&gt;The Patch&lt;/h3&gt;&lt;pre class=&quot;oldVersion code&quot; style=&quot;font-size:0.7em&quot;&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, &#39;r&#39;) as token_file:
+    with open(token_path, &#39;rb&#39;) 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, &#39;r+&#39;) as token_file:
+    with open(token_path, &#39;rb+&#39;) 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, &#39;r&#39;) as token_file:
+    with open(token_path, &#39;rb&#39;) as token_file:
       token_dict = pickle.load(token_file)
   else:
     token_dict = {}
   token_dict[service] = token 
-  with open(token_path, &#39;w&#39;) as token_file:
+  with open(token_path, &#39;wb&#39;) 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=&quot;oldVersion&quot;&gt;I made it small on purpose because it&#39;s hard to read anyway. Hopefully, this way you&#39;ll be able to select it all and copy it easily. Apply the patch to your GoogleCL code. &lt;/p&gt;&lt;p class=&quot;oldVersion&quot;&gt;The patch makes GoogleCL open the auth token file in binary mode. I needed this because later I&#39;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 &quot;Disk Drive&quot; as the USB connection type. This mounts the phone&#39;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&#39;s the card we&#39;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&#39;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&#39;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&#39;t know how many of them are required to actually make this work, and I haven&#39;t felt like fiddling with it too much since it&#39;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=&quot;code&quot;&gt;#!/bin/bash 
export HOME=/sdcard 
export TEMP=&quot;/sdcard/ase/extras/pythontmp&quot; 
export PYTHONHOME=&quot;/data/data/com.google.ase/python&quot; 
export PYTHONPATH=&quot;/sdcard/ase/extras/python:/sdcard/ase/scripts/&quot;
/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&#39;s so easy with Android. This script calls the one above and passes the output to the phone&#39;s text-to-speech service. Save it as ase/scripts/say_calendar.py. &lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;import android 
import subprocess  
p = subprocess.Popen(
        [&#39;/system/bin/sh&#39;,  &#39;/sdcard/ase/scripts/calendar_today.sh&#39;],
        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&#39;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&#39;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&#39;ve followed my instructions exactly and I haven&#39;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&#39;t perfect. But I think that&#39;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;</description><link>http://publicint.blogspot.com/2010/06/build-talking-calendar-with-googlecl.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>7</thr:total></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#">command line</category><category domain="http://www.blogger.com/atom/ns#">Google CL</category><category domain="http://www.blogger.com/atom/ns#">GoogleCL</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&#39;m on the telephone and I need to write something down, I don&#39;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&#39;t read that note from my Android phone, from my laptop, or even from the PC in the other room. Because it&#39;s on &lt;i&gt;that&lt;/i&gt; hard drive.
&lt;/p&gt;
&lt;p&gt;
This isn&#39;t long-term storage. I usually don&#39;t need the notes for long and I trash them within a few hours or days. If they have information of greater value, I&#39;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&#39;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=&quot;code&quot;&gt;
google docs edit --format &quot;txt&quot; --editor &quot;notepad&quot; --title &quot;notes&quot;
&lt;/p&gt;
&lt;p&gt;
On Friday I wrote about &lt;a href=&quot;/2010/06/setup-googlecl-on-winxp.html&quot;&gt;setting up GoogleCL on Windows&lt;/a&gt;. After that setup, I can use the above command to edit a text file named &quot;notes&quot; 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=&quot;code&quot;&gt;
@ECHO OFF&lt;br /&gt;
SET filename=%*&lt;br /&gt;
&lt;br /&gt;
IF &quot;%filename%&quot; EQU &quot;&quot; (&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 &quot;txt&quot; --editor &quot;notepad&quot; --title &quot;%filename%&quot;
&lt;/p&gt;
&lt;p&gt;I called it &quot;gd.cmd&quot; -- &quot;gd&quot; for &quot;Google Docs&quot; 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&#39;t give a file name initially. You can change the --editor option and even the --format if you don&#39;t like plain text.
&lt;/p&gt;
&lt;p&gt;There&#39;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&#39;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&#39;t find it! I opened &lt;a href=&quot;http://code.google.com/p/googlecl/issues/detail?id=133&quot;&gt;issue #133&lt;/a&gt; to see about fixing that. 
&lt;/p&gt;</description><link>http://publicint.blogspot.com/2010/06/fixing-bad-habit-with-googlecl.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item></channel></rss>