Google Chrome OS - Not Everything to Everyone

Over the weekend I read a few articles on why Google's Chrome OS will be (or even already is!) a "failure." The common thread running through these supposedly fatal flaws was a misconception of the fundamental reasons for Chrome OS. It doesn't do everything because it doesn't need to do everything.

A 98% solution

I have been using a Chrome OS Cr-48 netbook as my primary computer 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.

No Drive

The Cr-48 has no hard disk or DVD drive, which I've seen decried as a critical deficiency. This is only reference hardware, of course, but I have no reason to believe that a commercial product running Chrome OS would need to have them either. There is a small solid-state drive that web apps can use for local/offline storage. There's also an SD card slot that users can fill to store downloads. I could see a user possibly wanting to pop in a DVD with home videos or photos to upload or watch, and that may be supported eventually with a USB DVD drive. Cutting out these non-essential drives will make Chrome OS products smaller and less expensive, which seem like obvious wins to me.

Chrome OS vs. Android

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.

I've had an Android phone for a few months. Before the Cr-48 came along, I would check email, Google Reader, Facebook, and run the occasional Google search on my phone. The Cr-48 running Chrome OS has certainly stolen much of that activity. It's easy to have the netbook sitting next to me while I work, and I can keep it within reach on the coffee table if I'm watching TV or playing video games. Each device (and OS) has its place and I appreciate having the choice of which to use when their features ovarlap.

Chrome OS <3 Android

What I would love to see is more interaction between Android and Chrome OS devices. Chrome to Phone is a great start. But imagine if you could sit down at any Chrome OS computer anywhere in the world - say, a friend's netbook or a kiosk in a public library - and connect your phone to the USB port. The phone would prompt you to authorize the connection, and then start acting as a proxy for Chrome OS. The computer would treat you as a guest, preventing anything you do from leaving a mark on the computer after you log off and your phone, which has already authenticated your Google account, is handling all the sensitive transactions and keeping your passwords safe. If the two devices were programmed to work together properly, things like OAuth attempts could be intercepted on the phone. Instead of typing a password on the computer you're using as a guest, you would type it on your trusted Android device. Any information you access, such as a private email, would of course still reach the computer and be vulnerable if the computer has been compromised. Or if someone is standing behind you. But that seems a lot safer, to me, than typing your password into a shared or public computer.

Let's take that idea into the business world. Now, instead of you not trusting the computer it's the computer that doesn't trust you. If you could use your Android phone (or other device) as an access card, then any computer in the office could be your computer. No more suits walking the halls carrying laptops! Your IT department installs security software on the company's Android devices and Chrome OS workstations so that you can plug into any computer in the office and pick up working on that proposal document where you left off at your desk. When you unplug your phone, the computer locks up again and forgets about you before you've turned around. Your document, instead of being on the phone or on a hard disk in your cubicle, is tucked away safely in your company's private cloud.

But back to reality, here are a few more things I've been doing with Chrome OS:

Jailbreak!

I found the secret switch in the battery compartment. I flipped it to see what would happen, but I haven't gone all the way to turning on developer mode yet. I'm still enjoying seeing what it can do right out of the box.

Apps

I installed a few apps from the Chrome Web Store, which is how you add features to your Chrome OS experience (short of developer mode; see above).

I've found Scratchpad 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.

Streaming HD radio with the NPR App produced mixed results. The app is slow to respond to clicks and it takes too many clicks to do simple things, like start playing my local NPR station even after I'd added it to my "favorites." It also doesn't handle having the lid closed while live streaming. When I open up again, it starts playing for a while (clearing the buffer, I assume) and then it just stops. I have to refresh the page to get it started again. On a positive note, streaming audio didn't seem to interfere with other activities, like checking email and editing documents. Chrome OS handled multitasking well.

Writing more

I'm sure it says something about how much I like using the Cr-48 that I've written more blog posts on it in the last week than I usually write in a month. It isn't just having something to write about; the Cr-48 is easy and convenient to write with.

I'm still hoping to find a screen reader that works on Chrome OS, and I need to try video chat. Any other suggestions?

Cr-48: Day 2 with my Chrome OS netbook

As I wrote yesterday, I have a new Cr-48 netbook as part of Google's Chrome OS pilot program. I've tried several new things with my Cr-48 today, which I want to share with you all.

Basic Black++

You've probably seen already that the Cr-48 is black (try the link above if you haven't seen it yet). I have nothing against black. Black is cool. And the Cr-48 is very black. Google kindly included a colorful sticker to add a little style to that very black black. That sticker and a couple of others I had lying around personalize my new toy nicely. (If anyone from Google is reading: I need more Googley stickers, and I won't even charge you for the ad space! May I humbly suggest one that reads "Ask me about Chrome OS"?)

This isn't a great picture because: a) I'm not a great photographer and b) it was taken with a camera phone. I uploaded it from my Android phone directly to Picasa and did what I could with Picnik to crop and clean it up on my Cr-48.

External monitor wonkiness

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.

The monitor worked, sorta. I plugged it in and hit the "mirroring" key, which made the display on my Cr-48 go blank. But the image that appeared on my monitor wasn't quite right. I expected stretching or a letterbox since the monitor wasn't widescreen. What I got was a letterbox copy of the Cr-48's display, but it was vertically aligned on the bottom of the screen, instead of the middle. It also looked pinched. A while later I shutdown and stepped away from the Cr-48, leaving the monitor hooked up. When I powered up again, both the Cr-48 and the monitor displayed the screen image, and the monitor was adjusted properly for the different aspect ratio. This is more like it! But I couldn't leave well enough alone, so I unplugged the monitor and hit the mirroring key again. The display on the Cr-48 came back. I plugged in the monitor and hit the mirroring key yet again. The display switched to the monitor. I continued to fiddle with it for a while but I couldn't figure out how to get them both to display again without shutting down the Cr-48. So, this feature needs a little tweaking.

The mouse worked exactly as expected. No drivers to install.

I was hoping that I could at least browse audio/visual media with the USB card reader, but no such luck. It didn't seem to recognize the device at all. Not sure if this is supposed to be supported yet. The Cr-48 does include an SD card reader, which is probably the most common form factor in use today. I would guess that's all the card reading most users would need.

Watching high def video

I visited The Daily Show to try high definition video streaming. The playback was a little choppy in places, but I don't know if that was down to hardware or software. After I had the video full-screen for a while, the playback controls stopped responding to clicks and I couldn't pause. I alt-tabbed out and the audio kept playing, but then I couldn't get back in to the window with the full-screen video. The tab that launched the video just showed a black box, where I would have expected the video to return to it's non-full-screen state. Closing that tab stopped the audio playback.

I also watched Chrome Event 12/07/2010 on YouTube. That worked well.

And even though I had already read that it wouldn't work, I went to Netflix to try streaming a movie. They don't support Chrome OS yet. I have heard that there's an Android streaming solution in the works, which I can't wait to try.

Best feature ever

I love this one: pressing ctrl+alt+/ opens an on screen keyboard. Big deal, right? It isn't like this thing has a touchscreen (or does it...? I haven't actually touched the screen). The cool part is that the labels on the keys change as you press and release the modifier keys (shift, ctrl, alt). That is just so awesomely useful. Why doesn't every application do that? Note to Google: ctrl+alt+c needs more cowbell.

Chrome Web Store

I have looked at the Chrome Web Store a couple of times and even installed an app from it, but I haven't really used the store enough to give a reasonable evaluation. Maybe I'll be able to do another post about that this weekend.

Got my Chrome Pilot's License

I'm writing this post from my new Cr-48 Chrome OS netbook. I love it. It's very light (3.8 lbs, according to the pilot program's website). The keyboard feels good; the individual keys are large, which is made possible by the removal of the function keys, the "lock" keys, the number pad, and other non-essentials. The screen is bright. I'm not thrilled with the touchpad yet, but I always need a while to get used to them.

But that's all hardware. What about the software? Well, it's Chrome. After logging in you see the Google Chrome browser. That's where I spend most of my time anyway, so it's familiar and intuitive to use for me. Chrome OS even imported all of my bookmarks, extensions, etc. that I sync on my other computers running the Chrome browser.

I'm looking forward to exploring Chrome OS further. If anyone from Google is reading: thank you!

Update: See what I had to say after day two with my Cr-48.

Richmond Java User Group - October

I gave a presentation on GWT at the Richmond JUG 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.
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.
I have granted access on Google Docs to a copy of the presentation I gave for anyone who wants to see it.

Build a Talking Calendar with GoogleCL and Android Scripting Environment

At the end of my post on how to Setup GoogleCL on WinXP I joked about running GoogleCL, Google's new command line tool for accessing Google service, on the Android OS. Trying to make that joke a reality, I found the Android Scripting Environment project which allows running Python scripts on Android - step one: accomplished.

Warning: 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 and modify Python source code. I will assume that you are capable of using SVN to get source code from code.google.com and applying a .patch file. And you'll probably end up having to type on a really tiny keyboard at some point. Don't say I didn't warn you.

Install Android Scripting Environment (ASE)

The easiest way to install ASE is to open up the ASE home page on your PC and scan the barcode.

Hack GoogleCL

Note: this change is now in trunk and won't be necessary in the 0.9.8 release.

Now grab the source code for GoogleCL (see here).

I needed to apply a small patch to get my setup to work with the 0.9.7 release.

The Patch

Index: src/googlecl/__init__.py
===================================================================
--- src/googlecl/__init__.py (revision 299)
+++ src/googlecl/__init__.py (working copy)
@@ -156,7 +156,7 @@
   import pickle
   token_path = os.path.join(GOOGLE_CL_DIR, TOKENS_FILENAME_FORMAT % user)
   if os.path.exists(token_path):
-    with open(token_path, 'r') as token_file:
+    with open(token_path, 'rb') as token_file:
       token_dict = pickle.load(token_file)
     try:
       token = token_dict[service.lower()]
@@ -184,7 +184,7 @@
   token_path = os.path.join(GOOGLE_CL_DIR, TOKENS_FILENAME_FORMAT % user)
   success = False
   if os.path.exists(token_path):
-    with open(token_path, 'r+') as token_file:
+    with open(token_path, 'rb+') as token_file:
       token_dict = pickle.load(token_file)
       try:
         del token_dict[service.lower()]
@@ -236,12 +236,12 @@
   import stat
   token_path = os.path.join(GOOGLE_CL_DIR, TOKENS_FILENAME_FORMAT % user)
   if os.path.exists(token_path):
-    with open(token_path, 'r') as token_file:
+    with open(token_path, 'rb') as token_file:
       token_dict = pickle.load(token_file)
   else:
     token_dict = {}
   token_dict[service] = token 
-  with open(token_path, 'w') as token_file:
+  with open(token_path, 'wb') as token_file:
     # Ensure only the owner of the file has read/write permission
     os.chmod(token_path, stat.S_IRUSR | stat.S_IWUSR)
     pickle.dump(token_dict, token_file)

I made it small on purpose because it's hard to read anyway. Hopefully, this way you'll be able to select it all and copy it easily. Apply the patch to your GoogleCL code.

The patch makes GoogleCL open the auth token file in binary mode. I needed this because later I'll be copying a token file from my desktop to my phone. Without the patch, the phone rejected token the file.

Install GoogleCL

Now you need to copy your GoogleCL source onto the phone. Your Android phone may vary. On mine, I just connect to my desktop computer via USB and select "Disk Drive" as the USB connection type. This mounts the phone's storage as two removable disks. You can also remove the SD card from your phone and put it in a reader connected to your computer, since it's the card we're putting files on.

Find ase/extras/python/ on your SD card. This directory should contain a number of Python modules already, such as gdata and xml. Copy your googlecl/src/googlecl in next to them. Also copy googlecl/src/google to ase/scripts/google.py. You'll use this later when you write your talking calendar scripts.

Write a Script to Call GoogleCL

This script changes your HOME dir to /sdcard so that GoogleCL can write your .googlecl configuration file. I wasn't able to figure out how to let GoogleCL write to the default HOME location. The other settings are what ASE uses when it runs Python scripts. I don't know how many of them are required to actually make this work, and I haven't felt like fiddling with it too much since it's working.

Replace [USERNAME] with your Google account username and save it as ase/scripts/calendar_today.sh.

#!/bin/bash 
export HOME=/sdcard 
export TEMP="/sdcard/ase/extras/pythontmp" 
export PYTHONHOME="/data/data/com.google.ase/python" 
export PYTHONPATH="/sdcard/ase/extras/python:/sdcard/ase/scripts/"
/data/data/com.google.ase/python/bin/python /sdcard/ase/scripts/google.py 
    --user [USERNAME] calendar list --date `date +%Y-%m-%d`

Make It Talk

I love this part because it's so easy with Android. This script calls the one above and passes the output to the phone's text-to-speech service. Save it as ase/scripts/say_calendar.py.

import android 
import subprocess  
p = subprocess.Popen(
        ['/system/bin/sh',  '/sdcard/ase/scripts/calendar_today.sh'],
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE)
output, errors = p.communicate()
print errors 
print output 
droid = android.Android() 
droid.ttsSpeak(output)

Important Note for Windows Users: 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.

Preauthentication

I couldn't get the GoogleCL OAuth process to work on my phone. When I returned to ASE from completing the auth process in the browser the script had already stopped running, interrupting the authentication. I got around that by preparing a auth token file on my desktop and copying it to the phone.

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.

Dismount your phone's drives from your desktop, or reinstall the SD card in your phone.

Make It So

Now, assuming you've followed my instructions exactly and I haven't left out anything important, you should be able to:

  • Open up ASE on your phone
  • Select Menu->View->Interpreters
  • Select Menu->Add->Python
  • Press back to return to the list of scripts

You should see a number of scripts listed, including the ones you just wrote. Select say_calendar.py. Your calendar entries for today should be displayed and the phone should speak them soon after. Now, it may not sound the way you expect - the TTS isn't perfect. But I think that's pretty good for a few minutes setting up some free scripting tools.

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.

Fixing a bad habit with GoogleCL

The Problem

I have a bad habit to confess. When I'm on the telephone and I need to write something down, I don't reach for paper and pencil. Instead, I open Notepad. I take my notes and save the file on my desktop where I can easily find it later. Information preserved! But that file is just sitting on my hard drive on my home PC. For a modern, cloud-connected individual such as myself, this is bad. I can't read that note from my Android phone, from my laptop, or even from the PC in the other room. Because it's on that hard drive.

This isn't long-term storage. I usually don't need the notes for long and I trash them within a few hours or days. If they have information of greater value, I'll copy the text into Google Docs where I can get it later. But what if I need that file before it gets deleted and I'm not sitting at my computer?

The Solution

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 > notepad. Enter GoogleCL:

google docs edit --format "txt" --editor "notepad" --title "notes"

On Friday I wrote about setting up GoogleCL on Windows. After that setup, I can use the above command to edit a text file named "notes" that resides in Google Docs. The file is automatically downloaded and displayed in Notepad or any other editor. After saving my changes and closing Notepad, the file is uploaded to Google Docs again. Pretty slick.

Now I just need to turn that command into something more manageable.

@ECHO OFF
SET filename=%*

IF "%filename%" EQU "" (
ECHO File name:
SET /p filename=
)

google docs edit --format "txt" --editor "notepad" --title "%filename%"

I called it "gd.cmd" -- "gd" for "Google Docs" should be quick to type and easy to remember. That script will take an argument for the file name and even prompt me if I don't give a file name initially. You can change the --editor option and even the --format if you don't like plain text.

There's also a --folder option which I expected would let me keep my notes in a folder in Google Docs. Well, it does look in that folder but if it doesn't find the file, it will create the file outside of the folder, so that next time it still won't find it! I opened issue #133 to see about fixing that.

Setup GoogleCL on WinXP

UPDATE: These instructions were originally written for version 0.9.5. I have started updating them with differences found in the newer 0.9.7 version of GoogleCL. If you find more differences I should mention, please leave a comment. Thanks!

Google just announced their new command line utility for Google services. The GoogleCL project is an Open Source project hosted on Google Code. Although the project page is obviously slanted toward Linux, I figured it's Python so it shouldn't be too hard to run on Windows too. Here's what I had to do to get things setup on Windows XP Professional SP3.

First some downloads:

Note: GoogleCL requires Python 2.5 or 2.6.

Install Python

Run the .msi file to install Python. I installed to C:\dev\Python\Python25 and I added C:\dev\Python\Python25 to my PATH for easier command line access to python.exe.

Install Google Data API

I unzipped gdata-2.0.10.zip to C:\dev\Python\gdata-2.0.10 and ran setup.py install from C:\dev\Python\gdata-2.0.10. No problems encountered there.

C:\dev\Python\gdata-2.0.10>setup.py install

Install GoogleCL

I unzipped googlecl-0.9.5.tar.gz to C:\dev\Python\googlecl-0.9.5 and ran setup.py install from C:\dev\Python\googlecl-0.9.5. Again, no problems.

C:\dev\Python\googlecl-0.9.5>setup.py install

Write a "google" script

Next I wanted a "google" command that would be as easy to run from the Windows command line as the Linux examples were. I wrote this google.cmd file and put it on my PATH:

@echo off
SET googlecl_home=C:\dev\Python\googlecl-0.9.5\src

python %googlecl_home%\google %*

Now, running google docs list got me a prompt for my user name. But instead of prompting for a password, GoogleCL uses OAuth. This is the message I got:

Note: this was true as of GoogleCL v0.9.5 - see below for v0.9.7

(Hint: You can automatically launch your browser by adding "auth_browser = " to your config file under the GENERAL section, or define the BROWSER environment variable.)

Please log in and/or grant access via your browser at
https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=[token removed]
then hit enter.

Well, obviously that wouldn't do. It would have been nice if it had told me where to find that config file, but it wasn't hard to locate. As alert reader Brian B. pointed out, the first time you run GoogleCL it will try to locate the config file and if it doesn't find one, it will tell you the path and create the file for you. Mine was in C:\Documents and Settings\itruett\.googlecl.

The path for my browser, Google Chrome, is a little less intuitive. I found it, and added this to my GoogleCL config file:

auth_browser = C:\Documents and Settings\itruett\Local Settings\Application Data\Google\Chrome\Application\chrome.exe

The next time I ran GoogleCL, Chrome launched and showed me the authorization page. A couple of clicks and that was done. I had to authorize once for each Google service.

Update: v0.9.7 Browser Authorization

The first time you try to access each service, GoogleCL will display this message:

Please log in and/or grant access via your browser at
https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=[token removed]
then hit enter.

GoogleCL will launch your default browser to the authorization page where you can grant your approval. You only need to do this once for each service.

Version 0.9.5 required auth_browser to be set in your GoogleCL config file in order to launch the browser automatically. Reader Joe Ledvina reported that auth_browser causes problems with version 0.9.7. Removing auth_browser will allow your default browser to launch. I believe this to be a bug and reported it as such in a comment to issue #51.

One complaint I have about the authorizations is that they just show up as "anonymous" in My Account. If I use GoogleCL for the same account from two different computers, I don't know how I'd be able to tell the difference if I wanted to revoke access for one of them.

No, unfortunately I did not write this post offline and then submit it with GoogleCL. Maybe next time. Now I wonder if I can get it to run on Android.

Richmond JUG April 21st

I went to my second Java User Group meeting last night. Kevin Smith gave a talk on Service-oriented Architecture (SOA) security. He talked about using interceptors and about access control based on services, requests, or individual records (or even individual pieces of data), and about loose coupling. And that's really what it all comes down to: loose coupling. All the buzz, hype, and mania over SOA really just boils down to the simple practice of not tying all of your code up in knots. Write little pieces of code that do one thing and anywhere one piece depends on another piece, use a layer of abstraction (an interface in the Object-oriented world or a service in SOA-speak) so that component A isn't tied to the implementation of component B, but rather to a specification that could be satisfied by components C or D instead. When the components don't depend on each other directly, it's more likely you'll be able to reuse one or more of them later.

Richmond JUG

I drove into the city this evening for a meeting of the Richmond Java User Group. The topic was Sun Certified Enterprise Architect certification. It was a fine presentation with a lot of good points. The speaker was pro, of course, while I remain pretty firmly anti.

The speaker, Andy Pemberton, suggested that it's probably best to pursue certification for personal growth rather then any hope of financial benefit. The "value" of the certification is going to depend on where you work, and may not be worth anything in some organizations. But the knowledge acquired in obtaining the certification should be valuable anywhere. I think I can agree with that.

Andy said that the certification exam is a good motivation. It drives you to do the studying necessary to pass. I can agree with that too. But it also costs money. Not just books and the time to read them, but something like $900.00 to sit for the exam. That's a lot of money, at least to me. I can't justify spending that much money on the exam, especially when it isn't necessary to acquire the knowledge. You don't get feedback from the exam, just practice.

So what would I do for motivation? Open Source. If you want to learn something new and get a chance to practice it, why not join an Open Source project that uses the technology you want to learn? Or if one doesn't exist, start your own. The SCEA exam involves designing a software solution to a fictitious business problem. Why not find a real problem and write a real software solution, and then release it for free?

I have two Open Source projects that I started myself to explore ideas and write a little code: SimpleGWT and SimpleJDBC. As the names suggest, both are built on the theme of simple APIs for building real world software. I also participate in the Google Web Toolkit project as a community member and occasional code contributer. I think I get more out of these hobbies than I would out of a certification exam.