Howdy!

Welcome to my blog where I write about software development, cycling, and other random nonsense. This is not the only place I write, you can find more words I typed on the Buoyant Data blog, Scribd tech blog, and GitHub.

OpenMoko 2007.2 Preview

I bit the bullet last thursday and started playing with some of the 2007.2 OpenMoko snapshot images, 2007.2 denoting the next iteration of the software. Whereas my previous photos were from 2007.1, the interface was a bit weak, and wasn't much to be proud of. The direction that the interface is now heading in is not only sleek, but much more usable. One of the most important changes, in my opinion, is the addition of acceleration-incluenced scrolling throughout the interface. The new scrolling allows you to do a quick swipe with your finger and have the interface scroll quickly and then slow to a stop, as if your scroll had momentum behind it.

OpenMoko Boot screen











2007.1

2007.2


Welcome to OpenMoko

2007.2 Boot screen



OpenMoko Desktop











2007.1

2007.2


OpenMoko Menu

2007.2 "Today" (Desktop)



OpenMoko Applications











2007.1

2007.2


OpenMoko Menu

2007.2 Applications Browser



OpenMoko Dialer











2007.1

2007.2


OpenMoko Dialing.

2007.2 Dialer



Overall things are progressing quite nicely, but as a developer I feel that I'm teetering between bricking my OpenMoko phone, and making beautiful music with it, either way, I'm along for the ride. The last picture I'll leave you with is one from when my friend whurley and I met up this past week since he was in town representing BMC at Linux World. whurley was one of the organizers of the first iPhoneDevCamp and is a proud owner of an iPhone, regardless, he thought the OpenMoko phone was pretty cool :)


whurley and OpenMoko



You can find all my OpenMoko photos on Flickr
Read more →

Scaling, with your "smart platform choice"

At times I feel as if I am plugged directly into the internet, almost like an NSA wiretap on AT&T's backbone, silently sniffing along reading packets until something throws up a red flag. This specifically applies to both Python, and .NET/Mono related bloggings, in which a fellow I know, Chris Messina, posted something titled "WordPressMU: Making a smart platform choice" which, not surprisingly, threw up a red flag. Chris and I tend not to see eye-to-eye on a lot of things, most notably, microformats, along with Ruby on Rails, and some of the other "Web 2.0" style technologies/idealogies that Chris has embraced, while I stand back and look on, casually remarking "OMGWTFBBQ" every now and then.

Chris opens the post with the following, in reference to a client of his:
Their current website is built in .NET and they’re getting to the point where things are about to start getting set in stone in terms of scaling and overall architecture and it kinda freaked me out that they’d continue down this path using a platform that I think offers little when it comes to organic community-building or much in the way of “doing web things right”.


Disclaimer: I'm not an expert on scaling, I just get yelled at when my code doesn't scale

Chris goes on to mention Ruby on Rails, Django, and WordPressMU, deciding on the third as the best option for building a people-powered Web 2.0 community on. Some of the reasons for this are employment, open source, web standards, community, scalability, politics, and a few others that don't matter. While Ruby on Rails, Django on mod_python, and WordPressMU on PHP are all good platforms to build upon, his complete dismissal of .NET (and in turn Mono) is completely unfounded, and in most cases, blatantly incorrect.

Examples


Looking at some popular sites around the internet, you can get a feel for exactly what it takes to scale:
  • MySpace
    • OS: Windows Server
    • Platform: ColdFusion/.NET
    • Database: MS SQL
    Originally, they were able to scale with ColdFusion, and have since switched over to .NET, making MySpace one of the largest sites running .NET with the largest MS-SQL installations on the planet.
  • Facebook
    • OS: Linux
    • Platform: PHP
    • Database: MySQL
    Facebook has scaled with a combination of MySQL and PHP, with a good amount of customization of their internal build of PHP, and memcached running to ensure database calls are kept to a minimum.
  • Slide
    • OS: Linux
    • Platform: Python
    • Database: MySQL

    Okay, I'm throwing us in there for fun, but we've scaled with MySQL and mod_python with a hefty dose of secret sauce :)
  • Yahoo!
    • OS: FreeBSD
    • Platform: PHP
    • Database: MySQL
    Yahoo! obviously has to scale to serve a gigantic portion of the internet, and they're running PHP, MySQL with C++ extensions written where they need to be in order to acheive extra speed.
  • Wikipedia
    • OS: Linux
    • Platform: PHP
    • Database: MySQL
    Wikpedia.org has scaled with MySQL, PHP along with some Lucene indexing servers and memcached servers running around to improve read times from their database servers

  • Microsoft
    • OS: Windows Server
    • Platform: .NET
    • Database: MS SQL
    Microsoft tends to eat their own dog food with most of their web sites and portals, running on .NET with MS-SQL, and according to Quantcast have 3 of the top 5 sites on the internet.
  • Apple
    • OS: Linux/Solaris/Mac OS X
    • Platform: WebObjects/PHP
    • Database: MySQL
    Apple runs a mix of WebObjects (Java), PHP, and god knows what else on varying platforms (Solaris, Linux, Mac OS X). I'm not 100% on exactly what's going on inside the web team at 1 Infinite Loop anymore, but they seem to be able to scale already with what they've got.

Counter-points


Employment
One of the points made is that it's easier to find PHP developers, as opposed to Python, or Ruby developers, which probably is true. However, .NET developers are definitely going to be more prominent, but most developers worth your employment, especially at a startup, are going to need to be able to pick up new frameworks and technologies quickly.

Open Source
I will agree that having an open source platform to build on is a good idea, but certainly not a deal breaker for .NET, or whichever platform you choose to use. Starting a community, or a web business in general doesn't matter if you can't get your product out the door as soon as possible. Nobody cares how "open" you are in your development process, if you can't ship.

Web standards
Citing Channel 9 as an example of how (somehow) the .NET platform doesn't adhere to web standards and "open data formats" is one of the most ludicrous arguments I've ever seen. You can generate valid JSON, XML, SOAP, and XHTML from any platform, even mod_perl!

Community
Chris makes the argument that somehow his experience in dealing with the WordPress community extrapolates to developing an actual product, and that if you're going to build a community-oriented site, you better use a platform that your community will approve of! Hint, it doesn't matter. 95% of your users probably won't care what you run, as long as they have the product to use.

Economics
The points about economics are certainly valid, in that it's far easier to find hosts and sysadmins familiar with PHP than with Rails or Django (Python), That doesn't mean that it scales however, once you get past a couple of million users, you need people who know what they're doing, with dedicated hardware to help your web application scale.

Scalibility
Talking about how you feel scaling is absolutely absurd. You will feel pain, that's what happens we you have to scale. Standing back, and looking at the code you've worked insanely hard on, and trying to figure out how to make that faster is painful, regardless of platform. If I've consulted with somebody about how to scale my architecture and they say "well, that doesn't feel right" without citing sources, strategies, or reasons, I'm going to find somebody else, or I'm going to fall on my face when the time comes to scale.

Politics
Just a quote:
However, I think people familiar with modern web design would agree with me that WordPress/PHP, Django or Rails are all superior choices over .NET when it come to the politics of technology development. In terms of openness, being forward-thinking and in terms of community outlook, any of these choices are going to net you a very different kind of response. Being keen to what each choice says about you is key to making a wise decision.
First error, is asking people involved in web design how you want to scale, you should probably ask people involved in systems architecture. Politics don't exist when you need to scale, or ship product, it's that simple. What gets the job done, the fastest, with the greatest net result.

End game


Chris' general ignorance of some of the features of ASP.NET 2.0, and his zealotry when it comes to buzzwords like "community, forward-thinking, people-powered, Web 2.0" and their ilk doesn't surprise me, since he's not a developer. For example, in ASP.NET 2.0 you can have asynchronous pages, just like you can have interlaced GIF images, that progressively load, you can have pages that progressively load, instead of needing the server to fully generate the entire page before it's piped back to the client. Of course, none of this matters since architecture is the biggest hurdle when it comes to scaling, not platform. The more important question to answer before you toss out your existing code base in favor of a more buzzword compliant platform are:
  • How can you more efficiently handle database queries?
  • Can you cut out unnecessary database queries?
  • Can you switch over to a newer version (MySQL 4 and 5 I'm looking at you) of your database to improve performance?
  • Will it be effective to add a caching solution like memcached between your web farm and your database servers?
  • What can be relegated into progessive page loads either via asynchronous pages in ASP.NET 2.0, or through the use of AJAX back to your web servers to retrieve more data instead of forcing a new page load?
  • Is this problem simply caused by not having enough servers?


Citing zero empirical evidence, not counting some useless benchmarks (scaling is far more case-by-case than doing benchmarkable operations), and going with whatever "the cool kids" are using is the quick road to failure. All of the sites I mentioned above have people whose job is to sit around all day and figure out how to squeeze more performance out of their architecture and help the sites grow with their userbase. The trick to optimization is rarely a complete rewrite, or any one trick, it's about finding where the bottlenecks are, and doing whatever possible to minimize those.

As a final note, all the platforms referenced above just spit out pages. That's it. It's how you form the output that determines how "community friendly" or aesthetically pleasing the final product is. It's all fair game between the <html> tags :)
Read more →

Meet OpenMoko

I'm not going to try to explain too much here, but I received my Neo 1973, the OpenMoko-based Smart phone today. While it's a developer preview, it's incredibly exciting. So far I've been able to use my Cingular SIM card, if you use AT&T/Cingular, you can check if yours is supported on the wiki. I can run the general built in suite of applications without too much trouble, I also made a phone call, which worked! Unfortunately however the latest build that I have on my Neo doesn't have sound properly working, which sagacis from the #openmoko channel on Freenode is helping me with currently. I'm a bit over-excited so I'll let the images do the rest of the talking for me.


Meet OpenMoko


Meet OpenMoko


Some Assembly Required


Some Assembly Required





Welcome to OpenMoko


Welcome to OpenMoko


Yes, It Does


OpenMoko, Runs Linux


Browsing around OpenMoko


OpenMoko Menu


Dialing with OpenMoko


OpenMoko Dialing.


Sizing up OpenMoko


OpenMoko, Sizing It Up


Running applications "on" your desktop


Running OpenMoko Applications


In general, it's a bit slow, but the developer preview is probably about half as powerful as the planned public-released version. so I'm not exceedingly worried about that. This phone is just all around cool, and will hopefully be a fun device to carry around with me. You can check up on the OpenMoko community by adding Planet OpenMoko to the feed reader of your choice. This is just the beginning.
Read more →

IronPython for MacPorts

What goes better with Sunday evening boredom better than some Tcl scripting and package management? I know! Nearly nothing, my sentiments exactly. After stumbling across a guide or two, I decided I should give creating an IronPython MacPort a try.

I'm not sure on the utility of this minor hack, since the Mono Framework installer includes IronPython 1.1a1. I decided to give it a whirl nonetheless and came up with a pretty simple IronPython Portfile, although there is one thing missing, the IronMath and IronPython DLLs are not properly installed in the GAC. I'm a bit hazy on whether I should be installing the DLLs using gacutil(1) or whether I should just copy things over to the $(PREFIX)/lib/mono/gac and be done with it.. Therefore the crux of my "work" was just creating a sane Makefile, since the IronPython makefile that's distributed on CodePlex uses "csc" and has some pretty nasty syntax.

You can check out my Portfile and copy of IronPython 1.1 from anonymous subversion by:

Clicking over here
or
Checking out the code with:
svn co svn://svn.geekisp.com/bleep/trunk/IronPython


I'm debating whether or not I should submit the port to MacPorts for inclusion in their next release, mostly because I'm not completely sure if the Mono port includes IronPython or not. If you've got the Mono port installed, feel free to let me know if it installed IronPython, or if you feel like offering up a Makefile.mono patch that properly installs the assemblies into the GAC. I'm a bit new to packaging up open source projects for Mac OS X properly, so any tips would be helpful.
Read more →

Ordered Filled

My RT ticket #3824 was finally filled late last week, so I should be receiving my OpenMoko-based (developer preview) mobile phone sometime in the next couple days.

As far as getting Mono functional on top of the device, it seems that the OpenEmbedded project and their BitBake build tool.

I'm wondering how easy the device will be to develop for in terms of getting Mono, IronPython, etc running on top of it, but if it really is the fully-featured Linux-based phone it's reported to be, this could turn out to be lots of fun (regardless of whether or not I can actually use it as a replacement for my miserable Cingular phone).
Read more →

Subversion branching with less Pain™

No matter how good of a source control system you use, branching can always cause loads of problems, and even painful merge days. At Slide, and other companies I've worked with that use Subversion, branching has been particularly painful because Subversion just doesn't maintain branch history like some commercial source control systems (like Perforce), in fact "branching" is quite literally making a copy of the trunk in Subversion.

Depending on the lifespan of a particular branch, and how often you refresh your branch from the mainline branch, merging back down to the main branch can go from bad, to even worse. Interestingly enough, running an `svn diff $BRANCH $MAIN` will give you the correct changes on the appropriate files that have been modified in the branch, where as running an `svn merge -r $START:$END $BRANCH ./` (whereas ./ is your working copy of main) can break in tremendously painful ways causing mis-merges and unintended rollbacks of previous changesets.

While merging down to the main branch today I decided to mix and match both svn diff and svn merge such that I would only merge changes down to the main branch that had been modified in my development branch, ensuring that nothing was changed on the main/stable branch that wasn't intended. The end result was a Python script that would execute the appropriate commands and merge the files one by one from one branch to the other, allowing the developer or QA engineer to check each file before commencing the merge.

After some serious tweaking and a couple of test branches in Slide's Subversion repository, merge-safe.py was born. The script is a bit hackish right now in that it executes svn(1) instead of using Py-Subversion bindings (which haven't ever worked the way I had hoped). There is definitely room for improvement as well, but the basic flow is there such that merge-safe.py will diff the two branches and aggregate a list of files that have been modified since the branch was originally cut from the main/stable branch, then iterate through the file list and either merge (if the file has been edited) or copy (if the file has been added) to the main branch as is necessary.

The script should always be run from the base directory of your working copy of the mainline branch, so if your main working copy is in /home/tyler/slide/main, this script could be run from that directory like:
python ~/scripts/merge-safe.py -h
In general I think the script is easy to use, but I also wrote it so I'm open to suggestions for improvement or ideas on how to more efficiently merge branches together with Subversion.

You can check the code out with:
svn co svn://svn.geekisp.com/bleep/trunk/svnutils/

Usage
ccnet% python qa/svnutil/merge-safe.py -h
Usage:

The merge-safe script should help you, the lowly startup employee
more effectively merge one branch to another by examining which files have changed, and merge/copy those to the destination branch.

Examples:
Do a dry-run of merging from $SRC to $DST where r1002 is the starting branch of $SRC and r1050 is the last revision to merge from $SRC

%> python some/dir/merge-safe.py -s $SRC -d $DST -r 1002:1050 --dry-run

Do an interactive merge from $SRC to $DST
%> python some/dir/merge-safe.py -s $SRC -d $DST -r 1002:1050 -i

Usage: $prog [options]


Options:
-h, --help show this help message and exit
-s SOURCE, --source=SOURCE
The source branch to merge from
-d DEST, --dest=DEST The destination branch to merge to
-i, --interactive Enable merging interactively on each file
--dry-run Run with --dry-run enabled
-r REVISION, --revision=REVISION
Specify the revisions separated by a colon (i.e. -r
100:104)
Read more →

Hacking with IronPython

I've been wanting to play with IronPython for a very long time, but never really got around to it since most of my days are either consumed with Python or Mono to some capacity, but never both.

Despite my initial instinct to flee in terror after looking over some of the IronPython examples I found on various blogs, I decided it would at the very least be worth an install just to check out the interpreter, and to see how well it performs on top of Mono.
ccnet% ipy
IronPython 1.0.2467 on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>>


Scary! But familiar, so I forged ahead undaunted, wanting to start hashing some strings, I figured I'd import the md5 module and get to work.

ccnet% ipy
IronPython 1.0.2467 on .NET 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import md5
Traceback (most recent call last):
File md5, line unknown, in Initialize
File hashlib, line unknown, in Initialize
File hashlib, line unknown, in __get_builtin_constructor
ImportError: No module named _md5
>>>


Alright, so there are still some holes in the IronPython bridge into Python, but this is fine by me, I can call into .NET code! One other thing that seemed to be missing was the 'select' built-in module, which in turn made my little 'telnetlib' based project fall on it's head.

I run an icecast2 server on my workstation, so I can just tune in with my MacBook Pro, and get whatever stream is being served up by the server. The source for the icecast2 server is a script using Liquidsoap which allows for shuffling, bumps, and a couple of other things to make my music-listening experience better. One of the nice things about Liquidsoap is that it has a telnet interface, so I can glean meta-data about what's playing, or control the playlist through the telnet interface. With this telnet interface in tow, I set out to hack up a Windows Forms and IronPython-based controller for already scripted radio station. And thus, my little IronRadio Controller was born:
IronRadio Controller


Unfortunately, I couldn't use Python's native "telnetlib" so I rolled my own IronTelnet class that would permit basic reads and writes to the telnet server, but other than that, the IronRadio Controller is mostly WIndows Forms code and some events cobbled together. The interface is unfortunately poor, as I don't have an Interface Builder for WIndows Forms, let alone IronPython-based Forms (not to mention I could care less about spit-and-polish for anything in X11.app).

The source for the script can be found here, and will require IronPython and Mono to run (or .NET if you're on a Windows machine).

I'm still trying to figure out if I can use IronPython with mod_mono to replace fighting with mod_python, but there are no guarantees as to whether that will work or be worth the trouble.
Read more →

Songbird, a visual review

A few nights ago, not knowing what I should hack on and thinking about Andreia's post about her progress embedding XulRunner in a Mono-based Windows Forms application, I remembered something I had heard about vaguely a few months ago (really vaguely, like remembering to turn the oven off after you've already been on vacation for two weeks). Songbird, a Gecko-based media player being touted as the possible Firefox for media applications, and as their site says:


Songbird™ is a desktop Web player, a digital jukebox and Web browser mash-up. Like Winamp, it supports extensions and skins feathers. Like Firefox®, it is built from Mozilla®, cross-platform and open source.


Feeling curious, bored, and a bit sadistic, I decided I'd give it a whirl on my MacBook Pro. How bad could it be? Besides the fact that they call themselves a "desktop web player" which means god-knows-what, it can't be that terrible, they have an über leet black interface!

It was bad. Very bad.

Songbird is at version 0.2.5 and is marked as a developer preview, and as a developer, I didn't like the preview. I would however, recommend trying out Songbird with a grain of salt in that they have to battle with Mozilla's notoriously bad source code and maintaining cross-platform capability across numerous architectues for Linux, Windows and Mac OS X. Regardless, on to the pictures!

Starting up Songbird for the first time
Songbird, EULA!?

Any application that first presents the user with useless legalese is not off to a good start, especially when Songbird has such an uphill battle to fight against WinAmp and iTunes. I'll subtract a point for the annoyance, but it's a recoverable error for 0.2.5


Agreeing to use the software
Songbird, GPL == EULA?

YIKES! One cannot stress this enough with any software that embeds the GPL, or any other software source license with their released distributions (looking at you OpenOffice.org). Are you out of your damn minds?! Minus five points!

Phew, almost lost it there, now that I've agreed to promise not to violate the GPL when I play songs or "play the web on my desktop" as I inferred from their website, I can continue to get to actually use the software.

Setting up Songbird
Songbird, first run

Before you get to playing music, you definitely need to go through a first run setup, just like iTunes does, to set some initial presets. Nothing out of the ordinary here, but I do appreciate the checkbox to turn off reporting my usage or setup information, +1.

Downloadin' ur extenzionz!
Songbird, Fetching extensions

I was a bit taken aback by the fact that I needed to download the extensions that one would assume were already bundled, since they're selected in the installation process. Given the immaturity of the project, these extensions could have drastically changed since they bundled and pushed the release, so no point change, I can understand their decision even if I don't agree with it.

The images get a bit bigger from here on out, so they'll be linked and pop up in an inline image window thanks to a derivative of Lightbox.

Importing iTunes Library
Fortunately they prefill the textbox with the full path to my iTunes library, otherwise I might not be able to find it myself, assuming I'm a normal user. No points awarded for common sense :)

Importing iTunes Library, seriously
I'm a bit confused, I thought I just imported my iTunes library? Unfortunately Songbird can grab the meta-data properly from my iTunes.xml library file, but can't seem to find the actual music! Therefore, the user needs to select their actual iTunes music folder, or whereever they actually store their music! Adding another step between me, and hearing my commemorative "10th Anniversary of The Wiggles" tracks is definitely not a good thing, -1.

Now to my music!
Not so fast cowboy, first, Songbird needs to tell me that some of my tracks failed to import. Does it mean my AAC music? Or my iTunes Store purchases? Wait, or does it mean my OGG music? Oh well, something failed somewhere. Now that that's done, you don't go straight to your music you just spent about 3 clicks too many importing, you go to some silly media-homepage in Songbird's internal browser. I don't care! I know what Songbird is! I just downloaded and installed it! All I wanted was to hear some rocking good kid's tunes from "The Wiggles." Minus three points for standing between me and my music.

Menus galore!
No really, menus!
Menus and sidebars!
The menus for most of Songbird are reasonably well done, but they have some fetish for including images and non-standard things in their interface. For example, at least on Mac OS X, I can't think of a single application outside of Safari's "History" menu that includes little icons in their menus to let you know exactly what you're reading really is what it says it is. Their side navigation bar also includes, just like Firefox does, bookmarks for crap I don't care about. They're trying to follow some conventions, but not conventions for my platform, a measely one point awarded.

Browsing the library
Fortunately, they weren't able to convolute the most basic function of the media player, playing and browsing through media. +2.

Mini-birds
More mini-birds
One thing they definitely have over iTunes, is their minimized mode is much more compact, and definitely sleeker, +2.

Browsing mp3 blogs
Browsing "custom" mp3 blogs
Essentially, a podcast, I think? Not sure if they're trying to coin the phrase "mp3 blog", but giving me a more direct access to sites that offer feeds is certainly nice, their hybrid browser + playlist interface is pretty interesting as well, +1 for trying something different.

Trying to use it as a browser
In the above image, I decided I should try to click on the links inside the Songbird browser, and I'm not sure if it's a good thing that it opened up my default browser of choice, or absolutely retarded. Given that I work at software company I am sure that this tiny behavioral decision must have taken forever, I can't even make up my own mind about it, might as well give them a pity point since I know that some poor developer probably had to switch this back and forth 8 times before this shipped.



Ultimately, as a developer and big proponent of open source, I can certainly appreciate what they're trying to do with Songbird. On the other hand, as a user of computers in general, I don't care for what they've acheived thus far. Making great software takes a HUGE investment of both time and money, looking over the pond of media players to iTunes for an example, which took over 7 years to get to where it is today and it still sucks (sort of). As a Mac developer, I would recommend ditching their insane reliance on Firefox's codebase and use WebKit as their internal browser and strive for more native interfaces, but that's just being picky now isn't it?

Final Score: -2 :(
Read more →

Facebook Grokathon, and how we're trying to take over the world.

My day (friday) began like most others tend to working at Slide, it began with the previous day and another all night hacking session on an idea Nik (from SuperPoke!) had. Before too many people came into the office I found myself running back to my barely-furnished, marginally decorated apartment to take a shower before leaving for Palo Alto, stopping outside 612 Howard, a.k.a. Slide HQ, on my return trip for a brief cigarette to collect my thoughts and remember that this is all going to make us insanely rich (in theory), I hopped in the elevator. After pitching the idea Nik and I stayed up all night hacking on to our Director of Engineering, Jeremiah, I woke Nik from a beanbag in the game room and along with Will Liu (also behind SuperPoke!) we three Facebook Platform developers stepped into Max's BMW M3 and raced off towards Palo Alto.

Fortunately, not only is Max a good driver, but the M3 is a phenomenal car, which got us there in a swift 30 or so minutes, just in time to show up 15 or 20 minutes late for the Facebook Grokathon. We met up with James Hong of "Hot or Not" while we were walking towards the Facebook Cafeteria and as we entered, Kevin Hartz of event brite said:

"Let's all pause now that Slide has arrived"

(I'm probably butchering the quote)


(Photos courtesy of Seth Goldstein)



I immediately sat down on the floor and popped open my laptop, partially to take notes, and partially because I still had lots of stuff to do! After holding up this sign to Meagan Marks, one of my favorite Facebook employees (alongside Dave Morin and Chris Putnam), I hopped on VPN and got to work. Hacking, taking notes, and listening to people's presentations was very reminiscent of my limited time in college, the hacking bit is more the reason why the time was limited, but that's another story.

Since we arrived late, Max presented close to last instead of the scheduled first, and I'm glad that Max mentioned that he wasn't going to try to upstage anybody and announce an API or let on to too many of our viral marketing strategies. He just casually noted that our applications have touched most of Facebook's userbase in one capacity or another and that Hot or Not's "Moods" application has been integrated into Top Friends for almost a month. In fact, a lot of our application has APIs for them, Top Friends for example integrates into My Questions, FunWall, SuperPoke and Moods, and those applications at some level or another reciprocate. In the end it is more a question of how we, as a business, strategically partner with other companies or individuals inside the Facebook space than whether we feel the compulsion to stand up in front of our peers and say "Look! This stuff we're doing is so awesome! Aren't we awesome!?"

While Dave Morin (head honcho behind the Facebook Platform) was giving a final presentation, Top Friends became the first application on Facebook to hit 10 million installed users. Aren't we awesome?! :)

As the meetup started to come to an end I felt that was a lot of what the meetup/grokathon degraded into, which from a human standpoint, is understandable. We are all battling it out to be "King of the Facebook Platform", so at every meetup like this to come there will be a bit of chest pounding just as there will be collaboration, business dealings, and (hopefully for the next one I attend) good food.

This is only just the beginning, the one year, not the today's two month, anniversay of the Facebook Platform launch should be very interesting.


Read more →

IronRu..OOH SHINEY!

While debating which set of bugs to squash next, I popped open Vienna and started catching up on monologue and came across Jb Evains' post regarding IronRuby which John Lam from Microsoft posted as just being "released" (pre-mega-alpha).

While I don't use Ruby, or even IronPython on a day to day basis, I have done a lot of work in Cocoa (Objective-C) and to a greater extent, Python. Watching hackers get dynamic languages up and running on top of the CLR is almost like watching Neil Armstrong walk on the moon, you were hoping that it could be done, but up until you actually saw it, you weren't really sure if it could actually be acheived.


Unfortunately, I don't care for Ruby's syntax in comparision to Python's, but that still doesn't mean I can't get excited about dynamic languages on top of the CLR, wahoo!
Read more →

Starting with OpenMoko.

I've already ordered my OpenMoko-based phone already and anxiously await its arrival to the U.S. from FIC. The first order of business will of course to see if I can use it as a real phone, which I'm not holding out for since it's very obviously both beta hardware and software. More importantly however, I'm very excited at the idea of getting Mono running on the mobile, Linux/arm-based device.

In the meantime, I've been playing around with the OpenMoko platform inside of the QEMU-arm emulator. Enjoy :)


Meet OpenMoko


Welcome to OpenMoko


Booting Linux


Booting OpenMoko

The OpenMoko Interface


OpenMoko Home

Running a Terminal


OpenMoko Terminal

OpenMoko Mail


OpenMoko Messages

Ordering Take-out


OpenMoko Dialing Out for Thai


All in all the interface definitely needs some work, but as my iPhone toting coworker David Young said "how cute!"

The platform in general has a lot of potential in my opinion, it's still up for grabs whether FIC will completely miscarry on producing decent hardware to run the phone, but you never know. The biggest key will be whether open source developers, notable for producing some of the most horrid user-interfaces since Windows 95, can cope with the new design paradigm that a smaller touch screen interface creates. I'm going to be doing my part, and for that much I'm very excited.


Is that a penguin in your pocket or are you just happy to see me?
Read more →

New Email, etc

Digging through my repository of domain names i rent, I finally found one I felt like using for some of my open source hacking; specifically my dealings with Mono, OpenMoko and Mac OS Forge. I finally setup monkeypox.org for both email, general web servitude, and moved most (if not all) of my related mailing list subscriptions over to tyler(at)monkeypox.org.

You can find me at that mailing address for all things Mono, and most things non-work related. I'm fine with giving out a few email address @monkeypox.org to some of my Mono compadres, provided they're super-cool and pass a 42km long obstacle course.
Read more →

Conference Season: iPhoneDevCamp

I showed up late to iPhoneDevCamp, so late it was Saturday evening and I had just enough time to meet up with whurley, blake, and some of the guys that whurley brought from BMC Software before whurley and I went back to Slide's offices to get some devcamp work done for the night. Overall, I had an absolute blast at the event, despite posting the following to twitter before I arrived: "Walking towards iPhoneDevCamp. I feel so 2.0". The premise behind the devcamp was an interesting one, despite royally screwing us developers by trying to spin web technologies as an SDK, a lot of people still banded together to develop web applications that target the iPhone. Not that the iPhone isn't a cool device, but the browser is an absolute crap platform. As so many people have already pointed out, Cocoa rocks, Javascript, not so much.

The Hacks
The innate suckage of Javascript makes the hacks created by people at the devcamp so much cooler! One of my favorites (that I didn't write of course) was an application that would allow you to remote control your Mac called Telekinesis, followed closely by cooler (and more social) hacks like a flash mob app or the best word processor around for the iPhone, gOffice. In tune with the odd, and usually useless, nature of devcamp hacks, came iSleuth which is both a Mac application and a web application allowing the user to keep an eye on what's happening at the regular Mac while using their mobile one, these guys got extra points for using a real live baby crib during their demo to show how a user could protect their baby, ostensibly with a $2,000 security system.

All in all the (web) applications that were developed were some great hacks, and great examples of developers making due with minimal resources and no API or great developer tools, both of which Apple is usually known for providing.

My Hack
Despite wearing a staff badge the last one and a half days while I attended the devcamp, I primarily hacked on an idea originally pitched to me by some of the BMC developers that showed up as "the hard part." I became so entrenched in the hack that I didn't sleep on saturday night trying to finish it in time for the demo session on Sunday afternoon at 2pm, before realizing around 11am on Sunday that I would probably have to clear this with my employer before open sourcing the project. I won't go into too much detail about it, since I can't post source code just yet (i'll post separately when I get the okay), but there are a few things worth noting:
  • It uses an arbitrary data set, in this case Flickr photos
  • The math is still off a little bit, so the sizing is also off, and thus, it's not done :)
  • I have yet to add reflection support
  • There are still a few rendering issues with the stacks
That said: Cover Flow

I'm still working on it, and am preparing to be sued as soon as I polish it up to look closer to Apple's version :)

All in all, despite what some people might say about the commercial aspects of the devcamp (being hosted at Adobe's Townhall here in San Francisco, among other things) I think it was a great success, bringing people together to make do with the "iPhone SDK". I enjoyed myself and can't wait to help organize the next one when Apple finally releases Cocoa ME (Mobile Edition).



Note: Somehow my (more common than not) late night hackery got me in an L.A. Times article, I didn't have the heart to tell the reporter that I do this at least once or twice a week.
Read more →

Mono, meet Facebook

Recently I've been developing Facebook applications on behalf of Slide (my employer) using our killer internal frameworks. While this has resulted in an extremely fast turn around from the whiteboard to release and 8 of the most used applications on Facebook with well over 15 million users, it's all in Python, about 100 miles and a "tabs vs. spaces" flamewar away from what I "used" to do, Mono.

Believe it or not, Mono has full ASP.NET 1.1, and a near-complete ASP.NET 2.0 class compatibility (check it out!). Not only that, there's two different ways of hosting a Mono/ASP.NET application, via xsp2 (for development) or with Apache 2 and mod_mono (for production). The only logical progression for a hacker such as myself, was to write a Mono-based Facebook application, and thus Weather# was born.

Development
Fortunately the pervasiveness of Facebook client libraries is approaching the commonality of Twitter client libraries, mostly because it's a simple REST API, and it's cool. Since somebody already wrote the code, and weaseled it into the Mono Subversion repository (facebook-sharp) I decided to use it instead of rolling my mini API. The code was a bit old, and obtuse to deal with, so I simply incorporated all of the classes into my project, building everything into my web application. Using one of the many SOAP webservices available on xmethods.net, I used the wsdl.exe app to generate my SOAP client stubs (which are always subclasses of System.Web.Services.Protocols.SoapHttpClientProtocol), which left me with only about 150 lines of interface and basic glue code to bring these components together such that on page load:
  • The user location information is fetched from Facebook
  • A SOAP request to the weather web service is made per zip code or city
  • The return data is parsed and fed into the page for display

The entire project was built in MonoDevelop which has pre-built ASP.NET templates which include customizable build, run and deploy settings for the MonoDevelop build system. When you click "Run" from inside MonoDevelop IDE, it will rebuld the solution, launch your project inside of xsp2 and then open up a new tab in Firefox to the web application. Building/Testing/Deploying is definitely the easiest part of the road to ASP.NET on Mono.

While the ASP.NET Visual Designer is not yet ready for prime time, it's only a minor set back in that you can't drag and drop your web interface together a la Visual Studio .NET, but you have to revert to how most of the web builds their interfaces, with templates and by hand. Given the sheer simplicity of the Weather# interface, this wasn't a major hurdle to overcome.

Deployment
The only true problem with this near-perfect development setup is the actual public deployment, there are only a few hosts that provide mod_mono hosting as of yet. One of the most beneficial features of Mono however, is the full binary compatiblility with .NET, meaning you can develop your entire web application using the free and open source Mono tools, and then deploy your web application to an IIS ASP.NET server (which are very common in the hosting biz). If you have a colocated server, or a virtual private server, it's trivial to setup mod_mono on your Apache 2 web server with most of the mainstream Linux OSes and *bSD's. With ubuntu, in my case, there's only a few packages to install via Synaptic and then move the configuration over in the /etc/apache2/mods-enabled directory and make sure your configuration is correct. That said, if you're the proud owner of a colocated server it should be trivial to configure everything properly.

Facebook Integration
Facebook includes a couple key parameters in their calls into your page to present the user your application, such as the fb_sig_user and fb_sig_session_key, both of which you can pass into any Facebook client library to start to have your application querying the Facebook Platform. Weather# only makes this call once to users.getInfo to fetch the location information it needs. You can query for a lot more information if necessary, but for the purposes of this example, fetching the location was as basic as was necessary. The most complex part is setting up your Facebook applications settings in "My Applications", the Weather# information can be found here (opens in a new window). The most important information is in the screenshot, but if you'll note the callback URL settings. They are set to "iframe" for development purposes (and my desire not to open another port in the firewall to my workstation) and are hitting localhost port 8081, which is the local port I configured my MonoDevelop-deployment xsp2 settings to use. If you switch it over to FBML, you will either have to serve up FBML to the canvas page, or an <fb:iframe/>, but both require Facebook being able to contact your callback URL for proxying purposes.

<fb:conclusion/>
Developing with ASP.NET on Mono is essentially no different than developing with ASP.NET on the stock Microsoft .NET assemblies with the key difference being...no Microsoft .NET assemblies, and no IIS. Meaning, that if you're comfortable with C# or Visual Basic, you can very quickly, and very cheaply develop ASP.NET-based web applications (or web services) and serve them from within your existing LAMP infrastructure. In my opinion, this is one of the best options out right now for current web development, right behind Python; the absolute power of the .NET class libraries is unparalleled, from web controls, to web services, to ADO.NET for data storage, the tools available to the overworked and underpaid developer are worth looking into if you're not already "in the know." mod_mono and xsp2 both run on Mac OS X, Linux, and FreeBSD, and are in the package systems across those platforms (MacPorts, APT, or Ports). MonoDevelop works on Linux and FreeBSD, you can get it working on Mac OS X but it's about as painful as a brazilian bikini wax (erm..so I'm told).



Resources

Read more →

Thriving in a Development Vacuum

Last week there was a post on Coding Horror about the "Dangers of programming alone". Jeff quotes this article which does a fairly good job of expressing the plight. Programming is not a full-time aspect of my work (at least not now) but when we need an application to do some piece of analysis or run some piece of equipment I am the sole developer. While I can relate to watching myself make those mistakes I don't share the same bleak opinion of being a lone programmer. Over the years I've been slowly figuring out how to make the sole-developer arrangement work.


  • Discipline is key: As mentioned in the original post, and quoted on Coding Horror, there is a lack of oversight in a situation like this. You are your own overseer. You have to have a great deal of resolve to keep your code clean, to keep your work prioritized, to keep on deadline, to keep up with documentation.

  • It isn't really a vacuum: I've got some friends online that I frequently bounce ideas off of and vent to. They often don't know specifics of what I'm working on, and they don't work on anything similar to what I'm doing, but it has still been vital to keeping me sane.

  • Keep learning new things: My early work was all in VB6, since then I've done projects in C, C#, Java, and Ruby, as well as a bit of dabbling in Python. If I had been stuck doing VB6 all this time I probably wouldn't be coming back tomorrow.

  • Be in control: Keep in contact with the relevant parties involved in the project. Don't be afraid to say things like "this can't be properly implemented in that amount of time" or any other variation of "no". It's hard to say "no" because, at the end of the day I really want to do almost every project that gets proposed.

  • There's more to life: At the end of the day, every day, I go home and I play with my kids. There is no project, no deadline, and no responsibility in my professional life that is more important to me than my family. Of course that doesn't mean that I don't work late, or work at home on weekends, but it provides a necessary balance when work starts to stress me out. Of course this really has nothing to do with working in a vacuum, it is a basic necessity for any position.



I think suggesting that programmer should demand to work with other programmers, as suggested in the Coding Horror post, is a bit extreme. The real requirement is to be able to work in a way that won't drive us insane, whether alone or in a team.

Of course this is all based on my personal position, which doesn't involve programming for all 52 weeks in a year, being constrained to one project for extended periods of time, or distributing my applications to any wide audience. Maybe what I should be writing about is all the reasons I love my job ...
Read more →

Insanity.

It's been exactly one month since the F8 event (Facebook Platform Launch) changed everything, and it's still going.

Rumor has it that users at some point translate into money, and at some point that money might see my bank account. I'm not holding out hope for this, but it's a novel idea.

Who would of thought that some of the goofiest ideas I've ever implemented would take off?

Here's the differences that I've found:
  • Indie Developer: "Man it'd be cool to have a couple of thousand users"
  • Enterprisey Contract Developer: "Man it'd be cool to have a couple hundred thousand users"
  • Startup Developer: "Man, I hacked up something over the weekend that has a couple of million users. Ho hum, to the pub?"[1]

The sheer scale of the market on the web is mind-boggling, despite working for a web company, I still stand by Todd Manning's comments of "I hate the web, the web is stupid." It's a fact I accept however, I hate Windows as a development platform, but I'm willing to accept that it's too large of a market to ignore (something the guys at plasq get with both skitch and ComicLife).

Not three months ago my days were filled with C# and now it's all python all the time.


I'll sleep when the bubble pops.


[1] Just kidding, I cherish every single one of my users like they were my own children, staying up late worrying, wishing it were legal to hit them with a plank of wood
Read more →

Long Live the License Flamewar

It's been far too long since I've lobbed a shell in the direction of a good "discussion" on open source licensing, so thanks whurley. I haven't stood on my soapbox/posted here in a while either, what better opportunity to go off on why I don't think the GPLv3 does anything worthwhile and what I think is wrong with nearly every GPLv3 vs. GPLv2 discussion.

The non-problem that v3 tackles is "tivoization". The concept here is that Tivo takes linux, customizes it, puts it on their set top boxes, makes their customizations available, and locks down the set top boxes you can't change the software running on them. To the first reason at the link I gave, I say "so what". Tivo makes a device that phones home and you can't turn it off. There is no issue modifying the software, as they correctly point out, but you can't make the hardware operate with that modification. I don't think preventing people from repurposing hardware is something that should be pursued in a software license.

They go on to further justify this with a doomsday scenario. The reason it seems far fetched is because it is. The programmable computer is simply not going to disappear. Special purpose computers are being locked down, but that is nothing new. I have a pile of electronics in my home that I can't program and I don't think one of them running Linux should make that any different.

I'll also note that they don't seem to look at a doomsday scenario for the so-called ASP loophole.

The other feature GPLv3 offers that I don't see much value in is the patent provisions. One more weapon in a patent arms race. While I appreciate that things like patent pledges have worked largely as a deterrent to widespread software patent lawsuits, so far, the GPLv3 is applying a small bit of salve to a sore while doing nothing for the disease.

Now I'm going to talk about the argument itself. If we look through the comments
to the post that I originally linked we can sum them up pretty easily.

  • The respectful disagreement - These are good, I'm a bit hard on GPLv3 proponents when my real problem is with Free Software Zealots.

  • You don't understand the problem - they don't understand that it's even possible to have a different opinion, or they just feel as though your opinion doesn't matter

  • Trust me, there is a problem or that loss of freedom is for your own good - Gee, thanks. I just needed to be reminded that RMS is "Far-sighted" and that my opinion still doesn't matter

  • Just go with it, the goals are the same, this is just an update - Obviously some people chose the GPLv2 thinking Tivo was fine. A purported Bruce Perens gave this one along with some more constructive comment

  • Yeah, you tell'em whurley - agreement with very little substance, my comment included



Thinking that people who disagree with the GPLv3 just need to be educated is wrong. I'm sick of seeing "You don't understand," "Trust in RMS," and "This is just an update" responses. Not every issue is a war to be argued, and not everyone will agree with you. I think you become a zealot when you decide that you are obviously right and there is no room for disagreement.
Read more →

Almost There

For the past two weeks I've been in super-mega-extreme stress mode, helping release an insane amount of features, applications, and fuzzy bunnies, which means my miscellaneous hacking time has been consumed by the man. I've got two week old code sitting in my /Software folder waiting to be tested, committed to Subversion and released for my "Windows Eye for the Cocoa Guy" series.

I've casually mentioned to a few friends that we'll catch up when the insanity dies down, to which I get chuckles and "nice knowing you" comments.

You Silicon Valley veterans suck.
Read more →

Conference Season: OSBC

I was fortunate enough to be able to go to "OSBC" (Open Source Business Conference) during this past week, I didn't exactly have a badge and I didn't register, I walked right in and snooped around since OSBC was hosted at the Palace Hotel on New Montgomery and Market St (a mere two blocks from Slide offices). It was right there, how could I resist? While at OSBC I met up with my good friend whurley to have lunch, meet some folks, and the usual pointing and laughing at the suits scurrying about. After the meeting a few folks and taking in a lot of what was going on, I couldn't help but thinking:

Shit.




They know, they know, they know. Not only do they know, they now use it casually the same way they started to talk about "emerging web technologies", the "services oriented architecture", the "power of viral marketing through the blogosphere", etc.

They are now talking about "leveraging open platforms" and "the convergance of open source and their systems". This has become nothing more than a bullet point on a poorly made PowerPoint presentation, nothing more than another tagline in a corporate press release.

Shit.




It's over now, it was such a fun ride, but it is so over it hurts. Looking at the big companies re-orienting themselves around a more "open source" attitude is almost as painful to watch as last year's State of the Union address. Apple adopted open source out of necessity, Novell adopted open source out of necessity (besides, remember how much Groupware SUCKED?), why are these other companies adopting open source? It's the hip new thing of course!

Overhearing suits talking to one another, blindly curious as to what the others' companies' "open source strategy is" is like nails on the chalkboard of my little open source soul. It is a completely empty thought for them, just as once upon a time they were buzzing about their new "web presence strategy" regardless of whether or not it made sense for "Johnson Toxic Chemicals USA, Inc." to have a web presence, they wanted one so they could checkoff a tally-mark on the "Uninformed Suits Monthly" magazine survey.

If we're lucky they won't corrupt it too much like they did to the internet in the late 90's. whurley's comment "they're here" with regards to the number of lawyers that he came across at OSBC is extra-special scary. It's funny though, just the other week as I was partaking in yet another "GPL vs. MPL vs. BSD" license flamewar, I couldn't help but think: "you know what would make open source better, some more fucking lawyers." The only way I would want lawyers muddling with open source would be if their name was "Johnny Cochran," purely for the entertainment value alone.

Just like everything good that's ever happened, rock music, the Olympics, rap music, hockey, and of course, beer. Open source is about to be commercialized and turned into a commodity by soulless corporations and lawyers.

It was fun while it lasted, I guess.

Shit.


Read more →

Sp4mz0r

After receiving an email a few weeks back about blog spam on my former blog, I decided that I'd go ahead and remove it. About 500 random spam comments later, it's been mostly removed. I'm still wondering if the captcha is that much better for Drupal, or if I've simply not posted anything popular enough to register on the Digg, or O'Reilly blog radars to attract the spam bots? I feel so unloved :)

As a side note, I finally got around to fixing the Drupal mail issue for this site, so if you attempted to register, but never got the confirmation you can request a new password to reset your account. I'm also testing the Twitter Drupal module with this post. Oy.
Read more →