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.
linuxopenmoko
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
Some Assembly Required
Welcome to OpenMoko
Yes, It Does
Browsing around OpenMoko
Dialing with OpenMoko
Sizing up OpenMoko
Running applications "on" your desktop
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.
mono
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 IronPythonMacPort 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.
openmoko
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).
slidesoftware development
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/
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
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)
monolinux
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:
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.
opinion
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
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
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
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!
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?
slidesoftware developmentfacebook
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:
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.
mono
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!
linuxopenmoko
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
Booting Linux
The OpenMoko Interface
Running a Terminal
OpenMoko Mail
Ordering Take-out
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?
mono
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.
software development
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 royallyscrewingusdevelopersbytryingtospinwebtechnologiesasanSDK, 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
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.
monoslidefacebook
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).
software development
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 somefriends 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 ...
slidesoftware developmentfacebook
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.
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
opinion
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.
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.
slidemiscellaneous
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.
opinion
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.
miscellaneous
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.
slidesoftware development
Having an epiphany over a two-beer lunch on a Wednesday isn't hard, and if you can't, make it a three-beer lunch. I had one such epiphany today where, as if stars in the mental mockup of the corporate world inside my head, started to come into alignment. It is one thing to release a corporate memo that states 'employees are our biggest asset'"or similarly market-drone-tainted nonsense, it is another thing to try to maintain a state of human resources nirvana where your employees genuinely like each other. In my less than expansive track record as a professional software developer, I've always chose the cut in pay, over dealing with colleagues that I don't like. That is to say, I've always opted for the companies to work for where I really enjoyed working with who I'm working with, regardless of what I've been working on. In the end, it's just code. They're just projects. And none of it really matters if you absolutely abhor your coworkers.
I don't. I enjoy working with who I work with, and if you've followed the constant stream of absolute nonsense from twitter stream it might start to become apparent why I spend so much time at the office (cue suspenseful music). I realized that I'm in the right place over the aforementioned two-beer lunch when I made a reference to a paragraph-long snippet from an ancient page of Jamie Zawinski's and everybody at the table knew exactly what I was talking about (Wednesday, 21 September 1994). The references to Arrested Development, or just the common understanding that we will all make jokes, and often the funnier ones are at each others' expense, all make the office a very enjoyable place, to where you can find yourself getting carried away until the wee hours of the morning. (Did I mention we're hiring?)
The startup atmosphere is certainly refreshing after dealing with smaller companies for so long that just "don't get it" when it comes to balancing between trying to bring products to the market yesterday, slowly grinding employees into either burnout or other companies, and the companies that don't understand you're allowed to think big, even if the payroll is small. It is also harder for companies to grow, while maintaining their "startup" tendencies. Apple seems to be proverbially stuck in the "90 hours and loving it!" mode, while Yahoo! has gone from a Web 1.0 blitzkrieg of products to a slow, lumbering giant that operates in every sense that you'd think a large software company, with the right hand not knowing exactly what that pesky left hand is doing over there. Google just has too much damn money. Microsoft is disintegrating into the IBM of old, and all of them fail to capture the fun and excitement of the startup, even though some have tried so valiantly to replicate it[1].
At the end of the day, the majority of us (Americans) need to find some sense of satisfaction and identity in what we do for a living, the importance of who you work with for the majority of your day is the difference between waking up in the morning and dreading what is to come, and waking up in the morning looking forward to lunch just so you can cut out of the office and hang out with your coworkers (I was going to fabricate some statistics about heart disease and stress levels, but the well ran dry shortly after that two-beer lunch when I exceeded my quota of bullshit for the day). In any given job interview that I've been on, I've always been measuring them up while they measure me up, asking myself important questions like if I work here:
will this person annoy me?
will I be thoroughly caffeinated?
will I need to work 12 hour days, or might I just choose to sometimes?
if we accidentally got into a bar fight with a competitor, would we win?
will the world come to an end if we miss a deadline?
There is little worse (professionally) than ending up on a team, or in a company with people you would try to avoid in public, but on the flip so there is little better (professionally) than ending up on a team, or in a company with people you would come to the office to hang out with even if you didn't have to.
[1]: The startup atmosphere seems to thrive around the idea of "make it big or go home." They tend to know that their time is limited so they try to shoot for the stars while they have a chance, some make it there, some burn up on the descent back down.
media
Reminiscent of Michael Bolton, Peter's side-kick, from Office Space I find myself indulging more and more in one of my numerous, geeky, guilty pleasures. Hip-hop. Not just any hip-hop, dirty south hip-hop. Sideways-sittin', wood-grain grippin', screwed and chopped, smoked-out dirty south hip-hop. One of the few exports that I'm proud Texas has produced (ahem) in the last ten or fifteen years. Texas hip-hop in general is a weird mix between the "roots" of rap in that a lot of it focuses on the ghettoes and hardships the artist has experienced growing up in places like Houston's 5th ward, to the "more modern" hip-hop which has become more and more about women, cash, and cars; mainstays of any good hyper-masculine artform.
There. Now you all know. I'm a sandals-wearing, Volkswagen driving, computer programming, book reading, hip-hop fan. Chances are, if I'm driving somewhere, in between points A and B, I'm bumping in my blue Jetta to some David Banner, Paul Wall, Mike Jones, Slim Thug and even some good old Geto Boys. Forget the east coast-west coast nonsense, with the exception of artists like Mos Def, the new home for hip-hop is in the south.
While working, I listen to a few internet radio stations whose collections of hip-hop far exceed my own. In the past I have listened to a great bit of Smoothbeats.com which is a more traditional hip-hop and rap station, but since leaving Texas I find myself listening to Thugzone.com far more. I recommend them both if you're in the same ackward cultural boat that I am, or if you just loves you some hip-hop.
The hip-hop scene has definitely embraced the internet with independent artists like Slim Thug and Mike Jones using it to get their music out to their audiences without relying on rich, prodominently white, record executives to decide which music was more fit for black America. Fortunately for the suburban white kids among us, who have been able to side-step the mainstream media and enjoy the works of artists who may be only from a few miles away but are on the other side of a deep crevasse of social precendence and economic class-structure.