Monday, July 14, 2008

GHOP Awards Ceremony

I just finished a great weekend in the San Francisco Bay Area, thanks largely to Google and their Highly-Open Participation Contest (GHOP). As you may already know, Google worked with several open source projects to run a contest for high school-aged students to complete tasks ranging from translation and documentation to coding and other bug fixes. Vincent Untz, Andre Klapper, and Behdad Esfahbod, Lucas Rocha, and Christian Kellner ran things from the GNOME end, and did a great job. Unfortunately the awards ceremony for GHOP grand prize winners was scheduled for this past Friday, and they were busy at GUADEC. Since I had been involved in GHOP as a mentor, I volunteered to represent GNOME at the ceremony. Later, I found out that the Mono project was unable to send a representative as well. Their side was largely administered by Miguel de Icaza and Michael Hutchinson, and Michael asked me to represent them since I was already going to be there. So although I was probably the least-involved mentor at the ceremony, I was also the only one with two students. :-P

GNOME's Grand Prize Winner: Patrick Hulin

Patrick is a junior at Hopkins School in New Haven, CT. He finished several tasks, often swooping in to get the job done after another student bailed. He submitted fixes to Totem and ported baobab from gnome-vfs to gio, in addition to documentation and GTK+ performance tasks. I had a great time meeting him and his parents on Friday. I'm always encouraged to meet teenagers who actually *enjoy* math, and find opportunities to learn about software development. Patrick is going to be a counselor at a local computer camp this summer, brainwashing^W teaching teens the ways of code and circuit. We had a blast in the lobbies at each Google building, watching on a screen as the world's search queries scrolled by.


Mono's Grand Prize Winner: Dan Abramov

Dan is from St. Petersburg, Russia, and came to the ceremony with his mother (who had an awesome camera, I hope I get to see some of her photos from the trip). He's a largely self-taught 16 year old dynamo. He made some nice contributions to Mono, including Gendarme analysis rules and MonoDevelop addins and documentation. One of my favorite moments of this trip is when I was asking Dan about his future plans, did he intend to go to university in Russia, pursue Computer Science, etc. He told me that although he felt confident programming in managed languages like C#, he wanted to understand more about the low-level details. He asked me if I had read Joel Spolsky's article on "leaky abstractions", and described how sometimes .NET/Mono programming could be like that. I could only laugh with joy that this guy was already reading (and understanding) Joel.

Daniel and his mother
I think it's pretty clear that these students have a huge head-start in computer science. Everybody was interested and excited about open source software. I got a lot of questions about what it's like to work on open source software all day at Novell. Being there, it really felt like I was looking at the next generation of open source leaders. I can only hope they stick with it instead of going down the boring path of being a doctor or a lawyer or something. ;-)

Thank you Google for encouraging these kids, and providing incentives like GHOP and Summer of Code to keep them in our world.

The Visit

It was pretty cool to meet the mentor representatives from other open source projects, some of whom were actually Google employees. Friday was a busy day, what with touring the Google campus, having the actual award ceremony, being interviewed for YouTube (eep), and stuffing my face. We saw presentations about App Engine (by Guido van Rossum), Android (Romain Guy), Google infrastructure (Jeff Dean), and testing at Google (Bharat Mediratta and Mike Bland).

My favorite talk by far was the testing one. Bharat and Mike are among the better pair presenters I've seen, so it was a joy just to watch them. But the subject matter is dear to my heart. At my last company I was often frustrated with how difficult it was to proliferate best practices (specifically TDD) even within a single team. I was fascinated to hear how these guys just decided to fix the testing problem at Google, guerrilla-style. They introduced the awesome Testing on the Toilet newsletter, devised testing training and certification programs for projects and employees, and introduced "test mercenaries" to spread skills where needed by hopping from project to project, staying only a few months with each. Ingraining these practices in a company's culture is a singularly difficult problem. Their example is inspiring, though of course it requires constant ongoing work, and it might be difficult to convince any company to invest such significant resources into a never-ending program like that. I've been following the Testing on the Toilet blog for awhile, but meeting these guys was truly invigorating. I wish there had been time to chat them up afterwards!

The Rest

Over the weekend, Ellery and I visited our old stomping grounds at San Francisco State University, Stonestown Borders, and West Portal. We had a fun dinner with Liz and Bernat at Mozzarella Di Bufala. It was nice; I really do miss my friends sometimes. :-) Later we visited some family in the East Bay.

Ellery is Queen of the Campus
The rest of my photos can be seen on my picasaweb. By the way, Lazyweb, do you know how to tag all photos in an album at once?

Wednesday, June 25, 2008

Recent Hacks: irc2wiki.pl and xchat-nick-pidgin-status.py

The Mono a11y team has weekly iteration meetings in IRC, and we post the logs to the Mono wiki. Our version of MediaWiki doesn't automatically prettify IRC logs, so for awhile I was using Jamie Zawinski's irc2html.pl to create HTML tables. Today I hacked it up to produce MediaWiki tables instead. I call it irc2wiki.pl. Fixes welcome (or better suggestions).

Also, I now live on IRC. Some people prefer to get me through IM, so I always have Pidgin running, but my online presence is mostly reflected in my IRC nick. I'm forgetful, so I kept noticing that I was "available" in Pidgin even though my IRC nick was "sandy|lunch", or that when I changed my nick from "sandy|brb" to "sandy" my Pidgin status would stay the same. I decided to automate that shit. Based on a bunch of useful code from Arstechnica's Ryan Paul, I present to you my first xchat plugin, xchat-nick-pidgin-status.py:


#!/usr/bin/env python

# Sets Pidgin status from XChat nick, assuming you use a style like:
# mynick => Available (status "Workin")
# mynick|busy => Away (status "busy")
# Hobbled together by Sandy Armstrong from code
# written by Ryan Paul (segphault) of Ars Technica:
# http://arstechnica.com/reviews/apps/pidgin-2-0.ars/4
# http://arstechnica.com/journals/linux.ars/2007/08/29/send-twitter-updates-from-xchat-using-python

import xchat, dbus

# Describe the plug-in metadata for XChat
__module_name__ = "Pidgin Status Plug-in"
__module_version__ = "1.0"
__module_description__ = "Set Pidgin status according to XChat nick"

# Specify status ID values
STATUS_AVAILABLE = 2
STATUS_AWAY = 5


def nick(words, word_eol, userdata):
# Get new nick
if len(words) < 2:
return None
new_nick = words[1]

# Check for status
pipe_index = new_nick.find("|")
if pipe_index > 0 and pipe_index < len(new_nick):
message = new_nick[pipe_index + 1:]
# set away with status message
set_status("", STATUS_AWAY, message)
else:
# set available
set_status("", STATUS_AVAILABLE, "Workin")


def set_status(name, kind, message):
# Create a new saved status with the specified name and kind
status = purple.PurpleSavedstatusNew(name, kind)
# Associate the specified availability message with the new saved status
purple.PurpleSavedstatusSetMessage(status, message)
# Activate the new saved status
purple.PurpleSavedstatusActivate(status)


# Initiate a connection to the Session Bus
bus = dbus.SessionBus()

# Associate Pidgin's D-Bus interface with Python objects
obj = bus.get_object(
"im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")


# Associate the nick function with the /nick command in XChat
xchat.hook_command("nick", nick)

Tuesday, June 24, 2008

Tasque 0.1.6 Released

Yesterday I released Tasque 0.1.6 to a legion of hungry Linux users. I can't believe it's been three months since 0.1.5 was released! You can expect to see 0.1.7 a lot quicker, especially because there are some good patches in bugzilla that just need a bit of review.

As you might expect, Tasque 0.1.6 is our best release yet. There's a new task entry widget at the top of the main window, and due dates are parsed right out of the task text. Plus, there are the usual handful of bug fixes, including a few crashers.

Give it a try, and let us know what you think!



Sunday, June 8, 2008

Dear LazyWeb: TiVo, MythTV, Decisions

So we have a TV in the bedroom now. We generally watch TV in the living room, where we have an old Series 2 TiVo that does the job. Now, in the bedroom, we miss the essential TiVo features: accessing recorded shows and pausing/rewinding/fastforwarding live TV.

As far as I can tell, these are my options:
  1. Buy a new TiVo + subscription for the bedroom.
  2. Set up a MythTV box in the bedroom that can get content from the other TiVo using tivodecode.
  3. Buy a MediaMVP or AppleTV and somehow rig it up with tivodecode so I can access content from the other TiVo. This doesn't allow me to pause/rewind/fastforward live TV, though.
Buying a new TiVo has the following costs:
  • New TiVo box: $99
  • New TiVo wireless adapter: $59
  • New TiVo subscription: ~$6/mo
  • Total over one year: $230
Option 2 is setting up a complete MythTV backend+frontend and deploying it in the bedroom. Considering that I'd have to buy a complete PC with a TV tuner, and I'd want it to be attractive and quiet, this would probably be $500-$800. Alternatively I could set up an ugly backend and an attractive frontend, but I doubt that would be any cheaper. This would allow me to have complete TiVo functionality (and more) in the bedroom, and would prevent me from falling further into the TiVo lock-in trap. It's a very tempting solution, but I'm put off by the initial cost.

The Hauppage MediaMVP seems pretty cool. It's hackable, can be made into a MythTV frontend if I ever decide to go down that road, and is super-cheap at $150. The only problem is that I'd either have to use Windows to serve it content, or hack it with MediaMVP Media Center, which doesn't seem very easy to use.

I'm not sure if I can use an AppleTV on my standard def TV. Its only advantage over the MediaMVP is sheer processing power (and easy-to-use interface if I used the provided software). It costs $229.

I guess I have to decide if manipulating live TV in the bedroom is important to me. If not, I could get a MediaMVP or AppleTV and rig up something on the server side to pull content from my TiVo and prep it with tivodecode. This could later be expanded into a full MythTV setup when I feel ready to invest in backend hardware.

However, if pausing/rewinding/fastforwarding live TV is a must, then it seems the more efficient choice is to buy another TiVo.

So, LazyWeb...what should I do? Do you use MythTV? Any compelling reasons that I should invest in setting it up?

Monday, May 19, 2008

Busy busy busy

If you've been desperately waiting for my weekly UIA status update, I'm sad to report that I'll no longer be posting those. You can track the team's progress via the development schedule page on the wiki. Never fear, if I have something interesting to share, I will make sure to post for you!

I've started helping out with Tasque maintenance, so I triaged a bunch of bugs and applied some patches. I think we'll be ready for a new release soon. I like working on Tasque; it's a fun project.

I installed openSUSE 11 Beta 3 in a VM last week. It's looking pretty good! The new intlclock applet is very cute with its weather integration. In openSUSE 10.3, I struggled a lot with package management...YaST's GTK+ interface was easy to use but crashed a lot, zypper had a very nice CLI but was ridiculously slow, and I ended up using the ncurses YaST UI, and leaving it up all day so that I could avoid the slow repository updates. In openSUSE 11, things are worlds better:
  • Zypper is wicked fast, and is now my favorite way to manage packages. All it lacks is tab-completion of package names, but running `zypper se somepackage` is so fast that I don't mind too much. ;-)
  • YaST's GTK+ interface has been updated to GTK2 (so it fits in with the rest of my desktop), no longer pops up a kabillion windows when you install packages (so I can, you know, use my computer while I install stuff), and seems really stable. I found some usability problems, but Sunday I wrote a patch and this morning Michael Meeks committed a modified version of it. YaST's GTK+ code was really easy to follow, by the way, considering I'd never looked at it before. Kudos to the YaST team!
I hope Firefox is better on openSUSE 11. Maybe it's just my crufty 10.3 install, but I've always had freezing/crashing issues with FF2 and FF3. It seems to be running fine in my openSUSE 11 VM, so I'll keep my fingers crossed. Looking forward to doing a clean install of openSUSE 11 on my main machine soon.

Oh and by the way, I'd like to toss out a quick immature Fuck You to Blogger for never auto-saving my posts, constantly crashing Firefox this morning, and having some weird display problem where the "Compose New Post" page has teeny tiny fonts. I guess I shouldn't care too much about the display of the page, since I apparently can't use it to write posts anymore. Normally FF3 restores the contents of text boxes after a crash, but for whatever reason this is not supported by Blogger. Hooray for using Tomboy as a text editor. :-/

Next, spiders...

Tomboy 0.10.2 Released; Please update your distro's packages if you want sync to work!

I just released Tomboy 0.10.2, which addresses a problem in newer distros where the output of `mount` has changed for FUSE shares.

This really needs to get into openSUSE 11, Ubuntu Hardy, etc, or else note synchronization works very poorly. If your distro has a policy of not taking new releases but you can take patches, here's a very simple patch against 0.10.1:

http://svn.gnome.org/viewvc/tomboy/branches/gnome-2-22/Tomboy/Synchronization/FuseSyncServiceAddin.cs?r1=1980&r2=2008&view=patch

I look forward to upgrading sync to use GIO or Conduit in the future so that we can avoid these areas of fragility in our code base.

Monday, May 12, 2008

Tomboy 0.11.0 released, et UIA

This morning I released the first development release in the 0.11.x series. Tomboy 0.11.0 features Boyd's Tasque add-in, the beginning of John Anderson's rewrite of the printing add-in (goodbye libgnomeprint!), and even a patch or two from our founding father. The new printing add-in lacks a few features, most notably text styling/formatting. We'll make sure to get it fixed before 0.12.0 is released, but if you want to see it fixed faster, patches are welcome. :-P

Last week didn't feel very productive at work. I made one commit and a table mapping winforms controls to UIA ControlTypes. I don't really understand where the time went. :-( How many hours did I lose wrestling with my Vista VM, or exploring the Mono implementation of the WebBrowser control? Fortunately, as the table shows, I have PLENTY of work to do! So I'd better get to it...