diff --git a/_posts/2007-01-03-another-blog.html b/_posts/2007-01-03-another-blog.html
new file mode 100644
index 0000000..166a6af
--- /dev/null
+++ b/_posts/2007-01-03-another-blog.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Another Blog?
+tags:
+- Miscellaneous
+created: 1167839271
+---
+Why would I sign up for another blog when I barely even create content for the first one? Maybe now I can keep that one clear of random bitching and cell phone reviews.
+
+Besides, tyler is one cool frood.
diff --git a/_posts/2007-01-03-new-blogthing.html b/_posts/2007-01-03-new-blogthing.html
new file mode 100644
index 0000000..c3ac77e
--- /dev/null
+++ b/_posts/2007-01-03-new-blogthing.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: New Blogthing
+tags:
+- Miscellaneous
+created: 1167835958
+---
+After talking with Phil Aaronson about a recent rant of mine (Bribing Bloggers, Better) I found out that this domain was available and couldn't resist the temptation. I've been meaning to move to a Drupal-based blogthing for quite some time, and the perfect storm of the domain being available and having a brief moment of free time combined with $9 led to the creation of unethical blogger.
+
+My own personal blog URL on the site is http://www.unethicalblogger.com/blog/tyler and I've left open user registration, so you too can have an unethical blog! For example, if I were a Vista shill, I could magically register the username "vistashill" and have an unethical blog at http://www.unethicalblogger.com/blog/vistashill and well, you get the point. I'm going to leave this open and see where it takes me, I am not putting ads on this site, but I must mention the hosting is provided ever-so-graciously by my (good?) friend Dave Steinberg over at GeekISP (GeekISP also happens to host the bleep subversion repository, amongst other things).
+
+I've had better, but I've also had much worse ideas, we'll see where unethical blogging takes me.
diff --git a/_posts/2007-01-03-scp1-resume.html b/_posts/2007-01-03-scp1-resume.html
new file mode 100644
index 0000000..a9a56da
--- /dev/null
+++ b/_posts/2007-01-03-scp1-resume.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: scp(1) resume
+tags:
+- Miscellaneous
+created: 1167841754
+---
+I came across this blog posting yesterday and figured I'd relay it because all of a sudden it's changed how I transfer large files. While scp(1) doesn't support resuming, but rsync(1) does and in a very Captain Planet-esque fashion, their combined powers allow for secure, resumable file transfers.
+
+By adding the following alias to .profile you can easily switch from the stock-scp to a resumable one:
+alias scpresume="rsync --partial --progress --rsh=ssh"
+
+It's then just a matter of using "scpresume" where I would use scp(1):
+intellian% scpresume medahugefile.tar.gz remotehost:
+
+This shouldn't incur too much overhead, but it sure makes large transfers much less painfull on a bad home-user uplink.
diff --git a/_posts/2007-01-04-dear-hp-fall-on-something-sharp.html b/_posts/2007-01-04-dear-hp-fall-on-something-sharp.html
new file mode 100644
index 0000000..9e6b8a1
--- /dev/null
+++ b/_posts/2007-01-04-dear-hp-fall-on-something-sharp.html
@@ -0,0 +1,30 @@
+---
+layout: post
+title: Dear HP, Fall On Something Sharp
+tags:
+- Opinion
+created: 1167940808
+---
+I may be too young to remember a Hewlett-Packard that actually innovated and hired engineers to do more than design crap personal computers, and crappier printers. Like an absolute dolt, I assumed this HP LaserJet 1020 would somehow be different. This time, things would some how work. This time, I wouldn't let myself be suckered in by the promise of quick, efficient printing.
+
+This time, I would be duped again.
+
+This printing saga started with an HP Photosmart C3100, a printer that somebdoy thought the all-in-one-ness of the printer would be a great choice, and by golly, the box says it supports Mac OS X! What a gullible chud I turned out to be. As I sat looking at the HP Printer Setup Utility on the right side of my screen complaining that it could not find the printer on the USB bus, and the Mac OS X Printer Setup Utility on the left side of my screen properly finding and identifying the printer on the USB bus, I honestly felt a little part of my soul curling into a ball and just dying. To make things worse, this was on a PowerPC Mac, who knows what sort of explosive chemical reactions might of occurred if I had trying this with my Intel Mac.
+
+Fast forward at least a year, to a poorly lit apartment in north-western San Antonio. A tall man stares blankly at a printer recently removed from the styrofoam entombing it, wondering first why there is a power cable included in the box but no USB cable, then progressing along to the toner cartridge which has no directions, nor indication on how it is to be inserted into the beast of a printer that lay before him. As with most peripherals purchased from anywhere but an Apple Store, this device may or may not work with Mac OS X (after looking online, the HP LaserJet 1020 apparently can be used from Mac OS X with a 1022 driver). After installing the 1022 driver from the HP.com website, precocious hope is quickly replaced by a subdued rage as the gorgeous 20" screen dims and a message that means nothing other than "restart" is displayed in the center. Shortly after reaching behind the screen and pressing the power button, the message is displayed again as the machine boots up. The device is angrily moved from one end of the office to the other and plugged into a hideous looking Dell machine lying tucked away, following a brief install process, the device succeeds in printing a "Windows Test Page" to verify its functionality, and nothing more.
+
+Fast forward another couple of days, my attempts to print a PDF from within Mail.app are greeted with a similar subdued anger staring at a crash report from Mail.app and a stack trace that contains the following:
+
+Thread 0 Crashed:
+0 com.apple.CoreFoundation 0x90859b76 CFBundleCopyLocalizedString + 106
+1 com.hp.framework.imaging 0x0eec21f2 AResAccess::CopyExplanationString(ExpType, __CFString const*, short, unsigned char) + 152
+2 com.hp.framework.imaging 0x0eec3b72 AControl::CopyDescriptionString(__CFString const*, __CFString const*) + 132
+3 com.hp.framework.imaging 0x0eec382f AControl::InitDescriptions(OpaqueControlRef*) + 61
+4 com.hp.framework.imaging 0x0eec2b38 ABooleanControl::ABooleanControl[in-charge](__CFString const*, AAccess*, OpaqueControlRef*) + 46
+5 com.hp.framework.imaging 0x0eec4a17 AControl::ControlFactory(AAccess*, __CFString const*, OpaqueControlRef*, int) + 313
+6 com.hp.framework.imaging 0x0eec4fbf AControlGroup::AddNewControl(ADataProvider*, __CFString const*, int) + 83
+
+
+I now have an HP LaserJet 1020, sitting on the counter that won't print from Windows, Mac OS X, or any Linux I've tried. Excluding Mac OS X/intel, all the OSes properly identify and configure the device, but that's about as far as any of them can go before meeting the iron curtain HP has wrapped around their miserable hardware and software. I have a feeling that the HP iPod was the last device that Hewlett-Packard sold that actually worked, everything I've either purchased, or come across of theirs certainly doesn't.
+
+R.I.P. Hewlett-Packard; at one point it did grand things in the industry, only to die a slow, suffocating death from its own desire to compete in a flooded commodity PC and printer market.
diff --git a/_posts/2007-01-04-going-on-tour.html b/_posts/2007-01-04-going-on-tour.html
new file mode 100644
index 0000000..81a3df3
--- /dev/null
+++ b/_posts/2007-01-04-going-on-tour.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Going on Tour
+tags:
+- Miscellaneous
+created: 1167912576
+---
+I have mentioned this to a few people already, but I will be attending te MacWorld Expo this year. Unfortunately the project I have been hustling to attempt to finish in time for MacWorld will not be done until late january/february, so I'll be schmoozing and talking it up at MacWorld, and walking around with a big dunce hat on my head.
+
+
+
+True to my inherent nature (see: dunce), I will be packing the bleep roadshow into my super-mega-awesome VW Jetta and driving from San Antonio to San Francisco. What does this mean for you I bet you're contemplating, well, a one time opportunity not only to meet me (a rare honor only bestowed various hiring managers and women of the night) but you too can buy me a beer, lunch, or dinner! If you're a Mac/Mono developer and just happen to either be in San Francisco next week, or along the way, drop me an email (tyler@bleepsoft.com) and I'd be more than happy to stop in $CITY long enough to grab a bite to eat.
+
+I'm not completely sure what to expect, nor how to schedule my time while there. I'm thinking about forgoing buying a "Users Conference" ticket or a "MacIT Conference" since it seems to be as large a waste of money as lighting my January rent payment on fire. Right now I'm planning on buying an exhibit hall ticket, bringing a stack of business cards, and resumés and seeing how many people I can meet.
+
+Again, if you're going to be there, let me know. The bleep roadshow departs early on the 7th, so my email will be hit and miss en route.
diff --git a/_posts/2007-01-05-academic-masochism.html b/_posts/2007-01-05-academic-masochism.html
new file mode 100644
index 0000000..6094ceb
--- /dev/null
+++ b/_posts/2007-01-05-academic-masochism.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Academic Masochism
+tags:
+- Academia
+created: 1168016950
+---
+Interesting post on Groklaw about freely available "courseware". The OpenCourseWare Consortium seems like a fantastic idea to me. Academia is really all about sharing knowledge.
+
+I've already bookmarked the MIT Mechanical Engineering page, though I can usually find comparable material in my own department.
diff --git a/_posts/2007-01-06-roadshow-departing.html b/_posts/2007-01-06-roadshow-departing.html
new file mode 100644
index 0000000..49fa110
--- /dev/null
+++ b/_posts/2007-01-06-roadshow-departing.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Roadshow Departing
+tags:
+- Miscellaneous
+created: 1168127995
+---
+Over 3,500 miles.
+
+Over 27 hours of driving.
+
+One big Mac conference to attend.
+
+This is absolutely insane.
diff --git a/_posts/2007-01-06-texas-is-bloody-big.html b/_posts/2007-01-06-texas-is-bloody-big.html
new file mode 100644
index 0000000..290bd97
--- /dev/null
+++ b/_posts/2007-01-06-texas-is-bloody-big.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Texas is bloody big
+tags:
+- Miscellaneous
+created: 1168148632
+---
+Almost exactly 333 miles into this trip, and I find myself sitting at a texas rest area (free wireless!). I stopped here about 50% because of the free wireless, and about 50% because I really wanted to see what it felt like to go to the bathroom in 30 degree temperatures.
+
+Unfortunately, thus far the coolest things I've seen are, something on fire on the side of the road, and the moon. West texas isn't really all that exciting. I better get back to cruising though, El Paso is something like 260 miles from here.
+
+I don't plan on making regular blogging stops, this one just happens to coincide with a more biological deadline.
+
+Hoping to be through New Mexico by sun up. Eep.
diff --git a/_posts/2007-01-09-meeting-a-comic-genius.html b/_posts/2007-01-09-meeting-a-comic-genius.html
new file mode 100644
index 0000000..37de6d8
--- /dev/null
+++ b/_posts/2007-01-09-meeting-a-comic-genius.html
@@ -0,0 +1,8 @@
+---
+layout: post
+title: Meeting a Comic Genius
+tags:
+- Media
+created: 1168360432
+---
+Yesterday afternoon at the Flash Fire Facility we got a visit from Rick Mercer. Since it won't be airing for a week or so (and thankfully I won't be in it) I won't yet comment on the stuff we did, but it was pretty cool. It was a lot more fun than some of the other TV spots we've done (local news, Daily Planet). Rick was pretty cool, and needless to say very funny. I'd invite him over for a BBQ anyday.
diff --git a/_posts/2007-01-10-its-just-diddy.html b/_posts/2007-01-10-its-just-diddy.html
new file mode 100644
index 0000000..1e821fc
--- /dev/null
+++ b/_posts/2007-01-10-its-just-diddy.html
@@ -0,0 +1,21 @@
+---
+layout: post
+title: It's Just Diddy
+tags:
+- Opinion
+created: 1168471055
+---
+I suppose I will really never be able to fulfill my childhood dream of working for Apple Computer, Inc. Bummer. The changing of the name from Apple Computer, Inc. to Apple, Inc. is certainly symbolic, but I think carries far more weight in the industry than anybody is really giving credence.
+
+Over five years ago, Apple told us that the Mac was becoming/is the digital media hub. They told us that the Mac was going to be the center of our digital life, and like a dropping a penny into an empty well, nothing happened. A glance of the industry as a whole is almost sickening in terms of the void that just didn't get filled. Apple should not have needed to create the iPod. Apple should not have needed to create the iPhone. To paraphrase what Steve Jobs said to a reporter from CNBC "we create products we want to [need/]use." Apple is slowly learning what John D. Rockefeller learned over a hundred years ago, vertical mergers will make you obscenely rich, or to put it more succinctly in terms of Apple's situation, you cannot trust the rest of the industry "figure it out." The Nomad Jukebox is a decent device, but it doesn't integrate into the rest of my "digital life" like the iPod did when it came out. The Motorola Razr, or the Blackberry are all nice devices, they sleek, they have appeal, but they just suck. The software is miserable, and they don't integrate like the iPhone does/will, so they're doomed to play the second-fiddle that Microsoft is finding itself playing with regards to the Zune.
+
+Moving from Apple Computer to just Apple is a weighty change at least in terms of the company mindset that should have the rest of the industry scared sh#$less. Apple is moving away from just computers to something most Mac OS X users have become familiar with, the experience which they have excelled and building with iPhoto, iMovie, iTunes, and the peripherals to go with them. While Microsoft did beat Apple into the living room with the original XBox (I know a number of people that use their first gen XBoxes as both DVD players and media hubs), appleTV has some catching up to do, but has something Microsoft doesn't (besides the religious fanbase), the "experience" necessary to get every joe and smoe type to not only desire an appleTV, but actually use it.
+
+The iPhone is a good example of Apple's power to look at an existing market and completely change the "level of play" required to compete in that market, and do it in such a way that everybody from Main Street to Wall Street is now paying attention.
+
+
+That's officially my one, requisite, Macworld 2007 blog posting. I'll finish with this image, courtesy of David Young's blog.
+
+
diff --git a/_posts/2007-01-11-emission-coming-soon.html b/_posts/2007-01-11-emission-coming-soon.html
new file mode 100644
index 0000000..5a3c582
--- /dev/null
+++ b/_posts/2007-01-11-emission-coming-soon.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Emission, Coming Soon
+tags:
+- Cocoa
+created: 1168542122
+---
+As some of you (both rather) may have noticed, the bleepsoft.com homepage is a bit different these days.
+
+In the very near future bleep will be releasing an application called "Emission" that, besides the cool icon, will certainly change how I work with the wide array of people across the globe that I deal with on a daily basis.
+
+As a lot of the network core is still unwritten (yes, it's very network-ey), so I'm not going to disclose too many details, but check out the site, Fernando Lins has done a fantastic job on the icon.
diff --git a/_posts/2007-01-15-being-white-rocks.html b/_posts/2007-01-15-being-white-rocks.html
new file mode 100644
index 0000000..fb51f50
--- /dev/null
+++ b/_posts/2007-01-15-being-white-rocks.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Being White Rocks
+tags:
+- Opinion
+created: 1168930180
+---
+On my recent trip back from road trip, I couldn't help but appreciate Chris Rock's commentary on "being white" when he said "I always viewed being white like always having five bucks in your pocket."
+
+Sitting in line at a border patrol station just east of El Paso, I watched a hispanic family in a van get inspected relatively thoroughly, and couldn't help but giggle at the "inspection" that awaited me:
+Are you a U.S. citizen?
+arrrrrrr
+...Is that a yes or a no?
+yes. (-_-)
+Have a nice day.
+
+
+I feel secure.
+
+
diff --git a/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html b/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html
new file mode 100644
index 0000000..ca0984b
--- /dev/null
+++ b/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Cocoa Radio, I'm Almost Relevant
+tags:
+- Cocoa
+created: 1168934782
+---
+Through some twist of fate, I was interviewed on Cocoa Radio. I think I managed to maintain some semblance of competence throughout the interview until some random fellow sat really close to Blake and I and threw my concentration.
+
+It was pretty fun, Blake and I hung out most of the week (I even rescued him from the airport in blue lightning on thursday) so doing the interview was a bit weird, as we talk regularly.
+
+And thus begins my long hard trek into the public consciousness; I'll be super-famous, just like Sting, you'll see.
diff --git a/_posts/2007-01-18-howdy.html b/_posts/2007-01-18-howdy.html
new file mode 100644
index 0000000..6a01a6d
--- /dev/null
+++ b/_posts/2007-01-18-howdy.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Howdy?
+tags:
+- Opinion
+created: 1169143399
+---
+So today I began what I hope is a great experience at Texas A&M University, but as I walk through the freezing cold weather and enter my first class I realize I have entered a different world. This has nothing to do with the amout of work or toughieness of the classes ( liked my bushism there... heh heh), its getting used to saying Howdy. Howdy, who the dues says howdy...., people dont say hi here, they say howdy.... what is with this, plus depending on how you say it howdy can sound very (insert brokeback mountain joke here). Well lets just hope things work out, i may just revolt and just say, hi.
+
+whatever
+
+As always I am the roy
diff --git a/_posts/2007-01-19-educating-engineers.html b/_posts/2007-01-19-educating-engineers.html
new file mode 100644
index 0000000..8d7b46e
--- /dev/null
+++ b/_posts/2007-01-19-educating-engineers.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Educating Engineers
+tags:
+- Academia
+created: 1169228449
+---
+Found an interesting article (through slashdot) on how we should be educating engineering students. The bird's eye view is that students should come out of school with the ability to continue learning rather than some specific skillset. The slashdot discussion and the article really cover mostly different ground on the subject, with the comments on /. debating the pros and cons of teaching engineers as thinkers or trades-people and the original article focusing more on how the education of thinkers can be done. Of course this isn't limited to engineering, any really good Comp. Sci. program runs the same give-and-take between teaching students to program and teaching them how to solve problems.
+
+I don't really think there's necessarily a right answer in any of this. At this point in time it seems to me like the market for Engineers as workers with a certain skill set is notably present (and I'm going to entirely avoid the debate about whether that is right or wrong), while there is undeniable value in being able to apply knowledge outside of a specific skill set (I'm also going to avoid debate about whether this can be taught).
+
+My own career, thus far, has been a case study in why problem solving is more important than specific skills. I am a graduate of the Computer Engineering Co-op program at the University of Alberta. Of my five terms of "Work Experience" I spent the first three doing PLC programming, circuit diagrams (in AutoCAD), and specification and ordering of parts for industrial control systems. My last two were spent doing data acquisition programming in Visual Basic in a direct precursor to my current position, which is a mix of Windows programming, putting together custom experiments, and heat transfer research. I'm also preparing to begin a M.Sc. degree in Mechanical Engineering.
+
+The common theme in all of this is that none of my day-to-day work heavily involves anything I learned as a skill in my undergraduate degree, though I admit I haven't followed an entirely traditional career progression. I heard a Faculty member whom I have a tremendous amount of respect for answer the question "What qualities do you look for when you're looking for graduate students?" with something like "I like to see how they react to problems outside of their comfort zone." Of course he elaborated more on that, and the point was that it much more important for the student to be able to figure out something than to recite something. He also noted that you can get very different solutions to a problem from someone who solves it using a well-trained skill and someone who solves it with ingenuity, reasoning, and research.
+
+Getting back to the article, I really think the term "meta-skills" is fantastic. While you learn skill in a program (and that's inevitable, most concepts in applied science and engineering are taught through some usable skill) the important thing isn't necessarily the skill or even the concept (which set the "trajectory" talked about in the article), but the ability to turn learning skills and concepts into a skill in itself. I think the article essentially skips the most important part of making that happen for students, telling them directly what they should be gaining. All the hand-on activity in small groups in the world isn't going to help them make that leap if they just see it as another lab assignment in a course that's only marginally (if that) related to the job they hope to have when they graduate.
+
+As for the slashdot discussion, while interesting, I think it misses the point by focusing on theory vs. application. As many comments correctly point out, both theoretical understanding and practical ability are important, but in the context of the articles theories and concepts are simply another skill learned. A high level mathematics theory is every bit as narrow as a single programming language if the person who knows that skill doesn't have the ability to work outside their "comfort zone". Versatility is key. But like I said, the discussion is pretty interesting. I've noticed quite afewinterestingcomments. As a note on that last comment, it is fairly similar to (albeit longer) the engineering program here. All engineers here take a common first year, specialize in years 2-4 (while still taking cross-discipline courses), then have to practice as an E.I.T. for years (a residency of sorts) before being able apply to become a Professional Engineer (which is a term whose use is legally restricted).
diff --git a/_posts/2007-01-20-baby-ill-panic-your-kernel-anytime.html b/_posts/2007-01-20-baby-ill-panic-your-kernel-anytime.html
new file mode 100644
index 0000000..def226a
--- /dev/null
+++ b/_posts/2007-01-20-baby-ill-panic-your-kernel-anytime.html
@@ -0,0 +1,33 @@
+---
+layout: post
+title: Baby, I'll Panic Your Kernel Anytime
+tags:
+- Software Development
+created: 1169339883
+---
+I've been experiencing a kernel panic for the past couple weeks, sporadically, but I've finally come up with a reliable set of reproduction steps (for my set up anyways). I have a nagging feeling it has something to do with the Parallels Kernel Extensions (specifically the pseudo-networking devices).
+
+The basics of my kernel panic are as follows, for purposes of demonstration, let's pretend Mac[0] is the machine you feel like kernel panicing, and Mac[1] is some other machine sitting around causing trouble:
+
On Mac[0] enable "Personal File Sharing" (i.e. turn on Apple File Sharing)
+
Using Mac[1], mount an AFP share from Mac[0].
+
Transfer a large file (ISO, DMG, pr0n.mp4) from Mac[0] to Mac[1].
+
+I've been able to reproduce this at the login screen for Mac[0], all the way up to full interactivity (running iTunes, Xcode, etc). In my office, Mac[0] is a 20" intel iMac, whereas Mac[1] is a 12" PowerBook G4. If I had more machines to test with, I'm sure I'd be able to reproduce it there as well. I find it very unlikely that the Apple drivers are kernel panicing my box (see crash logs at end of post), as Apple's IOKit drivers seem to be very solid, so I'm guessing that it is related to the Parallels kernel extensions (.kext). A brief look at kextstat(8) returns this:
+intellian:~ tyler$ kextstat | grep parallels
+ 79 0 0x8d4000 0x5000 0x4000 com.parallels.kext.ConnectUSB (2.5.0) <33 11 6 5 4 3>
+ 91 0 0x8d9000 0x6000 0x5000 com.parallels.kext.Pvsnet (2.2) <5 4 3 2>
+ 101 0 0x6bd000 0x14000 0x13000 com.parallels.kext.hypervisor (2.2) <11 6 5 4 3 2>
+ 102 0 0x9ed000 0xa000 0x9000 com.parallels.kext.vmmain (2.2) <11 6 5 4 3 2>
+ 103 0 0x4a10d000 0x3000 0x2000 com.parallels.kext.Pvsvnic (2.2) <36 4 3>
+
+Regardless of whether or not Parallels is running, to ensure I don't come off as a Parallels-basher (even if I really am), VMWare leaves kernel extensions loaded when VMWare Fusion isn't running as well:
+intellian:~ tyler$ kextstat | grep vmware
+ 95 0 0x48fe5000 0x1b000 0x1a000 com.vmware.kext.vmmon (1.0.0d1) <11 5 4 3 2>
+ 99 0 0x48d7f000 0x5000 0x4000 com.vmware.kext.vmioplug (1.0.0d1) <33 19 5 4 3>
+ 100 0 0x48b74000 0x5000 0x4000 com.vmware.kext.vmnet (1.0.0d1) <5 4 3 2>
+Anyways, back on topic. Given the inherently cryptic crash logs that a kernel panic will leave behind (if any), it's hard to truly tell what is causing the panic. As much as I like to fantasize about becoming an über 1337 kernel haxx0r, I simply haven't the time to whip out a firewire cable, and use Mac[1] as a debugging console to reproduce and crash my main workstation (Mac[0]).
+
+As a software developer however, I'm a bit annoyed that these virtualization applications (Parallels, VMWare) are leaving KEXTs loaded into kernel space even when they're not running, leaving the door wide open to crashes like this one. Unfortunately, a kernel is only as strong as it's weakest link/kext, if one of the KEXTs crash in the spectacular fashion in which they normally do, they can bring down an entire system, possibly leaving a lone developer in central Texas with no other options than to crack open a beer shortly after lunch.
+
diff --git a/_posts/2007-01-20-how-to-ruin-a-publicly-traded-company.html b/_posts/2007-01-20-how-to-ruin-a-publicly-traded-company.html
new file mode 100644
index 0000000..70d1e35
--- /dev/null
+++ b/_posts/2007-01-20-how-to-ruin-a-publicly-traded-company.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: How To Ruin A Publicly Traded Company
+tags:
+- Software Development
+created: 1169343041
+---
+Step 1:Stop developing a product
+Step 2:Put a complete imbecile in charge.
+Step 3:Bring a lawsuit against one of the largest technology companies on the planet.
+Step 4:Watch as hilarity ensues. (taken from here)
+
+$1.08 a share, the stock market is a fickle bitch.
diff --git a/_posts/2007-01-21-ichat-hates-me.html b/_posts/2007-01-21-ichat-hates-me.html
new file mode 100644
index 0000000..5781185
--- /dev/null
+++ b/_posts/2007-01-21-ichat-hates-me.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: iChat hates me
+tags:
+- Media
+created: 1169442498
+---
+Many Mac users around the world are having problems using video chat on iChat AV. The problem is routers or so I hear, every time I try to video chat with some ( sometimes video chat works) i get an error message concerning a communication error -8. When typed into google, there are several people with my same problem, why can't iChat love everyone equally, does it just hate mexicans. Why can't I hit Video Chat and it just works, I can just hope the new OS can fix this or someone can help me.
+
+Sorry Apple I just had to say it,
+
+Roy
diff --git a/_posts/2007-01-21-mono-incorporated.html b/_posts/2007-01-21-mono-incorporated.html
new file mode 100644
index 0000000..1f5d09a
--- /dev/null
+++ b/_posts/2007-01-21-mono-incorporated.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Mono Incorporated
+tags:
+- Mono
+created: 1169370753
+---
+I recently posted this: Customer Brief: Autonomic Software, Inc to the bleep consulting site. While I cannot disclose too much about how "we have done what we have done" I can say that I used the Mono runtime to allow for them to deploy their software onto both Mac OS X and Linux.
+
+When deploying at a client site recently, I used Package Maker to build a meta-package to install Mono.framework and their software simultaneously. Using the power of launchd(8) the installer installed a LaunchDaemon job file (.plist) and started the job with launchctl all from within the installer. On the Linux side of things rsync(1) to sync things into the appropriate places and then fire off the init.d script.
+
+Overall it's been quite an interesting experience bringing Mono into the corporate world; it's almost like you're telling somebody something that's too good to be true: "wait, I can run this under .NET on Windows, and Mono on everything else? Really?" Unfortunately because of my NDA, I can't disclose too much about the actual project, but it's certainly proved that not only is Mono "enterprise ready," it is probably a better choice to write and deploy software than most other cross-platform frameworks out there.
diff --git a/_posts/2007-01-22-get-your-dance-on.html b/_posts/2007-01-22-get-your-dance-on.html
new file mode 100644
index 0000000..a3cd0a3
--- /dev/null
+++ b/_posts/2007-01-22-get-your-dance-on.html
@@ -0,0 +1,8 @@
+---
+layout: post
+title: Get Your Dance On
+tags:
+- Media
+created: 1169521713
+---
+Now that I've finally figured out where I know Zach Hale from (via Colin it seems) I wanted to link to his mixtape-blog. It''s an idea I've thought about before, but never taken the initiative to do, so golf claps are in order for Zach. Anyways, they're some great mixes with lots of artists you probably haven't been introduced to just yet, check it out over on poorleno.com
diff --git a/_posts/2007-01-22-no-really-what-are-you-doing.html b/_posts/2007-01-22-no-really-what-are-you-doing.html
new file mode 100644
index 0000000..bd4519b
--- /dev/null
+++ b/_posts/2007-01-22-no-really-what-are-you-doing.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: No Really, What Are You Doing?
+tags:
+- Miscellaneous
+created: 1169523025
+---
+Like an idiot-moth to a bright lamp, I've somehow been sucked into the latest social web 2.0 zomgzomg craze, I think it's just a subconscious geek's desire to be cool, but regardless, you can find my twitter stream at twitter.com/agentdero.
+
+Most of what's attracted me to the site has been their very simple API, which has allowed me to get an application called "Twitterer" up and running in less than a few hours (1, 2, 3). I've not yet released it (no icon!) but i've been using it for the past two days and am quite pleased with it (if I may say so myself). In fact, if you have read this before, you might notice a recent trend in posts about webservices...ahem.
+
+Twitter allows the masses to finally answer the question "what are you doing?"
+
+To which the masses can reply in a most resounding fashion "nothin really."
diff --git a/_posts/2007-01-22-webservicescore-on-the-radar-screen.html b/_posts/2007-01-22-webservicescore-on-the-radar-screen.html
new file mode 100644
index 0000000..74a6e95
--- /dev/null
+++ b/_posts/2007-01-22-webservicescore-on-the-radar-screen.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: WebServicesCore, On The Radar Screen
+tags:
+- Cocoa
+created: 1169471640
+---
+A little birdie chirped into my email wondering what the radar number for my previous gripings about WebServicesCore, and I figured that for all one of the Apple employees that actually read my inane bullshit, behold:
+
+Radar #4945073 ("WebServicesCore lacks support for basic HTTP authentication")
+
+Let's all cross our fingers and hope for a much needed update to WebServicesCore. If all else fails, we can tap our shoes together and wish for a new web services API right?
+
+(What's that weird rdar url?)
diff --git a/_posts/2007-01-22-webservicescore-why-hath-thou-forsaken-me.html b/_posts/2007-01-22-webservicescore-why-hath-thou-forsaken-me.html
new file mode 100644
index 0000000..65fd8a2
--- /dev/null
+++ b/_posts/2007-01-22-webservicescore-why-hath-thou-forsaken-me.html
@@ -0,0 +1,22 @@
+---
+layout: post
+title: WebServicesCore, Why Hath Thou Forsaken Me
+tags:
+- Cocoa
+created: 1169465965
+---
+I've been hacking around with more webservices-based applications recently (Twitterer for example) and I've also reminded myself what an utter pain in the ass they can be in Cocoa. With twitter, they make available both JSON and XML-based webservices, which is good since they use basic HTTP authentication for their user-specific webservices (i.e. everything but retrieving the public timeline). The XML-based webservices are more or less straight-forward to hack up with Cocoa, all one really needs to do is write a parser (NSXMLDocument) and then make use of the URL loading classes (NSURLConnection, NSMutableURLRequest) to retrieve and process, or POST data. This method of interacting with "webservices" (more wgetting than anything else) is rudimentary at best, and in my personal opinion, isn't as robust as SOAP webservices are. It does however, work. Regardless of the framework, programming language, or geo-orbital location of the moon, they will work because all you're doing is making an HTTP GET and then parsing the results.
+
+The benefit of SOAP webservices however, is the almost "literal" translation of objects encapsulated into SOAP messages, into runtime objects. In effect, if I have a Person object defined in my WSDL and similarly defined in my application (with a good SOAP framework) the objects should be encoded and decoded appropriately when passed via SOAP. The real power of SOAP can be realized when used with ASP.NET (ick) webservices and .NET clients (see ASP.NET - Mono) where you can relatively quickly and easily build and deploy a services-oriented application. That's .NET/Mono however, my work is dealing with NuSOAP and Cocoa, a less than ideal mix.
+
+To start hashing out a Cocoa-webservices-oriented application, your first stop should be at a local pub, brewery, or mayor's office for a good round of intoxication, only after every tissue in your body is soaked with fine casket-aged whiskey will you be prepared to embark on your journey. It's usually best to start with a complete WSDL, you can then use /Developer/Tools/WSMakeStubs to generate what resembles some Objective-C that you can flesh out to some extent to provide an intermediary layer between your sane Cocoa code and the actual SOAP method calls. Cocoa makes SOAP painful. The stub code revolves around one magical "object" WSMethodInvocationRef. Think of WSMethodInvocationRef like you would a sadistic elf that only pops out of his little elf home to kick you in the groin before shouting "TRY AGAIN IDIOT" and scurrying away, there's a bit of magic involved, but mostly pain. Since the invocations will just return a generic "id" type, the only way to really be sure what your webservice invocation returns is to either call [NSObject respondsToSelector:(SEL)] or just trust that the webservice you called will return what you expect, whether it be an NSString, NSDictionary, NSArray, or NSNumber (NSNumber is what's returned in place of numbers and booleans, it's WebServiceCore's cheap way of boxing those primitives). TRY AGAIN IDIOT.
+
+Something else to note is that things you might expect to be able to use, such as basic HTTP authentication are absolutely non-existent in the magic WebServicesCore black-box. With a URL loading-based webservice (JSON, XML) you can just use the delegate method:
+- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
+And authenticate from there, popping around through the various NSURLConnection delegate methods. I have also experimented with updating the SOAP endpoint to include a URL something like the following:
+http://user:password@bleepsoft.com/some/stupid/url
+While one might assume the HTTP subsystem hidden behind that magical WSMethodInvocationRef would handle this appropriately, and translate it to the basic HTTP authentication tokens, it just doesn't work. TRY AGAIN IDIOT.
+
+The alternatives are few and far between if you absolutely need to use SOAP webservices for a certain Cocoa project, I am working on converting a framework that Jonathan Wight wrote to use the URL loading classes in Cocoa, but other than that learn to love WSMethodInvocationRef or plead with your web developers to rewrite their existing webservices with REST, JSON, etc. WebServicesCore is an antiquated pain in the ass, and probably hasn't been updated since Steve Jobs was at NeXT.
+
+TRY AGAIN IDIOT.
diff --git a/_posts/2007-01-23-ftgl.html b/_posts/2007-01-23-ftgl.html
new file mode 100644
index 0000000..2b2d504
--- /dev/null
+++ b/_posts/2007-01-23-ftgl.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: FTGL#
+tags:
+- Mono
+created: 1169571188
+---
+I neglected to mention it here, but I released some quick code to allow me to write text in OpenGL and C#. It's called FTGL# and hopefully someone besides me will have a use for it.
+
+The wiki page has svn info
+
+Disclaimer: I posted this in the mono category, but haven't actually tested it on mono yet.
+
+Update: I have finally gotten around to actually running this on Mono (version 1.2.2.1) on Windows.
diff --git a/_posts/2007-01-23-thread-cancellation-in-c.html b/_posts/2007-01-23-thread-cancellation-in-c.html
new file mode 100644
index 0000000..45d0a27
--- /dev/null
+++ b/_posts/2007-01-23-thread-cancellation-in-c.html
@@ -0,0 +1,29 @@
+---
+layout: post
+title: Thread Cancellation in C#
+tags:
+- Mono
+created: 1169617431
+---
+After some recent frustrations using Thread.Abort() and Thread.Join() in C# I adopted another means of cancelling a thread. In the previous iteration of this code, it was hanging on the following code:
+myThread.Abort();
+if (!myThread.Join(5000)) {
+ Console.WriteLine("Failed to join secondary thread");
+}
+Under certain conditions (such as invoking unmanaged code from C#), the function being executed by the thread "myThread" can cause the Thread.Join(uint) to block indefinitely regardless of what timeout value (in microseconds) is passed as an argument to Join().
+
+Instead of using the Thread class' functions for cancelling a thread, it is much more reliable to use a stay-alive boolean instead in your thread. In my code, the thread serves as a basic runloop that iterates a couple of times a second, so I added the following code:
+private static readonly object threadLock = new object();
+private static volatile bool threadStayAlive = false;
+
+public static void ThreadFunc() {
+//...
+lock (threadLock) {
+if (!threadStayAlive)
+ return;
+}
+//...
+}
+Elsewhere in the code, instead of calling both Thread.Abort() and Thread.Join(uint), I set threadStayAlive to false, and call Thread.Join(uint) to ensure that the thread is properly cancelled before continuing execution. I've tested this for about an hour or so trying to replicate the infinite-blocking that would occur with Thread.Abort() and Thread.Thread.Join(uint) and I've not been able to lock up my application yet with the stay-alive boolean. Checking the boolean periodically inside the thread function will allow the the code to appropriately clean up after itself instead of relying on Thread.Abort() which may interrupt whatever the thread is executing at any given time leaving your application in an inconsistent state. Catching a ThreadAbortException inside the thread function can help prevent inconsistent thread states, but I've found it's not preventing any amount of thread lock-ups like the stay-alive will.
+
+Regardless of the framework, threading is never something to be undertaken lightly; it is absolutely essential to know what your thread should be doing so you don't end up with race conditions or corrupted objects. Thread handling in C# is relatively straightforward, and certainly not as frustrating as pthreads, but still can have the same general threading related bugs.
diff --git a/_posts/2007-01-23-twitterbot-no-really-i-need-to-be-stopped.html b/_posts/2007-01-23-twitterbot-no-really-i-need-to-be-stopped.html
new file mode 100644
index 0000000..974590a
--- /dev/null
+++ b/_posts/2007-01-23-twitterbot-no-really-i-need-to-be-stopped.html
@@ -0,0 +1,26 @@
+---
+layout: post
+title: Twitterbot. No Really, I Need To Be Stopped
+tags:
+- Mono
+created: 1169560301
+---
+Ok, Twitterer almost had a valid excuse, but this is just bloody unnecessary. I wrote a C# (Mono) news bot for twitter last night out of boreom while waiting for a client to finish writing the webservices needed for my project. The Twitterbot is based very loosely on Mario Menti's perl source code, in that I took the tinyurl idea (and that's about it). I wrote the bot with the concept in mind of using one bot to manage all the feeds at once, which does have a slightly undesirable affect of posting the updates for all the feeds at once, but with a bit of tweaking that can be lessened.
+
+The bot is used to run the following twitter-things: googlenews, googlenewsworld, googlenewssports, googlenewsus, googlenewsent
+
+
+
+
the technical details
+The Twitterbot makes use of RSS.NET for all its incoming feed parsing, but uses the standard System.Net.WebRequest class for posting to both twitter and retrieving the proper tinyurl link. The basic structure of the bot is simple, whenever it grabs new items it'll check that feed's last (stored internally) items to prevent duplication of twitter-posts, and then will shorten the title, generate the tinyurl link and finally post the tiny message to twitter. One of the issues I discovered with Google News is that they randomize the story providers for any given story, i.e. a they might push out a story to their feeds about China's shooting down of a satellite but each time the bot updates that feed may return a different title for the story from a different news organization. In order to prevent flooding, the bot currently has a twitter-posting maximum of two per iteration, which combined with the update interval (30 minutes) helps cut down on both duplicate stories, but also spamming the living hell out of twitter.
+
+The file format that the bot reads feeds and twitter information from is also simple:
+<feeds>
+ <!-- & -> & -->
+ <feed name="Google News" url="http://news.google.com/news?ned=us&topic=h&output=rss" twitter="user" password="pass"/>
+</feeds>
+
+
+I think I am going to release this as open source in the very near future but I want to check with the twitter guys first to take any steps necessary to prevent spamming their goofy little service. I really think my bot would help organizations use twitter as a minimalistic content delivery platform (market-speak!) if they already spit out content in standard RSS formats elsewhere, but I don't want to step on any toes.
+
+A nice and neat little Twitterbot, all in less than 300 lines of code :)
diff --git a/_posts/2007-01-24-twitterbot-is-now-open-source.html b/_posts/2007-01-24-twitterbot-is-now-open-source.html
new file mode 100644
index 0000000..d0e31f0
--- /dev/null
+++ b/_posts/2007-01-24-twitterbot-is-now-open-source.html
@@ -0,0 +1,11 @@
+---
+layout: post
+title: Twitterbot Is Now Open Source
+tags:
+- Mono
+created: 1169643850
+---
+As I previously mentioned, I've written a small C# application called "Twitterbot" that grabs items from an RSS feed and retrofits them for twitter. After discussing it with some of the folks over at twitter, they have no problem with me open sourcing the litte bot, so I give you, the Twitterbot.
+
+I also added a few fixes this morning after adding the hybridized twitter-thing:
Improved duplication checks
Refresh slow-downs between 12:00 and 6:00 am (exclusive)
Better error handling
A few comments :)
+The Twitterbot can be downloaded from the subversion repository, details are located on the Twitterbot's page. The Twitterbot is BSD licensed and will run with both .NET and Mono. Enjoy!
diff --git a/_posts/2007-01-26-publishing-war-on-the-horizon.html b/_posts/2007-01-26-publishing-war-on-the-horizon.html
new file mode 100644
index 0000000..0ea0026
--- /dev/null
+++ b/_posts/2007-01-26-publishing-war-on-the-horizon.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Publishing War on the Horizon
+tags:
+- Academia
+created: 1169829128
+---
+Apparently, predictably, and late to the party, research publishers are getting nervous about the push for Open Access. Hopefully this is just an idea for a push from the publishers that will quickly be dropped, but from an article on nature.com (found via slashdot of course):
+
+Public access equals government censorship
+
+I hesitate to even quote that because it's so far off-base. There was more too, but since this is just an article on a potential future publicity campaign I don't really think a thorough response is warranted. If the publishers ever try pushing this BS on the research community I have no doubt the response will not be what the publishers hope.
+
+These publishers have to realize that the entire reason they exist at all is because they have been the best way to make information available to as many people as possible. Publishing researchers want their work to be available and if traditional publishers can't continue to be a relevant way to make that happen then they simply don't have a viable business model. Personally I still think there's value in subscriptions to printed journals, and I'm sure people I work with feel the same.
diff --git a/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html b/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html
new file mode 100644
index 0000000..4e96dd4
--- /dev/null
+++ b/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Basic HTTP Authentication with WebServicesCore
+tags:
+- Cocoa
+created: 1170281202
+---
+Todd Ditchendorf is the man I have to thank now, not only for his fantastic SOAP Client, but now for "showing me the way" in terms of using CFNetwork to handle basic HTTP authentication with SOAP webservices in Cocoa. Performing the basic HTTP authentication is still an absolute pain in the ass, but it is possible nonetheless.
+
+Without further ado, take it away Todd.
diff --git a/_posts/2007-01-31-were-all-retarded.html b/_posts/2007-01-31-were-all-retarded.html
new file mode 100644
index 0000000..afec2be
--- /dev/null
+++ b/_posts/2007-01-31-were-all-retarded.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: We're all retarded.
+tags:
+- Opinion
+created: 1170283296
+---
+I came across this after reading a bit about the "bomb scare" in Boston today, and cannot come to any other conclusion than "we're retarded." In the picture in the article linked above, even I can clearly see that it's really not a bomb, it's hardly even a "device" but nonetheless, these "hoax packages caused alarm in Boston."
+
+I fear that in this age of increased terror-McCarthyism and ridiculous (shallow) security measues, if I were to forget my backback under the table in an outdoor café, I would return later to retrieve it and be greeted by a bomb squad apprehensively approaching my backpack filled with nothing more explosive than a half-eaten roast beef sandwich.
+
+To the staff of "Aqua Teen Hunger Force" it was nice knowing you, and I'm sorry but you're all about to be implicated in an eeeevil terrorist plot to bombard Boston with poor animation; regardless, I hear Cuba has wonderful weather this time of year.
diff --git a/_posts/2007-02-01-im-on-another-podcast.html b/_posts/2007-02-01-im-on-another-podcast.html
new file mode 100644
index 0000000..035fec4
--- /dev/null
+++ b/_posts/2007-02-01-im-on-another-podcast.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: I'm on another podcast
+tags:
+- Cocoa
+created: 1170371707
+---
+Steve Scott of Late Night Cocoa asked me a couple weeks ago if I wanted to come on and talk about BuildFactory and continuous integration, and then that slowly morphed into talking about webservices and Dumbarton as he noticed I posted some WebServicesCore gripes. We got to chatting a bit about why Mac developers don't seem to "appreciate" webservices as much as those in the .NET world, etc and eventually got together to record Web Services with R. Tyler Ballance.
+
+If you've not checked out Late Night Cocoa, I highly recommend it, it's already shaping up to be a good (technical) podcast about Mac development (the Core Data with Marcus Zarra interview was fantastic, a hard one to follow). If nothing else I hope most developers can use my interview to get a better feel for what's available in the growing webservices (2.0!) landscape. A more active discussion about the strengths and weaknesses in the Cocoa frameworks can do nothing but make the Mac development community stronger, check it out!
diff --git a/_posts/2007-02-01-webservices-with-dumbarton.html b/_posts/2007-02-01-webservices-with-dumbarton.html
new file mode 100644
index 0000000..f2403fc
--- /dev/null
+++ b/_posts/2007-02-01-webservices-with-dumbarton.html
@@ -0,0 +1,29 @@
+---
+layout: post
+title: Webservices with Dumbarton
+tags:
+- Mono
+created: 1170319882
+---
+While I have been know togripeabout WebServicesCore, there are however options now when developing service-oriented applications. Introducing, Dumbarton; Dumbarton is basically a ObjC-C# bridge that makes use of the Mono embedded API to allow you to utilize C# code from within your Cocoa application. Personally, I think writing SOAP consumption code in C# using Mono or .NET is far nicer than trying to write something using C/Objective-C via WebServicesCore, so this is my "favorite" option. The word favorite being in quotes as unfortunately Dumbarton is a bit complex to use and bundle for a smaller Cocoa application.
+
+Dumbarton is however an option, so I wrote up a quick example that makes use of a currency exchange rate webservice via xmethods.com and essentially rehashes the proverbial "Currency Converter" sample project with an up to date exchange rate. I've pushed the project to GitHub in case you want to check out the whole project.
+
+
the nitty gritty
+Mostly because I'm a lazy developer (who isn't?) I used the standard "wsdl" executable that you can find in .NET or Mono to generate the necessary stub class for providing the last intermediary layer between our desktop application. The method that's generated (synchronous) that we'll write our wrapper for is:
+public System.Single getRate(string country1, string country2);
+which will handle the actual webservice invocations which we'll write a small Dumbarton wrapper for. Interacting with SOAP webservices in .NET/Mono is quite simple however, so it'd be trivial to take an existing set of generated stubs and modify them, or simply write all the code from scratch.
+
+The Dumbarton wrapper provides the neccessary "boot strapping" for a bridged object between Cocoa and Mono and also "acts" as the bridged object for the C# class. For example, our Dumbarton wrapper class is called CurrencyConverter which is a subclass of DBMonoObjectRepresentation, and in the wrapper method we call:
+[self invokeMethod:"getRate" withNumArgs:2,str1,str2];
+which will invoke the C# method getRate(string,string) and return a MonoObject pointer. The bridged methods will return a MonoObject pointer which you can either unbox with the DB_UNBOX_* macros provided in the DBBoxing.h file, or you can invoke methods on that object like CurrencyConverter does with:
+(MonoString *)(DBMonoObjectInvoke(rateObj,"ToString",0,NULL))
+in order to return a string, or another MonoObject pointer to use. Overall it's really simple to use once you have all the ducks in a row, such as llinking against the Mono.framework and the Dumbarton.framework properly, and you load them into the DBMonoEnvironment appropriately.
+
+
notes on CurrencyConverter
+I bundled a Dumbarton.framework build that I had handy inside the Subversion repository, but I have linked this against the Mono 1.2.3-preview that I have installed on my machine, so I recommend you checkuot the latest Dumbarton from Subversion (svn co svn://svn.myrealbox.com/source/trunk/Dumbarton) and install the latest stable version of Mono (1.2.2). If you feel like trying out the preview, you can grab the Mono 1.2.3 preview installer to link your custom Dumbarton build against. Something to note however, is the Installation Path in the Dumbarton Xcode project is set to /Library/Frameworks currently, so if you want to link against it and bundle it inside your application bundle you'll need to update that to @executable_path/../Frameworks and then bundle it in the same fashion you would with Growl or Sparkle. You will also need to setup a copy files or a build script phase to handle your bundling of the DLLs inside the application bundle as well. Distributing an application that uses Mono and Dumbarton is a bit stickier, as you have to pick and choose which libraries to bundle, etc, check out this thread from the mono-osx list.
+
+
the springer final thought
+Depending on your familiarity with developing with C# in either Mono or .NET, Dumbarton may be a great option for utilize existing .NET code for webservices, write cross-platform webservices code, or just avoid the pains of WebServicesCore; it can also be another frustrating stop on the avenue of SOAPy pains if you misunderstand how Dumbarton or C# works. It's currently on my ever lengthening todo list to start documenting far more of what you can do with Dumbarton, but hopefully the examples distributed with the source, along with CurrencyConverter provide a good starting point for those who feel crazy enough to try it out.
+
+As a side note, I have 8.6444 pound in my wallet right now.
diff --git a/_posts/2007-02-02-absolute-frustration.html b/_posts/2007-02-02-absolute-frustration.html
new file mode 100644
index 0000000..d31747f
--- /dev/null
+++ b/_posts/2007-02-02-absolute-frustration.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Absolute Frustration
+tags:
+- Opinion
+created: 1170446333
+---
+Time-Warner (again) had an outage this morning, and it has somehow left my Linksys WRT54G absolutely incapable of routing properly.
+
+From the router administration page, I can ping public servers. From inside the network, I can ping ping local machines. I can properly resolve hostnames, I just can't ping anything on the public internet, from inside the network. My router has become absolutely dysfunctional as anything but a simple switch.
+
+I'm only lamenting that I don't know of a taller building from which to hurl this miserable piece of shit from.
diff --git a/_posts/2007-02-02-mono-winforms-tao-and-me.html b/_posts/2007-02-02-mono-winforms-tao-and-me.html
new file mode 100644
index 0000000..f29b5a7
--- /dev/null
+++ b/_posts/2007-02-02-mono-winforms-tao-and-me.html
@@ -0,0 +1,32 @@
+---
+layout: post
+title: Mono, Winforms, Tao, and Me
+tags:
+- Mono
+created: 1170457820
+---
+I finally got around to testing FTGL# with Mono on Windows. Didn't require any modification, but there's one oddity ...
+
+
+C:\Documents and Settings\stephen\My Documents\work\FTGLSharp\sample\bin\Debug>"FTGLSharp Demo.exe"
+Opening Font File C:\Windows\Fonts\arial.ttf
+Setting 24pt, 72dpi
+Done font initialization
+sap.ftgl.MainForm, Text: FTGL.OnActivated() called
+sap.ftgl.demo.demoControl.forceRefresh()
+sap.ftgl.demo.demoControl.OnPaint() called
+sap.ftgl.MainForm, Text: FTGL.OnActivated() called
+sap.ftgl.demo.demoControl.forceRefresh()
+sap.ftgl.demo.demoControl.OnPaint() called
+
+C:\Documents and Settings\stephen\My Documents\work\FTGLSharp\sample\bin\Debug>mono "FTGLSharp Demo.exe"
+Opening Font File C:\Windows\Fonts\arial.ttf
+Setting 24pt, 72dpi
+Done font initialization
+sap.ftgl.MainForm, Text: FTGL.OnActivated() called
+sap.ftgl.demo.demoControl.forceRefresh()
+sap.ftgl.MainForm, Text: FTGL.OnActivated() called
+sap.ftgl.demo.demoControl.forceRefresh()
+
+
+I don't know yet if it's Mono or Me (I'm usually missing some detail ...) but OnPaint() isn't happening when it should if I fill my control with another control
diff --git a/_posts/2007-02-03-kernel-panics-do-weird-things.html b/_posts/2007-02-03-kernel-panics-do-weird-things.html
new file mode 100644
index 0000000..0c09d68
--- /dev/null
+++ b/_posts/2007-02-03-kernel-panics-do-weird-things.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Kernel Panics Do Weird Things
+tags:
+- Software Development
+created: 1170535223
+---
+With the arrival of my new Airport Extreme base station came two new ways I can kernel panic my machine. So I now have 1, 2, 3 ways, three ways to panic my machine, ah-ah-ah-ahhhhh.Besides the usual enjoyment of seeing this wonderful image, you can experience some weird things when your OS X machine reboots.
+
+In the attached video, I found that my mouse was in a perpetual state of scrolling down. Not a quick scroll either, a nice leisurely one, the kind you take on the beach, a nice leisurely scroll down in every window with a scrollbar in the entire operating system. Gak.
diff --git a/_posts/2007-02-05-mono-winforms-update.html b/_posts/2007-02-05-mono-winforms-update.html
new file mode 100644
index 0000000..539750f
--- /dev/null
+++ b/_posts/2007-02-05-mono-winforms-update.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Mono Winforms Update
+tags:
+- Mono
+created: 1170697979
+---
+The pre-release version of Mono 1.2.3 handles the painting events properly, so it appears that FTGL# actually works on Mono, at least on Windows.
+
+Thanks to the kind folks in #mono-winforms for taking a look at this for me.
diff --git a/_posts/2007-02-07-tiring.html b/_posts/2007-02-07-tiring.html
new file mode 100644
index 0000000..b637ab2
--- /dev/null
+++ b/_posts/2007-02-07-tiring.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Tiring
+tags:
+- Miscellaneous
+created: 1170910986
+---
+I am not certain if forgetfulness is a side effect of working too much, or general stress, but I spent about a minute looking around for my keys before finding them still sitting in the lock on my front door.
+
+Whoops.
diff --git a/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html b/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html
new file mode 100644
index 0000000..46017c9
--- /dev/null
+++ b/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: I ain't Shipley, but PmpMyApp
+tags:
+- Cocoa
+created: 1171013080
+---
+Ever since coming across the (draft) specification for NAT-PMP I've been almost in love with the absurdly simple NAT port mapping protocol. The unfortunate downside is that NAT-PMP isn't well supported except on Airport base stations, one of which I recently acquired, so as is customary when I welcome a new device into my apartment, I had to write some code for it. I hate to sound like a fan-boy, but like Bonjour, Stuart Cheshire's other baby, NAT-PMP is sickeningly simple. A series of straight-forward UDP packets is all that is needed for a local (inside the NAT) device to create a mapping on the NAT device itself.
+
+To exhibit this functionality, I've created a sample application that uses a tiny little library I built to create and destroy mappings on the NAT-PMP enabled device. The application is called "PmpMyApp" and can be found on GitHub
+
+The code contained in pmpmapper.c has three basic functions that perform the functionalities that NAT-PMP provides, and are aptly named as well:
+struct sockaddr_in *pmp_get_public();
+pmp_map_response_t *pmp_create_map(uint8_t type, uint16_t privateport, uint16_t publicport, uint32_t lifetime);
+pmp_map_response_t *pmp_destroy_map(uint8_t type, uint16_t privateport);
+
+The pmp_get_public() function returns a pointer to a sockaddr_in that contains the external IP address of the NAT device. The pmp_create_map() function does the heavy-lifting, in that it will create the actual mapping (and the deletion too, with a zero lifetime) and will tell the NAT device to persist the mapping for the number of seconds specified with the lifetime argument. The code is commented so it should be very easy to get a feel for how to use the pmpmapper functions, a good place to start is by examining how it's used in the PmpMyApp source. (Note: All of the PmpMyApp code is BSD licensed)
diff --git a/_posts/2007-02-09-internal-server-error.html b/_posts/2007-02-09-internal-server-error.html
new file mode 100644
index 0000000..c2af2d2
--- /dev/null
+++ b/_posts/2007-02-09-internal-server-error.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Internal Server Error
+tags:
+- Miscellaneous
+created: 1171064999
+---
+You may have noticed recently (hopefully not) this site kicking back a simple, plain-text error: An internal server error occurred. Please try again later
+
+The root of this issue was some scripts inside Drupal simply taking too long and timing out, which I believe, has been resolved by enabling e-accelerator in the site's .htaccess file. I'm hoping that has killed the errors, if it hasn't feel free to drop me a line at tyler@bleepsoft.com and let me know the site is broke again :)
+
+Special thanks to Dave at GeekISP of course for being accommodating with my silly complaints.
diff --git a/_posts/2007-02-14-terminally-ill.html b/_posts/2007-02-14-terminally-ill.html
new file mode 100644
index 0000000..1379ddd
--- /dev/null
+++ b/_posts/2007-02-14-terminally-ill.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Terminally ill
+tags:
+- Miscellaneous
+created: 1171450821
+---
+There's really not a decent explanation for this, other than Terminal.app went bonkers. I've seen this happen before to some extent if you have an NSWindow that has transparent background, but a partial background drawing like here is something completely new.
+
+This sort of weird nonsense only happens to me.
+
+If the video link isn't showing up in the RSS feed, here it is for you.
diff --git a/_posts/2007-02-16-in-the-news-last-week-drm.html b/_posts/2007-02-16-in-the-news-last-week-drm.html
new file mode 100644
index 0000000..6302247
--- /dev/null
+++ b/_posts/2007-02-16-in-the-news-last-week-drm.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: "In the news last week: DRM"
+tags:
+- Opinion
+created: 1171656501
+---
+DRM made news thanks to Steve Jobs' open letter. I don't really have anything to say that hasn't been said already, but I found an article today that sums it up pretty nicely.
+
+Of course I don't use iTunes much anyway, I'd much rather buy-and-rip CDs. I guess I'm doing just what Bill Gates says.
diff --git a/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html b/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html
new file mode 100644
index 0000000..7642c62
--- /dev/null
+++ b/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Twitterbot Basic HTTP Authentication Errors
+tags:
+- Mono
+created: 1171880681
+---
+As some of you may have noticed, the Twitterbot seems to always fail to authenticate properly against twitter's basic HTTP authentication prompt when run from Mono 1.2.3 on Mac OS X. This was neither an error in twitter's webservice (I have been running my bots from a FreeBSD machine with Mono 1.1.13 for some time now) nor in the Twitterbot code itself, but rather a regression in the System.Net.Configuration namespace, I'll let "kangaroo" (the developer who found and fixed the bug) explain:
+
+13:03 <@kangaroo> ok its falling in to DoPreAuth
+13:04 <@kangaroo> Authorization auth = AuthenticationManager.PreAuthenticate (this, creds);
+13:04 <@kangaroo> thats returning null
+14:04 <@kangaroo> got a patch for you
+14:04 < rtyler> to compile into mono or my app?
+14:05 <@kangaroo> http://monoport.com/1821
+14:05 <@kangaroo> mono
+14:05 <@kangaroo> you need a new System.dll
+
+The patch should make it into the next bug-fix release of Mono (1.2.3.2) and should allow you to once again run Twitterbot on Mac OS X, otherwise you might want to try another machine, or step back a few point releases if it's that critical to have you Twitterbot running.
diff --git a/_posts/2007-02-21-completely-off-topic.html b/_posts/2007-02-21-completely-off-topic.html
new file mode 100644
index 0000000..8ff9420
--- /dev/null
+++ b/_posts/2007-02-21-completely-off-topic.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Completely Off-topic
+tags:
+- Opinion
+created: 1172071359
+---
+I try to separate my political leanings from my work, especially when it comes to blogging, etc, but this is too much. The House passed non-binding resolution on Iraq which is the latest in the long list of completely neutered actions by our legislative branch.
+
+It's not a question of "supporting the troops" or "protecting the children" or "stopping terrorism" if you don't have the spine to keep the executive branch in check (what a quaint idea) resign so we can find somebody who isn't an absolute coward. Regardless of which side you lean towards politically, any executive branch that's given carte blanche is dangerous.
diff --git a/_posts/2007-02-23-im-shocked.html b/_posts/2007-02-23-im-shocked.html
new file mode 100644
index 0000000..72f4e66
--- /dev/null
+++ b/_posts/2007-02-23-im-shocked.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: I'm Shocked
+tags:
+- Opinion
+created: 1172247233
+---
+I'm shocked that anything as simple as a music download site offering popular music (not major label stuff, but still some high profile artists) in unprotected mp3 files could be done so poorly. Seriously, how crappy must that system be if they have to force a .wma extension onto the mp3s? If they have a non-ActiveX download setup what's the deal with Mac downloads? How hard is it to have a properly descriptive error message for Mac users?
+
+I can't even come up with words to describe how poorly they've done this. Has nobody involved with this mess ever actually thought of testing the site?
diff --git a/_posts/2007-03-02-the-visual-basic-stigma.html b/_posts/2007-03-02-the-visual-basic-stigma.html
new file mode 100644
index 0000000..cd39def
--- /dev/null
+++ b/_posts/2007-03-02-the-visual-basic-stigma.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: The Visual Basic Stigma
+tags:
+- Software Development
+created: 1172870489
+---
+I recently recommended to a client that a project they were looking to have done in Visual Basic should be done in C#, but I found that it wasn't as easy as I thought it would be to articulate *why* I was recommending that. The easy answer was because I'm a C programmer at heart and C# is what I'm into these days, but given that the bulk of my professional experience in the last 4-years has been in Visual Basic, and that both C# and current versions of VB are fairly interchangeable for someone familiar with both, that reasoning seemed a bit weak.
+
+I came across this article on programming in Visual Basic and it really rings true to me. I don't enjoy programming in VB quite as much, but at the end of the day I'll look back and realize that it made almost no difference to me at all. I have the same embarrassment about programming in VB that the author talks about on occasion, and I have the same thing with Windows programming in general in comparison to C on Unix-like systems.
+
+I also thought the wikipedia article comparing VB and C# had a pretty interesting section on the VB and C# programming cultures. I know that my first project in VB6 was terrible. I had a fairly strong C on Unix programming mindset and even though the concepts should have been the same it took me a long time to figure out how to adapt what I knew about programming "The Right Way" to that environment. I can't honestly say for certain that was the fault of VB, it may have been my unfamiliarity with doing graphical user interfaces, but to this day it still feels more natural to follow good programming practice in C#.
+
+Speaking of that first VB program, I'm inclined to agree that, given enough time I will think my old code was crap when I look back ...
diff --git a/_posts/2007-03-06-barcamp-austin-again.html b/_posts/2007-03-06-barcamp-austin-again.html
new file mode 100644
index 0000000..3bf678b
--- /dev/null
+++ b/_posts/2007-03-06-barcamp-austin-again.html
@@ -0,0 +1,8 @@
+---
+layout: post
+title: BarCamp Austin, Again
+tags:
+- Software Development
+created: 1173208449
+---
+It seems that I might be going to BarCamp Austin2 this next weekend. I'll be presenting on "the importance of webservices" or something about as exciting. I'm still working on my presentation (ick) and I'm going to try to incorporate as many useless buzzwords, pot-shots at George W. Bush, and cult movie references as possible. I'm not sure how it's going to be, at least 41% more exciting than my last BarCamp presentation on Cocoa hacking and why everybody should, but still 12% less turtle-neck than a Steve Jobs keynote. I'll be sure to post my slides and hopefully a video or audio of the presentation later, but we'll see if I can make a presentation worth posting first.
diff --git a/_posts/2007-03-11-teeny-tiny-updates.html b/_posts/2007-03-11-teeny-tiny-updates.html
new file mode 100644
index 0000000..a5b1d17
--- /dev/null
+++ b/_posts/2007-03-11-teeny-tiny-updates.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Teeny-tiny Updates
+tags:
+- Miscellaneous
+created: 1173665916
+---
+If you look at the sidebar, you might notice a new "Twitter" column has been added, which I intend on using to keep a good aggregated feed of the unethical blogger users' twitters. I have also added a new category "Literature" which I hope I'll be able to populate soon enough with book reviews, and other miscellaneous bits of criticism and commentary.
+
+I've noticed a few registered users that haven't commented or blogged about anything yet, which I hope they will remedy soon enough as I'd really like to sucker more folks into using the site or "blogging unethically" (har, har).
diff --git a/_posts/2007-03-12-soldiers-of-fortune.html b/_posts/2007-03-12-soldiers-of-fortune.html
new file mode 100644
index 0000000..5a5c6b7
--- /dev/null
+++ b/_posts/2007-03-12-soldiers-of-fortune.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Soldiers of Fortune
+tags:
+- Opinion
+created: 1173688552
+---
+I am watching this show on "the long war [on terror]" ("Our childrens' childrens' war") which is covering private contracting firms that are working with the military, specifically Blackwater USA which is seriously one of the scariest companies I've read about in a while. I'm not a fan of our ever growing federal government, but turns out they're dutifully employing mercenaries in a war on an already questionable moral foundation? Fun.
+
+There is no question that we're involved in a global war of ideologies, but we're walking a fine line between that and a crusade, and mercenaries only sweeten the pot.
diff --git a/_posts/2007-03-14-a-review-the-metamorphosis.html b/_posts/2007-03-14-a-review-the-metamorphosis.html
new file mode 100644
index 0000000..5821a68
--- /dev/null
+++ b/_posts/2007-03-14-a-review-the-metamorphosis.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: "A Review: The Metamorphosis"
+tags:
+- Literature
+created: 1173912206
+---
+Imagine yourself awaking to find that you simply aren’t; aren’t yourself that is. Such is the situation that Gregor Samsa, Kafka’s unfortunate “victim” in The Metamorphosis, finds himself in. Gregor awakens one morning from “unsettling dreams” to find that “he” has transformed from a (presumably) twenty-something traveling salesman into a beetle-like vermin. The story of Gregor’s unfortunate predicament begins with the climax, the transformation, and slowly descends from there to Gregor’s ultimate demise. Unlike some of the past philosophers I have read who tend to write essays or prose, Kafka’s insight takes the form of a parable of the conflicts of Gregor Samsa’s internal “self” with his external self and surroundings. This mask of fiction concealing the philosophical musings of the story makes them quite difficult to spot upon initial inspection (in my opinion), making a second read through or browsing of academic articles on the piece if not a necessity, highly recommended.
+
+ Kafka’s splitting insight is not for the faint of heart, at the same time that Gregor is lamenting his condition (specifically when he, as the vermin, attempts to get out of bed) he is also pleased with his escape from some of his “human” responsibilities that have shackled him to a miserable existence as a traveling salesman working in a soul-grinding firm paying off a debt owed his employer by his parents. As the story progresses, unbeknownst to Gregor, the reader is shown more to convince them that the family was more akin to vermin than Gregor may have transformed into. In Gregor’s early reflection he cites the importance of his work to help support his family and the necessity of his sacrifice (of freedom) to work in the firm that his parents are indebted to. As time wears on however, and Gregor is incapable of working (contrary to popular belief, vermin don’t sell too many Encyclopedia’s door to door) his father attains a job as a bank-messenger and his family lets out one of the rooms, in the spacious apartment Gregor provided, to three “roomers” indicating that Gregor’s degrading sacrifice at the firm may not have been necessary at all, ergo the Samsas may have been the vermin feeding off of Gregor instead of the inverse.
+
+ The issue of food, or rather nourishment, is another interesting theme Kafka adds into the already complex literary-gumbo of The Metamorphosis. The first day of Gregor’s transformation he is offered some of his favorite food by his sister Grete (we can assume she is trying to help cure what is perceived as an illness by Gregor’s family as opposed to the transformation it truly is) to which he refuses and scurries back under the couch to which he oft finds refuge. As the story wears on Grete slowly discovers that Gregor, the new Gregor, prefers what essentially boils down to table-scraps and garbage, but this is still not enough to “nourish” Gregor. He consistently complains (in thought) about a longing for nourishment, a lack of fulfillment of some sort that is finally placated one day when he hears the beautiful violin music Grete has taken to playing for the three “roomers.” This still doesn’t seem to be enough to “nourish” Gregor in the sense that he still longs for something, a certain something that he finds the fateful morning when he exhales his last breath with the rising morning sun (finding contentment, or fulfillment, with death is an interesting point Kafka raises for me after reading a few essays on both Absurdism and Existentialism).
+
+ Slowly Gregor becomes more of a curse in the eyes of the rest of the Samsas instead of a son with an inordinate amount of legs. When Gregor dies, it is a release in more than one sense. While Kafka cites most immediately the lifting of the burden from the Samsas’ backs, it is apparent that Gregor has also been relinquished of his conflicts with the firm, his parents, and most importantly, himself; with his death Gregor is finally set free, just as he had hoped to become after repaying his parents’ debt to his employer. While there is some academic discussion on whether the metamorphosis itself relinquished Gregor from some of his bourgeois-responsibilities, it is without a doubt that in his death he finds the freedom for which he had longed. An interesting point was raised in one of the analysis of the piece that pointed out that maybe the parents were truly the “blood-sucking vermin” with regards to the last few pages of The Metamorphosis, when the parents turn to Grete, the daughter, and prepare her to be married off to a good husband, pointing out that with Gregor (the initial host) gone they must switch to a new one, Grete.
+
+ Unlike most stories, there are no likable characters in The Metamorphosis, as Gregor continues to act more and more like the “vermin” he has transformed into and his parents react negatively to their son’s predicament, the reader is left without solace. Although Gregor eventually attains the freedom he had so desired, he is still a poor choice for the “hero” of Kafka’s work. That is not to say however, that there are no identifiable characters; Gregor typifies a lot of the internal struggle most found themselves in, in the whirlwind of capitalist growth in the early 20th century along with the lessening of the importance of the individual; both very fundamental conflicts most (including Kafka) found/find themselves in, especially in western culture. Simultaneously many can identify with the denial the Samsas find themselves in with their disgust of the vermin that comes to inhabit Gregor’s room. The Metamorphosis is widely regarded as one of, if not the, most important pieces of literature Kafka ever had published, but is a difficult pill to swallow and at the same time a worthwhile exposure of the conflict that Kafka, and many others, have struggled with.
+
+ I highly recommend, if you have not already read The Metamorphosis, purchasing the “Bantam Classics” version of The Metamorphosis which includes over one hundred pages of critical essays and academic discussions on Kafka’s masterpiece. Translator (and PhD) Stanley Corngold made a fantastic selection of analytic essays on the story ranging from incisive psychological analysis of Gregor’s transformation to the oedipal conflict and reversal of roles between the father and son that constantly lurks beneath the surface. Dutifully reading all of the explanatory notes on the text as well as the critical essays that Corngold included in the book drive the point firmly into place, Kafka was a brilliant writer and, like his tragic heroes, was a tormented individual who may have found solace in the escape that his death (from tuberculosis) ultimately offered him.
diff --git a/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html b/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html
new file mode 100644
index 0000000..eb2aff7
--- /dev/null
+++ b/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Perforce On The Road, p4tunnel
+tags:
+- Software Development
+created: 1174220443
+---
+The best means of accessing a Perforce repository is over an SSH tunnel, to access my home repository while I'm on the road I use a handy-dandy little script to do a few things:
+The proxy is more so I can have some semblance of security while on open wireless networks, the rest should be self explanatory.
+
+Anyways, straight from /usr/local/bin, here's my p4tunnel script:
+#!/bin/sh
+
+HOST="yourhost.com"
+PROXY_PORT="8081"
+
+echo "===> Creating tunnel to ${HOST} with a SOCK5 proxy on port ${PROXY_PORT}"
+
+ssh ${HOST} -L 1666:localhost:1666 -L 8080:localhost:8080 -D ${PROXY_PORT} -C
+
diff --git a/_posts/2007-03-22-im-seriously-famous.html b/_posts/2007-03-22-im-seriously-famous.html
new file mode 100644
index 0000000..1ef5c49
--- /dev/null
+++ b/_posts/2007-03-22-im-seriously-famous.html
@@ -0,0 +1,8 @@
+---
+layout: post
+title: I'm Seriously Famous
+tags:
+- Mono
+created: 1174576173
+---
+Okay, maybe not. But as it turns out, the Twitterbot however, is! A short 5-minute guide to setting up the Twitterbot has been created over here on the engtech blog, and does a far better job of documenting how to get started with the Twitterbot than I ever wanted to. With the help of a Twitterbot, twitter can be a great news-to-SMS gateway, or damn near anything else you can think of doing with about 140 characters worth of content either IMed or SMSed to you.
diff --git a/_posts/2007-03-31-in-the-fifth-dimension.html b/_posts/2007-03-31-in-the-fifth-dimension.html
new file mode 100644
index 0000000..80cc69a
--- /dev/null
+++ b/_posts/2007-03-31-in-the-fifth-dimension.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: In the fifth dimension
+tags:
+- Slide
+- Miscellaneous
+created: 1175396447
+---
+I figured I might as well come out and say it, things have been changing quite rapidly lately, thus the latency on blog postings. In the past two weeks, I have accepted a job offer, moved to San Francisco, and started working at Slide, Inc. with a friend of mine David Young (and quite a few other folks who are prime friend-candidates).
+
+I'm not sure yet how this is going to affect my Mac (development) musings, but what I do know is that in the coming weeks Python and I are going to become best of friends...or I'm going to kill it.
+
+There's still quite a few things in the pipeline, such as an update to the Twitterbot, and Twitterer, a customized version of Sparkle, and of course, Emission. I hope that the dust settles soon so I can return to wasting endless amounts of time blogging and hacking on open source projects, but that remains to be seen.
diff --git a/_posts/2007-04-11-cocoaheads-silicon-valley.html b/_posts/2007-04-11-cocoaheads-silicon-valley.html
new file mode 100644
index 0000000..f34caaf
--- /dev/null
+++ b/_posts/2007-04-11-cocoaheads-silicon-valley.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: CocoaHeads Silicon Valley
+tags:
+- Cocoa
+created: 1176357251
+---
+Scott Stevenson beat me to the punch in announcing it, but I might as well reflect the sentiment and invite you all (even those of you who actually don't live in Silicon Valley) to come out to Cupertino tomorrow (thursday) night to see if I can actually pull off a Windows-esque presentation in front of a room full of Mac developers.
+
+I will be discussing a lot of the latest developments in .NET 3.0 and Visual Studio 2005 and contrasting them where appropriate to the state of Mac development with Xcode, Cocoa, Objective-C and all the other niceties that Leopard's developer tools offer. If possible I will also try to work in a bit about Mono as another alternative in the sea of options for developers these days.
+
+I'll make sure that I either post my slides to my flickr stream or the PDF of the slides to this blog after the fact. If I don't however post before Saturday that means I've probably been beaten up and left for dead by a room full of angry Mac developers.
diff --git a/_posts/2007-04-21-city-of-lost-boys.html b/_posts/2007-04-21-city-of-lost-boys.html
new file mode 100644
index 0000000..164521c
--- /dev/null
+++ b/_posts/2007-04-21-city-of-lost-boys.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: City of Lost Boys
+tags:
+- Opinion
+created: 1177201910
+---
+I have struggled to characterize the city of San Francisco ever since first coming out here for a job interview almost a year ago. The city escapes generalization because of the sheer magnitude of intermixing of races, cultures and economic classes, regardless I still am constantly fascinated by San Francisco (that and
+
+Despite the obvious age differential between some of my coworkers, and the different types of people that I meet either walking down the street or into a bar, I feel amongst my peers. It is uncanny to come from a place like Texas where the lines between young and old are drawn firmly in the dry, cracking soil, to a place like this where the more traditional boundaries between people have deteriorated. As a weird karmic side-effect, almost everybody seems to be perpetually stuck in their mid-to-late twenties.
+
+The youthful exuberance that floods over most of the bay area, and Silicon Valley, seem to be one of the many reasons why the topsoil is so welcoming to startups. Like most starry-eyed young people, not yet jaded by the harsh realities of an unforgiving world, so many people here have a dream to strike it rich. Unfortunately, like those that came to this part of California so long ago for the gold contained in the hills, almost nobody will strike gold. But just like birthday presents to your grandmother, it's the thought that counts.
+
+The perpetual optimism of San Francisco has made it the butt of numerous jokes but also the target of many envious eyes and in general a fun place to be. While it is very possible that Buzz might be (temporarily) leaving the insanity, I'm thrilled to join in just the same.
diff --git a/_posts/2007-04-25-choosing-a-platform-windows-and-linux.html b/_posts/2007-04-25-choosing-a-platform-windows-and-linux.html
new file mode 100644
index 0000000..7b68a95
--- /dev/null
+++ b/_posts/2007-04-25-choosing-a-platform-windows-and-linux.html
@@ -0,0 +1,30 @@
+---
+layout: post
+title: Choosing a platform, Windows and Linux
+tags:
+- Software Development
+created: 1177526955
+---
+Came across an article through slashdot (I should almost template that intro) that presents the opinion that Microsoft wins over developers by not offering the wide variety of development tools for Windows that are available on Linux. I've got quite a bit of insight on this topic, and I'll get to that in the context of some quotes from the article, but let me start with one thing I think the author has absolutely right.
+
+Every time I thought I was going to be stuck, there were a dozen articles explaining how to do exactly what I needed to do, with sample code that was up to date with the versions of the software I was using, and that actually related to the problem I was trying to solve.
+
+There are always cases where you end up thinking "this example isn't what I want" on any platform, but by and large the material you can find on MSDN is second to only the OpenBSD man pages in documentation that I've found useful and usable. There is also a huge amount of additional information online for .NET programming (Code Project comes to mind). This is the only part of the article I can say I strongly agree with.
+
+
+
+I thought I’d share a few thoughts on why people seem to be drawn to the Microsoft Way.
+
+The reason I do Windows development is because it has been the platform available for every job I've had since 2001. When I was a co-op student working with industrial control systems I did PLC programming and the manufacturers provided Windows tools to work with. When I started my current day job they were looking for a nice Windows replacement for an old DOS program. I do a lot of quick data acquisition setup for experiments and I typically grab a Windows laptop and one of a pile of cheap PCMCIA data acquisition cards that we have lying around that don't have Linux drivers. I'm doing some freelance application development for a medium sized company which is an all-Windows shop. None of these reasons have anything to do with lack of choice, and I suspect my experience is fairly similar to a lot of Windows developers.
+
+Microsoft offers the certainty of no choices. Choice isn’t always good
+
+There is no lack of choice on Windows. Most of the options available for Linux also apply to Windows. I can do a project in Visual Basic, C, C#, C++, Java, Ruby, Python or Perl, or choose Win32, .NET, Mono, GTK+, Qt, WxWidgets, or nearly anything else under the sun. I will admit this may or may not apply as much to web development, since that is an area I generally stay away from, but saying there is no choice for development on Windows is simply not true. Just because there is an obvious preference doesn't mean the choice doesn't exist. I should state explicitly that I won't consider only products offered by Microsoft to be the same as choices for programming on Windows. Just because the OS provider is also a tool provider does not preclude the existence or use of other tools.
+
+The astute among you may have noticed I've sidestepped the choice of Linux distributions, and I did so intentionally. I consider it prerequisite for becoming a developer on either platform to be a user of that platform. If you are talking about converting Windows developers to Linux developers they first have to be Linux users, at least to some level of proficiency, and vice versa. The distribution choice is much relevant to users than to developers.
+
+The takeaway I get from this entire line of reasoning is this: that somehow, someway, we need to start doing some winnowing
+
+What I really think about why developers program on and for Windows instead of Linux is that Windows is still the dominant environment for most of these developers, exactly the reasons I gave for my own programming on Windows. I've done some Linux programming at my day job in addition to my Windows programming. The longer I'm here the more I'll do and the less dominant Windows will become in this one organizational group. The issue as I see it isn't the quality of the OS or the available development tools, nor is it the number of tools available, it is simply a matter of inertia.
+
+Unfortunately I'm in no position to bring Mac into this discussion, but it'd be great to see some discussion of that as well.
diff --git a/_posts/2007-04-29-site-upgrade.html b/_posts/2007-04-29-site-upgrade.html
new file mode 100644
index 0000000..62f420a
--- /dev/null
+++ b/_posts/2007-04-29-site-upgrade.html
@@ -0,0 +1,8 @@
+---
+layout: post
+title: Site Upgrade
+tags:
+- Miscellaneous
+created: 1177914937
+---
+Just a side note, I upgraded this site to Drupal 5.1 this weekend. I'm not sure if there will be any visible changes besides the obvious theme change, but overall things should work smoother.
diff --git a/_posts/2007-04-30-im-in-ur-phonez.html b/_posts/2007-04-30-im-in-ur-phonez.html
new file mode 100644
index 0000000..205eb87
--- /dev/null
+++ b/_posts/2007-04-30-im-in-ur-phonez.html
@@ -0,0 +1,31 @@
+---
+layout: post
+title: Im in ur phonez
+tags:
+- Software Development
+created: 1177929000
+---
+In a weird sort of cosmic coincidence, I happened to be researching some of the mobile developer tools available after a weekend of toying with the Windows Mobile 5.0 framework (which is pretty cool by itself) within Visual Studio 2005, and while I was doinking around on the internet, I came across Nokia's Open C platform. By itself Open C is pretty impressive, but after digging around some more the entire Nokia development platform is certainly not what I expected. Quicker than you can say OMIGOSHSYMBIANSUCKS I found myself immersed in whitepapers and code all targetted at developing for the gigantic mobile market.
+
+Before I dive into Windows Mobile, I must first disclaim that I'm a relatively big fan of the .NET platform, usually by means of the Mono Project. The .NET Compact Framework (referred to as .NET CF) is merely an extension of the .NET framework meaning you can use a lot of the same code and know-how for developing Windows Forms interfaces for Windows Mobile enabled smart phones as well as already existing code for the backend of your embedded application (there is also an interesting extension on .NET CF available at OpenNETCF). The power of this sort of portability should go without saying, but why not say it anyways? Because of .NET CF I can write the same services and network interoperability code that can be used in my desktop application and take it straight over to my embedded application with zero or minimal hassle (optimizing your bloated desktop code for an embedded application is always a good idea). In addition the normal trimmings of .NET, the Microsoft.WindowsMobile namespace offers a myriad of device-specific APIs for sending messages, interacting with a smart phone's contacts, calendaring, camera, media player and all the rest that comes stock on modern Windows smart phones. With a saturday afternoon spent in an empty office pouring over API documentation and hacking furioiusly on some test applications, I could send messages, take pictures, play with contact information and do some G-rated damage to a Windows smart phone (Rory Blythe's screencasts on the subject are a fantastic resource as well). The obvious downside is that it is Windows (Mobile) and that the consumers that tend to own Windows smart phones tend to be business types who walk around with suits and have the word "synergy" tattooed on their buttocks. Not my cup of tea, nor my target market. Next!
+
+On the other side of the world to Nokia. Nokia's S90 platform is expansive to say the least, and runs on quite a few devices as well. While I'm certainly not "in the biz" with regards to mobile device development, the sheer size of the entire S90 platform and the varying means of using it surprised me. Nokia's S90 platform builds on top of Symbian (ick!) which, fortunately, powers more than half the mobile market but, unfortunately, sucks. You know it, I know it, even Symbian Ltd. knows it, so let's stop pretending. With regards to Nokia's developer tools though, they offer a relatively stock Java API for developers to use (eSWT? gross!), their Carbide C++ framework which builds on top of Symbian's own C++ libraries, and even a Python API for their SDKs (the Maemo work is worth a look too). Most interesting to me was their Open C project which borrows some of the best bits and pieces from a few open source projects and brings them to the mobile platform. While Nokia obvious doesn't have a clue with device design they do seem to be with it in terms of the open source world. Open C is built primarily on top of OpenBSD and OpenSSL libraries with a bit of libz and GNOME thrown in there as well.
+
+
libc
OpenBSD
+
libcrypt
OpenSSL
+
libcrypto
OpenSSL
+
libglib
GNOME
+
libm
OpenBSD
+
libpthread
OpenBSD
+
libssl
OpenSSL
+
libz
libz
+
+Either somebody at Nokia really wants to piss Theo de Raadt off, or they have a high opinion of his work! Personally I wouldn't have chose OpenBSD, but their unwaivering committment to the "absolutely open source" ideology seems to make their projects an ideal fishing ground for commercial ventures who are really looking to stand atop the shoulders of giants.
+
+Even Blackberry has tools readily available for developers, but I can't say I've researched them too much. I'm pretty sure that people who develop applications for Blackberries go sterile or get cast outside the universe at armageddon or something.
+
+The device development world is riper than ever for some killer application development, the Opera guys seem to get it (they use Qtopia from what I can tell), the Google guys seem to get it, where are the smaller shops? If the iPhone turns out to have some sort of "Cocoa Mobile Edition" (a poor ripoff on my part from JavaME) then I think we will see an influx of Mac independent developers to the iPhone as a platform all battling for a tiny niche of a niche just as they are on the Mac platform. What about the entire rest of the mobile market?
+
+With the growing ubiquity of the mobile devices market the opportunity for independent developers to write killer applications for Windows Mobile, Symbian, embedded Linuxes, and possibily the iPhone, is more attainable than ever. The tools to develop are either free or cheap, and you don't necessarily need to be a hero-programmer to develop applications for these embedded systems anymore either.
+
+That said, Brent, I'll buy you a beer when I see NetNewsWire iPhone Edition.
diff --git a/_posts/2007-04-30-windows-eye-for-the-cocoa-guy.html b/_posts/2007-04-30-windows-eye-for-the-cocoa-guy.html
new file mode 100644
index 0000000..0c14354
--- /dev/null
+++ b/_posts/2007-04-30-windows-eye-for-the-cocoa-guy.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Windows Eye for the Cocoa Guy
+tags:
+- Software Development
+created: 1177980477
+---
+I finally got around to posting the slides for my presentation at the april CocoaHeads Silicon Valley meeting. The motivation for the talk was to introduce my fellow Mac developer colleagues to some of the goods and bads of modern Windows develolpment. One of the primary points I tried to bring across was that Apple doesn't yet have an IDE that I would put on the same level as Visual Studio 2005, which is arguably one of the most complex and complete IDEs out there (with Eclipse in a close second, in my opinion). Xcode (and friends) in Leopard are very close to taking the throne away from Microsoft in that respect, but there are still a few things that are holding them back, such as gdb, which is still a relatively primitive debugger.
+
+With .NET 3.0 however, Microsoft is fighting back hard for the make-believe "most cool framework" award, with additions like Windows Presentation Foundation (formerly called Avalon). The downside of a lot of .NET 3.0 however is Microsoft's incessant love of all things XML, as WPF is based primarily on XAML which is grotesque on a good day.
+
+Unfortunately I can't repeat my entire presentation, and I didn't want to post my presenter notes, but hopefully you can ascertain enough information from my presentation.
+
+Windows Eye for the Cocoa Guy
diff --git a/_posts/2007-05-01-twitterbot-recap.html b/_posts/2007-05-01-twitterbot-recap.html
new file mode 100644
index 0000000..265498a
--- /dev/null
+++ b/_posts/2007-05-01-twitterbot-recap.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Twitterbot Recap
+tags:
+- Mono
+created: 1178062136
+---
+While trudging through some comment spam, I came across some older comments that I felt needed recapping in this post about my Twitterbot. An anonymous poster had asked about some issues with Mono on Mac OS X returning 401 Unauthorized errors when using HTTP authentication within the Twitterbot. The issue was fixed relatively quickly after I brought it to the attention of some of the Mono developers, and the fix will be included in Mono 1.2.4 (preview available).
+
+There shouldn't be any more issues with regards to running the Twitterbot on any platform supported by Mono now. In the future I would also like to add better history and duplicate checking by using either a flat-file datasource or one that feeds on a database, but the latter would probably make the program far more complex and difficult to use. Ideas, as usual, are always welcome.
diff --git a/_posts/2007-05-03-windows-eye-for-the-cocoa-guy-the-series.html b/_posts/2007-05-03-windows-eye-for-the-cocoa-guy-the-series.html
new file mode 100644
index 0000000..9396546
--- /dev/null
+++ b/_posts/2007-05-03-windows-eye-for-the-cocoa-guy-the-series.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Windows Eye for the Cocoa Guy, The Series
+tags:
+- Windows Eye for the Cocoa Guy
+created: 1178178004
+---
+After giving the idea a bit of thought and the desire to further alienate myself from my fellow Mac developers (i've noticed the drop in hits when I started mentioning Windows development versus Mac development), I've decided to turn "Windows Eye for the Cocoa Guy" into a series of posts detailing some of the architectural and semantical differences between developing applications in Cocoa on Mac OS X, and .NET on Windows. I've found myself lamenting my performance at the CocoaHeads Silicon Valley meeting because I felt like I either didn't have the time, or carelessly glossed over a lot of details that should have been mentioned. I was cramped for time before the presentation as well so I couldn't prepare enough (see: any) code samples or demos beforehand to pimp out some features of .NET or Visual Studio that are still lacking in Objective-C 2.0 and Xcode.
+
+I'm still crafting some of my points to make in upcoming posts, by user request (here) I intend to cover XAML in general (as well as Silverlight) contrasted against the "freeze-dried objects" model that Interface Builder, with a dash of Windows Forms Designer too.
+
+Also on the yellow notepad of bloggery, I would like to touch on the differences between C# Events in how they're handled and created versus the less than popular NSNotification way of doing events in Cocoa. Major differences also exist between the ways of doing .NET asynchronous I/O compared to Cocoa "asynchronous I/O," in quotes because, as much as I love the runloop, scheduling tasks to the runloop doesn't count in my opinion as asynchronous I/O [1].
+
+While I enjoy being slightly provacative, I'm really aiming to be pelted with rocks at WWDC. You'll be able to find me sitting at a table all by myself outside Moscone. Regardless of the certain doom I will face posting about Windows development from a Mac developer perspective, I hope the series will at the very least be interesting and educational.
+
+1. The lack of "real" asynchronous calls in Cocoa bugs the hell out of me. Darwin is one of the few operating systems I've developed on with functions like aio_read(2) and friends. Besides scheduling a call on the runloop, you can spawn a worker thread yourself, both options don't take advantage of the aio_* functions which just...sucks.
diff --git a/_posts/2007-05-06-my-guilty-pleasure.html b/_posts/2007-05-06-my-guilty-pleasure.html
new file mode 100644
index 0000000..c59735e
--- /dev/null
+++ b/_posts/2007-05-06-my-guilty-pleasure.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: My Guilty Pleasure
+tags:
+- Media
+created: 1178483600
+---
+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.
diff --git a/_posts/2007-05-10-our-employees-are-our-most-valuable-asset.html b/_posts/2007-05-10-our-employees-are-our-most-valuable-asset.html
new file mode 100644
index 0000000..2de474d
--- /dev/null
+++ b/_posts/2007-05-10-our-employees-are-our-most-valuable-asset.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Our employees are our most valuable asset
+tags:
+- Slide
+- Software Development
+created: 1178791890
+---
+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.
diff --git a/_posts/2007-05-19-sp4mz0r.html b/_posts/2007-05-19-sp4mz0r.html
new file mode 100644
index 0000000..8d42c06
--- /dev/null
+++ b/_posts/2007-05-19-sp4mz0r.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Sp4mz0r
+tags:
+- Miscellaneous
+created: 1179610398
+---
+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.
diff --git a/_posts/2007-05-26-conference-season-osbc.html b/_posts/2007-05-26-conference-season-osbc.html
new file mode 100644
index 0000000..31a881c
--- /dev/null
+++ b/_posts/2007-05-26-conference-season-osbc.html
@@ -0,0 +1,31 @@
+---
+layout: post
+title: "Conference Season: OSBC"
+tags:
+- Opinion
+created: 1180231424
+---
+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.
+
diff --git a/_posts/2007-06-03-almost-there.html b/_posts/2007-06-03-almost-there.html
new file mode 100644
index 0000000..343a04d
--- /dev/null
+++ b/_posts/2007-06-03-almost-there.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: Almost There
+tags:
+- Slide
+- Miscellaneous
+created: 1180938640
+---
+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.
diff --git a/_posts/2007-06-08-long-live-the-license-flamewar.html b/_posts/2007-06-08-long-live-the-license-flamewar.html
new file mode 100644
index 0000000..9029230
--- /dev/null
+++ b/_posts/2007-06-08-long-live-the-license-flamewar.html
@@ -0,0 +1,28 @@
+---
+layout: post
+title: Long Live the License Flamewar
+tags:
+- Opinion
+created: 1181333669
+---
+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.
diff --git a/_posts/2007-06-24-insanity.html b/_posts/2007-06-24-insanity.html
new file mode 100644
index 0000000..18f08ca
--- /dev/null
+++ b/_posts/2007-06-24-insanity.html
@@ -0,0 +1,25 @@
+---
+layout: post
+title: Insanity.
+tags:
+- Slide
+- Software Development
+- Facebook
+created: 1182691338
+---
+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
diff --git a/_posts/2007-06-26-thriving-in-a-development-vacuum.html b/_posts/2007-06-26-thriving-in-a-development-vacuum.html
new file mode 100644
index 0000000..a9444e9
--- /dev/null
+++ b/_posts/2007-06-26-thriving-in-a-development-vacuum.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Thriving in a Development Vacuum
+tags:
+- Software Development
+created: 1182879667
+---
+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 ...
diff --git a/_posts/2007-07-04-mono-meet-facebook.html b/_posts/2007-07-04-mono-meet-facebook.html
new file mode 100644
index 0000000..517c936
--- /dev/null
+++ b/_posts/2007-07-04-mono-meet-facebook.html
@@ -0,0 +1,31 @@
+---
+layout: post
+title: Mono, meet Facebook
+tags:
+- Mono
+- Slide
+- Facebook
+created: 1183571295
+---
+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).
+
+
+
diff --git a/_posts/2007-07-10-conference-season-iphonedevcamp.html b/_posts/2007-07-10-conference-season-iphonedevcamp.html
new file mode 100644
index 0000000..ece40cf
--- /dev/null
+++ b/_posts/2007-07-10-conference-season-iphonedevcamp.html
@@ -0,0 +1,23 @@
+---
+layout: post
+title: "Conference Season: iPhoneDevCamp"
+tags:
+- Software Development
+created: 1184057251
+---
+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
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.
diff --git a/_posts/2007-07-21-new-email-etc.html b/_posts/2007-07-21-new-email-etc.html
new file mode 100644
index 0000000..373f98e
--- /dev/null
+++ b/_posts/2007-07-21-new-email-etc.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: New Email, etc
+tags:
+- Mono
+created: 1185087139
+---
+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.
diff --git a/_posts/2007-07-21-starting-with-openmoko.html b/_posts/2007-07-21-starting-with-openmoko.html
new file mode 100644
index 0000000..663c31f
--- /dev/null
+++ b/_posts/2007-07-21-starting-with-openmoko.html
@@ -0,0 +1,39 @@
+---
+layout: post
+title: Starting with OpenMoko.
+tags:
+- Linux
+- OpenMoko
+created: 1185011139
+---
+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?
diff --git a/_posts/2007-07-23-ironru-ooh-shiney.html b/_posts/2007-07-23-ironru-ooh-shiney.html
new file mode 100644
index 0000000..18aee2e
--- /dev/null
+++ b/_posts/2007-07-23-ironru-ooh-shiney.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: IronRu..OOH SHINEY!
+tags:
+- Mono
+created: 1185204042
+---
+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!
diff --git a/_posts/2007-07-28-facebook-grokathon-and-how-were-trying-to-take-over-the-world.html b/_posts/2007-07-28-facebook-grokathon-and-how-were-trying-to-take-over-the-world.html
new file mode 100644
index 0000000..869472b
--- /dev/null
+++ b/_posts/2007-07-28-facebook-grokathon-and-how-were-trying-to-take-over-the-world.html
@@ -0,0 +1,30 @@
+---
+layout: post
+title: Facebook Grokathon, and how we're trying to take over the world.
+tags:
+- Slide
+- Software Development
+- Facebook
+created: 1185624747
+---
+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.
+
+
+
diff --git a/_posts/2007-07-28-songbird-a-visual-review.html b/_posts/2007-07-28-songbird-a-visual-review.html
new file mode 100644
index 0000000..16b46c1
--- /dev/null
+++ b/_posts/2007-07-28-songbird-a-visual-review.html
@@ -0,0 +1,70 @@
+---
+layout: post
+title: Songbird, a visual review
+tags:
+- Opinion
+created: 1185635396
+---
+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?
+
+Final Score: -2 :(
diff --git a/_posts/2007-07-30-hacking-with-ironpython.html b/_posts/2007-07-30-hacking-with-ironpython.html
new file mode 100644
index 0000000..66012ed
--- /dev/null
+++ b/_posts/2007-07-30-hacking-with-ironpython.html
@@ -0,0 +1,38 @@
+---
+layout: post
+title: Hacking with IronPython
+tags:
+- Mono
+- Linux
+created: 1185801848
+---
+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.
diff --git a/_posts/2007-08-03-subversion-branching-with-less-pain.html b/_posts/2007-08-03-subversion-branching-with-less-pain.html
new file mode 100644
index 0000000..b5022e1
--- /dev/null
+++ b/_posts/2007-08-03-subversion-branching-with-less-pain.html
@@ -0,0 +1,51 @@
+---
+layout: post
+title: "Subversion branching with less Pain\xE2\x84\xA2"
+tags:
+- Slide
+- Software Development
+created: 1186129471
+---
+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)
diff --git a/_posts/2007-08-05-ordered-filled.html b/_posts/2007-08-05-ordered-filled.html
new file mode 100644
index 0000000..7fa51c2
--- /dev/null
+++ b/_posts/2007-08-05-ordered-filled.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Ordered Filled
+tags:
+- OpenMoko
+created: 1186305244
+---
+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).
diff --git a/_posts/2007-08-06-ironpython-for-macports.html b/_posts/2007-08-06-ironpython-for-macports.html
new file mode 100644
index 0000000..3537bfd
--- /dev/null
+++ b/_posts/2007-08-06-ironpython-for-macports.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: IronPython for MacPorts
+tags:
+- Mono
+created: 1186391172
+---
+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.
diff --git a/_posts/2007-08-08-meet-openmoko.html b/_posts/2007-08-08-meet-openmoko.html
new file mode 100644
index 0000000..7f88a6b
--- /dev/null
+++ b/_posts/2007-08-08-meet-openmoko.html
@@ -0,0 +1,40 @@
+---
+layout: post
+title: Meet OpenMoko
+tags:
+- Linux
+- OpenMoko
+created: 1186633467
+---
+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.
diff --git a/_posts/2007-08-09-scaling-with-your-smart-platform-choice.html b/_posts/2007-08-09-scaling-with-your-smart-platform-choice.html
new file mode 100644
index 0000000..e16d923
--- /dev/null
+++ b/_posts/2007-08-09-scaling-with-your-smart-platform-choice.html
@@ -0,0 +1,48 @@
+---
+layout: post
+title: Scaling, with your "smart platform choice"
+tags:
+- Software Development
+created: 1186669090
+---
+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 :)
diff --git a/_posts/2007-08-11-openmoko-2007-2-preview.html b/_posts/2007-08-11-openmoko-2007-2-preview.html
new file mode 100644
index 0000000..4706620
--- /dev/null
+++ b/_posts/2007-08-11-openmoko-2007-2-preview.html
@@ -0,0 +1,85 @@
+---
+layout: post
+title: OpenMoko 2007.2 Preview
+tags:
+- Linux
+- OpenMoko
+created: 1186901933
+---
+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
+
+
+
+
+
+
+
+
+
+
+
+
+
OpenMoko Desktop
+
+
+
+
2007.1
2007.2
+
+
+
+
+
+
+
+
+
+
+
+
+
OpenMoko Applications
+
+
+
+
2007.1
2007.2
+
+
+
+
+
+
+
+
+
+
+
+
+
OpenMoko Dialer
+
+
+
+
2007.1
2007.2
+
+
+
+
+
+
+
+
+
+
+
+
+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 :)
+
+
+
+
+
+You can find all my OpenMoko photos on Flickr
diff --git a/_posts/2007-08-12-video-hello-moko.html b/_posts/2007-08-12-video-hello-moko.html
new file mode 100644
index 0000000..5b498ee
--- /dev/null
+++ b/_posts/2007-08-12-video-hello-moko.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "Video: Hello Moko"
+tags:
+- Linux
+- OpenMoko
+created: 1186923300
+---
+I thought I'd dork around a little bit with recording videos featuring the Neo1973, running OpenMoko. This video is running an older version of OpenMoko (2007.1) so it isn't current. It's also worth noting, to use the phone, you don't have to do a full shutdown and bootup, you should really only ever need to do either if you're a developer, or when you first receive the phone.
+Hello Moko.
+
+
+
+
diff --git a/_posts/2007-08-14-another-facebook-developer-meetup.html b/_posts/2007-08-14-another-facebook-developer-meetup.html
new file mode 100644
index 0000000..1f89cf3
--- /dev/null
+++ b/_posts/2007-08-14-another-facebook-developer-meetup.html
@@ -0,0 +1,25 @@
+---
+layout: post
+title: Another Facebook Developer Meetup
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+- Facebook
+created: 1187078869
+---
+Seth Goldstein of SocialMedia (who I think are a competitors of ours) has organized a Facebook Developers Meetup/Miniconference of sorts this Wednesday from 12-5 p.m. at Fenwick & West here in San Francisco, which I will be attending. I'm not completely sure on what I'll be talking about, I'm thinking about discussing some of the issues with scaling on the Facebook platform, or the pitfalls of choosing FBML vs. HTML for developing your Facebook application. There's going to be lots of market-speak I'm assuming ("OMFG VIRALITY!") so I'd like to bring a bit more of the technical side of developing applications that can explode on the Facebook platform.
+
+What I end up talking about is completely open to discussion, so if there's anything you'd like me to talk about, feel free to leave me a comment or drop me a mail at tyler [at] slide [diggitydot] com.
+
+While I am not one to discuss a lot about our "strategy" or "pixie dust" or however we've done what we've done, I do know how a lot of what we done works, and his Maxness permitting, i'll be able to impart some of the <fb:wisdom/> I've accumulated upon my fellow application developers. If interest warrants it, I might start to share some of my sicker (read: awesome) FBML hacks on this blog, but since I'm a big nobody in the world of blogs, it might be a waste of time, so we'll see.
+
+Regardless, if you can make it this wednesday come on by and say "howdy"
+
+I promise I probably don't bite.
+
+
+
+1, Ego-boost
+Just in case you aren't familiar with Facebook's Platform, or what's exactly going on, I figured I'd cite why Slide, and in turn why I am (sort of) credible to talk on the subject.
+Slide has done a good job (in my absurdly biased opinion) on the Facebook Platform with some of the top applications such as:
+
diff --git a/_posts/2007-08-15-coping-with-success-scaling-on-the-facebook-platform.html b/_posts/2007-08-15-coping-with-success-scaling-on-the-facebook-platform.html
new file mode 100644
index 0000000..c3ba541
--- /dev/null
+++ b/_posts/2007-08-15-coping-with-success-scaling-on-the-facebook-platform.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "Coping with Success: Scaling on the Facebook Platform."
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+- Facebook
+created: 1187213940
+---
+I figured I'd go ahead and post this now since the format is of the "App Dev Conference" (InsideFacebook coverage) is more paneled than the original "small presentations" I assumed it to be. Oops.
+
+We talked about a few topics from a developer perspective, such as a minor gripe session on Facebook breaking FBML, but the highlights of our developer's panel are monetizing and growing the user engagement inside the applications. I was on the panel with Blake Commagere (Vampires), Dave Genztel, (SocialMedia), Jia Shen, (RockYou), Joe Winterhalter (Quizzes), James Hong (HotOrNot). Fortunately for me, I get to do cool stuff like this, almost as the "voice" of Top Friends despite the fact that Top Friends is a definite Slide property with more smart people behind it than just me alone.
+
+Regardless, in between fixing some bugs last night, I hacked up a presentation citing some of the various means of scaling and designing your application to scale appropriately, I also made sure to discuss some of the lower-level scalability with one of our brilliant server guys, to cover the bases from application-level scaling to database and Facebook API scaling.
+
+I hope you enjoy my presentation with notes included:
+Coping with Success: Scaling on the Facebook Platform (PDF)
+Coping with Success: Scaling on the Facebook Platform (Flickr)
+
diff --git a/_posts/2007-08-19-i-just-saved-150.html b/_posts/2007-08-19-i-just-saved-150.html
new file mode 100644
index 0000000..3a799a9
--- /dev/null
+++ b/_posts/2007-08-19-i-just-saved-150.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: I just saved $150!
+tags:
+- Miscellaneous
+created: 1187529030
+---
+Thanks City of San Francisco for not being able to tell the differences between at least two of the three characters in my license plate.
+
+I'd feel guilty, but if my street is marked for "Street Cleaning" three days a week, I'd like to see it cleaned at least twice a week.
+
+What a racket.
diff --git a/_posts/2007-08-21-scaling-with-mysql-a-brief-guide.html b/_posts/2007-08-21-scaling-with-mysql-a-brief-guide.html
new file mode 100644
index 0000000..0867287
--- /dev/null
+++ b/_posts/2007-08-21-scaling-with-mysql-a-brief-guide.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Scaling with MySQL, a brief guide.
+tags:
+- Opinion
+- Software Development
+- Facebook
+created: 1187755277
+---
+I've been thinking and experimenting a lot with MySQL 5, and PostgreSQL 8.3, trying to figure out which database server would be most optimal for scaling larger web applications.
+
+I've brought some of my MySQL optimization tips into a small e-book styled guide, something I hope will help my fellow developers understand what they are getting into before choosing a production environment with MySQL 4, or MySQL 5 in contrast to PostgreSQL.
+
+If you have any other tips for scaling with MySQL, I'll make sure I add them to my little e-book and release and updated PDF file :)
+
+
+Scaling MySQL (PDF)
diff --git a/_posts/2007-08-22-my-boss-is-a-robot.html b/_posts/2007-08-22-my-boss-is-a-robot.html
new file mode 100644
index 0000000..3616ec5
--- /dev/null
+++ b/_posts/2007-08-22-my-boss-is-a-robot.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: My Boss is a Robot.
+tags:
+- Slide
+- Miscellaneous
+created: 1187845694
+---
+Sometimes Max tells me things that I find hard to believe, but after I verify that he's not just telling tall tales, they inevitably turn out to be 100% correct, which is scary.
+
+Jokingly I mentioned that "Max is a robot" today, to which he promptly corrected me stating that "it's already known" that Max Levchin is a cyborg.
+
+Some of my favorite quotes from this obviously factual article are:
"The man is ripped. What human engineer has biceps?"
"When he worked at PayPal doing security (alert: common robot job).."
+
+The WD-40 he keeps in his left back pocket, and the obvious mechanical extension of his hand (which assumes the shape of a Blackberry) should have been dead give-aways, but I somehow glazed over this.
diff --git a/_posts/2007-08-23-back-to-the-basics.html b/_posts/2007-08-23-back-to-the-basics.html
new file mode 100644
index 0000000..76ca641
--- /dev/null
+++ b/_posts/2007-08-23-back-to-the-basics.html
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Back to the Basics
+tags:
+- Academia
+created: 1187887837
+---
+So last time we spoke I just arrived in college station during the spring semester. It has been a while! So I decided to come back after talking to my buddy tyler last night, I was reminded of the good times I had on unethical blogger (even though I only posted once). So I think I am going to start a weekly blog of things that scared the shit of of me this week. Many readers will laugh at this weeks, I did not find the situation funny.
+
+WHAT SCARED ME?
+
+RACCOONS?
+
+As I was throwing out the trash, I hit a raccoon with a box and I jumped out of the dumpster and almost killed me. Luckily I have learned from Chuck Norris So that Raccoon was good as dead. Bust still they need to die.
+
+I have also started a new thing with my buddy tyler, when I call tyler for tech support, I give him a dollar. So far he has earned 4. By the end of the year I would not be surprised if he has earned at least 50 from me.
+
+Anywhoo my quesidillla is done so I gotsta jet.
+
+As always I am your humble mexican friend,
+
+The Roy
diff --git a/_posts/2007-08-25-facebook-developer-garage-palo-alto.html b/_posts/2007-08-25-facebook-developer-garage-palo-alto.html
new file mode 100644
index 0000000..9d5b775
--- /dev/null
+++ b/_posts/2007-08-25-facebook-developer-garage-palo-alto.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Facebook Developer Garage Palo Alto
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+- Facebook
+created: 1188064625
+---
+Somewhere amongst the stress of this past week, I neglected to mention that this weekend, i.e. today, there will be a Facebook Developer Garage in Palo Alto Co-hosted by Slide.
+
+I'll be speaking, giving the presentation I previously mentioned not being able to give, on scaling on the Facebook platform and some of the key things to consider when choosing between and FBML or an IFrame based application.
+
+Not only will I be there, but most of the Slide/Facebook crew will be there along with (at latest count) about 300 people from around Silicon Valley who are interested in developing, monetizing, and creating on top of the Facebook platform.
+
+Feel free to stop on by to watch me say "um" too many times in front of 300 of my peers, good times will be had by all.
diff --git a/_posts/2007-08-26-facebook-developer-garage-wrap-up.html b/_posts/2007-08-26-facebook-developer-garage-wrap-up.html
new file mode 100644
index 0000000..bbc7856
--- /dev/null
+++ b/_posts/2007-08-26-facebook-developer-garage-wrap-up.html
@@ -0,0 +1,21 @@
+---
+layout: post
+title: Facebook Developer Garage Wrap-Up
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+- Facebook
+created: 1188168348
+---
+Despite resisting the temptation to come on stage chanting "developers, developers, developers!" I think the entire Facebook Developer Garage - Palo Alto was great success. Application developers from (in my opinion) well over half of the popular applications on Facebook and a lot of independent application developers showed up and in general good times were had by all.
+
+
+
+As far as my presentation went, I was apparently "a great speaker, spoke in depth about building apps thats scale." But in general the feedback was very good, and I spent most of the rest of the day talking to individual developers about short-term and then longer term growth and how to attack that from a developer's perspective.
+
+Since I've updated the presentation, it's posted here again.
+
+Coping with Success (PDF)
+
+
diff --git a/_posts/2007-08-29-video-facebook-developer-garage.html b/_posts/2007-08-29-video-facebook-developer-garage.html
new file mode 100644
index 0000000..d222e1d
--- /dev/null
+++ b/_posts/2007-08-29-video-facebook-developer-garage.html
@@ -0,0 +1,32 @@
+---
+layout: post
+title: "Video: Facebook Developer Garage"
+tags:
+- Slide
+- Facebook
+created: 1188452401
+---
+I figured I'd go ahead and include some of the Facebook Developer Garage videos that were recently posted to YouTube, including ones of me giving my presentation.
+
+
Coping with Success
Part One
+
+
+Part Two
+
+
+And of course Dave Fetterman, the lead engineer on the Facebook Platform gave a good talk (preceeding mine)
+
+
From Facebook
Part One
+
+
+Part Two
+
+
+Part Three
+
+
+In general it was a great event, both technically, but also in terms of networking and sharing knowledge and ideas we've all accrued through our work on the platform. Slide had a good showing in my opinion and I think we did a good job of offering up advice where we could in terms of scaling, technical "gotchas" on the platform, and whatever else we could offer up to the community.
+
+Around 300 showed up this time around, I'm hoping closer to 400 or 500 show up for the next Facebook Developer event that's held in the bay area, but we'll see.
+
+Videos courtesy of dalmaer
diff --git a/_posts/2007-09-07-time-for-a-road-trip.html b/_posts/2007-09-07-time-for-a-road-trip.html
new file mode 100644
index 0000000..4160066
--- /dev/null
+++ b/_posts/2007-09-07-time-for-a-road-trip.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Time for a Road Trip
+tags:
+- Miscellaneous
+created: 1189155054
+---
+After a few solid months of staying within the city limits of San Francisco hacking to my heart's content on a few Facebook products, my OpenMoko, some Mono libraries that I'm building, and other stuff I shouldn't talk about, I'm taking a break.
+
+A friend of mine has taken my advice and is moving to the west coast now that she's graduated and is ready to see what the world has to offer outside of Boston. Part of my obligation it would seem as the giver of (fantastic) advice is that I will now help her drive 2,968 miles from Washington D.C., to Santa Barbera.
+
+I'm debating buying a camera once I arrive in D.C. later today. If anybody has any suggestions for reasonably priced, good digital cameras, please let me know.
+
+This should be fun.
+
+
diff --git a/_posts/2007-09-13-for-what-its-worth.html b/_posts/2007-09-13-for-what-its-worth.html
new file mode 100644
index 0000000..cd17ac3
--- /dev/null
+++ b/_posts/2007-09-13-for-what-its-worth.html
@@ -0,0 +1,11 @@
+---
+layout: post
+title: For what it's worth
+tags:
+- Miscellaneous
+created: 1189711474
+---
+I'm back in San Francisco, and I'm not dead.
+
+That was one crazy-fast road trip.
+
diff --git a/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html b/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html
new file mode 100644
index 0000000..b870311
--- /dev/null
+++ b/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: C'mon down to SilverlightDevCampSF
+tags:
+- Mono
+- Software Development
+created: 1189805360
+---
+A bit late to bring up, but later today and tomorrow here in San Francisco, "we" (using that term loosely) will be holding SilverlightDevCampSF, one of the first BarCamp-styled events that I'll have ever attended where I've not played a part in it's organization.
+
+In case you're unfamiliar with BarCamp events, they're loosely organized meetups/conferences to which geeks flock to normally for the booze included, but sometimes for the technical aspects as well.
+
+I'm showing up particularly for Kevin Marshall's session on "Silverlight Facebook Apps" for obvious reasons, as well as to try my best to enlighten my fellow developers on the joys of Mono and Moonlight (that last part might not work out, time permitting). Overall it should be fun, and I hope if you're in the bay area you can make it down to 1 Market St! (map)
+
+
In case you're showing up, here's what I look like:
+ I'm with stupid ^
diff --git a/_posts/2007-09-15-silversurfer-try-out-silverlight-on-mac-os-x.html b/_posts/2007-09-15-silversurfer-try-out-silverlight-on-mac-os-x.html
new file mode 100644
index 0000000..1141196
--- /dev/null
+++ b/_posts/2007-09-15-silversurfer-try-out-silverlight-on-mac-os-x.html
@@ -0,0 +1,23 @@
+---
+layout: post
+title: SIlverSurfer, Try out Silverlight on Mac OS X
+tags:
+- Mono
+- Software Development
+created: 1189920348
+---
+At the SilverlightDevCampSF this past couple days, I discovered a couple things while hacking around with both Moonlight, and Silverlight.
+
+The first of which was that I don't know nearly enough about Silverlight, XAML, and WPF in general (crap). The second of which, was that with WebKit on Mac OS X, any application that embeds WebViews inherits plugins that are installed on the system. Extending this idea further, WebKit can inherit plugins that are bundled with a Cocoa application (inside Application.app/Contents/PlugIns), woohoo! What this means, outside of a purely Silverlight-related context, is that you could theoretically bundle a WebKit-plugin with a WebKit-based application and just have that plugin purely application specific, or bundle up a WebKit application with different versions of Flash and Silverlight for testing purposes. Unfortunately, there are some issues with clicking through to the Silverlight canvas in an embedded WebKit view, you can still try it out inside an application, without having to install the Silverlight plugin and restart your instance of Safari.
+
+That said, are you thinking what I'm thinking? Of course not, you're probably sane, but I'm not, so I'd like to introduce SilverSurfer 1.0, an embedded version of WebKit that loads in the Silverlight 1.0 plugin for Mac OS X. It doesn't install anything on your computer, so you don't have to restart Safari, or futz with plug-ins, this is especially useful if you just want to try Silverlight out and see what it's about without installing anything.
+
+
Running SilverSurfer
+
+
Visiting a Silverlight page in Safari
+
+
Visiting the same page in SilverSurfer
+
+
Complex Silverlight in SilverSurfer
+
+I think it's a neat trick, the only downside is actually having to bundle up the entire Silverlight.plugin bundle with the application bundle to make sure you don't have to install it, but other than that I hope you can find it useful when trying out Silverlight, or just testing it in Safari!
diff --git a/_posts/2007-09-19-channel9-silverlight-interview.html b/_posts/2007-09-19-channel9-silverlight-interview.html
new file mode 100644
index 0000000..f5d6010
--- /dev/null
+++ b/_posts/2007-09-19-channel9-silverlight-interview.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Channel9 Silverlight Interview
+tags:
+- Mono
+- Miscellaneous
+- Software Development
+created: 1190204903
+---
+At the closing of SilverlightDevCampSF Microsoft Evangelist Adam Kinney did a brief video interview with me about my silly Silverlight hack. I had just started with Silverlight the night before, and didn't even have Moonlight virtual machine up yet, but I did have a Windows XP vm kicking around.
+
+After the, roughly, three hours it took me to get Visual Studio 2008 (Orcas), Expression Blend, and a couple of other tidbits installed on my vm, I finally got to my Silverlight hack. Starting with something I presumed would be exceedingly simply, I created our "collage" transition in Silverlight (you can find a "sample" here).
+
+The hack is relatively simple, a new randomly generated storyboard and canvas are created for each image, then added to the root element; after 15 images have been added the canvas is cleared and repeats. I used Silverlight 1.0, since that's all that is released right now, so everything is in Javascript (argh!), but I intend on revisiting the hack once Silverlight 1.1 is a bit more stable (and rewrite it in IronPython!).
+
+Anyways, here's the interview.
diff --git a/_posts/2007-09-21-unofficial-facebook-hackathon-in-palo-alto.html b/_posts/2007-09-21-unofficial-facebook-hackathon-in-palo-alto.html
new file mode 100644
index 0000000..4ac46c6
--- /dev/null
+++ b/_posts/2007-09-21-unofficial-facebook-hackathon-in-palo-alto.html
@@ -0,0 +1,9 @@
+---
+layout: post
+title: (Unofficial) Facebook Hackathon in Palo Alto
+tags:
+- Facebook
+created: 1190442838
+---
+Rumor has it that there will be a little meetup in Palo Alto tomorrow to hack on some Facebook applications. The hackathon will be at Happy Donuts in Palo Alto, which is a hop skip and a jump away from the California Ave. Caltrain stop. I am planning on attending to hack on my Bug Tracker application (written in ASP.NET on Mono, which I will dissect and discuss later) as well as help out anybody that needs a good kick in the pants. Other than that however, it should be interesting how many folks show up and for what reasons, I'd like to discuss and share some of our sicker FBML hacks and maybe collectively play with (read: break) the Facebook Data Store API. Should be fun, come down and hang out :)
+
diff --git a/_posts/2007-09-23-contemplating-remix-07-in-boston.html b/_posts/2007-09-23-contemplating-remix-07-in-boston.html
new file mode 100644
index 0000000..0cf95d8
--- /dev/null
+++ b/_posts/2007-09-23-contemplating-remix-07-in-boston.html
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Contemplating ReMIX 07 in Boston
+tags:
+- Mono
+- Miscellaneous
+- Software Development
+created: 1190547252
+---
+While catching up on about 2 weeks of Mono Subversion commit emails (about 1000), building Mono, and writing a new Facebook REST client library, I came across ReMIX 07 in Boston, which certainly looks interesting. I haven't been to Boston yet, and it'd be nice to at the very least, to try to buy Miguel and some of the Boston-based Mono team a beer, maybe to make up for some of my anger that sometimes blurts out into the IRC channel:
+
+
05:48 <rtyler> god [expletive-deleted] damnit, I'm going to beat somebody up
(Which, in all fairness, usually stems from some idiot mistake on my part)
+
+ The sessions on Silverlight by Adam Kinney, who I did this interview with, are definitely looking enticing, as I'm still trying to figure out if it's worth my time and effort, or if Microsoft is going to screw developers again (ActiveX for Mac OS anybody?).
+
+Most of the sessions seem to be targeting web developers, which is a role I find myself increasingly definable by, despite my role being clearly stated on my business card:
+
+
+
+Regardless, seeing what developers are doing off in la-la-Microsoft land should be interesting as most of my webdevelopmentwork is either in Python or ASP.NET(Mono).
+
+I am a little disappointed in the lack of sessions on IronPython and where that project is heading; it probably lost out to mega-mind-boggling sessions like "Stop Building PowerPoint Backgrounds & Start Selling High-end Presentations", which means I would have to settle on "Just Glue It! Ruby and the DLR in Silverlight" for my DLR fix.
+
+That said, will it be worth a trip across country and a couple of hundred dollars out of pocket? Any couches available in the Boston are? And of course, are Microsoft conferences that awesome?
diff --git a/_posts/2007-09-27-popfly-how-to-lose-the-buzz.html b/_posts/2007-09-27-popfly-how-to-lose-the-buzz.html
new file mode 100644
index 0000000..be0028b
--- /dev/null
+++ b/_posts/2007-09-27-popfly-how-to-lose-the-buzz.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Popfly. How to lose the buzz.
+tags:
+- Mono
+- Opinion
+- Facebook
+created: 1190889834
+---
+I remember watching a Channel 9 interview about Popfly with my coworker and former landlord David Young just after the original Facebook F8 Platform Launch back in May, laughing hysterically at a user-interface that used grass as an interface element, but at the same time thinking it was a very cool use of Silverlight as an application platform, instead of a Microsoft reply to Flash. Since that fateful day in May when a Microsoft Vice President of Business Development unveiled Popfly (exactly who should be unveiling a developer tool), I've heard close to absolutely nothing about Popfly, but loads about Silverlight.
+
+Waiting to build a new version of Mono from trunk, I figured I'd check it out again, hoping their ludicrous "private beta" period would have passed, and I could finally use the technology that was unveiled almost 5 whole months ago. Alas, despite having the Silverlight plugin for Safari, popfly.com doesn't support Safari (I thought people wrote cross-platform web pages these days). Admitting my defeat, I popped open my VMWare instance of Windows XP, and Internet Exploder 7, only to discover that yes, Popfly is still invite-onlyor they're having server difficulties? Despite their about page jokingly referring to themselves as the developers behind products like Microsoft Bob, I'm starting to wonder if they weren't joking, as Popfly's introduction at F8 was either woefully premature or Microsoft decided that a developer environment where you draw lasers in-between boxes that represent stuff is too silly.
+
+All my criticisms aside, the product does look interesting enough for me to be excited about the Popfly session at ReMix Boston '07 in October, if for no other reason than to ask for an invite, and maybe even wtf?
+
+Given the insane amount of buzz around the Facebook Platform, and independent developers struggling to get cool applications into users' hands fast enough, Microsoft screwed up royally on a chance to sow the seeds of the next generation of developers on the web with Microsoft technologies.
+
+Dear 800lb Gorilla,
+When you announce something at a tech event that could possibly turn out to be industry changing like the Facebook Platform Launch, actually have the product ready for people to start using, otherwise, why bother?
diff --git a/_posts/2007-09-29-operation-iraqi-freedom.html b/_posts/2007-09-29-operation-iraqi-freedom.html
new file mode 100644
index 0000000..d44a00c
--- /dev/null
+++ b/_posts/2007-09-29-operation-iraqi-freedom.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Operation Iraqi Freedom
+tags:
+- Opinion
+created: 1191098802
+---
+Where's the call to war to freedom for our fellow democracy seeking people in Burma?
+
+Instead, we should start a war with a country begging for a reason to show off it's developing nuclear arsenal?
+
+What the fuck.
+
+My old life-goal was to get filthy rich and waste it on ridiculous stuff like a t-rex egg, but I think I'll just try to get really rich and start buying Senators.
diff --git a/_posts/2007-10-03-graphing-social-building-your-first-app-workshop.html b/_posts/2007-10-03-graphing-social-building-your-first-app-workshop.html
new file mode 100644
index 0000000..d6bc644
--- /dev/null
+++ b/_posts/2007-10-03-graphing-social-building-your-first-app-workshop.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Graphing Social, Building your first app workshop.
+tags:
+- Slide
+- Facebook
+created: 1191406109
+---
+As one of the developers behind a big Facebook application or three (1, 2, 3), I've tried to share the love as much as possible. I can be found regularly on the #facebook channel on Freenode as well as in various tea lounges and bakeries. Through our Indie App Promotion in Top Friends and some other projects still developing, I'm trying my best to help ease the transition from web developer, to Facebook Platform developer as much as possible for my fellow hackers out there.
+
+So, partially because my employer has been gracious enough to allow me, and because Dave McClure has given me the opportunity, I will be hosting a workshop at the Graphing Social conference in San Jose, CA, this upcoming Sunday.
+
+The workshop is titled "Facebook App Dev 101: Intro to Platform / Building Your First App." In the first half of the workshop I'll cover some of the basics, with an introduction to the Facebook Platform, some Facebok Platform developer resources that are available, and then I'll touch on the various frameworks available for the Facebook Platform ranging from Facebook's PHP4/5 client library, to PyFacebook (Python), rfacebook (Ruby), and the Facebook Developer Toolkit (.NET). The second half of the workshop will cover building a sample application from the ground up, i.e. from setting up the developer version of the application as well as the live version, to writing a basic feed-postin', invitin', profile updatin' Facebook application in PHP and finally to running some basic tests and setting up basic metrics for the application.
+
+Regardless of whether the workshop is recorded on video (it's going to be two, hour and fifteen minute, sessions, so most likely not), I'll be sure to post my "workshop materials" here after the fact. Hopefully they become as useful to novice Facebook Platform application developers as I hope my previous presentation "Coping with Success" (video) has been.
+
+If you're in the Bay Area, I would highly recommend at the coming to Graphing Social as most of the bigger players on the Facebook Platform will be there, and it should definitely be an interesting conference, and if you're a developer who wants to get the scoop on developing Facebook Platform applications, be sure to come to the super-mega-awesome workshops we'll be doing this Sunday preceding the two main days of the conference.
+
+Hope to see you there :)
diff --git a/_posts/2007-10-03-remix-07-boston-woohoo.html b/_posts/2007-10-03-remix-07-boston-woohoo.html
new file mode 100644
index 0000000..776cb0b
--- /dev/null
+++ b/_posts/2007-10-03-remix-07-boston-woohoo.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Remix 07 Boston, Woohoo!
+tags:
+- Mono
+- Miscellaneous
+created: 1191394907
+---
+
+Turns out I'll be attending Remix 07 Boston next week but unfortunately my mega-cool-Silverlight hack won't be finished due to some scheduling complexities involved with working 130% of my time at a start-up in San Francisco (turns out, not too conducive to side-projects). I will be arriving bright and early at 6:30a.m. pounding down a gigantic (and expensive) airport coffee, and then heading to the Hyatt Regency Cambridge, so I apologize in advance if I look exceedingly tired Monday morning.
+
+It'll be a great opportunity to get a feel for where Microsoft thinks that Silverlight is going, and how they intend to get there. It's a long hard road to even become near where Flash is in terms of market entrenchment, but Microsoft is one of three companies I believe currently capable of acheiving it (the other two being Adobe itself [bought Macromedia, they cheated], and Apple).
+
+I would also like to give those Popfly guys an earful but I may spare them depending on how busy I am trying to find some fellow Facebook developers that live in the Boston area, or Miguel, who I'm pretty sure doesn't exist, but is merely a robotic creation of some wacky laboratory in Mexico.
+
+If you'd like to meetup and have lunch, or a beer in the evening Monday or Tuesday, feel free to send me at email (tyler@slide.com) or track me down during the actual conference (i'm this guy).
+
+Special thanks to Anand for what us young-folk call "the hook-ups" and I look forward to seeing both of my blog readers in Boston next week ;)
diff --git a/_posts/2007-10-06-conference-season-communitynext-platform.html b/_posts/2007-10-06-conference-season-communitynext-platform.html
new file mode 100644
index 0000000..6f0716d
--- /dev/null
+++ b/_posts/2007-10-06-conference-season-communitynext-platform.html
@@ -0,0 +1,11 @@
+---
+layout: post
+title: "Conference Season: CommunityNext Platform"
+tags:
+- Slide
+- Facebook
+created: 1191693798
+---
+As luck would have it, I'm currently masquerading as Max at CommunityNext in Sunnyvale. The underlying drive behind the entire event is to discuss some of the intricacies behind a locked-down platform like Facebook's. CommunityNext is interesting in that Noah Kagan, one of the organizers, did a really good job of finding, and bringing a lot of the upper tier Facebook Platform developers to Silicon Valley from Philadelphia, Boston, New York City, etc.
+
+If nothing else, CommunityNext is rumored to have great parties, and there just so happens to be a BBQ later today down here in Sunnyvale. It's somewhat late to suggest that everybody I know to attend, so I'll just mention that you're missing some good fun in South Bay, and leave it at that.
diff --git a/_posts/2007-10-06-introducing-why-are-you-awesome.html b/_posts/2007-10-06-introducing-why-are-you-awesome.html
new file mode 100644
index 0000000..de5af42
--- /dev/null
+++ b/_posts/2007-10-06-introducing-why-are-you-awesome.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "Introducing: \"Why are you awesome?\""
+tags:
+- Software Development
+- Facebook
+created: 1191736927
+---
+As I previously mentioned, I'll be teaching a workshop on "developing your first Facebook application" tomorrow at the Graphing Social conference in San Jose. I figured, what better way to explain building your first Facebook app then to write one! Why the hell not right? So last thursday night I cleaned the dust off my pathetic PHP skills and set to work to create an application in a couple hours, that I could use as a tool for teaching the "basics" of Facebook application development.
+
+
Behold, awesomeness
+
+
+Why are you awesome? is a relatively simple application that follows the self-importance of Twitter, but adds the "social graph", and voting capabilities. Using "Why are you awesome?" I hope to convey in a marginally basic sense some of the core concepts behind rendering FBML pages, making use of notifications/feed posts/invitations and Mock AJAX from the profile.
+
+I won't disclose too much before the presentation (not that anybody will see this before the presentation), but I'm extremely happy with what about 4 hours of morning hacking has garnered me, and the possibilities of the application.
+
+You know what, let's see that super-mega-hot interface one more time.
+
+
diff --git a/_posts/2007-10-07-facebook-app-development-101-wrap-up.html b/_posts/2007-10-07-facebook-app-development-101-wrap-up.html
new file mode 100644
index 0000000..53d6f74
--- /dev/null
+++ b/_posts/2007-10-07-facebook-app-development-101-wrap-up.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Facebook App Development 101 Wrap-up
+tags:
+- Slide
+- Facebook
+created: 1191799294
+---
+In addition to posting the source code for the application I wrote specificaly for Graphing Social ("Why are you awesome?") I also figured I should post my slides from the two hour or so session, which was composed of much more discussion and suggestions from Ari Steinberg (a Facebook Platform developer) and myself on developing on the platform and some of the intricacies involved. Gary Lerhaupt did a good job of "live blogging (part one)" (part two) the workshop if you're interested in the play-by-play.
+
+In theory there should be video soon so "stay tuned" (get it!) and I'll be sure to either post or link appropriately.
+
+Regardless, I hope you can at least find the presentation informative if you couldn't be here.
+
+
+
+In general I really enjoyed presenting and answering questions from some folks in the audience who were really keen on squeezing as much knowledge out of my pea-sized brain as possible. Unfortunately I can't stay for the next two days of Graphing Social, as I'm off to ReMix 07 Boston and some Silverlight hackery!
diff --git a/_posts/2007-10-07-why-are-you-awesome-source-code.html b/_posts/2007-10-07-why-are-you-awesome-source-code.html
new file mode 100644
index 0000000..eb93a8c
--- /dev/null
+++ b/_posts/2007-10-07-why-are-you-awesome-source-code.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "\"Why are you awesome? Source Code"
+tags:
+- Facebook
+created: 1191795164
+---
+I got off-stage just a few moments ago, but since Dave McClure already blogged about it, I would go ahead and post the source code so Dave could link to it.
+
+
+
+The version of the client that the code is using, is specifically for PHP4, you can just replace the client/ folder with the PHP5 version depending on your host settings. The source code also includes the database schema that "Why are you awesome?" expects.
+
+Happy hacking, and add the app!
diff --git a/_posts/2007-10-08-in-boston-at-remix-phew.html b/_posts/2007-10-08-in-boston-at-remix-phew.html
new file mode 100644
index 0000000..6f4dd00
--- /dev/null
+++ b/_posts/2007-10-08-in-boston-at-remix-phew.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: In Boston, At Remix. Phew.
+tags:
+- Mono
+- Miscellaneous
+- Software Development
+created: 1191843734
+---
+After a grueling flight that started with a full-on sprint from the TSA security checkpoint and ended about a quarter mile through the terminal (in socks no less), I have made it across the country to Boston for Remix 07 Boston.
+
+I'm still anxiously awaiting the keynote, and trying to find the Mono guys that are in attendance to try to learn as much as possible about the development and future of Moonlight, while simultaneously trying to learn as much as possible about how other developers are embracing and using Silverlight too.
+
+If you're at Remix, come find me, I'm a San Franciscan in a rainy Boston, and I'm scared ;)
+
+I'm this idiot, rocking my "business attire"
+
diff --git a/_posts/2007-10-08-miguel-questions-the-manhood-of-400-microsoft-developers-awesome.html b/_posts/2007-10-08-miguel-questions-the-manhood-of-400-microsoft-developers-awesome.html
new file mode 100644
index 0000000..797453b
--- /dev/null
+++ b/_posts/2007-10-08-miguel-questions-the-manhood-of-400-microsoft-developers-awesome.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Miguel questions the manhood of 400 Microsoft Developers. Awesome.
+tags:
+- Mono
+created: 1191856045
+---
+Miguel de Icaza, one of my own personal geek heroes, just gave his brief "keynote" as part of Microsoft's partner talks component of the overall Remix Boston 07 keynote speech.
+
+After previous demos being proudly shown for "working in Safari on Mac OS X, and oh by the way, it's PC compatible too", Miguel showed everybody up by pulling up the still very development version of Moonlight and dazzled a room full of hardened .NET/ASP.NET developers and designers with Mono's progress on the Moonlight project in a scant 4 months since the original "Mix Vegas" conference earlier this year.
+
+If you hang around Miguel enough, you'll know how much he loves Compiz, which he used gratuitously during his demonstrations. The mixture of a good looking Gnome skin and Compiz really helped convey that "yes, Linux is here, Gnome is a fully-featured desktop environment, and check out this AWESOME CUBE EFFECT!" As a developer who's participated in the open source community for almost five years now, it was very inspiring to see a room full of Microsoft's battle-tempered third party developers pine to have some of the cool features that Linux has!
+
+Some of the Silverlight applications Miguel demonstrated were Metaliq's Top Banana which ran surprisingly well, then Silverlight Chess followed by the Halo 3 trailer running (not streaming) on Miguel's Linux laptop. To invite further jealousy from the room of developers, Miguel fired up Firefox, running Moonlight, running the Halo 3 Trailer, on the edge of a "cube" workspace (such as this). Applause ensued.
+
+Coming back to the topic of developing Silverlight/Moonlight applications on top of Linux, Miguel fired up MonoDevelop claiming that "we have one, I just don't use it; I have an allergy to IDEs." Much to my surprise, he then fired up Emacs to edit his local copy of Silverlight Chess, updating a property such that it returned "Mono" instead of ".NET" in the interface, dropped back into his X terminal and ran "make" like, quote, "real men do" (to which some of the crowd applauded and the rest laughed). Miguel then ran the SilverlightMoonlight Chess application and closed his keynote speech stating that:
+
+"Your designers can use Expression Blend on Windows, but your real developers can use Linux to develop Silverlight."
+
+Overall the keynote was very well done but it really seemed like Miguel stole the show after so much emphasis was placed on "Silverlight's portability" by really showing what the Mono Project is capable of, and that while Silverlight may work on Mac and Windows, Moonlight runs on the corner of a wicked cool cube.
diff --git a/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html b/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html
new file mode 100644
index 0000000..da75611
--- /dev/null
+++ b/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "Unofficlal Facebook Developers Meetup: Boston"
+tags:
+- Facebook
+created: 1191858834
+---
+During the insane array of things that have been/are going on these past couple days, I have neglected to mention that I'll be organizing another Unofficial Facebook Developers Meetup, this time in Boston.
+
+The Facebook event can be found here, and I am thinking we'll be striving to grab dinner and drinks tomorrow (Tuesday, October 9th) in the Cambridge area since that seems to be central enough for everybody to come.
+
+Zach Allia, of Free Gifts fame, myself, as well as a few independent Facebook developers have already RSVP'd, but I'd love to see as a lot more Facebook developers, or those just interested in the platform, come out and join us to discuss some Facebook platform related things, pick each others' brains, and throw back a pint of Sam Adams.
+
+The venue hasn't really been decided yet, I'm debating between a couple different resturants in Cambridge, so if you have any suggestions, by all means bring it up. Regardless, if you're in the Boston area, come on out, it should be lots of fun.
diff --git a/_posts/2007-10-09-miguel-de-icazas-remix-07-boston-keynote-address.html b/_posts/2007-10-09-miguel-de-icazas-remix-07-boston-keynote-address.html
new file mode 100644
index 0000000..d40fa04
--- /dev/null
+++ b/_posts/2007-10-09-miguel-de-icazas-remix-07-boston-keynote-address.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Miguel de Icaza's Remix 07 Boston Keynote Address
+tags:
+- Mono
+created: 1191989997
+---
+Before I leave Boston, I had to make sure of one more thing, that my fellow Mono bretheren got to see what I got to see, Miguel's keynote. Thanks to lots of hard encoding and video preparation done by G. Andrew Duthie and his crew from Microsoft's Media Room at Remix 07 Boston, the videos from the keynote have already been posted in their entirety to Channel 9.
+
+Unfortunately they didn't clip the videos on a per-speaker basis, so you'll probably want to fast-forward in the video to about the 11 minute marker to watch our fearless leader question the manhood of 400 Microsoft developers as I had previously mentioned. Talking with Miguel after the fact he mentioned that some of his more witty quips were mostly due to him worrying about things breaking on stage and going impromptu with some of the things he was talking about. Overall though I think Miguel did a great job exhibiting Moonlight and the Gnome desktop in general, so I hope you enjoy the video (again, fast-forward to the 11 minute marker).
+
+
diff --git a/_posts/2007-10-12-remix-07-boston-wrap-up.html b/_posts/2007-10-12-remix-07-boston-wrap-up.html
new file mode 100644
index 0000000..91e58ce
--- /dev/null
+++ b/_posts/2007-10-12-remix-07-boston-wrap-up.html
@@ -0,0 +1,23 @@
+---
+layout: post
+title: Remix 07 Boston Wrap-up
+tags:
+- Mono
+- Slide
+- Miscellaneous
+- Facebook
+created: 1192179088
+---
+Earlier this week, following CommunityNext and Graphing Social I was lucky enough to have been asked out to Boston for Remix 07 Boston. After receiving the necessary flack from my co-workers at Slide (primarily a Python/Linux shop), I boarded a plane late Sunday night to arrive extremely early on Monday morning (6a.m. isn't my best hour).
+
+Upon arrival to the Hyatt Regency Cambridge, I found out that I had access to the Media Room, which allowed me to recharge my laptop and plug into a hard-wired connection such that I was able to write up a fewblogposts from the conference itself. Having such access also allowed me to work on some sample Silverlight applications that I'll write up over the weekend covering Silverlight and IronPython.
+
+While I enjoyed the sessions, such as Miguel's session on Moonlight and Mono and another session on the DLR and dynamic languages, what I enjoyed most was the ability to pick the brains of some of the folks there. Specifically guys like Aaron Brethorst, who works a lot on Microsoft Popfly's interface among other things, who let me question just about everything under the sun with regards to Popfly while still maintaining that I really like the application and its potential.
+
+I also really enjoyed meeting up with Miguel and his crew at Novell (Aaron Bockover and Michael Hutchinson) after Miguel was kind enough to take me to a late lunch and then show me around Novell's Boston office. I also think Miguel successfully guilted me into contributing more code that I've been putting off for so long, like my Mono.Nat NAT-PMP code, Mono.Facebook.Platform, and some patches for System.Web.Script.Serialization; all of which I have neglected in the difficult search for a good night's rest, or the perfect ping-pong serve against co-workers.
+
+I still look and feel mostly dead from exhaustion, but not dead enough not to continue pounding away on everybody's favorite Facebook app, or working on some of the other really cool things that we work on here at Slide (bubble text!). In the valley, everybody knows who Slide is now, everybody knows what's going on with Facebook, and an extremely small subset of people that matter know who I am; but on the east coast, far fewer understand what's going on right now on "that college social network, right?"
+
+Miguel said he doesn't install Facebook applications citing the near-complete opacity of the security and data-storage policy to the end-user, but maybe now that he's met me, and knows who's behind it, he'll install Top Friends and I'll finally be able to claim that Miguel uses something that I wrote, instead of the usual case of vice versa.
+
+Note to self: Travel back to Boston, soon.
diff --git a/_posts/2007-10-13-google-search-inside-of-facebook.html b/_posts/2007-10-13-google-search-inside-of-facebook.html
new file mode 100644
index 0000000..cb643b3
--- /dev/null
+++ b/_posts/2007-10-13-google-search-inside-of-facebook.html
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Google Search Inside of Facebook
+tags:
+- Miscellaneous
+- Facebook
+created: 1192318644
+---
+A couple of days ago I found out that you could get Google results in JSON while poking around for simple JSON APIs that I could use for miscellaneous hacks.
+
+I was thinking of all the fun things I could do with search results, and finally settled today on the most ridiculous one possible, searching from within Facebook. About an hour's worth of PHP5 later, I present Search!, another ridiculous example application.
+Unlike my previous "Why are you awesome?" demonstration application, Search! doesn't really integrate into Facebook nearly as much. Search! doesn't post to the profile, send notifications, or do much more than provide an easy means of sharing search links via your "Posted Items" or sending them along in a message to a friend on Facebook.
+
+Searching with Search!
+
+Sharing search results
+
+
+I can make no claims to this being a "good" application by any means, I just really felt the need to write something ridiculous, and this is what came out. The source code can be considered public domain, but I would appreciate attribution if you spread this super-mega-awesome code.
+
+
+
diff --git a/_posts/2007-10-15-speaking-at-widget-summit.html b/_posts/2007-10-15-speaking-at-widget-summit.html
new file mode 100644
index 0000000..655df5c
--- /dev/null
+++ b/_posts/2007-10-15-speaking-at-widget-summit.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: "Speaking at Widget Summit "
+tags:
+- Slide
+- Miscellaneous
+- Facebook
+created: 1192451801
+---
+This upcoming tuesday (October 16th) I'll be speaking on Facebook Development to what will presumably be an audience of "widgeteers" (as I'll call them).
+According to Wikipedia, a web widget is "a portable chunk of code that can be installed and executed within any separate HTML-based web page by an end user without requiring additional compilation."
+
+Following this definition, most of Slide's products are "widgets" per se, but our Facebook applications don't necessarily fall under this category of "web things," as they are in a category unto themselves by integrating into the Facebook Platform whenever and wherever possible.
+
+I'll be speaking on some of the differences between normal "widget" development on the web in contrast to Facebook "apps." As the session page notes, I'll be covering some of the topics like:
Walk-through the functionality of a basic Facebook application.
A brief explanation of Facebook networks including cities, colleges, companies, and groups of friends.
The benefits of Facebook markup over a fully-hosted solution.
Enabling important integration points such as user dashboard, user profile, and social news feed.
When to use requests and alerts, and the proper etiquette for these interactions.
I'm really looking forward to talking in a slightly different capacity than usual, as "my usual audience" is developers who are really interested in Facebook application development at other venues like at Graphing Social, the Facebook Developer Garage: Palo Alto and other mini-conferences, hackathons, and meetups. At Widget Summit I'll be speaking about a bit higher-level concepts, indirectly related to development, to an audience of product managers, entrepreneurs and folks generally interested in how to get in on the Facebook Platform.
+
+Widget Summit will be at the Mission Bay Conference Center at UCSF is located at 1675 Owens Street, just off the 280 freeway in San Francisco (directions). I'm really looking forward to the event, if you can make it out today, our fearless leader Max Levchin will be giving a keynote of sorts this morning at 10 a.m. which should definitely be insightful and entertaining to say the least. I'll be there tuesday to speak, so if you can make it, come for both days!
diff --git a/_posts/2007-10-16-widget-summit-slides.html b/_posts/2007-10-16-widget-summit-slides.html
new file mode 100644
index 0000000..85e21a6
--- /dev/null
+++ b/_posts/2007-10-16-widget-summit-slides.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Widget Summit Slides
+tags:
+- Slide
+- Facebook
+created: 1192570978
+---
+I recently got off stage at Widget Summit and figured I'd better post my slides before I get back to the grind at Slide.
+
+Unfortunately given some of the restraints on my personal and professional time, I couldn't come up with an entirely new presentation for this event but some of the concepts I've talked about at previous presentations and talks could be brought into this presentation. The audience here at Widget Summit was slightly different than previous talks so I needed to modify and remove some of the more developer-targeted content as it simply wasn't pertinent to this audience.
+
+In general I think the talk went reasonably well, with the sole exception of running about 10 minutes short of the allotted time because I talked too fast. It did however give me the opportunity to answer plenty of questions. I hope my slides are more informative than I think they will be by themselves, since I didn't have any presenter notes and was speaking impromptu almost the entire time. Enjoy?
+
+
diff --git a/_posts/2007-10-20-any-unemployed-net-developers-in-nyc.html b/_posts/2007-10-20-any-unemployed-net-developers-in-nyc.html
new file mode 100644
index 0000000..7583808
--- /dev/null
+++ b/_posts/2007-10-20-any-unemployed-net-developers-in-nyc.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Any Unemployed .NET Developers in NYC?
+tags:
+- Mono
+- Miscellaneous
+- Software Development
+created: 1192878071
+---
+Last week at the Widget Summit speakers dinner I met an executive from DoubleClick, you know, that gigantic ad company that recently got acquired by Google, Inc. While talking about some of the difficulties in developing scalable web products I brought up some of my history in terms of developing .NET web applications and of course, Mono (at least I think that's how we got on the topic).
+
+As it turns out, DoubleClick is really pushing to modernize their internal infrastructure on the .NET platform and really needs some smart folks either willing to move to New York City, or that already live there. If you're looking, feel free to contact me at tyler@monkeypox.org and I'll put you in touch, or hit up their careers page.
+
+If you go to work at DoubleClick, I think you can technically get away with saying you work for Google. You'll also be able to say you are working on truly scalable .NET, which is something I really only think Windows Live and Myspace* developers can say currently.
+
+Of course, if you're on the west-coast or lean more towards Python, Slide is always hiring.
+
+
+* As it turns out, Myspace runs one of the largest .NET sites on the internet, and lays claim to the largest SQL Server installation on the entire planet.
diff --git a/_posts/2007-10-24-my-new-favorite-chuckle.html b/_posts/2007-10-24-my-new-favorite-chuckle.html
new file mode 100644
index 0000000..8d88ba7
--- /dev/null
+++ b/_posts/2007-10-24-my-new-favorite-chuckle.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: My new favorite chuckle
+tags:
+- Miscellaneous
+- Facebook
+created: 1193238434
+---
+Whenever discussing possible Facebook applications or some of the concepts involved in bringing a product into Facebook, I invariably hear a lot of:
"we want to do X because we've found college students respond well to Y"
or
"college students [on Facebook] will love Z"
+
+Now, I don't mean to be too picky but there's a couple of problems with this:
Over 50% of Facebook is not in college
Just how old do I look to you?*
+Seriously now.
+
+
+*I dropped out of college earlier this year, after winter semester
+
diff --git a/_posts/2007-10-25-the-superpoke-facebook-song.html b/_posts/2007-10-25-the-superpoke-facebook-song.html
new file mode 100644
index 0000000..3c0397f
--- /dev/null
+++ b/_posts/2007-10-25-the-superpoke-facebook-song.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: The SuperPoke Facebook Song
+tags:
+- Slide
+- Facebook
+created: 1193337683
+---
+We recently stumbled across this here at Slide, and it's pretty awesome, check it out, and of course, check out SuperPoke!.
+
+
+
+
+
+Thanks J. Michnovicz, L. Siegel, and E. Stuart!
diff --git a/_posts/2007-10-28-on-investing.html b/_posts/2007-10-28-on-investing.html
new file mode 100644
index 0000000..5ef8e4a
--- /dev/null
+++ b/_posts/2007-10-28-on-investing.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: On Investing
+tags:
+- Miscellaneous
+created: 1193595416
+---
+Every month since coming to work at Slide I've been putting away some money into a low-yield savings account, the modern financial equivalent of hiding money in the mattress. The more I've been thinking about this, the more I've been wanting to change this, start investing and the likes, putting my money to work (I don't get a break, why should it!). The biggest obstacle however is that, as a young man in the 21st century, I haven't the slightest clue what to do here. It takes grown men their entire lives to really get a handle on such large volatile systems such as the stock market, what hope do I have to do anything but piss my money away?
+
+The dollar is unfortunately weak right now but I feel that it will turn around soon, so it seems like an ideal time to start investing in a few select stocks. I figured that I would pitch my plan, and see what reactions it got before I started to actually put money down.
+
+
The Plan
Please point out as many flaws in my logic as possible, I want to be as prepared as possible before money leaves my bank account(s).
+
+
Overview
The "inspiration" for how I want to invest comes from some development methodologies that have started to crop out in various places out of the desire to increase productivity and squeeze the most bang for their buck of developer time (such as SCRUM). "The Plan" will follow a similar "flow" as it will be oriented around a planning period, an investment period (the sprint) and the analysis period (basically me crying because I lost all my money). I think that allowing for a cycle of around 7 months for "the plan" should be adequate enough to maximize returns while maintaining a good diverse portfolio. Some of the very few stocks I follow seem to perform well for a 6-10 month period before somebody either does something stupid or a product line fails, etc. Catching this wave is important, as is getting off at the right time, this concept is nothing new, but will probably be the hardest rule to follow from "the plan."
+
Step One: Research
The entire first month of "the plan" I intend to spend on research, not full-time, but on my weekends and free time. This part of "the plan" should allow me to scour the internet reading up as much as possible on candidate stocks, charting their progress over the first month and getting familiar with those leading the business and their ability to do so. Investing in lines on a bar graph is not what I want to do, I don't think, given my experience with investing, I will be able to analyze a company's potential just by looking at numbers. This phase is definitely going to be the most interesting and educational about the market and will help me figure out whether this is really a good idea or not.
+
Step Two: Invest and Track
With my set of stocks for this cycle chosen in Step One, now it's time to actually invest. I'm not certain whether going through a broker, e*trade or another online firm will be the right way to do it, but I'm open to suggestions. Pending the research I would do beforehand, that would gauge how much money and where I would invest. Once money is invested however, it's hands-off until the end of the sprint of 6 months. Every week I intend on watching the stocks, following the companies and what they're doing to, and doing basic incremental metrics on how well everything is performing. This should be the fun part of the entire cycle, partially since it's the least work, but it will also allow me to learn the most about how the market works in contrast to world events.
+
Step Three: Extraction and Analysis
Regardless of how well they're performing, what goes up must go down, after the 6 month sprint from Step Two, sell! Once all the money is out of the selected stocks, it'll be time to really analyze how well everything performed. Ideally finding which sectors are doing well, what influenced the stock prices, what the company did during the sprint and how well the market as a whole did during the sprint. Pending the success of the first cycle of investment in this fashion, this step will lead nicely into another cycle's "step one" and allow for rapid iteration on fine tuning my investment savvy and give me a chance to try out investment in a variety of different businesses and markets.
+
+In general I haven't decided how much money I want to start putting into the stock market nor have I decided on when I want to start, but I've been pondering this plan for almost a month now and would love to get feedback from anybody that's tried their hand at investing, etc. Because the first cycle will be an experiment I will most likely be noting my progress here. If anybody wants to join, let me know! It could be fun to "pick your teams" like fantasy football (I can't believe this exists) except with actual money and (hopefully) actual returns.
diff --git a/_posts/2007-11-03-silicon-valley-gangstas.html b/_posts/2007-11-03-silicon-valley-gangstas.html
new file mode 100644
index 0000000..199588b
--- /dev/null
+++ b/_posts/2007-11-03-silicon-valley-gangstas.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Silicon Valley Gangstas
+tags:
+- Miscellaneous
+- Media
+created: 1194116701
+---
+Last night I attended the "Hip Hop Live" show at the Mezzanine here in San Francisco, and it was nothing short of absolutely amazing. As some of my coworkers know, I'm a huge hip-hop fan, but primarily dirty-south rap, so going to a show by three East Coast rappers was different. The show started with Brother Ali, who I've maintained for the month leading up to the show is "one of the most insightful rappers you'll see." Following Brother Ali, the venerable Ghostface Killah and his crew took the stage, dedicating a song to ODB (Old Dirty Bastard) as well as paying homage to some of the other Wu-Tang Clan members. The final act of the show was Rakim, another powerhouse act, who did some songs off his new record but also some "oldies" from the early nineties like "Don't Sweat The Technique."
+
+In general, you missed a hell of a show. I wish I could describe it a bit better but between raising my fist in the air or making the Wu-Tang symbol with both hands, I lost track of it all and let myself become overpowered by the music.
+
+At the very least, I recommend checking out Brother Ali, I think you'll be hearing a lot more from him over the next couple years. This is one of his more controversial songs, "Uncle Sam Goddamn." Enjoy.
+
diff --git a/_posts/2007-11-04-your-order-has-been-completed.html b/_posts/2007-11-04-your-order-has-been-completed.html
new file mode 100644
index 0000000..6aa5c1c
--- /dev/null
+++ b/_posts/2007-11-04-your-order-has-been-completed.html
@@ -0,0 +1,14 @@
+---
+layout: post
+title: Your order has been completed
+tags:
+- Miscellaneous
+created: 1194216890
+---
+Yesterday while shopping around for a new cell plan I figured it'd be a good time to get a new phone as well. The cell phone I currently have is the only cell phone I've ever owned, I believe the model is an LG Piezza-shit.
+
+After browsing around Cingular's site, I found a good deal on a Blackberry Pearl and decided I really want to be tethered to my email more than I am now. Not that I ever had any free time to begin with, but I'm a sucker, I liked the placebo effect; that's all over now, I'm getting a Blackberry.
+
+
I'm fucked
+
+
diff --git a/_posts/2007-11-06-a-note-to-my-graphing-social-students.html b/_posts/2007-11-06-a-note-to-my-graphing-social-students.html
new file mode 100644
index 0000000..cf98ee0
--- /dev/null
+++ b/_posts/2007-11-06-a-note-to-my-graphing-social-students.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: A note to my Graphing Social "students"
+tags:
+- Facebook
+created: 1194339061
+---
+I figured I'd inform anybody that attended my Facebook App Development 101 workshop at Graphing Social, that I have finally deleted the workshop test accounts that were located at workshop.monkeypox.org.
+
+I have made a backup of the database that we used to play around with the "Why are you awesome?" source code, and I have also backed up the files, so in case you forgot to get your modified files drop me a line and I'll fish your data out.
+
+
diff --git a/_posts/2007-11-06-building-mono-on-leopard.html b/_posts/2007-11-06-building-mono-on-leopard.html
new file mode 100644
index 0000000..5e813fe
--- /dev/null
+++ b/_posts/2007-11-06-building-mono-on-leopard.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Building Mono on Leopard
+tags:
+- Mono
+created: 1194343180
+---
+I figured I'd write up a guide to building Mono from Subversion in preparation of the upcoming 1.2.6 release, on a site I've neglected since I set it up, mononews.org (I hope to get back to writing tutorials and "newsy" stuff with the 1.2.6 release).
+
+Anyways, if you've got Leopard installed, Geoff Norton did a great job in helping me track down the remaining Leopard/i386 bugs earlier today, so now you can build and run Mono relatively easily from Subversion on your fancy smancy new OS.
+
+
diff --git a/_posts/2007-11-08-bug-number-seven.html b/_posts/2007-11-08-bug-number-seven.html
new file mode 100644
index 0000000..d776c16
--- /dev/null
+++ b/_posts/2007-11-08-bug-number-seven.html
@@ -0,0 +1,25 @@
+---
+layout: post
+title: Bug Number Seven
+tags:
+- Facebook
+created: 1194520600
+---
+One of my favorite Facebookers, Ari Steinberg, just resolved bug #7 in Facebook's bugzilla.
+
+
LIMIT, OFFSET, and ORDER BY are all implemented.
+docs at http://developers.facebook.com/documentation.php?v=1.0&doc=fql are updated. enjoy guys, and let me know if there are any problems with it. tyler, don't go too crazy with it...keep in mind that order by in particular can be an expensive operation (but do try it out - when used in the appropriate ways it could lead to a savings)
+
+When used correctly, LIMIT, OFFSET and ORDER BY can really make writing application-level code much easier, because you're offloading a lot more onto Facebook. For example, instead of fetching an entire list of people (presumably friends) and then sorting by their name, you can perform a query like:
+
SELECT uid,name FROM user WHERE uid IN (SELECT uid1 FROM friend WHERE uid2 = $UID) ORDER BY name
+This query will fetch an alphabetically sorted list of $UID's friends along with their uid, preventing any sorting you might need to do.
+
+Make sure you check the FQL documentation for which "columns" are keyed such that you perform the most optimal queries possible. Of course, you should already make sure you're selecting as often as possible on keyed "columns" in FQL, but when you're offloading large amounts of sorting onto Facebook's API servers, it becomes more important to form optimal queries to make sure that you can fetch data from Facebook as fast as possible and render your application's pages.
+
+Another fun query that becomes more fun with ORDER BY is fetching events for a particular user:
+
SELECT eid, name FROM event WHERE eid IN (SELECT eid FROM event_member WHERE uid = $UID) ORDER BY name
+This of course is using ORDER BY on the event.name "column" which is not keyed so it will theoretically perform slower than the example above, but it's far less likely that a user will have thousands of events versus thousands of friends, so the real-world performance hit will be negligible.
+
+
+As as side note, Ari was on stage with me at Graphing Social, helping me give the Facebook App Development 101 workshop a few weeks ago. You can regularly find him cruising through bugzilla and every so often on the #facebook channel on Freenode.
+
diff --git a/_posts/2007-11-15-why-are-you-awesome-meet-mono.html b/_posts/2007-11-15-why-are-you-awesome-meet-mono.html
new file mode 100644
index 0000000..b07e77c
--- /dev/null
+++ b/_posts/2007-11-15-why-are-you-awesome-meet-mono.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: "\"Why are you awesome?\" meet Mono"
+tags:
+- Mono
+- Facebook
+created: 1195135032
+---
+When I originally wrote the Facebook demo application "Why are you awesome?" I wrote it in PHP4 in about 3 hours and hated myself for every one of those miserable 180 minutes. Since then however, I've been slowly and methodically working on a new, JSON-based, Facebook client library (Mono.Facebook.Platform) specifically to bring together some of the aspects of pyfacebook, the PHP client, and the Facebook Toolkit that I like (implementation progress can be found in the NOTES). After getting some of the key Facebook calls implemented to support "Why are you awesome?" I figured I might as well give it a whirl and see if a "real" application would work on top of the library (it does).
+
+Thus far, all that were needed as far as library calls were:
feed.publishActionOfUser
notifications.send
fql.query
profile.setFBML
+
+A couple of the things I've found thus far in my work have been, that writing a library that you have to use forces you to think about what you add and what you remove a lot more and focus on simplicity and extensibility; secondly, JSON is much faster, meaning I can do things with the Mono.Facebook.Platform library that I couldn't with the XML-based PHP4/5 library. Operations like fetching the user IDs of all 700 friends of mine complete in a timely fashion under the JSON library, whereas they typically timeout with the XML-based libraries.
+
+
+The Mono.Facebook.Platform library isn't even alpha, it's in negative greek letters right now, there's not enough of the API implemented, and it doesn't handle errors very well at all, so don't use it. When it's finished however, I intend to support over 90% of the Facebook calls, and offer it up as a faster, viable option, for ASP.NET developers on Windows and on Mono.
+
+Of course if you want to check out "Why are you awesome?", head on over to the application page and install it.
+
diff --git a/_posts/2007-11-17-facebook-flyers-make-my-eyes-bleed.html b/_posts/2007-11-17-facebook-flyers-make-my-eyes-bleed.html
new file mode 100644
index 0000000..6acc640
--- /dev/null
+++ b/_posts/2007-11-17-facebook-flyers-make-my-eyes-bleed.html
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Facebook Flyers Make My Eyes Bleed.
+tags:
+- Facebook
+created: 1195317344
+---
+As part of what consists of my day/night/weekend job, developing Facebook applications like Top Friends, I spent a lot of time on Facebook (mostly losing games of Scrabulous to other developers). Since I spend anywhere between 20 and 30 hours a day on Facebook, I see a lot of Facebook's ads, and in particular, Facebook's "Flyers".
+
+The concept at it's most basic level is a novel one, allow posting a flyer, similar to stapling a "Free Couch" flyer to a bulletin board, except on Facebook. In practice however, they suck. They suck bad. Really bad. I have a much higher respect for advertisers that can come up with ads that are either intriguing, or at the very least, not absolutely painful to see.
+
+Over the past week I've been quietly taking screenshots of the absolutely worst Flyers that I've seen that have brought me close to sending a flaming bag of poo down to Palo Alto. Think about the lame kind of spam you get in your inbox, that's about the level that Facebook's Flyers seem to be, except I can't fix it with aggressive spamassasin rules.
+
+
+
+
+
+
+
+
+Isn't this supposed to be targeted? These all seem to target single, stupid, bi-curious, poor, gullible, and desperate people, and I'm pretty sure I only fall in, at most, three of those categories.
+
+Seriously, what the fuck.
+
diff --git a/_posts/2007-11-22-turning-famousosity-up-to-11.html b/_posts/2007-11-22-turning-famousosity-up-to-11.html
new file mode 100644
index 0000000..9e177ab
--- /dev/null
+++ b/_posts/2007-11-22-turning-famousosity-up-to-11.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Turning Famousosity Up To 11.
+tags:
+- Slide
+- Facebook
+created: 1195728896
+---
+Sergio, one of our talented web monkeys, sent an email out today that started with "OMFGBBQ!"
+
+As it turns out, Sergio is a much more religious reader of Penny Arcade than the rest of us (a public shaming and revocation of some geek cards is in order) since he was the first to notice this:
+
+
Click to view the image fullsize
+
+Hell yes.
+
+As a side note, I have Sergio to thank for the sweet drag-and-drop interface on the Top Friends edit page and now for bringing some Gabe and Tycho love to our attention.
diff --git a/_posts/2007-11-24-ichatagent-leaks-in-leopard.html b/_posts/2007-11-24-ichatagent-leaks-in-leopard.html
new file mode 100644
index 0000000..984dcc4
--- /dev/null
+++ b/_posts/2007-11-24-ichatagent-leaks-in-leopard.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: iChatAgent leaks in Leopard
+tags:
+- Cocoa
+- Miscellaneous
+- Software Development
+created: 1195933933
+---
+I really don't have much that I can say about this, I came into the office after leaving my Mac on (as per usual) for about 12 hours and found that I was out of space on my startup disk, out of all available system memory, and things were crashing left and right.
+
+What the fuck right?
+
+Well, after I recovered the system enough to pop open "Activity Monitor" I found the exact culprit.
+
+
+
+
diff --git a/_posts/2007-12-01-missed-spain.html b/_posts/2007-12-01-missed-spain.html
new file mode 100644
index 0000000..7b490cf
--- /dev/null
+++ b/_posts/2007-12-01-missed-spain.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Missed Spain :(
+tags:
+- Mono
+created: 1196542797
+---
+I hope everybody enjoyed their stay this past week in Madrid for the Mono Summit 2007.
+
+Unfortunately, it's been too hectic a month to take the week off and go to Madrid, so I'm incredibly jealous of all of you. Grumble.
+
+
fcgi-server re-enabled: 0 /tmp/fastcgi-mono-server
+backend is overloaded; we'll disable it for 2 seconds and
+send the request to another backend instead: reconnects: 0 load: 130
+
+fcgi-server re-enabled: 0 /tmp/fastcgi-mono-server
+backend is overloaded; we'll disable it for 2 seconds and
+send the request to another backend instead: reconnects: 0 load: 130
+
+
+After diagnosing the problem and kicking the server again, I decided that a couple of tips on the wiki page for Mono's FastCGI & Lighttpd had done me in, the first being about the FastCGI handler's max-procs configuration variable:
"max-procs" specifies the maximum number of servers to spawn. Because ASP.NET stores session specific objects, I am unsure of how applications would react if switching from one server to another, or if Lighttpd bonds a single server to a client. As such, I highly recommend keeping this value as "1" to avoid any conflicts.
Fortunately Urlenco.de doesn't really need any session information, so I did what Emeril and Apache admins are both familiar with doing, I kicked it up a notch (to about 10). After kicking the server one more time, this time with "max-procs" > 10 I watched the load on my little 1U server spike up to 30. While every terminal I had became so sluggish I could barely interact with the machine, I managed to open up "top(1)" and see what processses were royally screwing my machine. Turns out it was 10 instances of Mono, all trying to digest an ASP.NET site at once, all competing for the meager resources available. It seems that the Mono FastCGI server will process and compile your entire ASP.NET web application as soon as the FastCGI server is bootstrapped and accepting requests. Fortunately pushing new code to the site gets updated on the next HTTP request, so the number of times you'll have to kick (i.e. restart) the Lighttpd server should be minimal and you won't have to incur the huge performance penalty that often (I've since changed max-procs to 4).
+
+I also went against some of the other advice on the wiki page
To overcome these problems, the recommended method for processing files is to send all requests directly to the FastCGI Mono Server.
By effectively passing every single request off to the Mono FastCGI Server you can avoid exposing some internal ASP.NET resources that should be interpreted and not sent over the wire, this seems to be poor practice as far as Lighttpd and FastCGI are concerned. Lighttpd is a very good, high performance HTTP server and should be allowed to do it's job, whereas FastCGI servers merely serve as a means for executing server-side pages, returning markup, etc. To avoid passing every single request off to the FastCGI server, I merely setup the FastCGI handler for .aspx pages and then mapped other ASP.NET extensions to that handler as was appropriate:
+
+Specifying the "application path" is somewhat of a pain, as now I more or less need a separate FastCGI configuration, which means they'll also need separate FastCGI servers, so another virtual host in the configuration (pineapple.monkeypox.org) has the following setup:
+
+Since the virtual host pineapple.monkeypox.org barely runs any ASP.NET code at all, I decided to only give it one Mono FastCGI process. Also of note is that the "socket" is different from the other FastCGI handler, if you try to use the same socket, the first Mono FastCGI process will take it over and both FastCGI handlers will return the same code, returned from the first handler.
+
+Feel free to bug me with any questions, this is my first foray into using Lighttpd and I'm already pleased as punch with it (compared to Apache) but there are certainly some caveats and bits of black magic involved with Mono, FastCGI and Lighttpd. That said, it still feels less sticky than running Apache 2 and mod_mono (not that they're not great and all). Hopefully web traffic will increase and give me a good test-bed for figuring out "the right stuff" to scale Mono on Lighttpd.
+
+Scary thought isn't it? :)
diff --git a/_posts/2007-12-17-my-new-startup.html b/_posts/2007-12-17-my-new-startup.html
new file mode 100644
index 0000000..f01f177
--- /dev/null
+++ b/_posts/2007-12-17-my-new-startup.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: My new startup
+tags:
+- Miscellaneous
+created: 1197895741
+---
+I was talking to Dennis about quitting Palantir and coming to work for my startup which has no funding, and no time, but lots of brilliant ideas, when I realized I don't have a name for the startup yet.
+
+So effectively immediately my I'm naming my startup TY-Combinator and wouldn't you know it! We're currently accepting angel funding, demon funding, and picnic baskets filled with those little sandwiches cut into triangles.
+
+Also effectively immediately, I'm still going to work at Slide.
diff --git a/_posts/2007-12-18-comparing-ironpython-and-cpython.html b/_posts/2007-12-18-comparing-ironpython-and-cpython.html
new file mode 100644
index 0000000..6ec68bb
--- /dev/null
+++ b/_posts/2007-12-18-comparing-ironpython-and-cpython.html
@@ -0,0 +1,115 @@
+---
+layout: post
+title: Comparing IronPython and CPython
+tags:
+- Mono
+- Software Development
+created: 1198043060
+---
+First a little background to help explain some of the terms, etc. "Python" is a language, similar to how "Java" is a language; unlike Java wherein the language is also relatively synonymous with the actual implementation of that language, Python has multiple implementations. If you've run python(1) from the command line, you're most likely running the CPython implementation of the Python language, in effect, Python implemented in C. Other implementations of Python exist, like Jython (implemented on top of the Java virtual machine), PyPy (Python implemented in Python), and IronPython (Python implemented on top of the .NET CLR).
+
+I was talking with some of the guys from the #mono channel on GIMPNet about IronPython versus CPython as far as performance is concerned and I decided that I would refine my testing (using pybench) for more similar versions of the respective implementations, in as controlled of an environment as possible.
+
+I ran pybench.py on a "quiet" (i.e. not-busy) machine sitting in a remote datacenter not too far from Novell, the machine is a Pentium III (i386) based machine running openSUSE 10.3. Since IronPython reports it's "implementation version" as Python 2.4.0, I decided to build and run CPython 2.4 against it. IronPython is running on top of the recently released Mono 1.2.6 which I also built from source (I got IronPython from the IPCE package in YaST however). pybench reported the various implementation details for both as such:
+
+CPython
+
+
+IronPython did alright, but it got pretty thrashed on a lot of the benchmarks. Unfortunately it's hard to tell whether it's Mono getting beaten up, or whether it's IronPython itself that's losing the battle here, running similar tests on the .NET 2.0 CLR would be beneficial but not something I am curious enough to boot a Windows virtual machine for. Regardless, here are the results, I've highlighed the rows where IronPython performs better than CPython.
+
+
+
+
+
Test
+
Minimum Run-time
+
Average Run-time
+
+
+
+
CPython
+
IronPython
+
Diff
+
CPython
+
IronPython
+
Diff
+
+
BuiltinFunctionCalls:
448ms
357ms
+25.4%
450ms
405ms
+11.0%
+
BuiltinMethodLookup:
530ms
1329ms
-60.1%
536ms
1390ms
-61.4%
+
CompareFloats:
380ms
129ms
+194.3%
381ms
132ms
+187.7%
+
CompareFloatsIntegers:
377ms
93ms
+306.1%
378ms
97ms
+291.2%
+
CompareIntegers:
436ms
160ms
+172.5%
437ms
161ms
+170.6%
+
CompareInternedStrings:
425ms
443ms
-4.1%
426ms
445ms
-4.3%
+
CompareLongs:
360ms
292ms
+23.3%
361ms
293ms
+23.0%
+
CompareStrings:
423ms
330ms
+28.0%
423ms
337ms
+25.6%
+
CompareUnicode:
377ms
243ms
+54.7%
377ms
245ms
+54.2%
+
ConcatStrings:
726ms
9452ms
-92.3%
823ms
10071ms
-91.8%
+
ConcatUnicode:
711ms
5687ms
-87.5%
756ms
6039ms
-87.5%
+
CreateInstances:
508ms
761ms
-33.2%
518ms
815ms
-36.4%
+
CreateNewInstances:
451ms
3475ms
-87.0%
458ms
3581ms
-87.2%
+
CreateStringsWithConcat:
473ms
2650ms
-82.1%
475ms
2833ms
-83.2%
+
CreateUnicodeWithConcat:
482ms
1008ms
-52.1%
508ms
1092ms
-53.4%
+
DictCreation:
405ms
2944ms
-86.2%
407ms
3057ms
-86.7%
+
DictWithFloatKeys:
552ms
934ms
-40.9%
553ms
944ms
-41.5%
+
DictWithIntegerKeys:
423ms
1118ms
-62.2%
426ms
1137ms
-62.5%
+
DictWithStringKeys:
413ms
1186ms
-65.1%
414ms
1317ms
-68.6%
+
ForLoops:
412ms
189ms
+118.5%
413ms
217ms
+90.7%
+
IfThenElse:
372ms
128ms
+191.8%
374ms
141ms
+165.8%
+
ListSlicing:
311ms
4033ms
-92.3%
315ms
4230ms
-92.6%
+
NestedForLoops:
488ms
349ms
+39.7%
489ms
382ms
+28.1%
+
NormalClassAttribute:
430ms
1080ms
-60.2%
432ms
1104ms
-60.9%
+
NormalInstanceAttribute:
401ms
427ms
-6.1%
404ms
442ms
-8.7%
+
PythonFunctionCalls:
393ms
302ms
+30.1%
402ms
352ms
+14.3%
+
PythonMethodCalls:
478ms
643ms
-25.7%
536ms
673ms
-20.3%
+
Recursion:
547ms
158ms
+245.9%
659ms
159ms
+313.6%
+
SecondImport:
476ms
1383ms
-65.6%
481ms
1432ms
-66.4%
+
SecondPackageImport:
501ms
1425ms
-64.8%
503ms
1482ms
-66.1%
+
SecondSubmoduleImport:
589ms
1916ms
-69.3%
592ms
1990ms
-70.2%
+
SimpleComplexArithmetic:
475ms
729ms
-34.9%
476ms
758ms
-37.3%
+
SimpleDictManipulation:
424ms
1009ms
-58.0%
427ms
1020ms
-58.2%
+
SimpleFloatArithmetic:
416ms
455ms
-8.7%
422ms
480ms
-12.0%
+
SimpleIntFloatArithmetic:
345ms
161ms
+113.8%
346ms
162ms
+112.9%
+
SimpleIntegerArithmetic:
345ms
161ms
+114.7%
345ms
161ms
+113.9%
+
SimpleListManipulation:
346ms
497ms
-30.4%
350ms
501ms
-30.1%
+
SimpleLongArithmetic:
402ms
1120ms
-64.1%
403ms
1130ms
-64.3%
+
SmallLists:
417ms
1693ms
-75.4%
421ms
1717ms
-75.5%
+
SmallTuples:
450ms
3839ms
-88.3%
453ms
3915ms
-88.4%
+
SpecialClassAttribute:
431ms
1104ms
-60.9%
432ms
1133ms
-61.8%
+
SpecialInstanceAttribute:
608ms
423ms
+43.8%
610ms
437ms
+39.5%
+
StringMappings:
443ms
2255ms
-80.3%
448ms
2311ms
-80.6%
+
StringPredicates:
503ms
1058ms
-52.5%
504ms
1066ms
-52.7%
+
StringSlicing:
527ms
2880ms
-81.7%
562ms
3008ms
-81.3%
+
TryExcept:
418ms
21ms
+1905.2%
418ms
39ms
+985.6%
+
TryRaiseExcept:
587ms
6670ms
-91.2%
591ms
6733ms
-91.2%
+
TupleSlicing:
390ms
1817ms
-78.5%
397ms
1863ms
-78.7%
+
UnicodeMappings:
362ms
1323ms
-72.7%
365ms
1347ms
-72.9%
+
UnicodePredicates:
438ms
860ms
-49.0%
439ms
912ms
-51.8%
+
UnicodeProperties:
400ms
0ms
n/a
401ms
0ms
n/a
+
UnicodeSlicing:
624ms
2491ms
-75.0%
666ms
2638ms
-74.7%
+
+
+The results are disappointing but not all that surprising, especially with regards to string manipulation. I attempted to run the same pybench.py tool on top of Jython but Jython doesn't appear to support the "platform" module, so I don't have a really good baseline for "managed/virtual machine-based Python implementations" right now. However, given the lack of evidence otherwise, I'll just go ahead and assume IronPython blew the doors off of Jython :). In general though this isn't the be-all end-all benchmark for IronPython, especially on Mono, but it does give a nice hint of where some improvements could be made both in the Mono runtime and IronPython. I'll have to run the benchmarks again with the newer versions of both implementations of Python to see where they're improving or degrading but by all means don't let this deter you from checking out IronPython! I'll be writing up a few code samples over the next couple weeks that I hope will be helpful to those "unenlightened" among us; dynamic languages on the CLR, what has the world come to.
diff --git a/_posts/2007-12-18-what-a-heaping-pile-of-fail.html b/_posts/2007-12-18-what-a-heaping-pile-of-fail.html
new file mode 100644
index 0000000..e2e029c
--- /dev/null
+++ b/_posts/2007-12-18-what-a-heaping-pile-of-fail.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: What a heaping pile of FAIL.
+tags:
+- Cocoa
+- Miscellaneous
+created: 1197984055
+---
+I had mentioned previously that iChatAgent in Leopard leaks, I'm going to take that statement back. iChatAgent in Leopard hemorrhages memory, and I think I know why now.
+
+While I was napping, there was a network hiccup causing iChat to get disconnected, when the network connectivity returned, it first tried to sign on a couple of Jabber accounts, both of which use self-signed SSL certificates. Being the lovely old chap that iChat is it prompted the user (napping at the time) to accept the self-signed certificate. While the dialog box was up, iChat sat waiting around before it signed on the other accounts and spun and spun and spun.
+
+iChat spun and spun and spun until all the available disk space for virtual memory was used up by every process that had to swap out to make space for iChatAgent's demands on real memory, and then by iChatAgent itself swapping out.
+
+
+
+God fucking damnit.
diff --git a/_posts/2007-12-31-sxswi-and-me.html b/_posts/2007-12-31-sxswi-and-me.html
new file mode 100644
index 0000000..7c0c48a
--- /dev/null
+++ b/_posts/2007-12-31-sxswi-and-me.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: SXSWi and Me
+tags:
+- Mono
+- Slide
+- Miscellaneous
+- Facebook
+created: 1199106668
+---
+I spoke with Tammy (our PR mastermind) about whether or not Slide was going to let me out of my cage to go to South by Southwest Interactive this coming March and it seems like they might actually let me! (I'm just as surprised as you are)
+
+Unfortunately things with Facebook were at such a ridiculous pace when SXSWi was accepting panel submissions, that I never got a chance to submit my panel idea: "Slide is awesome, now let's talk about how great Slide is." This leaves me in a slightly awkward position, I cannot remember the last conference or event that I went to where I wasn't speaking or talking or dancing with a baboon in front of a live studio audience. Even at the last SXSWi I was there for about 36 hours and most of that time was spent setting up and then helping run BarCamp Austin2. Ideally I'd like to get on stage with some of the guys from Twitter, Facebook, Bebo, Google and maybe even Myspace to discuss the more open social web that we seem to be moving towards and a bit about how awesome Slide is. It's probably nothing more than a pipe-dream however, since the panels seem to be quite locked down at the moment.
+
+Of course, if nobody will have me, then I might be relegated to slumming up and down 6th street in Austin hanging out with the usual drunkards that I know in Austin (you know who you are) and getting into trouble. Mmm, trouble.
+
+Regardless, if you're going to be in Austin for SXSWi let me know, I've got a stack of swanky new business cards I want to get rid of :)
+
diff --git a/_posts/2008-01-05-perforce-backups-revisited.html b/_posts/2008-01-05-perforce-backups-revisited.html
new file mode 100644
index 0000000..24a0ced
--- /dev/null
+++ b/_posts/2008-01-05-perforce-backups-revisited.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Perforce Backups, Revisited.
+tags:
+- Miscellaneous
+- Software Development
+created: 1199556742
+---
+A very long time ago I wrote about my backup script for archiving my entire Perforce repository. I can finally write the obvious follow-up to the post, as I've finally had to use my backups.
+
+In my scenario, the last backup I took was in February of 2007, almost an entire year ago (my development slowed around that time). During my transit from San Antonio to San Francisco the "server" my Perforce repository ran off, also known as orange (seen on the bottom here), a "headless laptop", had its disk completely fail. Up until recently however I haven't had a replacement for "orange" but now that I have pineapple sitting in a colocation facility, I have a new candidate for a Perforce server.
+
+Luckily I had made a habit of burning my backups to DVDs every two weeks, since two weeks of nightly backups would fill up an entire 4.7GB DVD (I still have no idea how my own source repository grew to 120MB or so). After rsync'ing the latest backup tarballs, it was completely up to Perforce to reliably restore them.
+
+Perforce's documentation is very good, so I suggest going over the backup and recovery procedures if you find yourself needing to recover from backups.
+
+Within about 15 minutes I had restored the Perforce database files as well as the actual source code itself and begun to sync a new Perforce client up with the new server (thanks to my p4tunnel script).
+
+I can't talk enough about how much I really like Perforce as a version-control-system and am nothing short of elated to finally have my repository back online, it only goes to show how backups are crucial for anything you might ever want later, in my case backups albeit old backups, were still better than no backups.
+
diff --git a/_posts/2008-01-06-just-curious.html b/_posts/2008-01-06-just-curious.html
new file mode 100644
index 0000000..06698b2
--- /dev/null
+++ b/_posts/2008-01-06-just-curious.html
@@ -0,0 +1,8 @@
+---
+layout: post
+title: Just Curious
+tags:
+- Miscellaneous
+created: 1199637915
+---
+ At what point, as a man, do you give up hopes of being in a rock band?
diff --git a/_posts/2008-01-23-five-and-seven-zeroes-is-big.html b/_posts/2008-01-23-five-and-seven-zeroes-is-big.html
new file mode 100644
index 0000000..dc03ea9
--- /dev/null
+++ b/_posts/2008-01-23-five-and-seven-zeroes-is-big.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Five and Seven Zeroes is Big.
+tags:
+- Slide
+- Facebook
+created: 1201084170
+---
+It was recently announced that Slide (this little start-up that I work for) raised some more money. Neato.
+
+Since Max isn't the aeron chair kind of CEO, it looks like we're going to spend that money on things like "engineers, hardware, etc." Bummer, I've always wondered how an $800 chair can exist that doesn't rub your feet and write your code for you.
+
+Regardless, should be a fun year.
+
+(p.s. we need more engineers)
diff --git a/_posts/2008-01-23-your-voice-interface-is-fucking-stupid.html b/_posts/2008-01-23-your-voice-interface-is-fucking-stupid.html
new file mode 100644
index 0000000..ddec0a1
--- /dev/null
+++ b/_posts/2008-01-23-your-voice-interface-is-fucking-stupid.html
@@ -0,0 +1,48 @@
+---
+layout: post
+title: Your "voice interface" is fucking stupid.
+tags:
+- Opinion
+created: 1201157068
+---
+Recently the bank that financed my car switched their phone payment systems over from their more traditional "press a number to do stuff" to a "talk to a computer and try to do stuff" interface, and my reluctance to pay my car payments has increased tenfold.
+
+Before they switched the phone interface, I almost had the correct sequence of numbers to press entirely memorized to where I could press 3-5 numbers in sequence and be done with my "payment session" in under two minutes. Meaning in a matter of two minutes, I could initiate a transaction from my checking account, to send almost $300 to Chase, in two minutes. I hated losing the money, but I loved the efficiency.
+
+Recently however, they've "pulled a Vista" and replaced a wonderfully functional system that "got the job done" with a bloated, slow and buggy system that infuriates me everytime I need to talk to the computerized woman at the other end of the line. A rapid mashing of touch-tone keys on my phone has been replaced with:
+
+PaymentBot: Welcome to Chase Auto Finance!
+
+*pause*
+
+PaymentBot: If you would like to make a payment, say "make a payment." If you would like to check your payoff balance, say "payoff balance." If you would like to blow a goat, say "baaaaaaaa."
+
+Tyler-Unit: make a payment
+
+PaymentBot: It looks like you want to make a payment, if this is correct say "yes."
+
+Tyler-Unit: yes (at this point I'm usually irritated that I've past the two minute mark)
+
+PaymentBot: First I need to find your account, please say your account number or your social security number, or enter them into the phone
+
+Tyler-Unit: *mashes on keys*
+
+PaymentBot: The number you entered was 1-2-3--4-5--5-6-5-4, if this is correct, say "yes."
+
+Tyler-Unit: YES
+
+PaymentBot: I'm sorry, I didn't catch that, if the number you entered: 1-2-3--4-5--5-6-5-4 is correct, say "yes."
+
+Tyler-Unit: YES
+
+PaymentBot: Okay, if you would like to make a payment over the phone, say "phone." If you would like to make a payment via mail, say "mail."
+
+I could continue, but I won't .
+
+Just to get to the point where I finally need to enter my payment details (because Chase couldn't update their system to, god-forbid, remember the same information I've been mashing into a keypad for the past two years) takes close to five to eight minutes.
+
+Between the various financial institutions that I need to deal with every month I get to fight with terrible websites, miserable phone interfaces and idiot-customer service representatives, it almost makes me regret being fiscally responsible (our government isn't, why should I have to?). I'm hoping there's a special portion of hell reserved for whichever numbnuts in middle-management at Chase decided "OMG! Voice interfaces are TOTALLY kewl!!!!!"
+
+Are there means of consolidating smaller (think below $10,000) loans from one bank to another? While it's prettyobvious that Chase can effectively handle its finances, they certainly can't handle "user-experience", if your customers' only interaction with you as a company is over the phone, or over snail-mail, it's usually in your best interest to make sure those "interfaces" to your customers are top-notch.
+
+I hate voice interfaces.
diff --git a/_posts/2008-01-26-fbrubbar-chikken.html b/_posts/2008-01-26-fbrubbar-chikken.html
new file mode 100644
index 0000000..2fd86db
--- /dev/null
+++ b/_posts/2008-01-26-fbrubbar-chikken.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title:
+tags:
+- Slide
+- Facebook
+created: 1201420542
+---
+
+We've been working pretty hard for the past month (well, for the past 8 months too) but I'm particularly proud of the work that my co-conspirator and I have been putting in on Top Friends (we're that green line that creeps up from behind on FunWall and Super Wall).
+
+One of the most helpful "tools" that's been available to me has been Slide's competitive spirit. In addition to the 2,000+ developers on the Facebook platform we have some pretty healthy competition going on inside Slide as well. Between Top Friends, SuperPoke and FunWall there is plenty of trash-talking and "friendly competition" (read: if it weren't an HR violation, I'd of already resolved to dirty tactics). In doing so we've cultivated an environment where some of the most often heard phrases are: "Is Facebook down again?!" and "OH SCHNAP!"
+
+Another key factor to our team's enjoyable demeanor has been (in my opinion) our liberal use of the "rubber chicken" as part of a sort of group hazing. In essence, when you have glaring mistakes that somehow get pushed to the live site, you will come into the office the next day with rubber chickens adorning your monitor. This group acknowledgement of when we "fuck up" encourages more of a social-pressure to write good code instead of relying on policy, etc to ensure code quality, especially on the rapid release schedules we adhere to. Rubber chickens are the truly quintessential gift at Slide, it is always feels better to give than to receive.
+
+As we near the end of the first month in 2008, I wish Facebook and Bebo continued success with there platform(s); not because I love FQL and FBML oh so much, but because I work for Slide, on the Facebook team, where competition and rubber chickens reign supreme in the land of embedded videos, sortable friends and flying sheep.
+
+(Now seriously, Slide is hiring)
diff --git a/_posts/2008-01-28-sigsegv-in-my-brane.html b/_posts/2008-01-28-sigsegv-in-my-brane.html
new file mode 100644
index 0000000..626c48a
--- /dev/null
+++ b/_posts/2008-01-28-sigsegv-in-my-brane.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: SIGSEGV in my brane.
+tags:
+- Opinion
+- Miscellaneous
+created: 1201537646
+---
+I'm not proud of it, but I do read TechCrunch every now and again, if for only the occasional gem that comes across that causes me to hate buzzwords and everybody that uses them.
+
+In the second paragraph of this article almost caused an entire system shutdown in my central-buzzword-processing unit (CBU):
+
+
"Both Imeem and Anywhere.FM saw a lot of synergy in the deal."
+
+I couldn't read any further into the article after reading that, whenever anybody uses the word "synergy" seriously I have a tendency to tune out completely and think the absolute worst of them until they offer me chocolates, caffeine or other goodies.
diff --git a/_posts/2008-02-01-are-free-gifts-still-gifts.html b/_posts/2008-02-01-are-free-gifts-still-gifts.html
new file mode 100644
index 0000000..5ff80bb
--- /dev/null
+++ b/_posts/2008-02-01-are-free-gifts-still-gifts.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Are Free Gifts Still Gifts?
+tags:
+- Opinion
+- Facebook
+created: 1201894031
+---
+Facebook has been pretty nice to Free Gifts in the past, despite originally being a blatant rip-off of the real Gifts application. Prior to today, I have only received one complaint from Facebook regarding Free Gifts practices. They asked me to remove a gift that looked similar to one of their gifts. I was okay with that even though mine was a lemon and theirs was a lime; maybe it was tough for the color blind audience to decipher? Today, I received my second complaint from them, which stated:
+
+Your Facebook application, Free Gifts, is currently in violation of the Platform Application Guidelines section I.3 (see http://developers.facebook.com/guidelines.php). Specifically, please note that the Terms prohibit applications from acting in a manner that is misleading, deceptive, or fraudulent.
+
+The application's link under the profile picture uses the same wording as Facebook's Gift application (please see attached). Please change this to reflect your application's name to differentiate Facebook's Gift application and "Free Gifts" application, as it is currently misleading users to think that this refers to the associated Facebook features.
+
+
+I will admit it is relatively the same wording, but they failed to explain how using "Send xxxx a Gift" is deceptive or misleading to users. First of all, Facebook provides a tool tip when you hover over a profile action which says "Provided by the xxxxxx Application," which immediately makes a distinction between Gifts and Free Gifts. Second, as far as I know, users are still sending a gift when they use Free Gifts. Third, I have been using this text for longer than I can remember now with no complaints. With over 50 million gifts sent, I have never had a user say they were "trying to use the real gift" application.
+
+I did comply somewhat by making all future profile actions say "free gift" instead of "gift," but there is no easy way for me to fix the 8 million profiles already containing the text. As of now they have failed to respond to my question of how exactly I was deceiving users, but I am really interested in hearing their reasoning.
diff --git a/_posts/2008-02-02-on-funding-my-startup.html b/_posts/2008-02-02-on-funding-my-startup.html
new file mode 100644
index 0000000..2134219
--- /dev/null
+++ b/_posts/2008-02-02-on-funding-my-startup.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: On funding my startup
+tags:
+- Opinion
+- Miscellaneous
+created: 1201980639
+---
+This has been a whirlwind year for startups across the bay area and my startup, TY-Combinator really is no different. Barely a month into 2008, Slide, Incannounced it had received funding, the recent news about the bid from Microsoft to purchase Yahoo! for just above the GDP of Croatia and now great news for the TY-Combinator.
+
+I'm pleased to announce that the TY-Combinator has received an unsolicited bid from Microsoft that values TY-Combinator shares at over 400% under market value. Microsoft is willing to offer TY-Combinator a half-eaten sammich in exchange for 85% of TY-Combinator outstanding shares. This is an exciting time to work for TY-Combinator, with the prospective addition of the capital Microsoft is willing to offer we will be able to finance new projects to expand our global reach over 1000%, up from our reported reach in the 2007 fiscal year of 1.
+
+
Microsoft's bid for a stake in TY-Combinator
diff --git a/_posts/2008-02-03-tips-for-beginning-facebook-developers.html b/_posts/2008-02-03-tips-for-beginning-facebook-developers.html
new file mode 100644
index 0000000..71cb33c
--- /dev/null
+++ b/_posts/2008-02-03-tips-for-beginning-facebook-developers.html
@@ -0,0 +1,23 @@
+---
+layout: post
+title: Tips for beginning Facebook developers.
+tags:
+- Slide
+- Software Development
+- Facebook
+created: 1202087034
+---
+I am starting to see more and more novice developers on the Facebook forums as well as the IRC channel asking fewer and fewer "development" questions and more and more "product" questions. I find this incredibly interesting because it means one of two things: either everybody has figured out how to use the Facebook platform or an increasing number of people are putting the proverbial cart before the horse when it comes to developing Facebook applications.
+
+Call me cynical about the first option, but I find it highly unlikely that everybody figured out how to use the Facebook Platform; despite its low entry barrier many people are over-thinking it or simply trying to develop a Facebook application before they figure out how to build a web application in general.
+
+The second option is far more likely, Facebook applications have reached such a level of ubiquity that "everybody and their mother" wants to write a Facebook application these days. Right now at a small consulting firm in Omaha, Nebraska some middle manager is asking his lead developer if the firm can reinvigorate their collaborative synergies and utilize the social graph to further meet their clients needs.
+
+Facebook is the new Windows, and the Facebook Platform is the new Visual Basic and I feel as if there is a burden on "us" (the existing "top developers" on the platform) to start to cultivate a community that will encourage stylish, functional and ultimately useful applications on the Facebook platform, to ensure that there will never be a "Facebook 98" or a "Facebook ME".
+
+Here's a couple of the best tips I can offer, and maybe Zach (developer of Free Gifts) can help expand.
+
+
Learn by example: Currently Slide has many of the largest applications on the platform, and we've worked extremely hard tuning and tweaking our apps and understanding our userbase. When thinking about developing your application, it certainly won't hurt to check out some of the existing apps that have succeeded on the platform. Stand on the shoulders of others who have spent far more time researching and testing what works and what doesn't work on the platform than you'll be able to spend.Learn the vocabulary: Make sure you read up on what FBML, FQL, FBJS all are.Understand the difference between the Profile and a Page on Facebook.Check out some demos: There are a few demo applications that you can dig through to better understand the basics of what makes a Facebook application.Just code already: By far the most common mistake I've seen thus far is over-thinking things, the majority of your questions will be answered by simply trying stuff out on the platform. This isn't high school calculus, you are allowed to guess-and-check. I am willing to help developers who obviously need it, but if you can't be buggered to try something out, I can't be buggered to point you in the right direction on where you went wrong.
+
+
+With the first year anniversary of the original F8 event right around the corner in May, I feel we as a community of developers have made tremendous progress in establishing ourselves, but now I feel it's time for some introspection and self-improvement as a community.
diff --git a/_posts/2008-02-03-trying-out-adsense.html b/_posts/2008-02-03-trying-out-adsense.html
new file mode 100644
index 0000000..8872400
--- /dev/null
+++ b/_posts/2008-02-03-trying-out-adsense.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Trying out AdSense
+tags:
+- Miscellaneous
+created: 1202104800
+---
+In a vain effort to try to monetize all of the incredibly witty things that I do and say on this ridiculous excuse for a blog, I've started experimenting with Google AdSense mixed in with some of the content on the site. They don't insert themselves into the RSS feeds (as far as I know) and they only show up for anonymous users to the site so I'm willing to bet that the majority of where my traffic actually goes won't be affected.
+
+Unfortunately, since Slide has infected me with this weird disease where I obsessively watch numbers, I'll most likely be obsessively watching a large number of zeroes in the coming weeks. That said, you could totally screw with me by clicking around on a lot of the advertisements...seriously, that would totally irritate me...you should try it.
diff --git a/_posts/2008-02-04-more-tips-for-beginning-facebook-developers.html b/_posts/2008-02-04-more-tips-for-beginning-facebook-developers.html
new file mode 100644
index 0000000..8b71c58
--- /dev/null
+++ b/_posts/2008-02-04-more-tips-for-beginning-facebook-developers.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: More Tips for Beginning Facebook Developers
+tags:
+- Software Development
+- Facebook
+created: 1202195795
+---
+I don't feel quite as awesome as I did last summer when I tell people that I "develop facebook applications." Despite personally being really happy with my applications, I get the feeling that users now perceive facebook apps as spammy, poorly designed, and pointless. Sure, there are some applications that are knowingly like this (and they are probably making some quick cash), but to many new developers they just don't know any better.
+
+The points in Tyler's post, as well as the ones below, will help new developers start on the right track and then we can all feel awesome again to be a facebook application developer. I am staying away from saying "don't spam" because that is a topic in need of it's own post.
+
+Just because you haven't seen it doesn't mean it isn't there. Do a little research on existing applications with the same idea before you start development. This will help you decide whether you should pick up their best features and improve on them, or just scrap your idea altogether. There is definitely room for similar applications, but don't build a product if you can't make it better.
+
+She may be hot, but she has no brain. Looks are great, but make sure you have a well built application to support your idea. Users love to uninstall when they see error messages.
+
+Keep improving and adding features to your applications based on user requests, they really know best. I may be crazy, but I like to read and respond to nearly every (positive) comment and suggestion on Free Gifts boards.
+
+Tyler pointed out that the one year mark is approaching, and the amount of progress the developer community has made is really amazing. Over the next few months there are a few things I really hope to see: inter-application collaboration, more functional user interfaces, and a decline of "one timer" apps (quizzes, etc).
diff --git a/_posts/2008-02-16-speaking-at-graphing-social-patterns.html b/_posts/2008-02-16-speaking-at-graphing-social-patterns.html
new file mode 100644
index 0000000..bdf7069
--- /dev/null
+++ b/_posts/2008-02-16-speaking-at-graphing-social-patterns.html
@@ -0,0 +1,16 @@
+---
+layout: post
+title: Speaking at Graphing Social Patterns
+tags:
+- Slide
+- Facebook
+created: 1203209183
+---
+Coming up in the first week of March you'll be able to find me doing one of my three favorite things (right behind, writing code and sleeping), I'll be talking, in front of people, about Facebook, Bebo and "social applications." If you are one of the four people that have gone on record has having actually subscribed to my RSS feed, you might know that I spoke at something called "Graphing Social" in the past, but this time I'm speaking at "Graphing Social Patterns West" which will be occurring in parallel to O'Reilly's "ETech (Emerging Technology) Conference)" in San Diego March 3rd and 4th.
+
+I'll be talking briefly, in front of people, on tuesday March 4th about during a joint session on "Social App Development 101: Elements of Style," where I'll be discussing some of keystone pieces of building an application that "pops" on Facebook and Bebo, and designing for portability, etc. My session is going to be brief, so I will most likely be employing my crouching-ninja-presentation technique, where the slides rotate every quarter-second at such a fast pace that the content becomes melded into my audiences' subconscious. It's been rumored to cause brain hemorrhaging, but that's nothing but an urban legend, I promise.
+
+In general the entire event should be lots of fun; I'm looking forward to schmoozing with the speakers lined up for the event, as well the time-honored tradition at O'Reilly conferences, playing a good old game of "Find Tim and tickle him until he pees himself."
+
+Overall the combination of GSP West and ETech looks like it's going to make for an interesting couple of days in San Diego, go ahead and register now to make sure you can get in.
+
diff --git a/_posts/2008-02-17-facebooks-bleeding-edge.html b/_posts/2008-02-17-facebooks-bleeding-edge.html
new file mode 100644
index 0000000..447a677
--- /dev/null
+++ b/_posts/2008-02-17-facebooks-bleeding-edge.html
@@ -0,0 +1,26 @@
+---
+layout: post
+title: Facebook's Bleeding Edge
+tags:
+- Slide
+- Facebook
+created: 1203304651
+---
+For the past couple weeks I've been living dangerously, as some people know I live in the Tenderloin District, but that's not what I mean when I say "living dangerously." In my constant quest to squeeze as much performance out of Top Friends as possible, I've been evaluating the latest and greatest stuff that Facebook has to offer developers. In addition to the usual adding of features, tuning virality, and general application upkeep, I've been exploring mixes of FBML, FBJS, Mock AJAX, preload FQL, and batched queries all as a means to improve how fast Top Friends is for our users. I've been saying for months that it's exceptionally important to keep up with all of Facebook's changes, for better or for worse, and sometimes they throw out gems like preload FQL that will help shape new and interesting ways you can utilize Facebook's data inside your application.
+
+The Feature
+The first obvious thing that I wanted to apply preload FQL to, was a new feature we've pushed out called "Top Friends News" which aggregates "what's going on" with your Top Friends.
+
+It was very important to incorporate data from Facebook as well as our own data into the feature to make sure the page was as rich and interesting to the user as possible. Unfortunately, executing queries to fetch birthdays, recently uploaded photos, statuses, etc, are prohibitively expensive if you just run them as standard FQL queries. Even as preload FQL queries they are relatively expensive when hitting a cold cache. To ensure the page was as fast as possible using preload FQL we ran a lot of tests with various iterations of the queries and tuned everything as much as possible. I could yak endlessly on all the cool stuff we've done in this specific case to squeeze every last drop of performance out of the News page, but I'll cite the numbers and get to the nitty-gritty right away. Before we released the feature I tried the page with no preload FQL queries, and the necessary Facebook data was procured through painfully slow standard FQL queries. Executing these queries on the page made the "Top Friends News" page the slowest page Slide served up to Facebook, clocking in at about 2.5-3.0s. Simply unacceptable. After a long day of tuning and implementing all the queries to run as preloaded FQL queries, the "Top Friends News" page became the fastest page Slide serves up to Facebook at around 0.5s a pop.
+
+Although preload FQL is technically still a "beta feature" according to the wiki, we've implemented it in an application that has millions of users daily; in my opinion preload FQL is "Google-beta" quality (which means, it's solid) as opposed to "Microsoft-beta" quality (which means, it sucks).
+
+Using preload FQL
+If you grab the latest PHP client library from Facebook, support for preload FQL is already baked in via the admin.setAppProperties API call. Actually calling the API call is relatively painless, it's something to do pre-push instead of "live" like normal FQL queries. Once you set your application's preload FQL rules, the results are simply posted to the FBML page matching the "pattern" you specified when you set the FQL rules to begin with (read the wiki page for more), when the results are POSTed however, they'll be formatted in JSON, similar to a regular FQL query if you specify ResponseType.JSON. This does mean however you should be using FBML for your application page to take advantage of preload FQL, it's possible to use iframe pages and preload FQL through a clever mix of memcached and <fb:iframe/>, but I won't go into that here.
+
+Performance Concerns
+While moving to preload FQL means you lessen the chance that Facebook times out while trying to load your FBML page, if you structure your queries incorrectly you merely shuffle the lag-time for the user, you won't eliminate it. After working with some Facebook engineers on profiling the performance of preload FQL, they've added another parameter that will be posted into your FBML page that you can use to guage the time it took your preload FQL queries to execute. If you start logging fb_sig_time alongside fb_sig_preload_fql_timestamp you can measure the difference between when Facebook started to process your preload FQL rules (fb_sig_preload_fql_timestamp), and when Facebook called your server for the page (fb_sig_time).
+
+Mixing and matching FBJS, FBML and preload FQL rules in your pages can allow you to create blistering-fast pages that are as rich as possible for your users, while allowing you do to more with less (server-wise) than you could ever do before. Add in a bit of the Data Store API and you'll have pages that rival Facebook's own in terms of speed at prices that rival Amazon's S3 in terms of overall cost. In general Facebook is an engineering organization with lots of smart people working for them, and most of those smart people (that I've met anyways) are working to make the Facebook Platform even better than it is now, meaning the time you put into exploring new parts of the platform will most definitely have been worth it after you start to use some of Facebook's more "bleeding edge" features that are designed to make your life easier, not harder.
+
+2008 is going to be an interesting year.
diff --git a/_posts/2008-02-17-upgraded-to-drupal-6-0.html b/_posts/2008-02-17-upgraded-to-drupal-6-0.html
new file mode 100644
index 0000000..8e31308
--- /dev/null
+++ b/_posts/2008-02-17-upgraded-to-drupal-6-0.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Upgraded to Drupal 6.0
+tags:
+- Miscellaneous
+created: 1203297824
+---
+I'm certain that this doesn't interest anybody in the slightest, but I just upgraded the entire site to Drupal 6.0.
+
+Unfortunately some modules like jstools, or the Adsense module haven't been ported over yet so I've just gone ahead and disabled them for now until everything gets back to normal in the land of Drupal.
+
+I've been very pleased with Drupal as a CMS, and am really look forward to them tightening up Drupal 6 further on in the release cycle, but right now everything is looking promising enough to jump ship from Drupal 5.xx.
diff --git a/_posts/2008-02-23-i-hate-mac-os-x.html b/_posts/2008-02-23-i-hate-mac-os-x.html
new file mode 100644
index 0000000..b3941df
--- /dev/null
+++ b/_posts/2008-02-23-i-hate-mac-os-x.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: I hate Mac OS X
+tags:
+- Cocoa
+- Opinion
+- Software Development
+created: 1203834769
+---
+Hate is such a strong word, but I think I can verifiably say that I hate Mac OS X (Leopard). In a past life I wrote Mac software on Mac OS X (Tiger) and everything was wonderful, I enjoyed using Mail, iCal, Xcode, Safari and even iTunes sometimes. I liked using my computer, I enjoyed using the tools handed to me by the gods on high in the mountains of Cupertino.
+
+Now a couple months since upgrading to Leopard certain that everything was going to be even more awesome than before, I type this from my openSUSE 10.3 workstation, running Opera, Thunderbird, Sunbird, Banshee and Gnome Terminals open all over the place. The tipping point was an afternoon at a coffee shop with my lovely MacBook Pro (code named "cherry") when I closed Safari entirely because it was leaking memory, only to open it again for about an hour, and notice that it had started leaking again and in the course of an hour had a memory footprint of 1.3GB.
+
+Using Mail.app in Leopard has been nothing but a complete and total nightmare, somehow Mail.app's internal IMAP implementation can lock up the entire machine causing the Finder, Safari and Terminal all to beachball while Mail.app takes 15 minutes only to end up crashing. Too many stack traces I've watched Mail.app emit have all been rooted in their IMAP support. Thunderbird is also a miserable piece of software, I'm convinced that everybody except the one engineer I know at Mozilla is a complete and utter idiot, but when Thunderbird locks up, I can still use the rest of my system. Somehow Apple has munged the lines between userland and kernel space so much that userland applications can take control of the machine leaving the user on the sidelines while applications compete for resources and bicker amongst themselves.
+
+Time Machine, and Spaces are the only two redeeming features in Leopard for me, but after losing multiple modal dialogs in Spaces and watching iChat or Adium steal focus and rip focus from one space to another became too much to handle. Somehow every window manager on the planet has gracefully supported multiple workspaces for well over a decade and Apple was able to do it wrong.
+
+I really like Apple's hardware, I own a 20" iMac, 13" MacBook, 12" PowerBook and have a 15" MacBook Pro at work, but either Apple let go, or lost some really good engineers in their famed deathmarches up to releases, especially up to the release of Mac OS 10.5. I'm sure the iPhone is a great revenue stream, the Apple TV is "cute" and iPods are still my preferred portable media devices, but I never realized that when "Apple Computer, Inc." became "Apple, Inc" that it was going to have such an effect on the quality of their products.
+
+Now I have a split partition on my MacBook Pro, and I intend on putting openSUSE on the machine this weekend. My trust in the open source community, as low as it is, is now higher than my trust in Apple to release quality software. Grrrr.
diff --git a/_posts/2008-02-24-graphing-social-appnite.html b/_posts/2008-02-24-graphing-social-appnite.html
new file mode 100644
index 0000000..612d2e9
--- /dev/null
+++ b/_posts/2008-02-24-graphing-social-appnite.html
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Graphing Social AppNite
+tags:
+- Slide
+- Facebook
+created: 1203916567
+---
+I'm not yet certain what kind of audience is going to be attending Graphing Social Patterns West, so I'm hoping I can help tip the scales in favor of developers because, to be frank, business people scare me.
+
+I was told about AppNite and it seems like a good excuse to try to get more developers to make the trek down to San Diego to keep me company in a sea of marketers and business folk. Better yet, developers who enter the AppNite contests get 50% off the admission to the conference (enter here). Unfortunately I'm not going to enter my apps in the contest, but I do know a friend of mine Jason Rubenstein, of Just Three Words fame, has entered his app, to give you an idea of the stiff competition you'll be up against.
+
+If that doesn't seal the deal for you, Virgin America flies to San Diego now, and round-trip flights from San Francisco to San Diego are only ~$85. Which means if you're a Silicon Valley Facebook/Bebo/OpenSocial developer you can come hang out at the conference for cheap, and if your application is good enough, get some killer exposure to potential investors, business contacts, and other developers (like me!).
+
+Zach Allia (of Free Gifts fame), Jason Rubenstein (Just Three Words), Ryan Romanchuk (Dipity) as well as the developers on the speakers list will all be there, so it should be a fun meeting of the minds (for developers at least).
+
+See you there!
diff --git a/_posts/2008-03-17-gsp-west-and-sxsw-2008.html b/_posts/2008-03-17-gsp-west-and-sxsw-2008.html
new file mode 100644
index 0000000..79348f1
--- /dev/null
+++ b/_posts/2008-03-17-gsp-west-and-sxsw-2008.html
@@ -0,0 +1,24 @@
+---
+layout: post
+title: GSP West and SXSW 2008
+tags:
+- Slide
+- Facebook
+created: 1205745848
+---
+It's been almost a whole entire week since I left Austin, but it certainly seems better late than never.
+
+So far this month I've been fortunate enough to have been invited to speak at a few events, and one or two I just happened to wedge myself into anyways.
+
+I spoke at Graphing Social Patterns West in San Diego the first week in March on a concept I feel I didn't have the time to really explain sufficiently, "Social Portability" (pdf). Unfortunately most of the audience weren't developers, so I adjusted the presentation to shoot a bit higher level than usual.
+
+Following GSP I spoke at BarCamp Austin 3 on building ASP.NET sites on top of the Mono stack (pdf). The session was relatively small, so it broke down into much more of a round table discussion (we were sitting at a literal round table) about some of our experiences with ASP.NET on Mono through Apache2/mod_mono and Lighttpd/Mono-FastCGI, etc.
+
+Also while at SXSW I spoke at the Facebook Developer Garage Austin on the same concept as before, Social Portability, except this time the audience was far more developer oriented so I could dive into some nitty gritty bits of FBML/FBJS caveats, etc ((pdf). The Developer Garage was especially fun because the Zuckerborg was in attendance, and I met more than my fair share of interesting developer-types that were either Texans themselves, or in Texas for the event.
+
+March is barely half over and I'm already exhausted.
+ Presentation Files
+Social Portability.pdf (GSP)
+Social Portability (Developer Garage).pdf
+ASP.NET on Mono.pdf (BarCamp)
+
diff --git a/_posts/2008-03-21-javascript-wonks-missing-after-property-id.html b/_posts/2008-03-21-javascript-wonks-missing-after-property-id.html
new file mode 100644
index 0000000..594c935
--- /dev/null
+++ b/_posts/2008-03-21-javascript-wonks-missing-after-property-id.html
@@ -0,0 +1,78 @@
+---
+layout: post
+title: "Javascript Wonks: \"missing : after property id\""
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+- JavaScript
+created: 1206091986
+---
+I've been doing work with OpenSocial recently and have used the opportunity to bring my tolerance talent in Javascript up a notch or two. In doing so, I've been slowly but surely running into a myriad of browser-specific quirks along with a few cross-browser gems that have left me thinking about putting some browser developers on my "To Anonymously Beat Up In Alleyway" list (so far, James Gosling, and this man top the list).
+
+After working on a few "classes" tonight (the notion that Javascript is object-oriented still makes me chuckle) I ran into an interesting problem with some of my global-level "constants" defined in the same file that I was working in, that my "class" just so happened to make use of. As I tend to do when I fall into situations like this to where I can't tell if I'm hallucinating or if something with Javascript has gone awry, I called over Sergio (in-house CSS master and Javascript Lvl. 60 Mage).
+
+Some background to how Javascript works
+Javascript engines essentially have two "modes" that it runs over your code that you can spot errors in. The first mode, "parsing", is where you'll find syntax errors spewing into the Javascript console. If you've used any interpreted language before (Python, Java, C#, Ruby), this is really just "compilation". Using Python as an example, when you import a module (i.e. import some_module) the Python interpreter actually compiles your code into Python byte-code to be executed at a later date. The second mode, "execution", is where you'll run into your run-time errors, using an accessing an undefined object property, overrunning an array index, etc. In Python/Java terms, this is where your compiled byte-code is actually being run in the Python/Java virtual machine.
+
+
+The gripe
+The crux of the problem comes down to two different ways to declare an associative array in Javascript, the following two notations are both correct and both "work":
+Notation #1
+var mapped_values = {};
+mapped_values['key'] = 'value';
+
+Notation #2
+var mapped_values = {'key' : 'value'};
+
+Everything looks correct yes? (hint: say yes)
+
+
+Incorrect, because of the point at which the two are evaluated. The first example will be notated at run-time, whereas the second example will be evaluated at parse/compile-time. Who cares right? The distinction becomes much more apparent when you start to use references to other code for your keys. Keep in mind, with both notations it is actually valid to have a key "undefined" when you declare your associative array. For example:
+Notation #1
+/* the variable "foo" is not defined */
+var mapped_values = {};
+mapped_values[foo] = 'value';
+
+Notation #2
+/* the variable "foo" is not defined */
+var mapped_values = { foo : 'value' };
+
+
+This still works perfectly fine, both at parse/compile-time and at run-time. Since I mentioned I'm working on OpenSocial, chances are I'm going to need to reference some of the OpenSocial code. So for the next example let's say I need to create an associative array with one of the keys defined by the OpenSocial container, using the two different notations I would write something like:
+Notation #1
+var mapped_values = {};
+mapped_values[opensocial.DataRequest.PeopleRequestFields.FILTER] = opensocial.DataRequest.FilterType.ALL;
+
+Notation #2
+var mapped_values = {opensocial.DataRequest.PeopleRequestFields.FILTER : opensocial.DataRequest.FilterType.ALL};
+
+
+Because of the different points in time at which the two notations above will be evaluated, #1 will properly "compile" and then execute correctly when called (regardless of the scope-level at which it is defined). The second one however, will fail to "compile" when the browser's rendering engine is loading the Javascript (also regardless of the scope-level at which it is defined), and will result in the following error at load-time:
+
"missing : after property id" (verified in both IE6 and Firefox)
+
+The issue here is that the variable "opensocial" is not defined at "compile-time" as far as the Javascript engine is concerned (which is fine) but the code attempts to access a property of that object, which causes the error at "compile-time". This will error at at *any* level (as far as I've tried) so it's not a scoping issue, just an unfortunate fact of life with how Javascript is loaded and eventually executed in the browser.
+
+
+Sergio and I tried a few more examples (the scope of which was in side a function, not at the global level):
+
+// Works in IE/FF
+var test = { magic : 'thing' };
+var test2 = {};
+test2[rick.roll] = 'thing';
+test2[alert] = 'somethingelse';
+var test3 = {};
+test3[function() { alert('sux'); }] = 'test';
+
+
+
+// Fail in IE/FF
+var test4 ={ opensocial['DataRequest']['PeopleRequestFields']['FILTER'] : opensocial['DataRequest']['FilterType']['ALL']} ;
+var test5 = { rick['roll'] : 'thing'};
+var test6 = { rick.roll : 'thing'};
+var test7 = { function() { alert('sux'); } : 'test'};
+
+
+Object accessor calls work in "test2" for example because that's going to be evaluated at run-time instead of at compile-time, as is happening in "test5" and "test6". I would love to be proven wrong on our analysis of the issue here (our tests were less than scientific, and there may have been Corona involved) but switching from inline-declarations for associative arrays (var t = {'k' : 'v'};) to the more sequential alternative (var t = {}; t['k'] = 'v';) solved the issue of the Javascript engine's parser spewing errors on the loading of the Javascript.
+
+Food for thought I suppose.
diff --git a/_posts/2008-03-24-srsly-ur-doin-it-wrong.html b/_posts/2008-03-24-srsly-ur-doin-it-wrong.html
new file mode 100644
index 0000000..84a45c6
--- /dev/null
+++ b/_posts/2008-03-24-srsly-ur-doin-it-wrong.html
@@ -0,0 +1,21 @@
+---
+layout: post
+title: Srsly ur doin it wrong.
+tags:
+- Opinion
+- Software Development
+- JavaScript
+created: 1206357533
+---
+Via twitter I have been gripinga bitaboutJavascript recently. It's quite possible that I've been complaining about it far more than I complain about other things via twitter, which is a tall order to match.
+
+When addressing something as big and scary as say, a platform built on Javascript, it forces you into looking at Javascript in a way different than how I think most developers (myself included) have looked at Javascript. Most Javascript that I've seen has been hideous. Gobs and gobs of functions and procedural garbage thrown into a series of files that kinda makes sense, but really doesn't. It would seem that most developers charged with writing Javascript don't understand how to write object-oriented Javascript. In fact about two or three months ago when considering topics to discuss in a front-end developers meeting here at Slide, I bit the bullet, raised my hand and said "Can you explain how to do object-oriented Javascript? Because I honestly don't have a fucking clue."
+
+In the past Javascript that I've written has been to compliment existing backend web-application code and front-end code, i.e. I wasn't looking at Javascript as one of the building blocks of my application, I was looking at it as a bit of mortar spread between the cracks to smooth out the surface of the application. The difference in how you start to use Javascript in a web application makes an enormous difference 6 months to a year down the road. How terrible your code (this isn't actually segregated to Javascript) is becomes far more apparent when other developers start to work with your code as well, it's tremendously embarrassing to have to answer questions like "where's the code that generates that one DOM element?" As a general rule, coding all by your lonesome, especially with a tight schedule, will produce less than clean results (unfortunately Javascript is one of the languages I've found where this is more of the norm than the exception).
+
+A lot of what's driven the change from my Javascript being the mortar to being the bricks in my work has been the adoption of jQuery which I highly recommend along with the jQuery.ui library. jQuery makes developing Javascript feel like actual programming, instead of hackish-scripting, which means you'll start to view your Javascript code differently too. Dealing with scoping issues, and prototype-based programming in Javascript isn't all rainbows and butterflies but "doing it right" will help you sleep at night and help reduce the amount of embarrassing questions you'll have to answer to the next poor unfortunate soul that inherits your code.
+
+Some of the resources I've found useful in getting over the barrier to object-oriented Javascript have been:
+
+I'm still not a huge fan of Javascript, but I'm hating it less these days :)
+
diff --git a/_posts/2008-03-26-dashboard-for-linux-users.html b/_posts/2008-03-26-dashboard-for-linux-users.html
new file mode 100644
index 0000000..b5aaf77
--- /dev/null
+++ b/_posts/2008-03-26-dashboard-for-linux-users.html
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Dashboard for Linux users
+tags:
+- Miscellaneous
+- Linux
+created: 1206518135
+---
+With the release of Mac OS 10.5 (Leopard) I found myself in a tough spot, I liked certain features added into Leopard, but I couldn't stand some of the stability issues I was having and the other bugs that would interrupt my normal workflow during the day. In an effort to alleviate some of my frustrations with Leopard, I experimented for a week with running Gnome (with Compiz) on my openSUSE workstation. In general all the important bits were there, By this point, I had already switched from using any sort of GUI editor to work, but instead had switched over to using vim on a shared development server here at the office. Given that Drosera still wasn't fast enough for my normal day-to-day web development debugging, I was also using Firefox and Opera for most of my web browsing as well. Chat was covered by Adium, so using it's Linux/Windows counter-part, Pidgin was no trouble at all.
+
+After switching for a week and falling in love with Compiz and some of the features it offers, I feel like I can accomplish far more now on Linux than I was on Mac OS X. For me Mac OS X became the new Windows, I was fighting the system to work almost as much as I was do actual work (between the IMAP code in Mail.app crashing and Safari leaking, I was not a happy camper). The one missing feature however was Dashboard. I'm not a religious user of Dashboard, but I always used it to keep little chunks of information stored away either in post-it notes, via clocks, or tickers, etc. I'd not found a good solution until recently, by way of Opera and a combination of widgets and one of the default Compiz Fusion plugins.
+
(click to enlarge)
+
+The concept behind Opera Widgets is the exact same as behind Dashboard widgets, tiny little web applications running on your desktop, by default however they run on your desktop. This wasn't going to work for me, I like to stash widgets away, and access them through the trusty F12 button as per usual with Dashboard.
+
+In enters the "Widget Layer" plugin for Compiz Fusion , which allows you to assign rules for placing regular windows sitting in the window manager, into this special widget layer that appears just like Dashboard does on Mac OS X (with the actual desktop faded out in the background). In order to group all Opera Widgets in the Widget Layer, you can set the "Widget Windows" field to:
+
role=opera-widget
+Which will cause all enabled Opera Widgets to be availabe at a keypress of F12, if you're on Linux, I highly suggest you try it out, it's extremely useful, especially if you grab some of the more developer focused widgets from the widget directory
+
+Of course, there's plenty of reasons to use Compiz. One of my favorite plugins is the "Annotate" plugin that allows you to draw on your screen, which comes in handy for going over interfaces with coworkers.
+
+In general the addition of Compiz to the Linux desktop I feel is an important one, it drastically improves the rendering of windows since it's essentially doing what Quartz Extreme is doing on Mac OS X in terms of offloading some rendering on the graphics card's GPU. Having really bitching eye-candy certainly doesn't hurt either, So far with Compiz I have what equates to "Spaces", "Expose", and "Dashboard" from Leopard, along with a myriad of other goodies like "Wobbly Windows", true transparency and reflections on arbitrary UI elements and of course, a fish tank inside my desktop. (If you're using openSUSE, the one-click packages for Compiz Fusion can be found here on the wiki).
diff --git a/_posts/2008-04-02-data-binding-with-jquery.html b/_posts/2008-04-02-data-binding-with-jquery.html
new file mode 100644
index 0000000..e97ab88
--- /dev/null
+++ b/_posts/2008-04-02-data-binding-with-jquery.html
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Data Binding with jQuery
+tags:
+- Slide
+- Miscellaneous
+- JavaScript
+created: 1207147958
+---
+Since I've come from the land of desktop application development, there are a few concepts that I don't think quite "made the voyage" from desktop/thick-client development to web/thin-client development. The concept of "data binding" is completely lost in my opinion in the land of Javascript and HTML (not to mention the concept of "controls" to begin with).A few weeks ago while exploring a couple other concepts for how to improve our overall frontend development at Slide I prototyped a means of "databinding" controls, or at the very least DOM elements to data-providing Javascript functions.
+
+I've posted an example here of some of the data binding code I've written for experimentation purposes. In the example page linked, there is a <ul> tag that is "bound" to a Javascript function, the Javascript function creates an array of associative arrays inline (it could very well be powered by some AJAX-oriented Javascript with minor adjustments). Using the results of the "databind" function specified on the bindable element, it creates a set of child nodes to attach to the parent list. In effect, the following code:
+
+
+
+Will generate the following DOM tree, after the "bind()" function has been run on page load:
+
+
List Item #1 OMG
+
List Item #2
+
List Item #3
+
+
+
+Since the code is relatively simple (in my opinion) I figured I would throw it out there in all it's minimalistic glory and get some general feedback on the concept before I go "all out" and create a full-on jQuery extension based off of the linked prototype above. I'm trying to think of ways to make it more powerful as well, built-in support for binding to the results of an asynchrounous call to a URL that returns JSON that would then create the elements is at the top of my TODO list at this point. Feedback, flames and actual useful critiques are all welcome; I'll be sure to post again once I have the time to create the jQuery extension for binding, this however is more experimental quality (i.e. don't use it, i'm not).
+
+What do you think?
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
+
diff --git a/_posts/2008-04-07-a-few-changes.html b/_posts/2008-04-07-a-few-changes.html
new file mode 100644
index 0000000..094c77d
--- /dev/null
+++ b/_posts/2008-04-07-a-few-changes.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: A few changes
+tags:
+- Miscellaneous
+created: 1207576475
+---
+If you're subscribed to my RSS feed you wouldn't have noticed, but if not you probably already know by now about the change in the look of unethicalblogger.com. I got tired of the old (boring) red theme and dug around on drupal.org until I found one I liked and then customized it to suit my needs.
+
+Other than that, I'm very proud to announce that this site is the 7th hit on Google for the query "unethical" (check it out). Besides the obvious tactics (kicking puppies), I'm wondering how I can reach the #1 result for "unethical".
+
+Any ideas?
diff --git a/_posts/2008-04-08-hi5-goes-100.html b/_posts/2008-04-08-hi5-goes-100.html
new file mode 100644
index 0000000..6879626
--- /dev/null
+++ b/_posts/2008-04-08-hi5-goes-100.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: "Hi5 goes 100% "
+tags:
+- Slide
+created: 1207661994
+---
+It's so easy to get caught up in the flurry of things going on here in Silicon Valley (not to mention just at Slide), but I figured that Hi5 deserved being mentioned. I'd like to congratulate Lou, Anil, Paul, Zack and the rest of the Hi5 Platform team on being (from what I can tell) the first social network to turn their OpenSocial-based platform on 100% to users. As of last friday they finally ramped up to 100%, meaning every user on Hi5 can add OpenSocial applications that have been approved and added to the Hi5 applications gallery.
+
+The past couple weeks I've been lurking on the #Hi5dev channel on Freenode, where most of the Hi5 team has been as well, dutifully answering questions and getting general developer feedback. I highly recommend following their developer blog where Lou (pictured here) has been posting regular updates and all the important things that you need to do in order to get your application viral, approved and reaching Hi5's users.
+
+Some of the applications we've launched include: Top Friends, Slide TV and SuperPoke. Of course, if all you want to do on Hi5 is be friends with me, you can find me here :).
+
+Overall the OpenSocial/Hi5 platform has been an interesting experience, moving more of the application into the realm of JavaScript as opposed to what I've become used to on the Facebook platform has made me think harder about the separation of front-end code from back-end code and where you actually draw the line when both are written in the same language. One down, only twoto go!
+
diff --git a/_posts/2008-04-13-an-informal-poll.html b/_posts/2008-04-13-an-informal-poll.html
new file mode 100644
index 0000000..4e3bffd
--- /dev/null
+++ b/_posts/2008-04-13-an-informal-poll.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: An informal poll
+tags:
+- Miscellaneous
+created: 1208070191
+---
+ An informal poll at the Slide offices this past week yielded these interesting results: at Slide.com, nearly 100% of white people seem to like "Stuff White People Like".
+
+I must say, I sure do like Arrested Development, not having a tv, expensive sammiches and diversity.
diff --git a/_posts/2008-05-03-parsing-html-with-python.html b/_posts/2008-05-03-parsing-html-with-python.html
new file mode 100644
index 0000000..4f4413a
--- /dev/null
+++ b/_posts/2008-05-03-parsing-html-with-python.html
@@ -0,0 +1,75 @@
+---
+layout: post
+title: Parsing HTML with Python
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+created: 1209884083
+---
+A while ago I jotted down about seven or so ideas of stuff that I thought would make good blog posts, somehow "markup parsers in Python" is next on the list, so I might as well spill the beans on how incredibly easy it is to process (X)HTML with Python and a little built in class called HTMLParser.
+
+There have been a few occasions when I needed a quick (and dirty) way to perform transforms on some chunk of HTML or merely "search and replace" parts of it. While it might be cleaner to do something with XSLT or the likes, using them doesn't even begin to match the speed of development of an HTMLParser-based class in Python.
+
+Getting Started
+One major thing to keep in mind when working with HTMLParser, especially if you're newer to Python, is that it is what's referred to as an "old styled" object, meaning subclassing it is a bit different than "new styled" classes. Since HTMLParser is an old-styled object, any time you'd want to call a super-class defined method you would need to perform HTMLParser.superMethod(arg) instead of super(SubHTMLParser, self).superMethod(arg)
+
+Creating the HTML parser
+For the purposes of this example, I want something simple, so we're just going to take a block of markup and "tweak" all the <a> tags within it to be "sad" (whereas "sad" means they'll be bold, blue, and blinkey). The actual code to do so is only 50 lines long and is as follows: import HTMLParser
+
+class SadHTML(HTMLParser.HTMLParser):
+ '''A simple HTML transform-class based upon HTMLParser. All links shall be bold, blue and blinky :('''
+
+ def __init__(self, *args, **kwargs):
+ HTMLParser.HTMLParser.__init__(self)
+ self.stack = []
+
+ def handle_starttag(self, tag, attrs):
+ attrs = dict(attrs)
+ if tag.lower() == 'a':
+ self.stack.append(self.__html_start_tag('blink', None))
+ attrs['style'] = '%s%s' % (attrs.get('style', ''), 'color: blue; font-weight: bold;')
+ self.stack.append(self.__html_start_tag(tag, attrs))
+
+ def handle_endtag(self, tag):
+ self.stack.append(self.__html_end_tag(tag))
+ if tag.lower() == 'a':
+ self.stack.append(self.__html_end_tag('blink'))
+
+ def handle_startendtag(self, tag, attrs):
+ self.stack.append(self.__html_startend_tag(tag, attrs))
+
+ def handle_data(self, data):
+ self.stack.append(data)
+
+ def __html_start_tag(self, tag, attrs):
+ return '<%s%s>' % (tag, self.__html_attrs(attrs))
+
+ def __html_startend_tag(self, tag, attrs):
+ return '<%s%s/>' % (tag, self.__html_attrs(attrs))
+
+ def __html_end_tag(self, tag):
+ return '%s>' % (tag)
+
+ def __html_attrs(self, attrs):
+ _attrs = ''
+ if attrs:
+ _attrs = ' %s' % (' '.join([('%s="%s"' % (k,v)) for k,v in attrs.iteritems()]))
+ return _attrs
+
+ @classmethod
+ def depreshun(cls, markup):
+ _p = cls()
+ _p.feed(markup)
+ _p.close()
+ return ''.join(_p.stack)
+ The actual ins-and-outs of the parser are very simple; markup like "<a href="#">Hello</a><br/>" would execute accordingly:
handle_starttag('a', [('href', '#')])
handle_data('Hello')
handle_endtag('a')
handle_startendtag('br', [])
+
+Since HTMLParser just gives you element tag names, and there attributes, SadHTML simply builds a list of strings out of what data is passed to it via the super class and then when everything is finished, ties the list back together with: ''.join(list_of_tags).
+Executing the SadHTML.depreshun method on the contents of my last blog post is a good example, part of the post was:
+
An informal poll at the Slide offices this past week yielded these interesting results: at Slide.com, nearly 100% of white people seem to like "Stuff White People Like".
+
+After running it through "SadHTML", the following markup is generated instead:
+
An informal poll at the offices this past week yielded these interesting results: at Slide.com, nearly 100% of white people seem to like .
+
+If you're curious as to how much more you can do with HTMLParser, do check out the documentation. It's far more lenient than using eXpat for parsing HTML, and it's still fast enough to be used on longer documents (there's also htmllib available for Python but I've not used it yet).
diff --git a/_posts/2008-05-04-nant-and-asp-net-on-mono.html b/_posts/2008-05-04-nant-and-asp-net-on-mono.html
new file mode 100644
index 0000000..f1485e0
--- /dev/null
+++ b/_posts/2008-05-04-nant-and-asp-net-on-mono.html
@@ -0,0 +1,142 @@
+---
+layout: post
+title: NAnt and ASP.NET on Mono
+tags:
+- Mono
+- Miscellaneous
+- Software Development
+created: 1209903968
+---
+Most of my personal projects are built on top of ASP.NET, Mono and Lighttpd. One of the benefits of keeping them all running on the same stack (as opposed to mixing Python, Mono and PHP together) is that I don't need to maintain different infrastructure bits to keep them all up and running. Two key pieces that keep it easy to dive back into the the side-project whenever I have some (spurious) free time are my NAnt scripts and my push scripts.
+
+NAnt
+I use my NAnt script for a bit more than just building my web projects, more often than not I use it to build, deploy and test everything related to the site. My projects are typically laid out like:
bin/ Built DLLs, not in Subversion
configs/ Web.config files per-development machine
libraries/ External libraries, such as Memcached.Client.dll, etc.
schemas/ Files containing the SQL for rebuilding my database
site/ Fully built web project, including Web.config and .aspx files
sources/ Actual code, .aspx.cs and web folder (htdocs/ containing styles, javascript, etc)
+
+Executing "nant run" will build the entire project and construct the full version of the web application in the site/ and finally fire up xsp2 on localhost for testing. The following NAnt file is what I've been carrying from project to project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+The Push Script
+Since I usually build and deploy on the same machine, I use a simple script called "push.sh" to handle rsyncing data from the development part of my machine into the live directories.
+
+#!/bin/bash
+###############################
+## Push script variables
+export NANT='/usr/bin/nant'
+export STAGE=`hostname`
+export SOURCE='site/'
+export LIVE_TARGET='/serv/www/domains/myproject.com/htdocs/'
+export BETA_TARGET='/serv/www/domains/beta.myproject.com/htdocs/'
+export TARGET=$BETA_TARGET
+###############################
+
+###############################
+## Internal functions
+function output {
+ echo "===> $1"
+}
+function build {
+ ${NANT} && ${NANT} site
+}
+###############################
+
+###############################
+## Build the site first
+output "Building the site..."
+build
+if [ $? -ne 0 ]; then
+ output "Looks like there was an error building! abort!"
+ exit 1
+fi
+
+###############################
+## Start actual pushing
+if [ "${1}" = 'live' ]; then
+ output " ** PUSHING THE LIVE SITE ***"
+ export TARGET=$LIVE_TARGET
+else
+ output "Pushing the beta site"
+fi
+
+output "Using Web.config-${STAGE}"
+output "Pushing to: ${TARGET}"
+
+cp config/Web.config-${STAGE} site/Web.config
+rsync --exclude *.swp --exclude .svn/ -av ${SOURCE} ${TARGET}
+
+
+Depending on the complexity of the web application I might change the scripts up on a case-by-case basis, but for the most part I have about 5-6 projects out "in the ether" that are built and deployed with a derivative of the NAnt script and push.sh listed above. In general though, they provide a good starting point for the tedious bits of non-Visual Studio-based web development (especially if you're in an entirely Linux-based environment).
+
+Hope you find them helpful :)
diff --git a/_posts/2008-07-27-experimenting-with-git-at-slide-part-1-3.html b/_posts/2008-07-27-experimenting-with-git-at-slide-part-1-3.html
new file mode 100644
index 0000000..2bff1ef
--- /dev/null
+++ b/_posts/2008-07-27-experimenting-with-git-at-slide-part-1-3.html
@@ -0,0 +1,49 @@
+---
+layout: post
+title: Experimenting with Git at Slide (Part 1/3)
+tags:
+- Slide
+- Opinion
+- Software Development
+- Git
+created: 1217161428
+---
+For the past two months I've been experimenting with varying levels of success with Git inside of Slide, Inc.. Currently Slide makes use of Subversion and relies heavily on branches in Subversion for everything from project specific branches to release branches (branches that can live anywhere from under 12 hours to three weeks). There are plenty of other blog posts about the pitfalls of branching in Subversion that I won't go into here, suffice to say, it is...sub-par. Below is a rough diagram of our general current workflow with Subversion (I've had some other developers ask me "why don't you just work in trunk?" to which I usually wax poetic about the chaos of trunk when any project gets over 5 active developers (Slide engineering is somewhere between 30-50 engineers)).
+
There are three major problems we've run up against with utilizing Subversion as our version control system at Slide:
Subversion's "branches" make context switching difficult
Depending on the age of a branch cut from trunk/, merges and maintainence is between difficult and impossible
Merging Subversion branches into each other causes a near total loss of revision history
Given that branches are a critical part of Slide's development process, we've historically looked at branch-strong version control systems as alternatives, such as Perforce. Before I joined Slide in April of 2007, I was a heavy user of Perforce for my own consulting projects as well as for some of my work with the FreeBSD project as part of the Summer of Code program. In fact, my boss sent out a "Perforce Petition" to our engineering list on my third day at Slide...we still haven't switched away from Perforce.
+
+
+
+Up until earlier this year I hadn't given it a second thought until the team I was working with grew and grew such that between me and four other engineers we were pushing a release anywhere from once to three times a week. That meant we were creating a Subversion "branch" multiple times a week, and a significant part of my daily routine became merging to our release branch and refreshing project branches from trunk/. All of a sudden Git was looking prettier and prettier, despite some of its warts. At this point in time I was already using Git for some of my personal projects that I never have time for, so I knew at the bare minimum that it was functional. What I didn't know was how to deploy and use it with a large engineering team that works in very high churn short iterations, like Slide's.
+
+
Subversion at Slide
Moving our source tree over into a system other than Subversion, from Subverison, was destined to be painful. The tree at Slide is deceptively large, we have a substantial amount of Python running around (as Slide is built, top-to-bottom, in Python) and an incredible amount of Adobe Flash assets (.swf files), Adobe Illustrator assets (.ai files) and plenty of binary files, like images (.png/gif/jpeg). Currently a full checkout of trunk/ is roughly 2.5GB including artwork, flash, server and web application code. We also have roughly 88k revisions in Subversion, the summation of three years of the company's existence. Fortunately somebody along the line wrote a script (in Perl however) called "git-svn(1)" that is designed to do exactly what I needed, move a giant tree from Subversion to Git, from start to finish (similar to svn2p4 in Perforce parlance).
+
+
+
This meant we needed a centralized, secure, repository which left us two options: Git over WebDav (https/http) orGitosis. After discovering that `git-http-push(1), the executable responsible for doing Git pushes over WebDav has tremendous memory issues, I abandoned that as an option (a `git push` of the repository resulted in memory usage peaking at 11GB virtual, 3.5GB resident memory).
+
+If you are looking to deploy Git for a larger audience in a corporate environment, I highly recommend Gitosis. What Gitosis does is allows for SSH to be used as the transport protocol for Git, and provides authentication by use of limited-shell user accounts and SSH keys; it's not perfect but it's the closest thing to maintainable for larger installations of Git (in my opinion).
+
+So far the experimenting with Git at Slide is pretty localized to just my team, but with a combination of Gitosis, git-svn(1) and some "best practices" defined for handling the new system we've successfully continued development for over the past month without any major issues.
+
+As this post is already quite lengthy, I'll be discussing the following two parts of our experimenting in subsequent posts:
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
+
+
+
+
+
+
+
+
+
diff --git a/_posts/2008-07-30-lets-swap-ipods.html b/_posts/2008-07-30-lets-swap-ipods.html
new file mode 100644
index 0000000..6f13f50
--- /dev/null
+++ b/_posts/2008-07-30-lets-swap-ipods.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Let's Swap iPods.
+tags:
+- Miscellaneous
+- Media
+created: 1217483846
+---
+Since I've started to spend such an enormous amount of my time with work and settling into a new apartment, I've had literally no time to discover new music. Because of this utter lack of time on my part, I've been pondering this idea for about the past month or two on a daily basis, I want to participate in an iPod Foreign Exchange Program.
+
+I currently own a 30GB Video iPod (black) that has about 28GB of music on it with a few assorted podcasts here and there.
+
+Here's what I'm thinking would constitute a good set of rules for swapping an iPod to "walk a mile in somebody's shoes" (musically).
We can be acquaintances, but not friends. I know what my friends listen to and can steal their iPods myself :)
The period to swap iPods would last one week
Both parties would make sure to un-sync their address book and calendars from the iPod, but not change any of the music (no trying to impress people)
The iPod swap is accompanied with a business card or means to coordinate a swap-back
Both parties must be respectful of the others' tastes, even if it's really weird (you know who you are)
+
+I went ahead and removed my calendars and contacts from my iPod just in case I run into somebody on the train that has read this post and wants to swap right away, but failing that, if you're around San Francisco, let's swap iPods :)
diff --git a/_posts/2008-08-20-one-line-automated-testing.html b/_posts/2008-08-20-one-line-automated-testing.html
new file mode 100644
index 0000000..669659c
--- /dev/null
+++ b/_posts/2008-08-20-one-line-automated-testing.html
@@ -0,0 +1,30 @@
+---
+layout: post
+title: One-line Automated Testing
+tags:
+- Slide
+- Opinion
+- Software Development
+- Hudson
+created: 1219220186
+---
+For about as long as my development team has been a number larger than one, I've been on a relatively steady "unit test" kick. With the product I've worked on for over a year gaining more than one cook in the kitchen, it became time to start both writing tests to prevent basic regressions (and save our QA team tedious hours of blackbox testing), but also to automate those tests in order to quickly spot issues.
+
+While I've been on this pretty steadily lately, I'm proud to say that automated testing was one of my first pet projects at Slide. If you ever crack into the Slide corporate network you can find my workstation under the name "ccnet" which is short for Cruise Control.NET, my first failed attempt at getting automated testing going on our now defunct Windows desktop client. As our development focus shifted away from desktop applications to social applications the ability to reliably test those systems plummeted; accordingly our test suite for these applications became paltry at best. As the organization started to scale, this simply could not stand much longer else we might not be able to efficiently push stable releases on a near-nightly schedule. As we've started to back-fill tests (test-after development?) the need to automate these tests has arisen to which I started digging aronud for something less painful to deal with than Cruise Control, enter Hudson.
+
+
Holy Hudson Batman!
I was absolutely astounded that I, nor anybody I knew, was aware of the Hudson project. Hudson is absolutely amazing as far as continuous integration systems go. The only major caveat is that the entire system is written in Java, meaning I had to beg one of our sysadmins to install Java 1.5 on the unit test machine. Once that was sorted out, starting the Hudson instance up was incredibly simple:
+java -jar hudson.war
+In our case the following to keep the JVM within manageable virtual memory limits:
+java -Xmx128m -jar hudson.war --httpPort=8888
+
+Once the Hudson instance was up and rnuning, I simply had to browse to http://unittestbox:8888/ and the entire rest of the configuration was set up from the web UI. Muy easy. Muy bueno.
+
+
Plug-it-in, plug-it-in!
One of the most wonderful aspects of Hudson is it's extensible plugin architecture. Adding plugins like "Git", "Trac" and "Jabber" means that our Hudson instance is now properly linking to Trac revisions, sending out Jabber notifications on "build" (read: test run) failures and monitoring both Subversion and Git branches for changes. From what I've seen from their plugin architecture, it would be absolutely trivial to extend Hudson with Slide-specific plugins as the needs arise.
+
+With the integration of the PyUnit XMLTestRunner (found here) and working an XML output plugin into Windmill we can easily automate testing of both our back-end code and our front-end.
+
+ Hudson in action
+
+And all with one simple java command :)
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-09-06-don-quixotes-new-side-kick-hudson.html b/_posts/2008-09-06-don-quixotes-new-side-kick-hudson.html
new file mode 100644
index 0000000..6af5a43
--- /dev/null
+++ b/_posts/2008-09-06-don-quixotes-new-side-kick-hudson.html
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Don Quixote's new side-kick, Hudson
+tags:
+- Slide
+- Software Development
+- Hudson
+created: 1220767493
+---
+I recently wrote about "one-line automated testing" by way of Hudson, a Java-based tool that helps to automate building and test processes (akin to Cruise Control and Buildbot). If you were to read this blog regularly, you'd be well aware that I work primarily with Python these days, at a web company no less! What does a web company need with a continuous integration tool? Especially if they're not using a compiled language like Java or C# (heresy!).
+
+As any engineering organization grows, it's bound to happen that you reach a critical mass of developers and either need to hire an equitable critical mass of QA engineers, or start to approach quality assurance from all sides. That is to say, automated unit testing and automated integration testing becomes a requirement for growing both as a engineering organization but as a web application provider (user's don't like broken web applications). With web products like Top Friends, SuperPoke! and Slide FunSpace we have a large amount of ever-changing code, that has been in a constant state of flux for the past 16-18 months. We can accomodate for ever-changing code on the backend for the past year and half with PyUnit and development discipline.
+
+How do you deal with months of ever changing code for the aforementinoned products' front-ends? Your options are pretty slim, you can hire a legion of black-box QA engineers to manually go through regression tests and ensure your products are in tip-top shape, or you can hire a few talented black-box QA engineers to conscript a legion of robots to go through regression tests and ensure your products are in tip-top shape. Enter Windmill. Windmill is a web browser testing framework not entirely unlike Selenium or Watir with two major exceptions: Windmill is written in Python and Windmill has a great recorder (and lots of other features). One of my colleagues at Slide, Adam Christian has been working tirelessly to push Windmill further and prepare it for enterprise adoption, the first enterprise to use it, Slide.
+
+Adam and I have been working on bringing the two ends of the testing world together with Hudson. About half of the jobs currently running inside of our Hudson installation are running PyUnit tests on various Subversion and Git branches. The other half of the jobs are running Windmill tests, and reporting back into Hudson by way of Adam's JUnit-compatible reporting code. Thanks to the innate flexibility of PyUnit and Windmill's reporting infrastructure we were able to tie all these loose ends together with a tool like Hudson that will handle Jabber-notifications or email notifications when test-runs fail and include details in it's reports.
+
+We're still working out the kinks in the system, but to date this set up has helped us fix at least one critical issue a week (with a numerous other minor issues) since we've launched the Hudson system, more often than not before said issues reach the live site and real users. If you've got questions about Windmill or Hudson you can stop by the #windmill or the #hudson channels on Freenode.
+
+Automated testing is like a really good blend of coffee, until you have it, you think "bah! I don't need that!" but after you start with it you can't help but wonder how you could tolerate the swill you used to drink.
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-09-11-resurgange-of-the-shell.html b/_posts/2008-09-11-resurgange-of-the-shell.html
new file mode 100644
index 0000000..948acaf
--- /dev/null
+++ b/_posts/2008-09-11-resurgange-of-the-shell.html
@@ -0,0 +1,121 @@
+---
+layout: post
+title: Resurgange of the shell.
+tags:
+- Mono
+- JavaScript
+created: 1221119856
+---
+Two things happened in such short proximity time-wise that I can't help but thing they're somehow related to the larger shift to interpreters. Earlier this week Miguel introduced csharp shell which forced me to dust off my shoddy Mono 1.9 build and rebuild Mono from Subversion just because this is too interesting to pass up on.
+
+One of my favorite aspects of using IronPyhton, or Python for that matter is the interpreter which allows for prototyping that doesn't involve creating little test apps that I have to build to prove a point. For example, I can work through fetching a web page in the csharp shell really easily, instead of creating a silly little application, compiling, fixing errors, and recompiling:
+
+tyler@pineapple:~/source/mono-project/mono> csharp
+Mono C# Shell, type "help;" for help
+
+Enter statements below.
+csharp> using System;
+csharp> Console.WriteLine("This changes everything.");
+This changes everything.
+csharp> String url = "http://tycho.usno.navy.mil/cgi-bin/timer.pl";
+csharp> using System.Web;
+csharp> using System.Net;
+csharp> using System.IO;
+csharp> using System.Text;
+csharp> HttpWebRequest req = HttpWebRequest.Create(url);
+(1,17): error CS0266: Cannot implicitly convert type `System.Net.WebRequest' to `System.Net.HttpWebRequest'. An explicit conversion exists (are you missing a cast?)
+csharp> HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest;
+csharp> HttpWebResponse response = req.GetResponse() as HttpWebResponse;
+csharp> StreamReader reader = new StreamReader(req.GetResponseStream() as Stream, Encoding.UTF8);
+(1,45): error CS1061: Type `System.Net.HttpWebRequest' does not contain a definition for `GetResponseStream' and no extension method `GetResponseStream' of type `System.Net.HttpWebRequest' could be found (are you missing a using directive or an assembly reference?)
+csharp> StreamReader reader = new StreamReader(response.GetResponseStream() as Stream, Encoding.UTF8);
+csharp> String result = reader.ReadToEnd();
+csharp> Console.WriteLine(result);
+
+
+
+What time is it?
+
US Naval Observatory Master Clock Time
+ Sep. 11, 07:29:02 UTC
+ Sep. 11, 03:29:02 AM EDT
+ Sep. 11, 02:29:02 AM CDT
+ Sep. 11, 01:29:02 AM MDT
+ Sep. 11, 12:29:02 AM PDT
+ Sep. 10, 11:29:02 PM AKDT
+ Sep. 10, 09:29:02 PM HAST
+
+
+I really think Miguel and Co. have adding something infinitely more useful in this Hackweek project than anything I've seen come out of recent hackweeks at Novell. The only feature request that I'd add along to the csharp shell would be "recording", i.e.:
+
+tyler@pineapple:~/source/mono-project/mono> csharp
+Mono C# Shell, type "help;" for help
+
+Enter statements below.
+csharp> Shell.record("public void Main(string[] args)");
+recording...
+csharp> using System;
+csharp> Console.WriteLien("I prototyped this in csharp shell!");
+(1,10): error CS0117: `System.Console' does not contain a definition for `WriteLien'
+/home/tyler/basket/lib/mono/2.0/mscorlib.dll (Location of the symbol related to previous error)
+csharp> Console.WriteLine("I prototyped this in csharp shell!");
+csharp> Shell.save_record("Hello.cs");
+recording saved to "Hello.cs"
+Which could conceptually generate the following file:
+using System;
+
+public class Hello
+{
+ public void Main(string[] args)
+ {
+ Console.WriteLine("I prototyped this in csharp shell!");
+ }
+}
+
+
+
+
JavaScript Shell
In addition to the C# shell, I've been playing with v8, the JavaScript engine that powers Google Chrome. The V8 engine is capable of being embedded easily, or running standalone, one of the examples they ship with is a JavaScript shell. I've created a little wrapper script to give me the ability to load jQuery into the V8 shell to prototype jQuery code without requiring a browser to be up and running:
+
+tyler@pineapple:~/source/v8> ./shell
+V8 version 0.3.0
+> load("window-compat.js");
+> load("jquery.js");
+> $ = window.$
+function (selector,context){return new jQuery.fn.init(selector,context);}
+> x = [1, 5, 6, 12, 42];
+1,5,6,12,42
+> $.each(x, function(index) { print("x[" + index + "] = " + this); });
+x[0] = 1
+x[1] = 5
+x[2] = 6
+x[3] = 12
+x[4] = 42
+1,5,6,12,42
+>
+The contents of "window-compat.js" being:
+
+/*
+ * Providing stub "window" objects for jQuery
+ */
+
+if (typeof(window) == 'undefined') {
+ window = new Object();
+ document = window;
+ self = window;
+
+ navigator = new Object();
+ navigator.userAgent = navigator.userAgent || 'Chrome v8 Shell';
+
+ location = new Object();
+ location.href = 'file:///dev/null';
+ location.protocol = 'file:';
+ location.host = '';
+};
+
+
+In general I don't really have anything insightful or especially interesting to add, but I wanted to put out my "+1" in support of both of these projects. Making any language or API more easily accessible through these shells/interpreters can really help developers double-check syntax, expected API behavior etc. Thanks Novell/Google, interpreters rock!
diff --git a/_posts/2008-09-15-lazily-loading-attributes.html b/_posts/2008-09-15-lazily-loading-attributes.html
new file mode 100644
index 0000000..2b5aa17
--- /dev/null
+++ b/_posts/2008-09-15-lazily-loading-attributes.html
@@ -0,0 +1,57 @@
+---
+layout: post
+title: Lazily loading attributes.
+tags:
+- Mono
+- Miscellaneous
+- JavaScript
+created: 1221463661
+---
+I found myself talking to Jason today about the virtues of getattr(), setattr(), and hasattr() in Python and "abusing" the dynamic nature of the language which reminded me of some lazy-loading code I wrote a while back. In February I found the need to have portions of the logic behind one of our web applications fetch data once per-request. The nature of the web applications we're building on top of the MySpace, Hi5 and Facebook platforms require some level of network data-access (traditionally via REST-like APIs). This breaks our data access model into the following tiers:
+Working with network-centric data resources is difficult in any scenario (desktop, mobile, web) but the particularly difficult thing about network data access in the mod_python-driven request model is that it will be synchronous (mod_python doesn't support "asynchronous pages" like ASP.NET does). This means every REST call to Facebook, for example, is going to block execution of the request handler until the REST request to Facebook's API tier completes.
+ def request_handler(self, *args, **kwargs):
+ fb_uid = kwargs.get('fb_sig_user')
+ print "Fetching the name for %s" % fb_uid
+ print time.time()
+ name = facebook.users.getInfo(uid=fb_uid)
+ ### WAIT-WAIT-WAIT-WAIT-WAIT
+ print time.time()
+ ### Continue generating the page...
+There is also a network hit (albeit minor) for accessing cached data or data stored in databases. The general idea is that we'll need to have some level of data resident in memory through-out a request that can differ widely from request-to-request.
+
+
Lazy loading in Python
To help avoid unnecessary database access or network access I wrote a bit of class-sugar to make this a bit easier and more fail-proof:
+class LazyProgrammer(object):
+ '''
+ LazyProgrammer allows for lazily-loaded attributes on the subclasses
+ of this object. In order to enable lazily-loaded attributes define
+ "_X_attr_init()" for the attribute "obj.X"
+ '''
+ def __getattr__(self, name):
+ rc = object.__getattribute__(self, '_%s_attr_init')()
+ setattr(self, name, rc)
+ return rc
+This makes developing with network-centric web applications a bit easier, for example, if I have a "friends" lazily-loading attribute off the base "FacebookRequest" class, all developers writing code subclassing FacebookRequest can simply refer to self.friends and feel confident they aren't incurring unnecessary bandwidth hits, and the friends-list fetching code is located in once spot. If one-per-request starts to become too resource intensive as well, it'd be trivial to override the _friends_attr_init() method to hit a caching server instead of the REST servers first, without needing to change any code "downstream."
+
+
Lazy loading in C#
Since C# is not a dynamically-typed language like Python or JavaScript, you can't implement lazily-loaded attributes in the same fashion (calling something like setattr()) but you can "abuse" properties in a manner similar to the C# singleton pattern, to get the desired effect:
+using System;
+using System.Collections.Generic;
+
+public class LazySharp
+{
+ #region "Lazy Members"
+ private Dictionary _names = null;
+ #endregion
+
+ #region "Lazy Properties"
+ public Dictionary Names
+ {
+ get {
+ if (this._names == null)
+ this._names = this.SomeExpensiveCall();
+ return this._names;
+ }
+ }
+ #endregion
+}Admittedly I don't find myself writing Facebook/MySpace/Hi5 applications these days on top of ASP.NET so I cannot say I actually use the class above in production, but conceptually it makes sense.
+
+Lazy loading attributes I find useful in the more hodge-podge situations, where code and feature-sets have both grown organically over time, they're not for everybody but I figured I'd share anyways.
diff --git a/_posts/2008-09-16-chase-auto-finance-fail.html b/_posts/2008-09-16-chase-auto-finance-fail.html
new file mode 100644
index 0000000..dae016e
--- /dev/null
+++ b/_posts/2008-09-16-chase-auto-finance-fail.html
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Chase Auto-Finance FAIL.
+tags:
+- Opinion
+created: 1221557004
+---
+I've been getting voice-mails from Chase Auto-Finance recently bugging me to pay them some money (turns out they're strapped for cash lately, something silly about irresponsible lending).
+
+All is well and good, I normally call Chase up once a month and navigate through increasingly painful phone menus and give Chase some of my money. As luck would have it, sometime between my last payment, and my current payment, Chase decided that you should really talk to a representative to make a payment. In effect, I have to talk to some poor soul working in a shitty 9-5 call center job to pay a car payment that I've paid for the past two years via an automated system. Hooray progress.
+
+
+Back to the voice mails, each one I receive I normally receive when I am at work, turns out I am receiving the voice mails because I'm too busy working to answer the phone. Unfortunately the voice mails always contain some poor soul working in a shitty 9-5 call center job asking me to call a Chase representative back to resolve my outstanding payment issue.
+
+
+Why is my bank making it so damned hard to give them money?
+
+
+In the future I intend on staying with my other bank for my loans since not only do they have reasonable customer service representatives, but they make it incredibly easy to give them money.
diff --git a/_posts/2008-09-18-hudson-notifications-with-libnotify.html b/_posts/2008-09-18-hudson-notifications-with-libnotify.html
new file mode 100644
index 0000000..d37521b
--- /dev/null
+++ b/_posts/2008-09-18-hudson-notifications-with-libnotify.html
@@ -0,0 +1,69 @@
+---
+layout: post
+title: Hudson notifications with libnotify
+tags:
+- Miscellaneous
+- Software Development
+- Linux
+- Hudson
+created: 1221806420
+---
+I've been using a Gnome-based desktop for about the past 8-9 months and one of the things I've come to really appreciate is that most Gnome applications integrate with "libnotify". Libnotify is a simple Windows taskbar-like notification system that presents status messages at the bottom of your screen. Like all great pieces of software, it has a solid Python interface which allows for incorporating it in those little 10-minutes scripts I find myself writing every now and again.
+
+One of the things I wanted to script was the notification of the build status of the numerous jobs that we're running in our Hudson instance here at Slide. Using the Universal Feed Parser and pynotify (listed under "notify-python"), I had a good little Gnome Hudson Notifier running in less than 10 minutes.
+
+
+Source code after the jump.
+
+
+import feedparser
+import pynotify
+import time
+
+BASE_TITLE = 'Hudson Update!'
+
+def success(job):
+ n = pynotify.Notification(BASE_TITLE,
+ '"%s" successfully built :)' % job,
+ 'file:///usr/share/pixmaps/gnome-suse.png')
+ n.set_urgency(pynotify.URGENCY_LOW)
+ return n
+
+def unstable(job):
+ return pynotify.Notification(BASE_TITLE,
+ '"%s" is unstable :-/' % job,
+ 'file:///usr/share/pixmaps/gnome-suse.png')
+
+def failure(job):
+ n = pynotify.Notification(BASE_TITLE,
+ '"%s" failed!' % job,
+ 'file:///usr/share/pixmaps/gnome-suse.png')
+ n.set_urgency(pynotify.URGENCY_CRITICAL)
+ return n
+
+def main():
+ pynotify.init('Hudson Notify')
+ old_items = []
+ while True:
+ feed = feedparser.parse('http://hudson/rssLatest')
+ items = [t['title'] for t in feed['entries']]
+ new_items = list(set(old_items).difference(items))
+
+ for i in new_items:
+ i = i.split(' ')
+ job, build, status = (i[0], i[1], i[2])
+ status = status.replace('(', '').replace(')','')
+ if status == 'SUCCESS':
+ success(job).show()
+ elif status == 'UNSTABLE':
+ unstable(job).show()
+ elif status == 'FAILURE':
+ failure(job).show()
+
+ old_items = items
+ time.sleep(60)
+
+if __name__ == '__main__':
+ main()
+
+It's pretty basic right now, but does everything I really wanted it to do. I may add it into a public Git repository in the near future if I spend any more time on the project. Hope you like it :)
diff --git a/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html b/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html
new file mode 100644
index 0000000..d9250bd
--- /dev/null
+++ b/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Facebook be riddled with swashbucklers!
+tags:
+- Facebook
+created: 1221810824
+---
+I've seen a lot of user-feedback about how confusing and "boring" the new Facebook redesign is, but I'm glad to know they are still having fun down there in Palo Alto, even if it's with subtle changes to their site (click to zoom)
+
+
+To enable the pirate localization, find the language combo box at the bottom-left portion of the Facebook homepage.
+Stay classy Facebook.
diff --git a/_posts/2008-09-29-team-development-with-git-part-2-3.html b/_posts/2008-09-29-team-development-with-git-part-2-3.html
new file mode 100644
index 0000000..8f2e260
--- /dev/null
+++ b/_posts/2008-09-29-team-development-with-git-part-2-3.html
@@ -0,0 +1,31 @@
+---
+layout: post
+title: Team Development with Git (Part 2/3)
+tags:
+- Slide
+- Software Development
+- Git
+created: 1222755722
+---
+In my last post on Git, Experimenting with Git at Slide, I discussed most of the technical hurdles that stood in our way with evaluating Git for a Subversion tree that has 90k+ revisions and over 2GB of data held within. As I've learned from any project that involves more than just myself, technology is only half the battle, the other half is the human element. One of the most difficult things to "migrate" when switching to something as critical to a developer's workflow as a VCS, is habits, good ones and bad ones.
+
+
The Bad Habits
When moving my team over to Git, I was able to identify some habits that I view as "bad" that could either be blamed on how we have used Subversion here at Slide, or the development workflow that Subversion encourages. For the sake of avoiding flamewars, I'll say it's 51% us, 49% the system.
+
+
The Occasional Committer
Chances are that if you're working on "something super important!" you fall into this bad habit. Because of the nature of trunk in Subversion, if you commit half-finished work into a team-branch or trunk itself, you could cause plenty of pain for your fellow developers. As a result, you tend to commit at the end of a long day working on something, or only after something has been completed. The 9 hours of sweat and frustration you've spent pounding away on 300 lines of code is now summed up in one commit message:
Turns out there was a race-condition here, re #52516
Now three months from now when you return to the same 300 lines of code and try to figure out what the hell led to this mess, you're left with the commit message above, and nothing more.
The Less-than-attentive Developer
I've worked on a Mac for the majority of my time at Slide, as do most of my compatriots, and sooner or later one of two things will happen:svn add some/directory/ and/or svn commit. This usually results in a second commit to come into the tree with a commit message like:
Whoops, accidentally checked in resource forks
This isn't that large of a problem, except for the implication of the second command there, svn commit will commit all outstanding changes in your working copy starting in the current working directory, and recursing through children directories. I'm probably more anal-retentive about my commits than most, but I usually do a diff before I commit to make sure I'm aware of what I'm about to commit, but I've seen plenty of developers skip this step.
The Over-Confident Merger
I've fallen into this trap numerous times when merging "old" branches back into trunk, especially with binary files that may have been changed in trunk, or in my branch (hell if I know!). One thing I can speak to anecdotally from our work at Slide, is that the probability of nonsensical conflicts rises with a branch's age. The rate of our repository progresses at about 50 commits to trunk per day (~150 commits across the board), if there is a branch cut from trunk, usually within two weeks it can become extremely difficult to merge back into trunk without constant "refreshes" or merges from trunk into the branch.
+
+If you're not careful when folding that branch back down into trunk, you can inadvertantly revert old binary files or even text files to previous states which will usually cause other individuals in the engineering organization gripe at you and your QA department to pelt you with rocks. For bonus points, you could (as I have done before) accidentally commit conflicting files earning a gold star and a dunce hat for the day. This merging pain led me to originally write my merge-safe.py script so long ago.
+
+
The Slide Way to Git
Fortunately for us, I think the decentralized nature of Git has helped us enforce some best practices when it comes to the bad habits above. "The Occassional Committer" is all but done away with thanks to the ability to atomically commit and revert revisions at a whim and have those changes not propogated to other developers until there has been an explicit push or pull.
+
+Unfortunately however, "The Less-than-attentive Developer" isn't solved so easily. To date I've sat next to two engineers that were new to Git, and watched them both execute the same fateful command: git add .
+Not realizing their mistake, they accidentally commit a truckload of build and temporary files (.so, .swp, .pyc, etc) interspersed with their regular work that they meant to commit. Git cannot prevent a developer from shooting themselves in the foot, but it does prevent them from shooting everybody else in the foot along with it (unless they commit, and then push their changes upwards).
+
+"The Over-confident Merger" grows more and more confident in the Git-based workflow. Since Git handles changesets atomically, it becomes trivial to merge branch histories together or cherry-pick one revision and apply to an entirely separate branch. I've not yet seen a Git conflict that wasn't a true conflict insofar that it was quite literally one line of code changing in two different ways between branch histories. As an aside, when using git-svn, be prepared for all the merging "fun" that Subversion has to offer when propogating changes between the two systems.
+
+
Basic Team Workflow
The manner in which we use Git is more like a centralized-decentralized version control system. We still have a "master" repository, which provides a central synchronization point when pushing stage servers, or when bringing code into Subversion to be pushed to live servers. For any particular project one of the developers will create a branch that will serve as the primary project branch, take the "superpoke-proj" branch as an example. That developer will push this branch to "origin" (or the master repository) such that other developers can "track" that branch and contribute code. For the purposes of this example, let's say Paul and Peter are working in "superpoke-proj", while Paul is working he will incrementally commit his work, but once he has resolved/fixed a ticket, he will perform a git push and then mark the ticket appropriately such that a QA engineer can verify the fix. If Paul and Peter are working on something that "breaks the build" but they need to collaborate on it together, Paul can perform a git pull from Peter and vice versa, and again, once they're done those changes will be pushed to origin. This model allows for developers to work in relative isolation so they're not inadvertantly stepping on each others' toes, but also close enough that they can collaborate in explicit terms, i.e. when they are ready for changes to be propogated to each other or the rest of the team.
+
+
Conclusion
Our workflow, like most things at companies under 500 employees is still a "work in progress™". I think we've found the right balance thus far for the team between freedom and process the allow for sufficient mucking around in the codebase in a way that provides the most amount of time actually writing code with as little possible time spent dealing with the overhead of anything else (merging, etc). There's nothing inherently special in the way we use Git, but we've found that it works for the way we work, which is to say in a very tight release schedule that's requires multiple branches per week and plenty of merging from branch-to-branch whether it be from another team or another part of the same team.
+
+Of course, your mileage may vary.
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-10-01-git-back-into-subversion-mostly-automagically-part-3-3.html b/_posts/2008-10-01-git-back-into-subversion-mostly-automagically-part-3-3.html
new file mode 100644
index 0000000..8fb300e
--- /dev/null
+++ b/_posts/2008-10-01-git-back-into-subversion-mostly-automagically-part-3-3.html
@@ -0,0 +1,150 @@
+---
+layout: post
+title: Git back into Subversion, Mostly Automagically (Part 3/3)
+tags:
+- Slide
+- Software Development
+- Git
+created: 1222929712
+---
+Thus far I've covered most of the issues and hurdles we've addressed while experimenting with Git at Slide in parts 1 and 2 of this series, the one thing I've not covered that is very important to address is how to work in the "hybrid" environment we currently have at Slide, where as one team works with Git and the rest of the company works in Subversion. Our setup involves having a "Git-to-Subverison" proxy repository such that everything to the "left" of that proxy repository is entirely Subversion without exceptions and everything to the "right" of that repository is entirely Git, without exceptions. Part of my original motivation for putting this post at the end of the series was that, when I originally wrote the first post on "Experimenting with Git at Slide" I actually didn't have this part of the process figured out. That is to say, I was bringing code back and forth between Git and Subversion courtesy of git-svn(1) and some gnarly manual processes.
+
+
No Habla Branching
The primary issue when bringing changesets from Git to Subversion is based in the major differences between how the two handle branching and changesets to begin with. In theory, projects like Tailor were created to help solve this issue by first translating both the source and destination repositories into an intermediary changeset format in order to cross-apply changes from one end to the other. Unfortunately after I spent a couple days battling with Tailor, I couldn't get it to properly handle some of the revisions in Slide's three year history.
+
+If you've ever used git-svn(1) you might be familiar with the git-svn dcommit command, which will work for some percentage of users that want to maintain dual repositories between Git and Subversion, things break down however once you introduce branching into the mix.
+
Up until Subversion 1.5, Subversion had no concept of "merge tracking" (even in 1.5, it requires the server and client to be 1.5, it also makes nasty use of svn props). Without the general support for "merge tracking" the concept of a changeset sourcing from a particular branch or the concept of a "merge commit" are entirely foreign in the land of Subversion. In less mumbo jumbo, this effectively means that the "revisions" that you would want to bring from Git into Subversion need to be "flattened" when being "dcommitted" into Subversion's trunk. Git supports a means of flattening revision history when merging and pulling by way of the "--squash" command line argument, so this flattening for git-svn is possible.
+
+
Giant Disclaimer
What I'm about to write I dutifully accept as Git-heresy, a nasty hack and not something I'm proud of.
+
+
Flattening into Subversion
First the icky bash script that supports properly flattening revisions into the "master" branch in the git-svn repository and dcommits the results:
#!/bin/bash
+
+MERGE_BRANCH=mergemaster
+REPO=$1
+BRANCH=$2
+
+if [[ -z "${1}" || -z "${2}" ]]; then
+ echo "===> You must provide a \"remote\" and a \"refspec\" for Git to use!"
+ echo "===> Exiting :("
+ exit 1;
+fi
+
+LATEST_COMMIT=`git log --max-count=1 --no-merges --pretty=format:"%H"`
+
+function master
+{
+ echo "==> Making sure we're on 'master'"
+ git checkout master
+}
+
+function setup_mergemaster
+{
+ master
+ echo "==> Killing the old mergemaster branch"
+ git branch -D $MERGE_BRANCH
+
+ echo "==> Creating a new mergemaster branch"
+ git checkout -b $MERGE_BRANCH
+ git checkout master
+}
+
+function cleanup
+{
+ rm -f .git/SVNPULL_MSG
+}
+
+function prepare_message
+{
+ master
+
+ echo "===> Pulling from ${REPO}:${BRANCH}"
+ git pull ${REPO} ${BRANCH}
+ git checkout ${MERGE_BRANCH}
+
+ echo "==> Merging across change from master to ${MERGE_BRANCH}"
+ git pull --no-commit --squash . master
+
+ cp .git/SQUASH_MSG .git/SVNPULL_MSG
+
+ master
+}
+
+function merge_to_svn
+{
+ git reset --hard ${LATEST_COMMIT}
+ master
+ setup_mergemaster
+
+ echo "===> Pulling from ${REPO}:${BRANCH}"
+ git pull ${REPO} ${BRANCH}
+ git checkout ${MERGE_BRANCH}
+
+ echo "==> Merging across change from master to ${MERGE_BRANCH}"
+ git pull --no-commit --squash . master
+
+ echo "==> Committing..."
+ git commit -a -F .git/SVNPULL_MSG && git-svn dcommit --no-rebase
+
+ cleanup
+}
+
+setup_mergemaster
+
+prepare_message
+
+merge_to_svn
+
+master
+
+echo "===> All done!"
Gross isn't it? There were some interesting things I learned when experimenting with this script, but first I'll explain how the script is used. As I mentioned above there is the "proxy repository", this script operates on the git-svn driven proxy repository, meaning this script is only invoked when code needs to be propogated from Git-to-Subversion as opposed to Subversion-to-Git which git-svn properly supports by default in all cases. Since this is a proxy repository, that means all the "real" code and goings-on occur in the "primary" Subversion, and "primary" Git repositories, so the code is going along this path: Primary_SVN <-> [proxy] <-> Primary_Git
+This setup means when we "pull" (or merge) from Primary_Git/master we are going to be flattening at that point in order to properly merge it into the Primary_SVN. Without further ado, here's the breakdown on the pieces of the script:
+function setup_mergemaster
+{
+ master
+ echo "==> Killing the old mergemaster branch"
+ git branch -D $MERGE_BRANCH
+
+ echo "==> Creating a new mergemaster branch"
+ git checkout -b $MERGE_BRANCH
+ git checkout master
+}What the setup_mergemaster branch is responsible for is deleting any prior branches that have been used for merging into the proxy repository and Primary_SVN. It gives us a "mergemaster" branch in the git-svn repository that is effectively at the same chronological point in time as the master branch before any merging occurs.
+function prepare_message
+{
+ master
+
+ echo "===> Pulling from ${REPO}:${BRANCH}"
+ git pull ${REPO} ${BRANCH}
+ git checkout ${MERGE_BRANCH}
+
+ echo "==> Merging across change from master to ${MERGE_BRANCH}"
+ git pull --no-commit --squash . master
+
+ cp .git/SQUASH_MSG .git/SVNPULL_MSG
+
+ master
+}The prepare_message function is part of the nastiest code in the entire script, in order to get an accurate "squashed commit" commit message when the changesets are pushed into Primary_SVN, we have to generate the commit message separately from the actual merging. Since this function is performing a `git pull` from "master" into "mergemaster" the changesets that are being pulled are going to be the only ones that show up (for reasons I'm about to explain).
+function merge_to_svn
+{
+ git reset --hard ${LATEST_COMMIT}
+ master
+ setup_mergemaster
+
+ echo "===> Pulling from ${REPO}:${BRANCH}"
+ git pull ${REPO} ${BRANCH}
+ git checkout ${MERGE_BRANCH}
+
+ echo "==> Merging across change from master to ${MERGE_BRANCH}"
+ git pull --no-commit --squash . master
+
+ echo "==> Committing..."
+ git commit -a -F .git/SVNPULL_MSG && git-svn dcommit --no-rebase
+
+ cleanup
+}If you noticed above in the full script block, the "LATEST_COMMIT" code, here's where it's used, it is one of the most important pieces of the entire script. Basically the LATEST_COMMIT piece of script grabs the latest non-merge-commit hash from the `git log` output and saves it for later use (here) where it's used to rollback the proxy repository to the point in time just before the last merge commit. This is done to avoid issues with git-svn(1) not understanding how to handle merge commits whatsoever. After rolling back the proxy repository, a new "mergemaster" branch is created. After the mergemaster branch is created, the actual Primary_Git changesets that differ between the proxy repository and Primary_Git are pulled into the proxy repository's master branch, and sqaushed into the mergemaster branch where they are subsequently committed with the commit message that was prepared before. The "prepare_message" part of the script becomes important at that step because the "squashed commit" message that Git generates at this point in time will effectively contain every commit that has ever been proxied across in this manner ever.
+
+After the "merge_to_svn" function has been run the "transaction" is entirely completed and the changesets that once differed between Primary_SVN/trunk and Primary_Git/master are now normalized.
+
+
Mostly Automagically
In the near future I intend on incorporating this script into the post-receive hook on Primary_Git in such a way that will truly propogate changesets automatically from Primary_Git into Primary_SVN, but currently I'm utilizing one of my new favorite "hammers', Hudson (see: One-line Automated Testing). Currently there are two jobs set up for proxying changesets across, the first "Subversion-to-Git" simply polls Subversion for changes and executes a series of commands when changes come in: git-svn fetch && git merge git-svn && git push $Primary_Git master. This is fairly straight-forward and fits in line with what git-svn(1) is intended to do. The other job that I created is "Git-to-Subversion" which must be manually invoked by a user, but still will automatically take care of squashing commits into Primary_SVN/trunk (i.e. bash svnproxy.sh $Primary_Git master).
+
+
Wrap-up
Admittedly, this sort of setup leaves a lot to be desired. In the ideal world, Tailor would have coped with both our Git and our Subversion repositories in such a way that would have made this script nothing more than a silly idea I had on a bus. Unfortunately that wasn't case and the time budget I had for figuring out a way to force Tailor to work was about 47.5 hours less than it took me to sit down and write the script above. I'd be interested to see other solutions other organizations are utilizing to migrate from one system to the other, but at the time of this writing I can't honestly say I've heard much about people dealing with the "hybrid" scenario that we have currently at Slide.
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-10-04-hudson-build-bookmarklet.html b/_posts/2008-10-04-hudson-build-bookmarklet.html
new file mode 100644
index 0000000..f0bda40
--- /dev/null
+++ b/_posts/2008-10-04-hudson-build-bookmarklet.html
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Hudson Build Bookmarklet
+tags:
+- Miscellaneous
+- Software Development
+- Hudson
+created: 1223112966
+---
+During the usual friday-frenzy I sat down and wrote a quick 10 minute little bookmarklet to start a Hudson job. Unlike most bookmarklets that "do things" this one actually "does things" but doesn't take you away from your current page. Using the Hudson Remote Access API you can query information from Hudson programmatically, but you can also kick off builds remotely with nothing more than a simple HTTP request to the properly formed URL.
+
+By dragging the link below to your bookmark bar, and updating the URL within ("http://hudson/") to the URL of your Hudson instance, you can queue a Hudson build from any page at any time (without leaving the page).
+
After talking the concept of making cross-domain HTTP requests over with Sergio, he suggested just using an "IMG" tag (or "IFRAME") to accomplish the task. The bookmarklet doesn't actually have to send any form parameters or receive any data, Hudson just needs to receive any HTTP request to the right URL. By creating the IMG object in JavaScript, and appending it to the body of the current page the user is on, it'll effectively con the browser into making the HTTP request without needing to pull off any XmlHttpRequest hacks. One of the more interesting things that we found out when playing with the end of the bookmarklet, was that if we returned "false" or tried to wrap the whole thing in a closure, the link would still execute and the browser would change pages. However, if we stuck an "alert()" call into the tail end of the bookmarklet JavaScript, execution would stop and the link wouldn't change the page in the browser (tested this in Firefox 3).
+
+Happy Hudsoning :)
diff --git a/_posts/2008-10-09-i-hate-it-when-the-onion-is-factual.html b/_posts/2008-10-09-i-hate-it-when-the-onion-is-factual.html
new file mode 100644
index 0000000..83543ab
--- /dev/null
+++ b/_posts/2008-10-09-i-hate-it-when-the-onion-is-factual.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: I hate it when The Onion is factual.
+tags:
+- Opinion
+- Miscellaneous
+created: 1223562679
+---
+I saw this referenced by an op-ed piece I read in a restaurant a few weeks back and had to share, as it's become more and more depressing.
+
+This is a piece run by The Onion on January 17, 2001 shortly after George W. Bush came into office netitlted: Bush: 'Our Long National Nightmare Of Peace And Prosperity Is Finally Over
+
+I'm going to go cry in a corner now.
diff --git a/_posts/2008-11-05-reliable-locks-in-hudson.html b/_posts/2008-11-05-reliable-locks-in-hudson.html
new file mode 100644
index 0000000..7303c84
--- /dev/null
+++ b/_posts/2008-11-05-reliable-locks-in-hudson.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Reliable Locks in Hudson
+tags:
+- Slide
+- Hudson
+created: 1225949021
+---
+There has been some amount of discussion on the Hudson user's list recently about the status of the "Locks and Latches" plugin. The plugin allows for one to create "locks" for Jobs in a similar manner to how "locks" work in a multithreaded programming environment. The need for such a plugin becomes very clear once you start to run multiple jobs that depend on some set of shared resources, take the following example:
Jobs A,B,C must run unit tests that fetch data from a test site
Slave #1 can only run one instance of Apache at a time
+
+How one would accomplish this with the Locks and Latches plugin would be to create a lock like "Site Lock" in the Hudson configuration, and then bind Jobs A, B, C to that Lock. Making the (large) assumption that the plugin works correctly and locks properly in order to prevent A and B from running concurrently, this would be enough to satisfy the requirements we have for the scenario above. Unfortunately it seems the plugin is largely unmaintained and buggy; in the past couple weeks of experimenting with such a set up on a variety of different slaves we've noticed that the locks aren't always respected, causing some locked jobs to execute in parallel spewing bad test results and build failures (the crux of this issue seems ot have been reported by Sergio Fernandes in #2450).
+
+The Loopback Slave
+The easiest way I found to work around the short-comings of the Locks and Latches plugin was to "break up" the Locks. Locks are only really useful if you have more than one "executor" on a Hudson node, in order to allow Hudson to execute jobs simultaneously. In essence, if you only have one executor, the Hudson queueing system will technically perform your "lock" for you by default. And thus the "loopback slave" was born! When explaining this to a co-worker, I likened my workaround to the fork(2) call, whereas the Locks and Latches plugin is much more of a pthread_mutex_lock(2) call. According to the "Distributed Builds" page on the Hudson wiki, you can start slave agent headlessly on any machine, so why not the master node? Above is the configuration of one such "loopback slave" that took the place of one of the executors on the master node.
After setting up the loopback slave, it's just a matter of tying the Job to that node for building.
+
+In short our set up was before: Jobs A, B, C all use the Lock "Site Job" in order to queue properly. With this change, now there is no lock, and Jobs A, B, C are all bound to the loopback slave in place of the lock on the master node. While certainly not ideal, given the frustrations of the Locks and Latches plugin going unmaintained this is the best short-term solution I've come up with thus far.
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-11-22-delightfully-wrong-about-git.html b/_posts/2008-11-22-delightfully-wrong-about-git.html
new file mode 100644
index 0000000..d21ce58
--- /dev/null
+++ b/_posts/2008-11-22-delightfully-wrong-about-git.html
@@ -0,0 +1,20 @@
+---
+layout: post
+title: Delightfully Wrong About Git
+tags:
+- Slide
+- Software Development
+- Git
+created: 1227408710
+---
+A very long time ago I mentioned on Twitter that I was looking at Git as a replacement for Subversion and Perforce with my personal projects, but lamented moving to Git at Slide would not be feasible
Like most disagreements I've had with people on technology in the past, immediately after I said it, I actively tried to prove myself wrong. Back in April when I made the statement above, Subversion 1.4 was "good enough" (just barely) for what we wanted to do as far as source control, but I became more and more curious about whether or not we could move to Git.
+
+Back in April, after spending a week with projects like Tailor and git-svn(1) I started to look at the potential of moving just my team over to Git for evaluation purposes. By the end of May I had requested Git to be installed on the machines that we use for development on a day-to-day basis and we moved the team over to Git by the second week of June.
+
+What followed were six months of sloshing uphill, some of the most notable milestones that we had to figure out in this time frame were:
Whereas in the Subversion architecture with a central repository there is a very clear development focal point for sharing code between developers, what is this in the Git workflow?
How do you ensure developers don't forget code was committed "in that one branch, in that one repository" and keep track of code
How will Git integrate with Hudson, Trac and our other pieces of development infrastructure? (answered here)
I'll be answering these questions and share some of the scripts, hooks, and documentation we've written internally to make moving to Git throughout the company a reality. I wish I could say I was responsible for it all, but there were a number of otherengineers that were extremely important in defining best practices, and what this shiny new world without Subversion would look like.
+
+At the end of the day, I'm pleased as punch with the transition. I don't hate Subversion, I just love Git; call me "spoiled" but I think we deserve something more than a system that strives to be "a better CVS".
+
+Update: I've posted an addendum: Why we chose Git, a rebuttal
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-11-23-git-integration-with-hudson-and-trac.html b/_posts/2008-11-23-git-integration-with-hudson-and-trac.html
new file mode 100644
index 0000000..69112e8
--- /dev/null
+++ b/_posts/2008-11-23-git-integration-with-hudson-and-trac.html
@@ -0,0 +1,190 @@
+---
+layout: post
+title: Git integration with Hudson and Trac.
+tags:
+- Slide
+- Software Development
+- Git
+created: 1227505864
+---
+As I mentioned in my previous post about Git at Slide, I wanted to answer some questions that we had to answer to migrate to Git for our development workflow. One of the major questions that had to be answered, especially for our QA department to sign off on the idea was:
How will Git integrate with Hudson, Trac and our other pieces of development infrastructure?
+
+For us to use any version control system, centralized or decentralized, there had to be a "central" point for changes to integrate into in order for us to properly test releases and then ship them to the live site. With this requirement, we oriented our use of Git around a centralized repository which developers pull from, and push to on a regular basis.
+
+In order for Git to integrate into Trac and Hudson, we opted for baking the functionality we needed into the post-receive hook on the centralized repository instead of relying on GitTrac, or the Hudson Git plugin to do what we needed it do to.
+
+You can find the script below, or in this GitHub repository. The script requires the Trac XML-RPC plugin to be installed in order to properly annotate tickets when changes are pushed into the central repository. The notation syntaxes that the post-receive.py script supports in commit messages are:
re #12345
+qa #12345
+attn bbum,fspeirs
+
+As one might expect, the first notation: "re #12345" will simply annotate a ticket with the commit message and the branch in which the commit was pushed into. The "qa #12345" notation part of an internal notation of marking tickets in Trac as "Ready for QA", which let's our QA engineers know when tickets are ready to be verified; a "qa" note in a commit message will reference the commit and change the status of the ticket in question. The final notation that the script supports: "attn bbum,fspeirs" is purely for calling attention to a code change, or to ask for a code review. When a commit is pushed to the central repository with "attn" in the commit message, an email with the commit message and diff will be emailed to the specified recipients.
+
+In addition to updating Trac tickets, pushes into any branch that have a Hudson job affiliated will use the Hudson External API to queue a build for that branch. In effect, it you "git push origin master", the post-receive.py script will ping Hudson and ask it to queue a build of the "master" job.
+
+I have included the script inline below for those weary of clicking links like this one to the GitHub repository containing the script. Enjoy :)
+
+
'''
+Copyright (c) 2008 Slide, Inc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+'''
+
+'''
+ For questions, patches, etc contact R. Tyler Ballance
+'''
+import getpass
+import os
+import re
+import socket
+import smtplib
+import sys
+import time
+import xmlrpclib
+
+from optparse import OptionParser
+
+MAIL_SERVER = 'your_mail_server.com'
+MAIL_SUFFIX = '@mycompany.com'
+BUILD_HUDSON = True
+HUDSON_URL = 'http://hudson'
+TRAC_XMLRPC_URL = 'URL_TO_TRAC/projects/MYPROJECT/login/xmlrpc'
+
+def rpcProxy(user='qatracbot', password=None):
+ password = password or os.getenv('TRAC_PASS')
+ return xmlrpclib.ServerProxy('https://%s:%s@%s' % (user, password, TRAC_XMLRPC_URL))
+
+def _send_commit_mail(user, address, subject, branch, commits, files, diff):
+ print 'Sending a GITRECEIVE mail to %s' % address
+ message = 'Commits pushed to %s:\n--------------------------------------\n\n%s\n--------------------------------------\n%s\n--------------------------------------\n%s' % (branch, commits, files, diff)
+ _send_mail(user, address, subject, message)
+def _send_attn_mail(user, destuser, diff):
+ print 'Sending a "please review" mail to %s' % destuser
+ message = '''Good day my most generous colleague! I would hold you in the highest esteem and toast you over my finest wines if you would kindly review this for me\n\n\t - %(user)s\n\nDiff:\n------------------------------------------------\n%(diff)s''' % {'diff' : diff, 'user' : user}
+ addresses = []
+ for d in destuser.split(','):
+ addresses.append('%s%s' % (d, EMAIL_SUFFIX))
+ _send_mail(user, addresses, 'Please review this change', message)
+
+def _send_mail(user, address, subject, contents):
+ try:
+ if not isinstance(address, list):
+ address = [address]
+ s = smtplib.SMTP(MAIL_SERVER)
+ message = 'From: %s%s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s\n' % (user, MAIL_SUFFIX, ', '.join(address), subject, contents)
+ s.sendmail('%s%s' % (user, MAIL_SUFFIX), address, message)
+ s.quit()
+ except:
+ print 'Failed to send the email :('
+
+def _update_ticket(ticket, message, options={}):
+ rpc = rpcProxy()
+ rpc.ticket.update(ticket, message, options)
+ return rpc
+
+def find_re(commit):
+ return map(int, re.findall(r'(?i)\s+re\s*#([0-9]+)', commit))
+def handle_re(branch, commit, ticket):
+ print 'Annotating ticket #%s' % ticket
+ message = '''The following was committed in "%(branch)s":
+ {{{
+%(commit)s }}}
+ ''' % {'branch' : branch, 'commit' : commit}
+ _update_ticket(ticket, message)
+
+def find_qa(commit):
+ return map(int, re.findall(r'(?i)\s+qa\s*#([0-9]+)', commit))
+def handle_qa(branch, commit, ticket):
+ print 'Marking ticket #%s as "ready for QA"' % ticket
+ message = '''The following was committed in "%(branch)s":
+ {{{
+%(commit)s }}}
+ ''' % {'branch' : branch, 'commit' : commit}
+ rpc = _update_ticket(ticket, message, options={'status' : 'qa'})
+
+def find_attn(commit):
+ return re.findall(r'(?i)\s+attn\s*([A-Za-z,]+)', commit)
+def handle_attn(branch, commit, attn):
+ # Unpack commit from this: "commit 5f4c31f3c31347c62d68ecb5f2c9afa3333f4ad0\nAuthor: R. Tyler Ballance \nDate: Wed Nov 12 16:57:32 2008 -0800 \n\n Merge commit 'git-svn' \n\n \n \n"
+ try:
+ commit_hash = commit.split('\n')[0].split(' ')[1]
+ except:
+ return # fuk it
+ diff = os.popen('git show --no-color %s --pretty=format:"Author: %%cn <%%ce>%%n%%s%%n%%n%%b%%n%%n%%H"' % commit_hash).read().rstrip()
+ _send_attn_mail(getpass.getuser(), attn, diff)
+
+def mail_push(address, oldrev, newrev, refname):
+ user = getpass.getuser()
+ machine = socket.gethostname()
+ base_git_diff = 'git diff %s %s' % (oldrev, newrev)
+ files_diffed = os.popen('%s --name-status' % (base_git_diff)).read().rstrip()
+ full_diff = os.popen('%s -p --no-color' % (base_git_diff)).read().rstrip()
+ ''' git rev-parse --not --branches | grep -v "$new" | git rev-list "$old".."$new" --stdin '''
+ commits = os.popen('git rev-parse --not --branches | grep -v "%s" | git rev-list %s..%s --stdin --pretty=format:"Author: %%cn <%%ce>%%nDate: %%cd %%n%%n %%s %%n%%n %%b %%n %%n-------[post-receive marker]------%%n" --first-parent ' % (newrev, oldrev, newrev)).read().rstrip()
+ branch = refname.split('/')[-1]
+ mail_subject = 'GITRECEIVE [%s/%s] %s files changed' % (machine, branch, len(files_diffed.split('\n')))
+
+ if branch == 'master-release':
+ print 'Tagging release branch'
+ tagname = 'livepush_%s' % (time.strftime('%Y%m%d%H%M%S', time.localtime()))
+ sys.stderr.write('Creating a tag named: %s\n\n' % tagname)
+ os.system('git tag %s' % tagname)
+ mail_subject = '%s (tagged: %s)' % (mail_subject, tagname)
+
+ if BUILD_HUDSON_JOB:
+ print 'Queuing the Hudson job for "%s"' % branch
+ os.system('/usr/bin/env wget -q -O /dev/null http://%s/job/%s/build' % (HUDSON_URL, branch))
+
+ _send_commit_mail(user, address, mail_subject, branch, commits, files_diffed, full_diff)
+
+ if branch == 'master':
+ return # we don't want to update tickets and such for master/merges
+
+ commits = filter(lambda c: len(c), commits.split('-------[post-receive marker]------'))
+ commits.reverse()
+ for c in commits:
+ if c.find('Squashed commit') >= 0:
+ continue # Skip bullshit squashed commit
+
+ for attn in find_attn(c):
+ handle_attn(branch, c, attn)
+
+ for ticket in find_re(c):
+ handle_re(branch, c, ticket)
+
+ for ticket in find_qa(c):
+ handle_qa(branch, c, ticket)
+
+
+if __name__ == '__main__':
+ op = OptionParser()
+ op.add_option('-m', '--mail', dest='address', help='Email address to mail git push messages to')
+ op.add_option('-o', '--oldrev', dest='oldrev', help='Old revision we\'re pushing from')
+ op.add_option('-n', '--newrev', dest='newrev', help='New revision we\'re pushing to')
+ op.add_option('-r','--ref', dest='ref', help='Refname that we\'re pushing')
+ opts, args = op.parse_args()
+
+ if not opts.address or not opts.oldrev or not opts.newrev or not opts.ref:
+ print '*** You left out some needed parameters! ***'
+ exit
+
+ mail_push(opts.address, opts.oldrev, opts.newrev, opts.ref)
+
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-11-24-git-protip-stash-the-goods-yo-git-stash.html b/_posts/2008-11-24-git-protip-stash-the-goods-yo-git-stash.html
new file mode 100644
index 0000000..c94b45b
--- /dev/null
+++ b/_posts/2008-11-24-git-protip-stash-the-goods-yo-git-stash.html
@@ -0,0 +1,71 @@
+---
+layout: post
+title: "Git Protip: Stash the goods yo (git stash)"
+tags:
+- Slide
+- Git
+created: 1227599406
+---
+For about a month now I've been sending weekly "Protip" emails about Git to the rest of engineering here at Slide. I've been using them to slowly and casually introduce some of the more "interesting" features Git has to offer as we move away from Subversion entirely. Below is the first Protip I sent around, I'll be sure to send the rest in good time.
+
+
+
+Given the nature of how Git is structured, in that your "working copy" is also your "repository" you might find yourself switching branches relatively often. While you can actually switch branches with uncommited changes outstanding in your Git directory, it's not advised (as you might forget you're commiting changes in the wrong branch, etc). You have two options if you are halfway through some work, one is to commit a checkpoint revision, but the other is to make use of the git stash command.
+
+A scenario where this becomes especially useful would be: Bill is working in his local branch "wip-funtime" on replacing large swaths of unnecessary useless code and Ted accidentally pushes some of Bill's other changes from another branch live and things break. Bill could commit his code and write a fairly uninformative log message like "checkpoint" which cheapens the value of the revision history of his changes or Bill can use git stash to snapshot his currently working state and context switch. In this case Bill would execute the following commands:
+
+
git stash
+
git checkout master-media
+
perform hotfixes
+
git checkout wip-funtime
+
git stash pop
+
+
+After performing the git stash pop command, Bill's Git repository will be in the exact same state, all his uncommitted changes in tact, as it was when he originally stashed and context-switched.
+
+For specific usage of `git stash` refer to the git stash man page
+
+
+
Example usage of `git stash`
+Stashing changes away
+
+tyler@starfruit:~/source/git/main/bt> git stash
+Saved working directory and index state "WIP on master-topfriends: 7b1ce9e... TOS copy fix"
+(To restore them type "git stash apply")
+HEAD is now at 7b1ce9e TOS copy fix
+tyler@starfruit:~/source/git/main/bt>
+Looking at the stash
+
+tyler@starfruit:~/source/git/main/bt> git stash list
+stash@{0}: WIP on master-topfriends: 7b1ce9e... TOS copy fix
+stash@{1}: On master-topfriends: starfruit complete patchset
+stash@{2}: On wip-classmethod: starfruit patches
+tyler@starfruit:~/source/git/main/bt>
+Grabbing the latest from the stash
+
+tyler@starfruit:~/source/git/main/bt> git stash pop
+Dropped refs/stash@{0} (94b9722b5a999c32c4361d795ee8f368d8412f9a)
+tyler@starfruit:~/source/git/main/bt>
+Grabbing a specific stash
+
+tyler@starfruit:~/source/git/main/bt> git stash list
+stash@{0}: WIP on master-topfriends: 7b1ce9e... TOS copy fix
+stash@{1}: On master-topfriends: starfruit complete patchset
+stash@{2}: On wip-classmethod: starfruit patches
+tyler@starfruit:~/source/git/main/bt> git stash apply 2
+# On branch master-topfriends
+# Changed but not updated:
+# (use "git add ..." to update what will be committed)
+#
+# modified: db/dbroot.py
+# modified: gogreen/coro.py
+# modified: py/bin/_makepyrelease.py
+# modified: py/initpkg.py
+# modified: py/misc/_dist.py
+# modified: py/misc/testing/test_initpkg.py
+# modified: py/path/local/local.py
+# modified: py/test/terminal/terminal.py
+tyler@starfruit:~/source/git/main/bt>
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-11-24-why-we-chose-git-a-rebuttal.html b/_posts/2008-11-24-why-we-chose-git-a-rebuttal.html
new file mode 100644
index 0000000..d6a606c
--- /dev/null
+++ b/_posts/2008-11-24-why-we-chose-git-a-rebuttal.html
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Why we chose Git, a rebuttal.
+tags:
+- Slide
+- Opinion
+- Software Development
+- Git
+created: 1227587078
+---
+One thing I learned early on in the internet, when is was more of a cobbling instead of a series, of tubes, was not to feed trolls. That said, I found that my post "Delightfully Wrong About Git" had found it's way into such silly news aggregation machines as DZone, Reddit and Hacker News. Some of the points raised in the comments were valid and warrant a response, while the majority of them were the standard responses to any discussion about version control "psh, dumb. should have used [Bazaar/Mercurial/Darcs/Subversion/Team Foundation System]"
+
+Why not another (D)VCS?
+One of the most resounding criticisms/questions was this one, why not Bazaar? Why not Mercurial! My favorite, albeit childish, retort is "why?" But I can say that I have tried a variety of other version control systems, Git, Bazaar, CVS, Subversion, Perforce and some other proprietary VCSes at previous employers. While both Darcs and Mercurial seem to be very solid DVCSes, they suffer from a problem of momentum, Darcs in particular. They both appear to be victims of Git's success, while there is inherently nothing wrong with either of them, they are competing with Linus' love-child, Git. When chosing to move to a new VCS in a company that is well over 50+ employees, the staying power of the technology you chose is important. I feel confident that Git will not only be supported, but actively developed and improved for years to come.
+
+More importantly than that though, I like Git. Is that not enough right there? Slide makes excessive use of branches, tags and other "complex" VCS concepts that centralized systems like CVS and Subversion have trouble with. With Subversion creating branches in the volume in which we create branches spiralled out of control with branches becoming "stale" quickly, meaning that if we didn't refresh the branch regularly with updates from trunk it would be nearly impossible to cleanly merge back down into trunk. With my current Git clone of our primary repository, I have 23 branches (roughly 6 personal local branches, 5 old branches, and 12 active branches). Our primary Git repository has been online for about 6 months and currently has 68 branches in it, rougly 55 are active.
Why all the love for Git, but nobody every talks about Bazaar, Mercurial, Darcs, etc? Sure Git is faster, but unless you've got a enormous code base (like the linux kernel), it seems like Bazaar or Mercurial would be a better choice than Git.
+One of the better known selling points of Git is that it's fast. My cloned repository of the primary Slide Git repository weighs in at a hefty 7.1GB. The latest revision number in our Subversion repository is in the 103,000 range, tacked onto that our tree is just over 2GB in size, and you've got a lot of history to keep track of. Git handles this without a sweat. despite hitting the disk extremely hard when switching to a very out of date branch. With this fix from Nico, the last of the mmap(2) allocation issues we were experiencing vanished as well.
+
+Stop re-inventing the wheel!
+One of the more interesting sentiments I noticed perusing the various comments made regarding my previous post were that we are "re-inventing the wheel" by writing scripts, hooks and other wrappers to use a product like Git. The notion that having scripts and hooks for something you use in daily development is re-inventing the wheel, or gratuituous strikes me as laughable at best. We're developers. We write scripts. Why didn't I ever write a myriad of scripts when I was an avid Subversion user? I did.. There's an enormous different between writing scripts to compensate for a poorly performing product, and writing scripts to further enhance you or your colleagues' workflows, Git's hook support falls into the latter category.
+
+The "religion" aspect of the whole version control debate was never considered in our transition to Git, nor was the buzz. I'm far more interested in what makes other VCSes better or worse than Git, so that Git can be improved instead of a justification to ditch Git for yet-another-dvcs. I like to think of the various tools like version control that we developers use as something more relatable: work pants. A good pair of work pants should be flexible enough to allow you to get your work done, modest enough to stay out of the way and most importantly, a good pair of work pants should keep your junk safe ;)
+
+I'm still happy to answer more specific questions about Git and how/why it works for us as well as it has, but I think most of the questions I've seen thus far have been answered above.
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-12-02-git-protip-learning-from-your-history-git-log.html b/_posts/2008-12-02-git-protip-learning-from-your-history-git-log.html
new file mode 100644
index 0000000..c03515a
--- /dev/null
+++ b/_posts/2008-12-02-git-protip-learning-from-your-history-git-log.html
@@ -0,0 +1,35 @@
+---
+layout: post
+title: "Git Protip: Learning from your history (git log)"
+tags:
+- Slide
+- Software Development
+- Git
+created: 1228255420
+---
+I've been sending weekly "Protip" emails about Git to the rest of engineering here at Slide for a while now, using the "Protips" as a means of introducing more interesting and complex features Git offers. Below is the second Protip written to date.
+
+
+
+One of the major benefits to using Git is the entirety of the repository being entirely local and easily searched/queried. For this, Git has a very useful command called git log which allows you to inspect revision histories in numerous different ways between file paths, branches, etc. There are a couple basic scenarios where git log has become invaluable, for me at least, in order to properly review code but also to track changes effectively from point A to point B.
+
What's Dave been working on lately? (with diffs)
git log -p --no-merges --author=dave
+
The --no-merges option will prevent git log from displaying merge commits which are automatically generated whenever you pull from one Git branch to another
+
+
Before I merge this branch down to my team master, I want to know what files have been changed and what revisions
+Git supports the ability with git log and with git diff to provide unidirectional branch lookups or bidirectional branch lookups. For example, say the left branch has commits "A, B" and the right branch has commits "A, C". The ... syntax will output "C", whereas .. will output "B, C"
+
+
+
I just got back from a vacation, I wonder what's changed?
At the tail end of a git log command you can specify particular paths to look up the histories for with the -- operator, in this case, I will be looking at the changes that have occured in the templates directory over the past two weeks
+
+
Most recent X number of commits? (with diffs)
+
git log -n 10 --no-merges -p
+
+All git log commands automatically filter into less(1) so you can page through the output like you would normally if you executed a svn log | less. Because git log is simply reading from the locally stored revision history you can quickly grep the history by any number of different search criteria to gain a better understanding of how the code base is changing and where.
+
+For more specific usage of `git log` refer to the git log man page
+
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2008-12-10-git-protip-by-commiting-that-revision-you-fucked-us-git-revert.html b/_posts/2008-12-10-git-protip-by-commiting-that-revision-you-fucked-us-git-revert.html
new file mode 100644
index 0000000..d02c65b
--- /dev/null
+++ b/_posts/2008-12-10-git-protip-by-commiting-that-revision-you-fucked-us-git-revert.html
@@ -0,0 +1,88 @@
+---
+layout: post
+title: "Git Protip: By commiting that revision, you fucked us (git revert)"
+tags:
+- Slide
+- Software Development
+- Git
+created: 1228905359
+---
+I've been sending weekly "Protip" emails about Git to the rest of engineering here at Slide for a while now, using the "Protips" as a means of introducing more interesting and complex features Git offers. Below is the third Protip written to date.
+
+
+
The concept of "revert" in Git versus Subversion is an interesting, albeit subtle, change, mostly in part due to the subtle differences between Git and Subversion's means of tracking commits. Just as with Subversion, you can only revert a committed change, unlike Subversion there is a 1-to-1 mapping of a "commit" to a "revert". The basic syntax of revert is quite easy: git revert 0xdeadbeef, and just like a regular commit, you will need to push your changes after you revert if you want others to receive the revert as well.
+In the following example of a revert of a commit, I also use the "-s" argument on the command line to denote that I'm signing-off on this revert (i.e. I've properly reviewed it).
+
+xdev3% git revert -s c20054ea390046bd3a54693f2927192b2a7097c2
+----------------[Vim]----------------
+Revert "merge-to-release unhide 10000 coin habitat"
+
+This reverts commit c20054ea390046bd3a54693f2927192b2a7097c2.
+
+Signed-off-by: R. Tyler Ballance <tyler@slide.com>
+# Please enter the commit message for your changes. Lines starting
+# with '#' will be ignored, and an empty message aborts the commit.
+# On branch wip-protips
+# Changes to be committed:
+# (use "git reset HEAD <file>..." to unstage)
+#
+# modified: bt/apps/pet/data.py
+
+
++ python bt/qa/git/post-commit.py -m svn@slide.com
+Sending a commit mail to svn@slide.com
+Created commit a6e93b8: Revert "merge-to-release unhide 10000 coin habitat"
+ 1 files changed, 4 insertions(+), 3 deletions(-)
+
+
+
Reverting multiple commits
+Since git revert will generate a new commit for you every time you revert a previous commit, reverting multiple commits is not as obvious (side note: I'm aware of the ability to squash commits, or --no-commit for git-revert(1), I dislike compressing revision history when I don't believe there shouldn't be compression). If you want to revert a specific merge from one branch into the other, you can revert the merge commit (provided one was generated when the changes were merged). Take the following example:
+
+commit 81a94bb976dfaaaae42ae2600b7e9e88645ebd81
+Merge: 8134d17... d227dd8...
+Author: R. Tyler Ballance <tyler@slide.com>
+Date: Thu Nov 20 10:15:16 2008 -0800
+
+ Merge branch 'master' into wip-protips
+
+
+I want to revert this merge since it refreshed my wip-protips branch from master, and brought in a lot changes tat have destablized my branch. In the case of reverting a merge commit, you need to specify -m and a number to denote where the mainline branch for Git to pivot off of is, -m 1 usually suffices. So the revert of the commit above will look something like this:
+
+Then my revert commit will be committed after I review the change in Vim:
+
+commit 8cae4924c4c05dadaaeccb3851cfc9ec1b8efd0f
+Author: R. Tyler Ballance <tyler@slide.com>
+Date: Thu Nov 20 10:20:44 2008 -0800
+
+ Revert "Merge branch 'master' into wip-protips"
+
+ This reverts commit 81a94bb976dfaaaae42ae2600b7e9e88645ebd81.
+
+
+Let's take the extreme case where I don't have a merge commit to pivot off of, or I have a particular set of bare revisions that I need to revert in one pass, you can start to tie Git subcommands together like git-rev-list(1) to accomplish this. This hypothetical situation might occur if some swath of changes have been applied to a team-master that need to be backed out. Without a merge commit to key off of, you have to revert the commits one by one, but that doesn't mean you have to revert each one by hand:
+for r in `git rev-list master...master-fubar --since="8:00" --before="12:00" --no-merges`; do git revert --no-edit -s $r; done
+In the above example, I can use git-rev-list(1) to give me a list of revisions that have occurred on "master-fubar" that have not occurred on "master" between the times of 8 a.m. and 12 p.m., excluding merge commits. Since git-rev-list(1) will return a list of commit hashes by default, I can loop through those commit hashes in chronological order and revert each one. The inner part of the loop signs-off on the revert (-s) and then tells git-revert(1) to auto-commit it without opening the commit message in Vim (--no-edit). What this then outputs is the following:
+
+xdev% for r in `git rev-list master...master-fubar --since="8:00" --before="12:00" --no-merges`; do git revert --no-edit -s $r; done
+Finished one revert.
+Created commit b6810d7: Revert "a test, for you"
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+Finished one revert.
+Created commit 83156bd: Revert "These are not the droids you are looking for
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+Finished one revert.
+Created commit 782f328: Revert "commented out stuff"
+ 1 files changed, 0 insertions(+), 3 deletions(-)
+Finished one revert.
+Created commit 2b8d664: Revert "back on again"
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+xdev%
+
+
+For specific usage of "git-revert" or "git-rev-list" refer to the git-revert(1) man page or the git-rev-list(1) man page
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2009-01-04-im-using-git-because-it-makes-me-feel-cool.html b/_posts/2009-01-04-im-using-git-because-it-makes-me-feel-cool.html
new file mode 100644
index 0000000..479d2ad
--- /dev/null
+++ b/_posts/2009-01-04-im-using-git-because-it-makes-me-feel-cool.html
@@ -0,0 +1,29 @@
+---
+layout: post
+title: I'm using Git because it makes me feel cool
+tags:
+- Opinion
+- Miscellaneous
+- Software Development
+- Linux
+- Git
+created: 1231080122
+---
+Let's be honest for a second, anybody who knows me knows that I'm clearly an insecure person; I spend the majority of my time trying my best to appear cool. I've owned a lot of Macs in my life, not because they're solid machines with a fantastic operating system, but because I felt so damn smug and cool whenever I was doing anything on my Macs. I also developed Mac software for a while, not because it was my passion or Objective-C and Cocoa are practically God's gift to software, but because Mac developers are so cool, what with the black-rimmed glasses and fancy coffees. Hell, I remember when I finally traded my MacBook Pro for a Thinkpad running Linux; it had nothing to do with an ideological stance against Apple's treatment of developers or frustrations with Leopard, it was all about the new geek-chic that was Linux. Thus far, my life has basically been one big quest for more leet-points.
+
+Then came Git.
+
+When I started out in the software world, I was using CVS, which was a notch less cool than a slim IBM salesman's tie. The constant moaning and groaning of fellow developers using CVS, combined with the shame that I felt when I finally told my parents about my use of CVS was too much to bear. I had to switch.
+
+I remember the first time I tried Subversion, I remember talking to Dave and saying "Meh, I'll stick with CVS!" Soon enough, just like the Macarena, Subversion swept the nation up. Subversion was the newest, coolest thing ever, developers rushed into the streets exclaiming "it sucks less than CVS! It sucks less than CVS!" I switched over to Subversion and all of a sudden I was cool again. One by one, open source projects I knew about switched over to Subversion, then Source Forge switched over to Subversion and in an instant, Subversion replaced CVS and became the mainstream version control system. Subversion had grown up, gotten married, a 401k and health insurance, how uncool.
+
+After joining Slide, which used Subversion, I found myself burning up inside. Here I was at this hip start-up, really feeling cool, but still using the same version control system that uncool companies like, Yahoo! and Sun use. I would not stand for this. As 2007 became 2008 the writing was on the wall, Git was our new bicycle. It had been blessed by Saint Torvalds and clearly we needed to get in on the ground floor of the new cool before it became mainstream.
+
+We needed to switch to Git immediately. Who cares if Git is extremely fast, it's not like time is money or something ridiculous like that. What do I care if Git handles branches and merge histories unlike CVS or Subversion? With its immense coolness-factor, I didn't even consider that Git will allow us to work in a decentralized workflow or a centralized workflow, nope, didn't even cross my mind. If one were to make a list of Pros and Cons of Git versus whichever other version control system, you could just put "Pro: Cool" at the top of the list, underlined, in bold, and the rest would be moot as far as I'm concerned.
+
+Unlike Subversion or Perforce, Git doesn't have corporate backing, Git is distributed, like a guerilla-force sweeping through the jungle ready to pownce on an unsuspecting platoon; that's freakin' cool. Git rides a motorcycle, wears a leather jacket, makes women swoon and kicks ass and/or jukeboxes.
+
+Git is the Fonz. Cool.
+
+Don't make any false assumptions about my feelings towards Git, it's not like it's a clearly superior version control system or anything, I'm using it only because I want to be cool too.
+
diff --git a/_posts/2009-01-05-extremely-brief-review-of-the-nokia-n810.html b/_posts/2009-01-05-extremely-brief-review-of-the-nokia-n810.html
new file mode 100644
index 0000000..1ab1871
--- /dev/null
+++ b/_posts/2009-01-05-extremely-brief-review-of-the-nokia-n810.html
@@ -0,0 +1,30 @@
+---
+layout: post
+title: Extremely brief review of the Nokia n810
+tags:
+- Opinion
+- Linux
+created: 1231147334
+---
+A coworker of mine was kind enough to let me borrow his Nokia n810 for a couple days to try it out as he know I was considering purchasing one for myself. I'm very glad I tried it before buying it, since I'm not going to buy it now (sorry Nokia! The princess is in another castle!)
+
+The thought of a handheld, wireless capable, Linux device is very intriguing for me. That said, I'm not sure what I would even do with it! As I mentioned in my previous post, I like to feel cool, and the prospect of answering the question "is that Linux in your pocket or are you just happy to see me" is far to enticing to pass up. Regardless, I think the n810 suffers from some critical hardware, and software, deficiencies.
+
+Hardware
+The n810 is powered by a 400Mhz ARM processor, and comes equipped with either 128MB or 256MB or RAM (from what I can tell), I'm not entirely certain which is to blame for the sluggishness of the experience, but my guess is on the RAM. Particularly when running the browser (Gecko-based) I would experience "hiccups" where the device spent a few seconds registering input, before actually following a clicked link. This may be more at fault of the software, but for an internet tablet, the sluggishness of the browser in both user interaction and rendering time was absolutely infuritating.
+
+The built-in keyboard is smooth, a little too smooth for my taste; I found myself constantly struggling to hit the right keys with my fingers (my thumb is the width of 2.5 columns of keys). Unlike most US keyboard layouts, the n810 keyboard has a lot of keys in "weird" places that I could not get a hang of over the course of a weekend. I eventually gave up on trying to chat or use SSH on the device because I found it so painful to try to type on the device.
+
+The battery life was nothing to write home about, closer to a laptop battery life, instead of a phone's battery life.
+
+
+The Software
+Despite being Linux-based, the device doesn't feel like Linux at all, which I think is a good thing for the mass-market. The "Home" screen was pretty slick, with the ability to add applets to the "desktop" to report things like weather, time, VPN status, etc. A cross-between systray and Dashboard, the Home screen was where I felt most comfortable in the device (the "home" screen in my Smartphone is set up with similar informational panels). Once leaving "Home" I was soon frustrated again, I still haven't figured out whether or not the "Accounts" preference in the Control Panel (for IM accounts) and the installation of Pidgin are the same thing or not. Email and IM, the two other foundations of what I would expect from an "internet tablet" were weak. Neither of them cooperated with any of the IMAP/SSL or Jabber/SSL servers I use, and they both seemed to be targeted at webmail and chat services like GMail and GTalk.
+
+Maemo does use .deb packages for installation, so I could pretty easily find some of my favorite open source applications in the Maemo repositories, unfortunately the GUI frontend for apt-get on Maemo allows for only one operation at a time (no checking multiple boxes and then clicking "Install") so adding new software was literally a 30 minute operation.
+
+
+Conclusion
+I don't think I'm being too negative in saying that I'm disappointed in Nokia for releasing what I think is such a substandard product. With the ubiquity of wireless in San Francisco, having a nice solid ultra-portable machine that I can actually fit into my pocket is exciting, The Nokia n810 is certainly not that machine.
+
+This week I'm shipping my ASUS Eee PC off for my little sister, so I'm starting to look more and more for something even more portable to fill the void, right now the leader is the OQO model 02 which is about 2 times the price of the n810, and ships with Vista by default, but with Ubuntu and close to 6 hours of battery life I think it could be the ultra-portable that I've been looking for.
diff --git a/_posts/2009-01-05-find-me-on-github-rtyler.html b/_posts/2009-01-05-find-me-on-github-rtyler.html
new file mode 100644
index 0000000..06be4b1
--- /dev/null
+++ b/_posts/2009-01-05-find-me-on-github-rtyler.html
@@ -0,0 +1,13 @@
+---
+layout: post
+title: Find me on github (rtyler)
+tags:
+- Slide
+- Miscellaneous
+- Software Development
+- Git
+created: 1231149866
+---
+Rod reminded me with his comment in one of my other posts that I've not yet mentioned github.
+
+I've got a bunch of my nonsense thrown up on github.com/rtyler, it's awesome (no really, github rocks my socks, those guys are good people).
diff --git a/_posts/2009-01-12-but-who-will-write-the-tests.html b/_posts/2009-01-12-but-who-will-write-the-tests.html
new file mode 100644
index 0000000..b082831
--- /dev/null
+++ b/_posts/2009-01-12-but-who-will-write-the-tests.html
@@ -0,0 +1,30 @@
+---
+layout: post
+title: But Who Will Write The Tests?
+tags:
+- Slide
+- Software Development
+- Hudson
+created: 1231778582
+---
+In addition to frothing at the mouth about Git, I've been really getting into the concept of automated unit tests lately (thus my interest in Hudson). Just like code comments however, tests are good, no tests is bad, wrong tests is worse. That means once you give in to the almighty power of unit testing, you are saddled with the curse of knowing that you will have to update them, forever.
+
+Taking up Test-driven Development is like having a child, if you are at a point in your life where you're ready to accept that kind of responsibility, it can be wonderful, a lot of work, but ultimately you will feel satisfied with your new role as a Responsible Developer (tm). If you're not prepared to take on the burden that TDD will present you with, you will likely regret it or neglect your tests (Deadbeat Developer, I like this metaphor).
+
+In the Top Friends Team at Slide, we practice the more "loose" definition of TDD; tests are not written before functionality is written, but rather functionality is written, and then as part of the QA and release process, the appropriate and accompanying tests are written. Our basic workflow is usually as follows:
Tickets are written and assigned to milestones and developers in Trac
Branch is created in central Git repository
General plan-of-action is discussed between developers
Hack-hack-hack
Code complete is reached, QA starts to test milestone
Developers write tests if needed for functionality
Once QA signs off, and tests look solid, code is shipped live
+
+There are two primary flaws with this workflow, the first and most obvious one is that it is far to easy to "forget to write the tests." That is, the project scheduled to start development tends to "flow forward" into the allotted test-writing time. As important as test coverage is, at the end of the day Slide did not raise funding on having solid test coverage, and our priorities lie in shipping software, first and foremost. Solving the flow-forward of scheduled projects into any available space is something that can be worked on, but never solved, it really comes down to discipline between those in charge of setting up any given project's particular roadmap.
+
+The second, more subtle flaw in this workflow, and I think all Test-driven Devleopment workflows, revolves around the writer of the tests. The fundamental nature of almost all bugs in software is human error, our natural tendency to make mistakes means that nothing we do will ever be perfect, including our tests. If Developer A is writing a couple new methods to handle data validation prior to that data going into the database. Chances are that Developer A's life is going to be made far easier by writing some test cases to run through some predefined user-input, and pass his validation code over it. Therein lies the problem, if the developer doesn't think of a particular edge case when he's writing the code to handle the data validation, the chances he'll remember and account for that particular edge case while he's working on the unit tests is nil.
+
+How do you really ensure that tests are of high enough quality to actually catch errors and regressions?
+
+I think a certain extent of intra-team test writing and code review, depending on the level of communication between developers, can really help. In this case less developer communication is better. If Developer A tells Developer B how his code works, Developer B is now going to have an unnecessary expectation when he starts to write tests for Developer A's code. If Developer B reviews the code for what it actually is, instead of what Developer A thinks it is, the tests that will ultimately be written will be more thorough than if Developer A had written the whole suite himself.
+
+This still isn't sufficiently fool-proof to where I feel all that confident in test coverage, the tests being written are subject to the availability, thoroughness and understanding that Developer B brings to the table. Inside a small team like this one, one of those is almost always in short supply (usually availability).
+
+One approach I'm anxious to try is the more active involvement of QA engineers in the test writing process, both in the pre-fail and post-fail scenarios. The pre-fail scenario being one like that which I detailed above, where new code is being written. In this case a QA engineer's experience can help guide the developer on what sets of user-input have typically caused issues in the past. The second case, post-fail, is actually already occuring at Slide; a live issue, data validity bug, or regression is caught by QA engineers who detail the reproduction case in Trac and as a result a regression test can be written for that specific issue.
+
+This still is subject to the three things I cited above: availability, thoroughness and understanding of those involved. I still have a lot of unanswered questions about the ideal QA and Dev workflow however, how does this scale to a team of tens or hudnreds? Who writes the tests for large teams? What about a team of 1 Dev and a 1 QA, what about the lone-hacker? How do you write quality code, without getting bogged down in the mush of writing thousands of tests for everything you can imagine could go wrong?
+
+Who writes the tests?
diff --git a/_posts/2009-01-12-proposal-imuse-an-imap-capable-fuse-filesystem.html b/_posts/2009-01-12-proposal-imuse-an-imap-capable-fuse-filesystem.html
new file mode 100644
index 0000000..7e5388e
--- /dev/null
+++ b/_posts/2009-01-12-proposal-imuse-an-imap-capable-fuse-filesystem.html
@@ -0,0 +1,24 @@
+---
+layout: post
+title: "Proposal: Imuse, an IMAP-capable FUSE filesystem"
+tags:
+- Miscellaneous
+- Software Development
+created: 1231771033
+---
+I've spent the better part of my weekend messing around with mail clients, and once again Evolution comes out on top and once again, I'm not happy about it. I tried: Claws, Thunderbird, Alpine (formerly Pine), Mutt, Balsa, KMail and TkRat. None of them worked as well as I wanted, is it too much to ask for to have a mail client that doesn't puke and die on large (>2GB) of IMAP mail? Supports proper jwz mail threading? And caches IMAP mail locally so I can actually access it while disconnect? Turns out it actually is too much to ask.
+
+That's not what this is about though. While hunting around, I started to look at my Slide IMAP mail account, and see something interesting: it looks suspiciously like a filesystem. The general layout I have right now is something like this:
/
INBOX
Sent
Drafts
Development/
Commits
Pushes
External/
Git
Hudson
Metrics
QA/
Exceptions
Trac
+
+Clearly, it's a very filesystem-esque looking tree of mail (and a couple gigabytes of it). When you start to really dig into e-mail technology, you really get a feeling for how royally screwed up the whole ecosystem is. Between Exchange, IMAP and POP3 (and their SSL counterparts), mbox and Maildir, and of course the venerable SMTP; e-mail technology is a clusterfuck. No wonder barely anybody can implement an e-mail client that doesn't suck.
+
+At a basic level, mail is organized into messages and folders. Messages map very easily to actual files on the filesystem, and folders naturually map into actual directories on the filesystem. Imagine that you could chose any program you wanted to read and write your email? The only pre-requisite: can it read from the filesystem? You could have any program register to receive filesystem events to notify you when mail "appears" in specific directories, and you could move mail around with a simple drag-and-drop in Nautilus/Thunar/Finder. What about writing mail though? Easy enough, you create a new file in the "Drafts" folder, writes would naturally be propogated to the "Drafts" folder on the IMAP server, and when you were done with the message, you could copy or move it into the "Sent" folder, which would have a hook to recognize the new file, and send it. The IMAP tree from above, starts to look something like this:
~/Imuse
Settings
Accounts/
Slide/
INBOX
Sent
Drafts
Development/
Commits
Pushes
External/
Git
Hudson
Metrics
QA/
Exceptions
Trac
+
+"Accounts" and "Settings" would likely need to be "special" insofar that Imuse would just create them out of thin air, Accounts would need to be a virtual directory to actually contain the appropriate account listings, and in Settings I'd likely want to have a couple of flat configuration "files" that you could edit in order to actually configure Imuse appropriately.
+
+If there are simply lists of files in each of the Accounts' folders, each representing a particular email, then the problem of dealing with all my e-mail becomes a much easier one to handle, then it's just a matter of picking my filesystem browser of choice. Even then it's not really limited to filesystem browsers like Nautilus, the scope of programs that I can use to access my mail is opened up to $EDITOR as well. Most editors like Notepad++, Vim, Emacs, Gedit, and TextMate all support the ability to view a directory, and open it's contents up for reading/editing. I'm a big fan using Vim, so Imuse coupled with vtreeexplorer would be phenomonal to say the least.
+
+I've started toying around with building FUSE filesystems and I've pushed my experimenting up to GitHub in my imuse repository. It's currently in C, since I either cannot get either of the two FUSE Python bindings to work properly. This presents a certain level of difficulty, since the standard means of accessing IMAP data from C seems to be c-client, which is reasonably well documented, but lacks sample code. On the other hand, if I can get the Python bindings to cooperate, then I have access to the wonderful Twisted Mail library (or even the basic imaplib).
+
+Given my obvious time restrictions, I wanted to open the idea up to more eyes and ears to see what others thought and maybe even find somebody else willing to pitch in. For the time being however, Evolution is still sifting through my mail, and I'm still not enjoying it :(
+
diff --git a/_posts/2009-01-15-git-protip-a-picture-is-worth-a-thousand-words-git-tag.html b/_posts/2009-01-15-git-protip-a-picture-is-worth-a-thousand-words-git-tag.html
new file mode 100644
index 0000000..013cd40
--- /dev/null
+++ b/_posts/2009-01-15-git-protip-a-picture-is-worth-a-thousand-words-git-tag.html
@@ -0,0 +1,29 @@
+---
+layout: post
+title: "Git Protip: A picture is worth a thousand words (git tag)"
+tags:
+- Slide
+- Software Development
+- Git
+created: 1232086450
+---
+I've been sending weekly "Protip" emails about Git to the rest of engineering here at Slide for a while now, using the "Protips" as a means of introducing more interesting and complex features Git offers. Below is the fourth Protip written to date.
+
+
+While the concept of "tagging" or "labeling" code is not a new, or original idea that was introduced with Git, our use of tags in a regular workflow does not predate the migration to Git however. At it's most basic level, a "tag" in any version control system is to take a "picture" of how the tree looks at a certain point in time such that it can be re-created later. This can be extremely helpful for both local and team development, take the following scenario for local development using tags:
+
Tim is extremely busy, most of his days working at an exciting, fast-paced start-up seem to fly by. With one particular project Tim is working on, a lot of code is changing at a very fast pace and the branch he's currently working in is stable one minute and destabilized the next. Tim has two basic options for leaving himself "bread-crumbs" to step back in time to a stable or an unstable state. The first, complicated option, is to mark his commit messages with something like "STABLE", etc so he can git diff or git reset --hard from the current HEAD to the last stable point of the branch.
+The second option is to make use of tags. Whenever Tim reaches a stable point in his turmultuous development, he can simply run:
+git tag wip-protips_`date "+%s"
+(or something similar, `date` added to ensure the tag is unique). If Tim finds himself too far down the wrong path, he can rollback his branch to the latest tag (git reset --hard protiptag), create a new stable branch based on that tag (git checkout -b wip-protip-2 protiptag), or diff his current HEAD to the tag to see what all he's changed since his branch was stable (git diff protiptag...HEAD)
+
+This local development scenario can become a team development scenario involving tags, if for example, Tim needed QA to start testing portions of his branch (his changes are just that important). Since the current HEAD of Tim's branch is incredibly unstable, he can push his tag to the central repository so QA can push a stage using the tag to the last stable point in the branch's history with the command: git push origin tag protiptag
+
+Tags are similar to most other "refs" in Git insofar that they are distributable, if I execute git fetch your-repo --tags, I can pull the tags you've set in "your-repo" and apply them locally aid development. The distributed nature is primarily how tags differ in Git from Subversion, nearly the rest of the concept is the exact same.
+
+Currently at Slide, tag usage is dominated by the post-receive hook in the central repository, where every push into the central repository ("origin") in the branch release branch is tagged. This allows us to quickly "revert" bad live pushes temporarily, by simply pushing the last "good" tagged release, to ensure minimal site destabilization (while we correct live issues outside of the release branch).
+
+For more specific usage of `git tag` refer to the git-tag(1) man page
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
+
diff --git a/_posts/2009-01-26-amazon-sucks-too.html b/_posts/2009-01-26-amazon-sucks-too.html
new file mode 100644
index 0000000..af7314b
--- /dev/null
+++ b/_posts/2009-01-26-amazon-sucks-too.html
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Amazon Sucks Too
+tags:
+- Opinion
+created: 1233037275
+---
+On the topic of online shopping "sucking", I have been sitting on this beautiful screenshot for a while.
+
+A couple of months ago I bought a watch on Amazon. Not a spectacular watch, a very basic Seiko analog watch that I had previously owned but had lost. I went on to Amazon to buy "my watch", and after finding it, I happily ordered the watch.
+
+Shortly after the watch arrived, I noticed a huge influx of quite topical SPAM.
+
+
+
+I'm pleased to say that I've not purchased anything from Amazon since I discovered that Amazon, or somebody that Amazon deals with sold my information to everybody.
+
+This still makes my blood boil. Rat bastards.
diff --git a/_posts/2009-01-26-old-navy-sucks.html b/_posts/2009-01-26-old-navy-sucks.html
new file mode 100644
index 0000000..1235877
--- /dev/null
+++ b/_posts/2009-01-26-old-navy-sucks.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Old Navy Sucks.
+tags:
+- Opinion
+created: 1233036804
+---
+I'm going to go ahead and admit something, something that's difficult for most men to admit in my situation. I shop at Old Navy. I'm sorry, I like their collared shirts. Sue me.
+
+This past weekend I decided to use an oldnavy.com gift card that I was given to buy some new jeans (as my favorite pair now has a hole in the knee). A "cute" side effect of redeeming an oldnavy.com gift card was that I needed to create an oldnavy.com account. "Cute".
+
+After I created my account, with a site-specific password (I generate throw-away passwords for sites that abuse the privilege of my business), I received the following email:
+
+
+Like I said, "cute". Damn idiots.
diff --git a/_posts/2009-03-05-head-in-the-clouds.html b/_posts/2009-03-05-head-in-the-clouds.html
new file mode 100644
index 0000000..caf5045
--- /dev/null
+++ b/_posts/2009-03-05-head-in-the-clouds.html
@@ -0,0 +1,29 @@
+---
+layout: post
+title: Head in the clouds
+tags:
+- Slide
+- Software Development
+- Hudson
+created: 1236325323
+---
+I've spent the entire day thinking about "cloud computing", which is quite a twist for me. Seeing "impressive" conferences centered around "cloud computing" I've ridiculed the concept mercilessly, it has a phenomenally high buzzword/usefulness ratio, which makes it difficult to take seriously. It tends to have an air of idiocy attached to it of the same style that the re-invention of thin-clients did a few years back. That said, I think the concept is sound, and useful for a number of companies and uses (once distilled of the buzz).
+
+Take Slide for example, we have a solid amount of hardware, hundreds of powerful machines constantly churning away on a number of tasks: serving web pages, providing back-end services, processing database requests, recording metrics, etc. If I start the work-week needing a new pool of machines either set up or allocated for a particular task, I can usually have hardware provisioned and live by the end of the week (depending on my Scotch offering to the Operations team, I can get it as early as the next day). If I can have the real thing I clearly have no need for cloud computing or virtualization.
+
+That's what I thought, at least, until I started to think more about what would be required to get Slide closer to the lofty goal of continuous deployment. As I was involved in pushing for and setting up our Hudson CI server, I constantly check on the performance of the system and help make sure jobs are chugging along as they should be, I've become the defacto Hudson janitor.
+
+
+Our current continuous integration setup involves one four-core machine running three separate instances of our server software as different users, processing jobs throughout the day. One "job" typically consists of a full restart of the server software (Python) and running literally every test case in the suite (we walk the entire tree aggregating tests). On average the completion of one job takes close to 15 minutes, and executes around 400+ test cases (and growing). Fortunately, and unfortunately, our Hudson machine is no longer able to service this capacity during development peak in the middle of the day, this is where the "cloud" comes in.
+
+We have a few options at this point:
Setup another one or more machines
Rethink how we provision hardware for continuous integration
+
+The fundamental problem with provisioning resources for continuous integration, at least at Slide, is that the requirements are bursty at best. We typically queue a job for a particular branch when a developer executes a git push (via the Hudson API and a post-receive hook). From around 9 p.m. until 9 a.m. we don't need but maybe two actual "executors" inside Hudson to handle the workload the night-owl developers tend to place on Hudson, from 12 p.m. until 7 p.m. however our needs fluctuate rapidly between needing 4 executors, and 10 executors. To exacerbate things further, due to "natural traffic patterns" in how we work, mid-afternoon on Wednesday and Thursday require even more resources as teams are preparing releases and finishing up milestones.
+
+The only two possible solutions to solve the problem are to: build a continuous integration farm with full knowledge capacity will remain unused for large amounts of time, or look into "cloud computing" with service provides like Amazon EC2 which will allow for Hudson slaves to be provisioned on demand. The maintainer of Hudson, Kohsuke Kawaguchi has already started work on "cloud support" for Hudson via the EC2 plugin which makes this a real possibility. (Note: using EC2 for this at Slide was Dave's idea, not mine :))
+
+Using Amazon EC2 isn't the only way to solve this "bursty" problem however, we could just as easily solve the problem in house with provisioning of Xen guests across a few machines. The downside of doing it yourself is amount of time between when you know you need more capacity and when you can actually add that capacity to your own little "cloud". Considering Amazon has an API for not only running instances but terminating them, it certainly provides a compelling reason to "outsource" the problem to Amazon's cloud.
+
+I recommend following Kohsuke's development of the EC2 plugin for Hudson closely, as continuous integration and "the cloud" seem like a match made in heaven (alright, that pun was unnecessary, it sort of slipped out). At the end of the day the decision comes down to a very fundamental business decision: which is more cost effective, building my own farm of machines, or using somebody else's?
+
+(footnote: I'll post a summary of how and what we eventually do to solve this problem)
diff --git a/_posts/2009-03-06-git-protip-split-it-in-half-understanding-the-anatomy-of-a-bug-git-bisect.html b/_posts/2009-03-06-git-protip-split-it-in-half-understanding-the-anatomy-of-a-bug-git-bisect.html
new file mode 100644
index 0000000..a6c188c
--- /dev/null
+++ b/_posts/2009-03-06-git-protip-split-it-in-half-understanding-the-anatomy-of-a-bug-git-bisect.html
@@ -0,0 +1,68 @@
+---
+layout: post
+title: "Git Protip: Split it in half, understanding the anatomy of a bug (git bisect) "
+tags:
+- Slide
+- Software Development
+- Git
+created: 1236406033
+---
+I've been sending "Protip" emails about Git to the rest of engineering here at Slide for a while now, using the "Protips" as a means of introducing more interesting and complex features Git offers.
+
+There are those among us who can look at a reproduction case for a bug and just know what the bug is. For the rest of us mere mortals, finding out what change or set of changes actually introduced a bug is extremely useful for figuring out why a particular bug exists. This is even more true for the more elusive bugs or the cases where code "looks" correct and you're stumped as to why the bug exists now, when it didn't yesterday/last week/last month. The options in most classical version control systems you have available to you are to sift through diffs or wade through log message after log message trying to spot the particular change that introduced the regression you're now tasked with resolving.
+Fortunately (of course) Git offers a handy feature to assist you in tracking down regressions as they're introduced, git bisect. Take the following scenario:
Roger has been working on some lower level changes in a project branch lately. When he left work last night, he ran his unit tests (everything passed), committed his code and went home for the day. When he came in the next morning, per his typical routine, he synchronized his project branch with the master branch to ensure his code wasn't stomping on released changes. For some reason however, after synchronizing his branch, his unit tests started to fail indicating that a bug was introduced in one of the changes that was integrated into Roger's project branch.
+Before switching to Git, Roger might have spent an hour looking over changes trying to pinpoint what went wrong, but now Roger can use git bisect to figure out exactly where the issue is. Taking the commit hash from his last good commit, Roger can walk through changes and pinpoint the issue as follows:
+
+## Format for use is: git bisect start [<bad> [<good>...]] [--] [<paths>...]
+xdev4% git bisect start HEAD 324d2f2235c93769dd97680d80173388dc5c8253
+Bisecting: 10 revisions left to test after this
+
+[064443d3164112554600f6da39a36ffb639787d7] Changed the name of an a/b test.
+xdev4%
+
+This will start the bisect process, which is interactive, and start you halfway between the two revisions specified above (see the image below). Following the scenario above, Roger would then run his unit tests. Upon their success, he'd execute "git bisect good" which would move the tree halfway between that "good" revision and the "bad" revision. Roger will continue doing this until he lands on the commit that is responsible for the regression. Knowing this, Roger can either revert that change, or make a subsequent revision that corrects the regression introduced.
+
+A sample of what this sort of transcript might look like is below:
+xdev4% git bisect good
+Bisecting: -1 revisions left to test after this
+[bcf020a6c4ac7cc5df064c66b182b2500470000a] Merge branch 'cjssp' into master
+xdev4% git bisect bad
+bcf020a6c4ac7cc5df064c66b182b2500470000a is first bad commit
+xdev4% git show bcf020a6c4ac7cc5df064c66b182b2500470000a
+commit bcf020a6c4ac7cc5df064c66b182b2500470000a
+Merge: 62153e2... 064443d...
+Author: Chris <chris@foo>
+
+Date: Tue Jan 27 12:57:45 2009 -0800
+
+ Merge branch 'cjssp' into master
+
+xdev4% git bisect log
+# bad: [7a5d4f3c90b022cb66fd8ea1635c5de6768882d7] Merge branch 'foo' into master
+# good: [d1014fd52bebd3c56db37362548e588165b7f299] Merge branch 'bar'
+git bisect start 'HEAD' 'd1014fd52bebd3c56db37362548e588165b7f299' '--' 'apps'
+
+# good: [064443d3164112554600f6da39a36ffb639787d7] Changed the name of an a/b test. PLEASE PICK ME UP WITH NEXT PUSH. thx
+git bisect good 064443d3164112554600f6da39a36ffb639787d7
+# bad: [bcf020a6c4ac7cc5df064c66b182b2500470000a] Merge branch 'cjssp' into master
+git bisect bad bcf020a6c4ac7cc5df064c66b182b2500470000a
+xdev4% git bisect reset
+xdev4%
+
+Instead of spending an hour looking at changes, Roger was able to quickly walk a few revisions and run the unit tests he has to figure out which commit was the one causing trouble, and then get back to work squashing those bugs.
+
+Roger is, like most developers, inherently lazy, and running through a series of revisions running unit tests sounds like "work" that doesn't need to be done. Fortunately for Roger, git-bisect(1) supports the subcommand "run" which goes hand in hand with unit tests or other tests. In the example above, let's pretend that Roger had a test case exhibiting the bug he was noticing. What he could actually do is let git bisect run automatically run a test script to run his unit tests to find the offending revision i.e.:
+
+xdev4% git bisect start HEAD 324d2f2235c93769dd97680d80173388dc5c8253
+Bisecting: 10 revisions left to test after this
+
+[064443d3164112554600f6da39a36ffb639787d7] Changed the name of an a/b test.
+xdev4% git bisect run ./mytest.sh
+
+After executing the run command, git-bisect(1) will binary search the revisions between GOOD and BAD testing whether or not "mytest.sh" returns a zero (success) or non-zero (failure) return code until it finds the commit that causes the test to fail. The end result should be the exact commit the regression was introduced into the tree, after finding this Roger can either grab his rubber chicken and go slap his fellow developer around or fix the issue and get back to playing Nethack.
+All in all git-bisect(1) is extraordinarily useful for pinning down bugs and diagnosing issues as they're introduced into the code base.
+
+For more specific usage of `git bisect` refer to it's man page here: git-bisect(1) man page
+
+
+Did you know!Slide is hiring! Looking for talented engineers to write some good Python and/or JavaScript, feel free to contact me at tyler[at]slide
diff --git a/_posts/2009-03-09-v8-and-fastcgi-exploring-an-idea.html b/_posts/2009-03-09-v8-and-fastcgi-exploring-an-idea.html
new file mode 100644
index 0000000..61a4a55
--- /dev/null
+++ b/_posts/2009-03-09-v8-and-fastcgi-exploring-an-idea.html
@@ -0,0 +1,81 @@
+---
+layout: post
+title: V8 and FastCGI, Exploring an Idea
+tags:
+- Miscellaneous
+- Software Development
+- JavaScript
+created: 1236592198
+---
+Over the past couple years I've talked a lot of trash about JavaScript (really, a lot) but I've slowly started to come around to a more neutral stance, I actually hate browsers, I like JavaScript just fine by itself! While the prototype-based object system is a little weird at first coming from a more classical object-oriented background, the concept grows on you the more you use it.
+
+Since I hate browsers so much (I really do), I was pleased as punch to hear that Google's V8 JavaScript Engine was embeddable. While WebKit's JavaScriptCore is quite a nice JavaScript engine, it doesn't lend itself to being embedded the same way that V8 does. The only immediate downside to V8 is that it's written entirely in C++, which does provide some hurdles to embedding (for example, I'm likely never going to be able to embed it into a Mono application), but for the majority of cases embedding the engine into a project shouldn't be all that difficult.
+
+A few weekends ago I started exploring the possibility of running server-side JavaScript courtesy of V8, after reading about mod_v8 I felt more confident to try my project: FastJS.
+
+In a nutshell, FastJS is a FastCGI server to process server-side JavaScript, this means FastJS can hook up to Lighttpd, Nginx, or even Apache via mod_fcgi. Currently FastJS is in a state of "extremely unstable and downright difficult", there's not a lot there as I'm exploring what should be provided by the FastJS server-side software, and what should be provided by JavaScript libraries. As it stands now, FastJS preloads the environment with jQuery 1.3.2 and a "fastjs" object which contains some important callbacks like:
fastjs.write() // write to the output stream
+fastjs.log() // write to the FastCGI error.lgo
+fastjs.source() // Include and execute other JavaScript files
+
+On the server side, a typical request looks something like this (for now):
+The code above generates a page that looks pretty basic, but informative nonetheless (click to enlarge):
+
+Pretty fun in general to play with, I think I'm near on the point where I can stop writing more of my terrible C/C++ code and get back into the wonderful land of JavaScript. As it stands now, here's what still needs to be done:
Proper handling of erroring scripts via an informative 500 page that reports on the error
Templating? Lots of fastjs.write() calls are likely to drive you mad
Performance concerns? As of now, the whole stack (jQuery + .fjs) are evaluated every page request.
Tests! I should really get around to writing some level of integration tests to make sure that FastJS is returning expected results for particular chunks of .fjs scripts
+
+The project is hosted on GitHub right now, here and is under a 2-clause BSD license.
diff --git a/_posts/2009-03-13-do-not-fear-continuous-deployment.html b/_posts/2009-03-13-do-not-fear-continuous-deployment.html
new file mode 100644
index 0000000..abe3bca
--- /dev/null
+++ b/_posts/2009-03-13-do-not-fear-continuous-deployment.html
@@ -0,0 +1,32 @@
+---
+layout: post
+title: Do not fear continuous deployment
+tags:
+- Slide
+- Software Development
+- Hudson
+created: 1236932009
+---
+One of the nice things about living in Silicon Valley is that you have relatively easy access to a number of the developers you may work with through open source projects, mailing lists, IRC, etc. Today Kohsuke Kawaguchi of Sun Microsystems, the founder of the Hudson project, stopped by the Slide offices to discuss Hudson and the "cloud", continuous deployment and our workflow with Hudson here at Slide. Continuous deployment being the most interesting topic for me, and the most relevant in terms of the importance of Hudson in our current infrastructure.
+
+
+Since reading Timothy Fitz's post on the setup for "continuous deployment" at IMVU, I've become obsessed to a certain degree with pushing Slide in that direction as an engineering organization. Currently we push a number of times a day as necessary, and it's almost as if we have manual-continuous-deployment as it is right now, there's just a lot of room for optimizations and automation to cut down on the tedium and allow for more beer drinking.
+
+
+
@agentdero continuous deployment = when build is green, autoship? sounds terrifying...
+ (@tlipcon)
+
+
+
+As a concept, continuous deployment can be quite scary "wait, some robot is going to deploy code to my production site, wha!" It's important to remember that the concept of continuous deployment doesn't necessarily mean that no QA is involved in the release process, it is however ideal to have enough good test cases such that you can do a fully automated unit/integration/system test run. The biggest difficultly with the entire concept of "continuous deployment" however is not writing tests or actually implementing a system to deploy, it forces you to understand your releases and production environment; it's about eliminating the guess work from your process and reducing the amount of human error (or potential for human error) involved in deployments.
+
+In my opinion, continuous deployment isn't about making a hard switch, firing your QA and writing boat-loads of tests to ensure that you can push the production site straight from "trunk" as much as humanly possible. Continuous deployment is far more about solidifying your understanding of your entire stack, evolving your code base to where it is both more testable and better covered by your tests, then putting your money where your mouth is and relying on those tests. If your codebase moves rapidly, unit/integration/system tests are only going to be up to date and valuable if you actually rely on them. If breaking a single unit test pre-deployment becomes a Big Deal™, then the developer responsible for the code being deployed will make sure that: (a) the test is valid and up to date and (b) the code that the test is covering does not contain any actual regressions.
+
+
+Take the typical repository layout for most companies which is, as far as I've seen, made up of a volatile trunk, stable release branch and then a number of project branches. In an engineering department QA would be responsible for ensuring that projects are properly vetted before merging from project branches (also called "topic branches" in the Git community) into the more volatile trunk branch. Once the CI server (i.e. Hudson) picks up on changes in trunk, the testing process would begin at that particular revision. Provided the test suites passed with flying colors Hudson would start to kick up the process to do a slow/sampled deploy as Timothy describes in his post. If the tests failed however, alarms would start beeping, sirens would wail and there would be much gnashing of teeth, somebody has now broken trunk and is blocking any other deployments coming down the pipe. In this "disaster scenario" the QA involved in the process would be thoroughly shamed (obviously) but then given the choice to block future pushes while the developer(s) create a fix or revert their changes out of trunk and take them back to a project branch to correct the deficiencies. This attention to detail will have an larger benefit in that developers won't become numb to test failures to where they're no longer important.
+
+
+What good is writing tests if there aren't have real-consequences for them failing? Releases shouldn't be a scary time of the day/week/month, you should certainly be nervous (keeps you sharp), but if you fear releases then it is probably an error in your release process that allows for too much uncertainty: inadequate test coverage, insufficient blackbox testing, poor release practices, etc. Continuous deployment might not be the magic solution to your woe of shipping software but the practice of moving towards continuous deployment will greatly improve your release process whether or not you ever actually make the switch over to a fairly automated deployment process as the engineers at IMVU have.
+
+
+How confident are you in your test coverage?
diff --git a/_posts/2009-04-06-breathing-life-into-a-dead-open-source-project.markdown b/_posts/2009-04-06-breathing-life-into-a-dead-open-source-project.markdown
new file mode 100644
index 0000000..d9a928f
--- /dev/null
+++ b/_posts/2009-04-06-breathing-life-into-a-dead-open-source-project.markdown
@@ -0,0 +1,40 @@
+---
+layout: post
+title: Breathing life into a dead open source project
+tags:
+- Miscellaneous
+- Software Development
+- Cheetah
+created: 1239006828
+---
+Over the past [couple years](http://twitter.com/agentdero/status/1441656514) that I have been working at [Slide, Inc.](http://www.slide.com) I've had a love/hate relationship with the [Cheetah](http://www.cheetahtemplate.org) templating engine. Like almost every templating engine, it allows for abuse by its users, which can result in some templating code that looks quite horrendous, contributing significantly to some negative opinions of the templating engine. At one point, I figured an upgrade of Cheetah would help correct some of these abuses and I distinctly remember pushing to upgrade to the 2.xx series of Cheetah. I then found out that I had unintentionally volunteered myself to oversee the migration and also to update any *ancient* code that was lying around that depended on "features" (see: *bugs*) in Cheetah prior to the 2.xx series. We upgraded to Cheetah 2.xx and life was good, but Cheetah was practically dead.
+
+The last **official** release of Cheetah was in November of 2007, this is not something altogether uncommon in the world of open source development. Projects come and go, some reach a point in their growth and development where they're abandoned, or their community dissipates, etc. As time wore on, I found myself coming up with a patch here and there that corrected some deficiency in Cheetah, but I also noticed that many others were doing the same. There was very clearly a need for the project to continue moving forward, and with my introduction to both Git and [GitHub](http://www.github.com) as a way of distributing development, I did what any weekend hacker is prone to do, I forked it.
+
+Meet Community Cheetah
+----------------
+On January 5th, 2009 I started to commit to my local fork of the Cheetah code base (taken from [Cheetah CVS tree](http://sourceforge.net/scm/?type=cvs&group_id=28961)), making sure my patches were committed but also taking the patches from a number of others on the [mailing list](https://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss). By mid-March I had collected enough patches to properly announce [Cheetah Community Edition v2.1.0](http://sourceforge.net/mailarchive/forum.php?thread_name=20090316070839.GD31561%40starfruit.corp.slide.com&forum_name=cheetahtemplate-discuss) to the mailing list. I was entirely unprepared for the response.
+
+Whereas the previous 6 months of posts to the mailing list averaged about 4 messages a month, March exploded to **88** messages, 20 of them in the thread announcing Cheetah CE (now deemed *Community Cheetah* (it had a better ring to it, and an available [domain name](http://www.communitycheetah.org) to boot)). All of a sudden the slumbering community is awake and the patches have started to trickle in.
+
+We've fixed some issues with running Cheetah on Python 2.6, Cheetah now supports compiling templates in parallel, issues with import behavior have been fixed and added a number of smaller features. In 2008 there were **six** commits to the Cheetah codebase, thus far in 2009 there have been over seventy (I'm still waiting on a few patches from colleagues at other startups in Silicon Valley as well).
+
+I'm not going to throw up a "Mission Accomplished" banner just yet, Cheetah still needs a large amount of improvement. It was written during a much different era of Python, the changes in Python 2.6 and moving forward to Python 3.0 present new challenges in modernizing a template engine that was introduced in **2001**.
+
+
+Being a maintainer
+-----------------
+Starting your own open source project is tremendously easy, especially with the advent of hosts like Google Code or GitHub. What's terrifying and difficult, is when other people depend on your work. By stepping up and becoming the de-facto maintainer of [Community Cheetah](http://www.communitycheetah.org), I've opened myself up to a larger collection of expectations than I originally anticipated. I feel as if I have zero credibility with the community at this point, which means I painstakingly check the changes that are committed and review as much code as possible before tagging a release. I'm scared to death of releasing a bad release of Community Cheetah and driving people away from the project, the nightmare scenario I play over in my head when tagging a release in Git is somebody going "this crap doesn't work at all, I'm going to stick with Cheetah v2.0.1 for now" such that I cannot get them to upgrade to subsequent releases of Community Cheetah. I think creators of a project have a lot of "builtin street cred" with their users and community of developers, whereas I still have to establish my street cred through introduction of bug fixes/features, knowledge of the code base and generally being available through the mailing list or IRC.
+
+
+Moving Forward
+-------------
+Currently I'm preparing the third Community Cheetah release (which I tagged today) [v2.1.1](http://github.com/rtyler/cheetah/tarball/v2.1.1rc1) which comes almost a month after the previous one and introduces a number of fixes but also some newer features like the **#transform** directive, markdown support, and 100% Python 2.6 compatibility.
+
+Thanks to an intrepid contributor, Jean-Baptiste Quenot, we have a v2.2 release lined up for the near future which fixes a **large** number of Unicode specific faults that Cheetah currently has (the code can currently be found in the [unicode branch](http://github.com/rtyler/cheetah/tree/unicode)) and moves the internal representation of code within the Cheetah compiler/parser to a unicode string object in Python.
+
+I eagerly look forward to more and more usage of Cheetah, with other templating engines out there for Python like [Mako](http://www.makotemplates.org/) and [Genshi](http://genshi.edgewall.org/) I still feel Cheetah sits far and above the others in its power and versatility but has just been neglected for far too long.
+
+If you're interested in contributing to Cheetah, you can [fork it on GitHub](http://github.com/rtyler/cheetah/tree/master), join the [mailing list](http://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss) or find us on IRC (#cheetah on Freenode).
+
+This experiment on restarting an open source project is far from over, but we're off to a promising start.
diff --git a/_posts/2009-04-07-slide-open-source.markdown b/_posts/2009-04-07-slide-open-source.markdown
new file mode 100644
index 0000000..7f5da51
--- /dev/null
+++ b/_posts/2009-04-07-slide-open-source.markdown
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "Slide Open Source "
+tags:
+- Slide
+- Software Development
+created: 1239173780
+---
+It's not been a secret that I'm a big fan of open source software, I would likely not be where I am today had I not started with projects like [OpenBSD](http://www.openbsd.org) or [FreeBSD](http://www.freebsd.org) way back when. While my passion for open source software and the "bazaar" method of developing software might not be shared by everybody at [Slide, Inc](http://slide.com), everybody can certainly get on board with the value of incorporating open source into our stack, which is almost entirely comprised of [Python](http://www.python.org) (and an assortment of other web technologies).
+
+Along those lines, there's been some amount of discussion about what we can or should open source from what we've developed at [Slide](http://www.slide.com), but we've not really *pushed* anything out into the ether as of yet. Today however, I think we finally put our foot in the door as far as contributing back to the open source community as a whole, **we're now on [GitHub](http://www.github.com) as "[slideinc](http://github.com/slideinc/)"**, yay! (coincidentally we have a [slideinc](http://twitter.com/slideinc) twitter account too)
+
+Currently the only project that's come directly out of Slide, and shared via the **slideinc** GitHub account is [PyVE](http://github.com/slideinc/pyve/tree), a Python Virtual Earth client that I hacked together recently to tinker with some Geocoding (released under a 3-clause BSD license). In the (hopefully) near future we'll continue to open source some other components we've either created or extended internally.
+
+If you're not a GitHub user, you should definitely check GitHub out, it's a pretty impressive site. If you are a GitHub user, or a Python developer, you should "follow" the [slideinc](http://github.com/slideinc/) user on GitHub to catch the cool stuff that we may or may not ever actually release ;)
+
diff --git a/_posts/2009-05-16-template-theory.markdown b/_posts/2009-05-16-template-theory.markdown
new file mode 100644
index 0000000..d7bc919
--- /dev/null
+++ b/_posts/2009-05-16-template-theory.markdown
@@ -0,0 +1,81 @@
+---
+layout: post
+title: Template Theory
+tags:
+- Opinion
+- Software Development
+- Cheetah
+created: 1242506511
+---
+Since becoming the (*de-facto*) maintainer of the [Cheetah project](http://www.cheetahtemplate.org) I've been thinking
+more and more about what a templating engine *should* do and where the boundary between template engine
+and language are drawn. At their most basic level, template engines are means of programmatically
+generating large strings or otherwise massaging chunks of text. What tends to separate template
+engines from one another are: the language they're written in and what level of "host-language" access
+they offer the author of the template.
+
+[Cheetah](http://www.cheetahtemplate.org) is special in that for all intents and purposes
+Cheetah **is** [Python](http://www.python.org) which blurs the line between the controller layer
+and the view layer, as Cheetah is compiled into literal Python code.
+In fact, one of the noted strengths of Cheetah is that Cheetah templates can
+subclass from regular Python objects defined in normal Python modules, and vice versa. That being
+the case, how do you organize your code, and where should particular portions physically reside in the
+source tree? What qualifies code to be entered into a **.py** file
+versus a **.tmpl** file? If you zoom out from this particular problem, to a larger scope, I believe there is a
+much larger question to be answered here: as a *language*, what should Cheetah provide?
+
+Since Cheetah compiles down to Python, does it merit introducing all the Python constructs that one
+has at their disposal within Cheetah, including:
+
+ * Properties
+ * Decorated methods
+ * Full/multiple inheritance
+ * Metaclasses/class factories
+
+Attacked from the other end, what *Cheetah-specific* language constructs are acceptable to be introduced
+into Cheetah as a Python-based hybrid language? Currently some of the language constructs that exist in Cheetah
+that are distinct to Cheetah itself are:
+
+ * `#include`
+ * `#filter`
+ * `#stop`
+ * `#shBang`
+ * `#block`
+ * `#indent`
+ * `#transform`
+ * `#silent`
+ * `#slurp`
+ * `#encoding`
+
+Some of the examples of unique Cheetah directives are necessary in order to manipulate template output
+in ways that aren't applicable to normal Python (take `#slurp`, `#indent`, `#filter` for example), but where does one draw
+the line?
+
+Too add yet another layer of complexity into the problem, Cheetah is not only used in the traditional
+Model-View-Controller set up (e.g. [Django + Cheetah templates](http://code.google.com/p/django-cheetahtemplate/))
+but it's also used to generate *other* code, i.e. Cheetah is sometimes used as a means of generating
+source code (`bash`, `C`, etc).
+
+In My Humble Opinion
+--------------------
+Cheetah, at least to me, is not a lump of text files that you can perform loops and use variables in,
+it is a fully functional, object-oriented, Pythonic text-aware programming language. Whether or not it compiles to Python or
+is fully interoperable with Python is largely irrelevant (that is not to say that [we](http://www.slide.com)
+don't make use of this feature). As far as "what should Cheetah provide?" I think the best way to answer the question
+is to not think about Cheetah as Python, or as a "strict" template engine (Mako, Genshi, etc) but rather as a
+*domain specific language* for complex text generation and templating. When deciding on what Python features
+to expose as directives in Cheetah (the language) the litmus test that should be evaluated against is: *does this make
+generating text easier?*
+
+Cheetah need not have hash-directives for every feature available in Python, the idea of requiring meta-classes
+in Cheetah is ridiculous at best, a feature like decorators however could prove quite useful in text processing/generation
+(e.g. function output filters), along with proper full inheritance.
+
+My goals ultimately with Cheetah, are to make [our](http://www.slide.com) lives easier developing
+rich interfaces for our various web properties, but also to make "things" faster. Whereas "things" can
+fall under a few different buckets: development time, execution time, maintenance time.
+
+
+Cheetah will likely look largely the same a year from now, and if we (the developers of Cheetah)
+have done our jobs correctly, it should be just as simple to pick up and learn, but even more
+powerful and expressive than before.
diff --git a/_posts/2009-06-18-using-glibs-gtester-results-in-hudson.markdown b/_posts/2009-06-18-using-glibs-gtester-results-in-hudson.markdown
new file mode 100644
index 0000000..96040af
--- /dev/null
+++ b/_posts/2009-06-18-using-glibs-gtester-results-in-hudson.markdown
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Using Glib's gtester Results in Hudson
+tags:
+- Miscellaneous
+- Software Development
+- Linux
+- Hudson
+created: 1245312122
+---
+For one of the projects I've been working on lately, I've been making use of [Glib's Testing](http://library.gnome.org/devel/glib/unstable/glib-Testing.html) functionality to write unit tests for a C-based project. I'm a fairly big fan of the [Hudson Continuous Integration Server](http://hudson-ci.org) and I wanted to run tests for my C-based project.
+
+Unfortunately, the `gtester` application generates XML in a custom format that Hudson cannot understand (i.e. JUnit formatted XML). In order to come up with some JUnit XML, I spent about an hour and a half toying with XSLT for transforming the XML `gtester` generates (see the snippet below).
+
+I added a shell script build step to the end of the build process that runs:
+
+ gtester test_app --keep-going -o=Tests.xml
+ xsltproc -o tests.junit.xml gtester.xsl Tests.xml
+
+Then I just specified "tests.junit.xml" in the **Publish JUnit test result report** section of the **Post-build Actions** and then Hudson would properly process and post the test results when the job was finished.
+
+
diff --git a/_posts/2009-07-21-jython-jgit-and-co-in-hudson.markdown b/_posts/2009-07-21-jython-jgit-and-co-in-hudson.markdown
new file mode 100644
index 0000000..4676c0c
--- /dev/null
+++ b/_posts/2009-07-21-jython-jgit-and-co-in-hudson.markdown
@@ -0,0 +1,62 @@
+---
+layout: post
+title: Jython, JGit and co. in Hudson
+tags:
+- Opinion
+- Miscellaneous
+- Software Development
+- Git
+- Hudson
+created: 1248243398
+---
+At the [Hudson Bay Area Meetup/Hackathon](http://wiki.hudson-ci.org/display/HUDSON/BayAreaMeetup)
+that [Slide, Inc.](http://slideinc.github.com) hosted last weekend, I worked on the
+[Jython plugin](http://wiki.hudson-ci.org/display/HUDSON/Jython+Plugin)
+and released it just days after releasing a strikingly similar plugin, the
+[Python plugin](http://wiki.hudson-ci.org/display/HUDSON/Python+Plugin). I felt
+that an explanation might be warranted as to why I would do such a thing.
+
+For those that don't know, [Hudson](http://hudson-ci.org) is a Java-based continuous
+integration server, one of the best CI servers developed (in my humblest of opinions).
+What makes Hudson so great is a **very** solid [plugin architecture](http://wiki.hudson-ci.org/display/HUDSON/Extend+Hudson)
+allowing developers to extend Hudson to support a wide variety of scripting languages
+as well as notifiers, source control systems, and so on ([related post](http://weblogs.java.net/blog/kohsuke/archive/2009/06/growth_of_hudso.html)
+on the growth of Hudson's plugin ecosystem). Additionally, Hudson supports *slaves* on
+any operating system that Java supports, allowing you to have a central manager (the
+"master" Hudson server/node) and a vast network of different machines performing tasks
+and executing jobs. Now that you're up to speed, back to the topic at hand.
+
+**Jython** versus **Python** plugin. Why bother with either, as [@gboissinot](http://twitter.com/gboissinot)
+pointed out in [this tweet](http://twitter.com/gboissinot/status/2619505521)? The
+*interesting* thing about the Jython plugin, particularly when you use a large number
+of slaves is that with the installation of the Jython plugin, suddenly you have the
+ability to execute Python script on **every** single slave, regardless of whether or
+not they actually have Python installed. The more "third party" that can be moved into
+Hudson by way of the plugin system means reduced dependencies and difficulty setting
+up slaves to help handle load.
+
+Take the "git" versus the "git2" plugin, the git plugin was recently criticized on the
+[#hudson channel](irc://irc.freenode.net/hudson) because of it's use of the [JGit](http://www.jgit.org/)
+library, versus "git2" which invokes [git(1)](http://git-scm.org) on the command line.
+The latter approach is flawed for a number of reasons, particularly the reliance on the git
+command line executables and scripts to return consistent formatting is specious at best
+even if you aren't relying on "porcelain" (git community terminology for front-end-ish
+script and code sitting on top of the "plumbing", the breakdown is detailed [here](http://www.kernel.org/pub/software/scm/git/docs/)).
+The command-line approach also means you now have to ensure every one of your slaves
+that are likely to be executing builds have the appropriate packages installed.
+One the flipside however, with the JGit-based approach, the Hudson slave
+agent can transfer the
+appropriate bytecode to the machine in question and execute that without relying on
+system-dependencies.
+
+The Hudson Subversion plugin takes a similar approach, being based on [SVNKit](http://svnkit.com/).
+
+Being a Python developer by trade, I am certainly not in the "Java Fanboy" camp, but
+the efficiencies gained by incorporating Java-based libraries in Hudson plugins and
+extensions is a no brainer, the reduction of dependencies on the systems incorporated
+in your build farm will save you plenty of time in maintenance and version woes alone.
+In my opinion, the benefits of JGit, Jython, SVNKit, and the other Java-based libraries
+that are running some of the most highly used plugins in the Hudson ecosystem continue
+to outweigh the costs, especially as [we](http://slideinc.github.com) find ourselves bringing more and more slaves
+online.
+
diff --git a/_posts/2009-07-25-awesomely-bad.markdown b/_posts/2009-07-25-awesomely-bad.markdown
new file mode 100644
index 0000000..5ee237d
--- /dev/null
+++ b/_posts/2009-07-25-awesomely-bad.markdown
@@ -0,0 +1,54 @@
+---
+layout: post
+title: Awesomely Bad
+tags:
+- Opinion
+- Miscellaneous
+- Linux
+created: 1248580338
+---
+A coworker of mine, [@teepark](http://twitter.com/teepark) and I recently
+fell in love with tiling window managers, Awesome
+in particular. The project has been interesting to follow, to say the least. When I
+first installed Awesome, from the [openSUSE package directory](http://software.opensuse.org/search),
+I had version 2, it was fairly basic, relatively easy to configure and enough to hook
+me on the idea of a tiling window manager. After conferring with [@teepark](http://twitter.com/teepark),
+I discovered that he had **version 3** which was much better, had some new fancy features, and
+an incremented version number, therefore I required it.
+
+In general, I'm a fairly competent open-source contributor and user. Autoconf and Automake, while I
+despise them, aren't mean and scary to me and I'm able to work with them to fit my needs.
+I run Linux on two laptops, and a few
+workstations, not to mention the myriad of servers I'm either directly or peripherally responsible
+for. I grok open sources. Thusly, I was not put off by the idea of grabbing the latest "*stable*" tarball
+of Awesome to build and install it. That began my slow and painful journey to get this software built,
+and installed.
+
+* Oh, it needs Lua, I'll install that from the repositories.
+* Hm, what's this [xcb](http://xcb.freedesktop.org/) I need, and isn't in the repositories. I guess I'll have to build that myself, oh but wait, there's different subsets of xcb? xcb-util, xcb-proto, libxcb-xlib, xcb-kitchensink, etc.
+* Well, I need [xproto](http://xorg.freedesktop.org/archive/individual/proto/) as well, which isn't in the repositories either.
+* CMake? Really guys? Fine.
+* ImLib2, I've never even heard of that!
+* libstartup-notification huh? Fine, i'll build this too.
+
+After compiling what felt like an eternity of subpackages, I discovered a number of *interesting*
+things about the varying versions of Awesome v3. The configuration file format has changed a few
+times, even between one release candidate to another. I ran across issues that [other people had](http://spiralofhope.wordpress.com/2009/04/14/awesome-window-manager-installation-misadventure/)
+that effectively require recompilling X11's libraries to link against the newly built xcb libraries
+in order to work (`/usr/lib/libxcb-xlib.so.0: undefined reference to _xcb_unlock_io`). Nothing I
+seemed to try worked as I might expect, if I couldn't recompile the majority of my system to be
+"bleeding edge" I was screwed. The entire affair was absolutely infuriating.
+
+There were a few major things that I think the team behind Awesome failed miserably at accomplishing,
+that every open source developer should consider when releasing software:
+
+* **If you depend on a hodge-podge of libraries, don't make your dependency on the bleeding edge of each package**
+* **Maintain an open dialogue with those that package your software, don't try to make their job hell.**
+* **When a user cannot build your packages with the latest stable versions of their distribution without almost rebuilding their entire system, perhaps you're "doin' it wrong"**
+* **Changing file formats, or anything major between two release candidates is idiocy.**
+* **If you don't actually care about your users, be sure to state it clearly, so then we don't bother using or trying to improve your poor quality software**
+
+
+In the end, I decided that Haskell isn't scary enough not to install XMonad, so
+I've started replacing machines that run Awesome, with XMonad, and I'm not looking back. Ever.
+
diff --git a/_posts/2009-07-29-writing-for-stability-or-i-hate-writing-tests.markdown b/_posts/2009-07-29-writing-for-stability-or-i-hate-writing-tests.markdown
new file mode 100644
index 0000000..bda8602
--- /dev/null
+++ b/_posts/2009-07-29-writing-for-stability-or-i-hate-writing-tests.markdown
@@ -0,0 +1,79 @@
+---
+layout: post
+title: "Writing for Stability (or: I hate writing tests)"
+tags:
+- Slide
+- Opinion
+- Software Development
+created: 1248852608
+---
+Since moving to the infrastructure team at [Slide](http://slideinc.github.com)
+I've found the rate at which my software gets deployed has plummeted, while the
+quantity of the code that I am deploying to the live site has sky-rocketed. When
+on an applications-team within Slide, code is typically pushed in small incrememnts a few
+days a week, if not daily. This allows for really exciting compact milestones that
+make more fine-grained analysis achievable, post-push for product management and metrics
+purposes. On the _infrastructure_ team however, the requirements are *wholly* different,
+the "fail-fast, ship-now" mentality that prevails when doing user-facing web application
+development just *does not* work in infrastructure. The most important aspects of building
+out infrastructure components are stability and usability, our "customers" are the rest of
+engineering, and that has a definite effect on your workflow.
+
+Code Review
+------------
+One of the things that [@jasonrubenstein](http://twitter.com/jasonrubenstein) and I always
+did when we worked together, was occasional code review. In the majority of cases, our "code review" sessions
+were more or less [rubber duck debugging](http://en.wikipedia.org/wiki/Rubber_duck_debugging), but
+occasionally it would escalate into more complex discussions about the "right way" to do something.
+When you're writing infrastructure software for services that are handling [tens of millions of users](http://www.slide.com/static/about_press)
+the notion of "code review" goes from being _optional_ to being absolutely _required_. Discussions
+are had on the correctness or performance characteristics of database indexes, the necessity of some
+objects instantiating default values of attributes or having them lazily load, or debating garbage
+collection of objects while meticulously watching [memory consumption](https://twitter.com/agentdero/status/2442677113).
+
+For one of my most recent projects, I was working on [something](http://github.com/slideinc/PyECC/tree/master) in C,
+a rarity at Slide since we work with managed code in [Python](http://python.org) the majority of the
+time. As the project neared completion, I counted roughly two or three *hours* of code review time
+dedicated by our Chief Architect. The attention to detail paid to this code was extremely high,
+as the service was going to be handling millions of requests from other levels of
+the Slide infrastructure, before getting cycled or restarted.
+
+A particularly frustrating aspect of code review by your peers is that a second set of eyes not only
+will find problems with your code, but will likely mean refactoring or bug fixes, more work.
+In my case, whenever a bug or stability issue was discovered, a test needed to be
+written for it to make sure the bug did not present itself again, the workload would be larger than
+if I had just fixed the bug and moved on with my life.
+
+
+Testing, oh the testing
+-----------------------
+If you expect to write an API, have it stablize, and *then* be used, you *must* write test cases for
+it. I'm not a [TDD](http://en.wikipedia.org/wiki/Test-driven_development) "nut", I actually *hate*
+writing test cases, I absolutely abhor it. Writing test cases is _responsible_ and the _adult_
+thing to do. In my experience, it can also be _tedious_ and usually comes as a result of
+finding flaws in my own software. The majority of tests that I find myself writing are admissions of
+defeat, admitting that I don't crap roses and by george, my code isn't perfect either.
+
+On the flipside however, *I hate debugging* even more. Stepping through a call stack is on par
+with waterboarding in my book, torture. Which means I'm more than willing to tolerate writing tests
+so long as it means I can be certain I will be cutting down on the time spent being tortured with
+either [pdb](http://docs.python.org/library/pdb.html) or [gdb](http://www.gnu.org/software/gdb/).
+In almost every situation where I've written tests properly, like the _responsible_ developer that
+I am, I find them saving me at some point. It might be getting late, or I'm just feeling a little
+cavalier, but tests failing almost always indicates that I've screwed something up I shouldn't have.
+
+Additionally, now that the majority of my projects are infrastructure-level projects, the tests I write serve
+a second "undocumented" purpose, they provide ready-made examples for other developers on _how to
+use my code_. Bonus!
+
+
+The more and more code I write, the more amazed I am at the pushback against testing in general,
+there exists decent libraries for *every* language imaginable (well, perhaps BrainfuckUnit doesn't
+exist), and its *sole* purpose (in my opinion) is to save develpoment time, particularly when coupled
+with a [good continuous integration server](http://www.hudson-ci.org). Further to that effect, if you're
+building services for *other developers* to use, and you're not writing tests for it, you're not only
+wasting your time and your employer's money, but the time of your users as well (read: stop being a jerk).
+
+Sure there are a lot of articles/books/etc about writing stable code, but in my opinion, solid code
+review and testing will stablize your code far more than any design pattern ever will.
+
diff --git a/_posts/2009-08-10-im-a-cat-person-now.html b/_posts/2009-08-10-im-a-cat-person-now.html
new file mode 100644
index 0000000..5ac4bc1
--- /dev/null
+++ b/_posts/2009-08-10-im-a-cat-person-now.html
@@ -0,0 +1,9 @@
+---
+layout: post
+title: I'm a cat person now.
+tags:
+- Miscellaneous
+created: 1249973118
+---
+
+
diff --git a/_posts/2009-08-10-investment-strategy-for-developers.markdown b/_posts/2009-08-10-investment-strategy-for-developers.markdown
new file mode 100644
index 0000000..a9e1507
--- /dev/null
+++ b/_posts/2009-08-10-investment-strategy-for-developers.markdown
@@ -0,0 +1,89 @@
+---
+layout: post
+title: Investment Strategy for Developers
+tags:
+- Slide
+- Opinion
+- Software Development
+created: 1249972459
+---
+It seems every time [@jasonrubenstein](http://twitter.com/jasonrubenstein),
+[@ggoss3](http://twitter.com/ggoss3), [@cablelounger](http://twitter.com/cablelounger)
+and I sit down to have lunch together, we invariably sway back and forth between
+generic venting about "[work stuff](http://www.slide.com)" and best practices for
+doing aforementioned "work stuff" better. The topic of "reusable code" came up
+over Mac 'n Cheese and beers this afternoon, and I felt it warranted "wider
+distribution" so to speak (yet-another-lame-Slide-inside-joke).
+
+We, [Slide](http://www.slide.com), are approaching our fourth year in existence as a
+startup which means all sorts of interesting things from an investor standpoint,
+employees options are starting to become fully-vested and other mundane and boring
+financial terms. Being an engineer, I don't care too much about the stocks and such,
+but rather about development; four years is a **lot** from a code-investment
+standpoint (my bias towards code instead of financial planning will surely bite me
+eventually). Projects can experience bitrot, bloating (read: Vista'ing) and a myriad
+other illnesses endemic to software that's starting to grow long in the tooth.
+
+At Slide, we have a number of projects on slightly different trajectories and timelines,
+meaning we have an intriguing cross-section of development histories representing
+themselves. We are no doubt experiencing a similar phenomenon to Facebook, MySpace, Yelp and a number of other "startups" who match this same age group of 4-7
+years. Just like our bretheren in the startup community, we have portions of code
+that fit all the major possible categories:
+
+* That which was written extremely fast, without an afterthought to what would happen when it serve tens of millions of users
+* That which was written slowly, trying to cater to every possible variation, ultimately to go over-budget and over-schedule.
+* That which has been rewritten. And rewritten. And rewritten.
+* Then the **exceptionally** rare, that which has been written in such a fashion that it has been elegantly extended to support more than it was originally conceived to support.
+
+In all four cases, "we" (whereas "*we*" refers to an engineering department) have
+invested differently in our code portfolio depending on a number of factors and
+information given at the time. For example, it's been a year since Component X was
+written. Component X is currently used by every single product The Company owns, but
+over the past year it's been refactored and partially rewritten each time a new
+product starts to "use" Component X. In its current state, Component X's code reads
+more like an embarrasing submission to [The Daily WTF](http://thedailywtf.com) with
+its hodge-podge of code, passed from team to team, developer to developer, like some
+expensive game of "[Telephone](http://en.wikipedia.org/wiki/Chinese_whispers)" for
+software engineers. After the fact, it's difficult and not altogether helpful to
+try to lay blame with the mighty sword of hindsight, but it is feasible to identify the
+*reasons* for the N number of developer hours lost fiddling, extending, and refactoring
+Component X.
+
+* Was the developer responsible for implementing Component X originally aware of the potentially far reaching scope of their work?
+* Was the developer given an adequate time frame to implement a proper solution, or "this should have shipped yesterday!"
+* Did somebody pass the project off to an intern or somebody who was on their way out the door?
+* Were other developers in similar realms of responsibility asked questions or for their opinions?
+* Is/was the culture proliferated by Engineering Leads and Managers encouraging of best practices that lead to extensible code?
+
+I've found, watching Slide Engineering culture evolve, that the majority of libraries
+or components that go through multiple time/resource-expensive iterations tend to have
+experienced shortcomings in one of the five sections above. More often than not,
+a developer was given the task to implement Some Thing. Simple enough, Some Thing
+is developed with the specific use-case in mind, and the developer moves on with their
+life. Three months later however, somebody else asks another developer, to add Some Thing
+to **another** product.
+
+> "Product X has Some Thing, and it works great for them, let's incorporate Some Thing into Product Y by the end of the week."
+
+Invariably this leads to heavy developer drinking. And then perhaps some copy-paste,
+with a dash of re-jiggering, and quite possibly multiple forks of the same code. That
+is, if Some Thing was not properly planned and designed in the first place.
+
+Working as a developer on products that move at a fast pace, but will be around for
+longer than three months is an exercise in *investment strategy* (i.e. managing
+[technical debt](http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx)).
+What makes great Engineering Managers great is their ability to determine when and where to invest
+the time to do things right, and where to write some Perl-style write-only code (*zing!*).
+What makes a startup environment a more difficult one to work on your "code portfolio"
+is that you don't usually know what may or may not be a success, and in a lot of cases
+getting your product out there **now** is of paramount importance. Unfortunately
+there isn't any simple guideline or silver bullet, and there is **no bailout**, if
+you invest your time poorly up front, there will be nobody to save you further down
+the line when you're staring an resource-devouring refactor in its ugly face.
+
+Where do you invest the time in any given project? What will happen if you shave a
+few days by deciding not to write any tests, or documentation. Will it cost you
+a week further down the road if you take shortcuts now?
+
+I wish I knew.
+
diff --git a/_posts/2009-08-24-toying-around-with-asp-net-mvc-and-nant.html b/_posts/2009-08-24-toying-around-with-asp-net-mvc-and-nant.html
new file mode 100644
index 0000000..e145271
--- /dev/null
+++ b/_posts/2009-08-24-toying-around-with-asp-net-mvc-and-nant.html
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Toying around with ASP.NET MVC and NAnt
+tags:
+- Mono
+- Miscellaneous
+created: 1251098232
+---
+I recently found myself toying around with a number of web frameworks (like Seaside) to get a good read on who's doing what in the web world outside of Python and Django, when I stumbled across the ASP.NET MVC Add-in for MonoDevelop. Though the new Vim keybindings are sweet, I still can't effectively get work done in MonoDevelop yet. What MonoDevelop does do however is support generating Makefiles for any given project, which allowed me to create some Makefiles for an ASP.NET MVC project I had created in MonoDevelop, and port those Makefiles over to fit my NAnt and Vim-based workflow.
+
+Along with building the necessary DLLs, I prefer to use my NAnt scripts to fire up the NUnit console and fire up a development instance of XSP to test my web applications out. All said and done this fairly basic script does the job; I typically run it with:
nant test run
+
+Not much else to say, hope you find it useful.
+
+
diff --git a/_posts/2009-09-02-doing-more-with-less-very-continuous-integration.markdown b/_posts/2009-09-02-doing-more-with-less-very-continuous-integration.markdown
new file mode 100644
index 0000000..9c7e727
--- /dev/null
+++ b/_posts/2009-09-02-doing-more-with-less-very-continuous-integration.markdown
@@ -0,0 +1,89 @@
+---
+layout: post
+title: "Doing more with less; very continuous integration "
+tags:
+- Miscellaneous
+- Software Development
+- Hudson
+created: 1251880922
+---
+Once upon a time I was lucky enough to take an "Intro to C++"
+class taught by none other than
+[Bjarne Stroustrop](http://en.wikipedia.org/wiki/Bjarne_Stroustrup)
+himself, while I learned a lot of things about what makes C++ good and sucky
+at the *same* time, he also taught a very important lesson: great engineers are lazy.
+It's fairly easy to enumerate functionality in tens of hundreds of lines of poorly
+organized, inefficient code, but (according to Bjarne) it's the great engineers
+that are capable of distilling that functionality into it's most succinct
+form. I've since taken this notion of being "ultimately lazy" into my
+professional career, making it the root answer for a lot of my design decisions
+and choices: "Why bother writing unit tests?" I'm too lazy to fire up the whole
+application and click mouse buttons, and I can only do that so fast; "Why do you only
+work with Vim in GNU/screen?" I can't be bothered to set up a new slew of terminals
+when I switch machines, and so on down the line.
+
+Earlier this week I found another bit of manual work that **I** shouldn't
+be doing and should be lazy about: building. The local build is something
+that's common to every single software developer regardless of language, Slide being a Python shop,
+we have a bit more subtle of a "build", that is to say, developers implicitly
+run a "build" when they hit a page in Apache or a test/script. I found myself
+constantly switching between two terminal windows, one with my editor
+([Vim](http://www.vim.org)) and one for running tests and other scripts.
+
+Being an avid Hudson user, I decided I'd give
+the [File system SCM](http://wiki.hudson-ci.org/display/HUDSON/File+System+SCM)
+a try. Very quickly I was able to set up Hudson to poll my working directory and
+*watch* for files to change every minute, and then run a "build" with some tests
+to go with it. Now I can simply sit in Vim **all** day and write code, only
+context-switching to commit changes.
+
+Setting up Hudson for *local* continuous integration is quite simple,
+by visiting [hudson-ci.org](http://www.hudson-ci.org) you can download
+[hudson.war](http://hudson-ci.org/latest/hudson.war) which is a **fully self contained**
+runnable version of Hudson, you can start it up locally with `java -jar hudson.war`.
+Once it's started, visit [http://localhost:8080](http://localhost:8080) and you've find
+yourself smack-dab in the middle of a fresh installation of Hudson.
+
+
+First things first, you'll need the File System SCM plugin from the Hudson Update
+Center (left side bar, "Manage Hudson" > "Manage Plugins" > "Available" tab)
+
+![Installing the plugin](http://agentdero.cachefly.net/unethicalblogger.com/images/fsscm_updatecenter.jpeg)
+
+After installing the plugin, you'll need to restart Hudson, then you can create your
+job, configuring the File System SCM to poll your working directory:
+
+![Configuring FS SCM](http://agentdero.cachefly.net/unethicalblogger.com/images/fsscm1.jpeg)
+
+Of course, add the necessary build steps to build/test your software as well, and
+you should be set for some good local continuous integration. Once the job is saved,
+the job will
+poll your working directory for files to be modified and then copy things over to
+the job's workspace for execution.
+
+After the job is building, you can hook up the RSS feed
+([http://localhost:8080/rssLatest](http://localhost:8080/rssLatest)) to
+Growl or some
+other form of desktop notifier so you don't even have to move your eyes to know whether
+your local build succeeded or not (I use the "hudsonnotify" script for Linux/libnotify
+below).
+
+By automating this part of my local workflow with Hudson I can take advantage of a few things:
+
+* I no longer need to context switch to run my tests
+* I can make use of Hudson's nice UI for visually inspecting test results as they change over time
+* I have near-instant feedback on the validity of the changes I'm making
+
+The only real downside I can think of is no longer having any excuse for checking
+in code that "breaks the build", but in the end that's probably a good thing.
+
+Instead of relying on commits, you can get near-instant feedback on your changes
+before you even get things going far enough to check them in, tightening the feedback
+loop on your changes even further, very-very continuous integration. Your mileage may
+vary of course, but I recommend giving it a try.
+
+
+hudsonnotify.py
+---------------
+
+
diff --git a/_posts/2009-10-04-crazysnake-ironpython-and-java-just-monkeying-around.markdown b/_posts/2009-10-04-crazysnake-ironpython-and-java-just-monkeying-around.markdown
new file mode 100644
index 0000000..df8e10c
--- /dev/null
+++ b/_posts/2009-10-04-crazysnake-ironpython-and-java-just-monkeying-around.markdown
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Crazysnake; IronPython and Java, just monkeying around
+tags:
+- Mono
+- Miscellaneous
+created: 1254722459
+---
+This weekend I finally got around to downloading IronPython 2.6rc1 to test it against the upcoming builds of Mono 2.6 preview 1 (the version numbers matched, it felt right). Additionally in the land of Mono, I've been toying around with the IKVM project as of late, as a means of bringing some legacy Java code that I'm familiar with onto the CLR. As I poked in one xterm (urxvt actually) with IKVM and with IronPython in another, a lightbulb went off. What if I could mix *different* languages in the **same** runtime; wouldn't that just be cool as a cucumber? Turns out, **it is**.
+
+After grabbing a recent release (0.40.0.1) of IKVM, I whipped up a simple Test.java file:
+
+
+I compiled Test.java to Test.class then to Test.dll with ikvmc (note: this is using JDK 1.6); in short, Java was compiled to Java bytecode and *then* to CIL:
+
+ javac Test.java
+ mono ikvm-0.40.0.1/bin/ikvmc.exe -target:library -out:Test.dll Test.class
+
+Once you have a DLL, it is fairly simple to import that into an IronPython script thanks to the `clr` module IronPython provides. It is important to note however, that IKVM generated DLLs *will* try to load other DLLs at runtime (`IKVM.Runtime.dll` for example) so these either need to be installed in the GAC or available in the directory your IronPython script is running in.
+
+Here's my sample test IronPython file, using the unittest module to verify that the compiled Java code is doing what I expect it to:
+
+
+When I run the IronPython script, everything "just works":
+
+ % mono IronPython-2.6/ipy.exe IkvmTest.py
+ .
+ ----------------------------------------------------------------------
+ Ran 1 test in 0.040s
+
+ OK
+ %
+
+While my Test.java is a fairly tame example of what is going on here, the underlying lesson is an important one. Thanks to the Mono project's CLR and the advent of the DLR on top of that we are getting closer to where "language" and "runtime" are separated enough to not be interdependent (as it is with CPython), allowing me (or you) to compile or otherwise execute code written in multiple languages on a common (language) runtime.
+
+That just feels good.
+
diff --git a/_posts/2009-10-13-ironwatin-mind-the-gap.markdown b/_posts/2009-10-13-ironwatin-mind-the-gap.markdown
new file mode 100644
index 0000000..355d59b
--- /dev/null
+++ b/_posts/2009-10-13-ironwatin-mind-the-gap.markdown
@@ -0,0 +1,46 @@
+---
+layout: post
+title: IronWatin; mind the gap
+tags:
+- Mono
+- Slide
+- Software Development
+- Hudson
+created: 1255471069
+---
+Last week @admc, despite being a big proponent of Windmill, needed to use WatiN for a change. WatiN has the distinct capability of being able to work with Internet Explorer's HTTPS support as well as frames, a requirement for the task at hand. As adorable as it was to watch @admc, a child of the dynamic language revolution, struggle with writing in C# with Visual Studio and the daunting "Windows development stack," the prospect of a language shift at Slide towards C# on Windows is almost laughable. Since Slide is a Python shop, IronPython became the obvious choice.
+
+Out of an hour or so of "extreme programming" which mostly entailed Adam watching as I wrote IronPython in his Windows VM, IronWatin was born. IronWatin itself is a very simple test runner that hooks into Python's "unittest" for creating integration tests with WatiN in a familiar environment.
+
+I intended IronWatin to be as easy as possible for "native Python" developers, by abstracting out updates to `sys.path` to include the Python standard lib (adds the standard locations for Python 2.5/2.6 on Windows) as well as adding `WatiN.Core.dll` via `clr.AddReference()` so developers can simply `import IronWatin; import WatiN.Core` and they're ready to start writing integration tests. When using IronWatin, you create test classes that subclass from `IronWatin.BrowserTest` which takes care of setting up a browser (WatiN.Core.IE/WatiN.Core.FireFox) instance to a specified URL, this leaves your `runTest()` method to actually execute the core of your test case.
+
+Another "feature"/design choice with IronWatin, was to implement a `main()` method specifically for running the tests on a per-file basis (similar to `unittest.main()`). This main method allows for passing in an `optparse.OptionParser` instance to add arguments to the script such as "--server" which are passed into your test classes themselves and exposed as "self.server" (for example). Which leaves you with a fairly straight-forward framework with which to start writing tests for the browser itself:
+
+
+#!/usr/bin/env ipy
+
+# The import of IronWatin will add a reference to WatiN.Core.dll
+# and update `sys.path` to include C:\Python25\Lib and C:\Python26\Lib
+# so you can import from the Python standard library
+import IronWatin
+
+import WatiN.Core as Watin
+import optparse
+
+class OptionTest(IronWatin.BrowserTest):
+ url = 'http://www.github.com'
+
+ def runTest(self):
+ # Run some Watin commands
+ assert self.testval
+
+if __name__ == '__main__':
+ opts = optparse.OptionParser()
+ opts.add_option('--testval', dest='testval', help='Specify a value')
+ IronWatin.main(options=opts)
+
+
+Thanks to IronPython, we can make use of our developers' and QA engineers' Python knowledge to get the up and running with writing integration tests using WatiN rapidly instead of trying to overcome the hump of teaching/training with a new language.
+
+Deployment Notes: We're using IronPython 2.6rc1 and building WatiN from trunk in order to take advantage of some recent advances in their Firefox/frame support. We've not tested IronWatin, or WatiN at all for that matter, anywhere other than Windows XP.
+
diff --git a/_posts/2009-10-19-my-journey-at-slide-part-1.markdown b/_posts/2009-10-19-my-journey-at-slide-part-1.markdown
new file mode 100644
index 0000000..9c48ede
--- /dev/null
+++ b/_posts/2009-10-19-my-journey-at-slide-part-1.markdown
@@ -0,0 +1,105 @@
+---
+layout: post
+title: My journey at Slide (part 1)
+tags:
+- Slide
+- Opinion
+- Miscellaneous
+created: 1256017253
+---
+As some of you may, or may not know, this friday October 23rd will be my final
+day as a Slide employee. With my journey at Slide nearing its completion, I wanted
+to document some of how I've gotten here and where I've started, if for nobody other
+than myself.
+
+Officially I started at Slide April 2nd, 2007, though my journey to Slide started
+far earlier. At the end of my fourth semester at Texas A&M my then girlfriend, now fianceé
+and I decided we were through with College Station and to move to San Antonio; most Texans would consider this a lateral move at best.
+I had every intention of resuming my studies at UTSA following a brief stint at San Antonio College clearing up pre-requisites with a slightly lower price tag. By
+the end of fall semester it had become clear that I wasn't cut out for college, I
+stopped attending and focused full time on software. At the time most of my experience
+and contacts were through the Mac development community, primarily via IRC on the Freenode
+network and developer mailing lists for various open source projects. Through
+my involvement in the Bonjour mailing lists and work with the API, I had at one
+point impressed Bonjour's original inventor Stuart Cheshire enough to land
+an interview at Apple for the Core OS group, working on Bonjour.
+
+Sitting on the Continental flight out to San Jose, I practiced writing network services
+using BSD sockets and pouring over as much C as I could possibly manage, all told I
+likely wrote around 3 multicast service/client pairs on that flight. What I wasn't prepared for
+was the "computer science" nature of the interview; I bombed it with my rudimentary algorithms
+knowledge and lack of experience working with C on a day to day basis. Fortunately, my last
+interviewer of the day was Ernie Prabhakar then a product or marketing manager for the Core OS
+group; Ernie indulged me in a very interesting conversation about Apple's position in the open
+source universe, product direction, etc. Despite bombing the technical portions of the interview,
+I suppose Ernie saw enough enthusiasm in me to refer me to Dave Morin at Facebook (the two worked
+together at some point).
+
+Those that know Dave Morin understand that the man wields a Jobsian reality distortion field,
+even via email 1500 miles away in Texas I felt the power of the field and was drawn to Facebook.
+While I was ultimately disappointed to not have landed my then-dream-job at Apple, I was incredibly excited to be flying back to Silicon Valley to interview at Facebook. When I mentioned to daver (Dave Young) on IRC that I would be flying back out to
+see the nice folks at Facebook in Palo Alto, he also arranged an interview at Slide the day after.
+
+A number of factors likely lead to my failure to excite my interviewers at Facebook, not having a
+Facebook account for one didn't help, I also think I uttered "fuck" under my breath once or twice while
+sketching out problems on a whiteboard. Considering my interview was done mostly in "the game
+room" due to a scheduling error, I didn't think I was being too unprofessional. As one could assume, my interview with Slide went substantially better, I accepted an offer to join Slide as
+a junior software engineer working on their now defunct desktop application(s).
+
+My start date was set for April 2nd, within three weeks I had terminated the lease on my apartment
+in San Antonio, tossed, sold or otherwise gave away the majority of my belongings and furniture and packed my VW Jetta
+to the brim and drove west. I didn't particularly have a plan other than "show up, get to work"
+(I was 21, how young and foolish), so I crashed on daver's couch while I settled in and started
+searching for an apartment.
+
+My early days at Slide were all about getting up to speed on Python (Slide's language of choice) and
+ActionScript 2 (Slide's only option for Flash at the time); I started helping with the Windows
+client, mostly in the spagetti-driven Flash-based screensaver product. Towards the beginning of May,
+Jeremiah (then Director of Engineering, now CTO) and Bobby (another engineer) were working with
+some preview APIs from what would ultimately become the Facebook platform. For whatever reason I
+started working on trying to incorporate some data from Facebook into our desktop client (optimal
+synergy, etc) and became the third engineer working at Slide on the Facebook platform in its
+infancy. As May came to completion, we (Slide) were invited to "F8" to unveil some of the
+applications for their new platform we had built.
+
+Donning my trusty brown cordoruy sport jacket, dark blue Slide t-shirt, I helped man Slide's booth
+presenting some of our apps: SlideShows and YouTube Skins (both products turned out to be utter
+failures). As the business/presentation portion part of F8 wound down, I grabbed a 19" monitor
+and told Max and Jeremiah that I wanted to stay for the hackathon but didn't have any idea what to
+hack on (being a desktop developer and all). Max leaned in and muttered "Top Friends" on his way
+out, leaving me to set up shop with the only dual screen setup in the hackathon, at a lonely table by myself (I hadn't
+figured out how to socialize at that point). Coming from a desktop background, I hadn't a clue
+what I was doing, I could barely figure out how to get pages working on Slide's infrastructure, let
+alone all this FBML, FQL and JavaScript malarkey.
+
+Fortunately in the days following the hackathon, I was able to enlist the help of Sergio, the best web front-end engineer
+Slide had to offer to help me create a grid of drag and droppable images along with
+some other pieces of front-end to make the application palatable. All said and done, if I remember correctly, Top Eight launched less than a
+week after the platform did, my first "big" project at Slide. Originally I couldn't get database
+resources for the app, so I stashed the friends list inside of the profile FBML and then would
+subsequently retrieve **back** from Facebook when I needed it, using regular expressions (had help
+with that too) to pull the list of Facebook user IDs out; that hacked up solution lasted for all
+of maybe 30 minutes on live as soon as everyone saw how god-awful slow it was.
+
+Day three of Top Eight, I learned what "viral meant". My parents had neglected to pay their phone
+bill, taking my "family plan" number out with it, meaning I couldn't receive the frantic calls
+from Jeremiah as I slept-in that morning. Turns out by giving the Top Eight a callback URL with
+Facebook that hit "www.slide.com" was proving impossible to load balance, resulting in a couple
+hours of site issues for the rest of Slide, as Top Eight skyrocketed hundreds of thousands of users in a single day.
+I awoke that morning to pounding on Dave's door (I was still on their couch), opening it I
+saw Carey (another desktop developer at Slide) who said "your phone's off." Not my preferred
+way to wake up, but it sufficed. I sheepishly called Jeremiah on Dave's house phone.
+
+Jeremiah was **pissed**. Not "who ate the rest of my hummus"
+pissed, righteously pissed, at me. Here I was, living on a friend's (who I met on the internets)
+couch, without a proper mailing address trying to figure out how this startup thing worked, and
+Jeremiah was furious with me. If there were such a thing as an "ideal time" for an earthquake, I
+would have gladly accepted that as an alternative.
+
+Once the smoke cleared and tempers cooled, we looked at some of the installation and growth numbers of Top Eight
+during the previous 6 hours; I had found myself a new job at Slide. From that day forth, I was
+"the Top Friends guy."
+
+
+**Continue on to [part 2](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_2), [part 3](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_3) and [the end](http://unethicalblogger.com/posts/2009/10/end_journey)**
+
diff --git a/_posts/2009-10-20-my-journey-at-slide-part-2.markdown b/_posts/2009-10-20-my-journey-at-slide-part-2.markdown
new file mode 100644
index 0000000..6798968
--- /dev/null
+++ b/_posts/2009-10-20-my-journey-at-slide-part-2.markdown
@@ -0,0 +1,131 @@
+---
+layout: post
+title: My journey at Slide (part 2)
+tags:
+- Slide
+- Opinion
+- Miscellaneous
+created: 1256104068
+---
+When I finished up writing [part 1](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_1) of my journey at Slide yesterday, I had
+just recounted becoming "the Top Friends guy", savvy readers might have noted
+that I had *not* moved off of Dave's couch at the time. I am uncertain whether
+it is a record to be proud of, but I held the position of "the guy on Dave's
+couch" for two months. With the leadup to the "F8" conference I didn't have a
+whole lot of time to find an apartment, Dave being an all around nice guy and
+amazing cook, wasn't helping my motivation to leave either. That said, I'm a
+delightful house guest, honest.
+
+Shortly after the initial successes of the Top Eight product, and the launch of
+"FunWall" (renamed "FunSpace" later), Slide quickly converted the desktop client
+team to the "Facebook Team" with 4-5 engineers hacking on Facebook applications
+to capitalize as quickly as possible on the wild-west nature of the platform at
+the time. We subsequently launched another couple apps, such as "My Questions" an application
+that allowed you to poll your friends (likely our most "useful" application). I
+ended up writing another application alongside Top Eight called "Fortune Cookie",
+contrasted to My Questions, it was probably our most useless application. The application
+was absolutely brilliant (Mike and Max get credit here again), the profile box for the application was a picture of a fortune
+cookie with a fortune overlaid. **Brilliant**. If/when the user clicked through to the
+application's canvas page, they were met with a simple grid of checkboxes and friends'
+faces, checkboxes checked with a giant blue button that said "Invite your Friends!".
+
+Never underestimate the power of "Select All", Fortune Cookie **exploded**, alongside
+our "Magic 8 Ball" application (guess what that was), it spread through the Facebook
+ecosystem like an epidemic. By mid June Top Eight was renamed Top Friends after
+we bumped the number of "top friends" you could list from 8 to 24 (**innovation!**);
+with the power of an intrisicly simple value-proposition to users, 24 friend tiles
+and "Select All", Top Friends held the rank of #1 application on Facebook. Following
+Top Friends was iLike, a major initial success, with Fortune Cookie pulling in third
+place. Further down the list were a couple of familiar applications: Free Gifts, created
+by Zach Allia, a Northwestern student at the time and a regular on the #facebook channel
+on Freenode; Rock You!'s "X Me" application was likely one of the first acquisitions on the Facebook platform, after
+being created by a student who joined the #facebook channel frantically
+asking for help as his server was crumbling under the load of pure virality, and SuperPoke!
+an application created by a then part-time Microsoft employee and two friends.
+
+
+The first couple weeks of the Facebook platform were sheer insanity, determined to one-up our
+competitors Rock You!, Slide acquired SuperPoke! and the three engineers that wrote it,
+Nik, Will and Jonathan. Slide was determined to own the market of "virtually do virtual things to your virtual friends
+on Facebook". In short order the SuperPoke team moved down from Seattle to join the "Facebook Team"
+in Slide's office at 2nd and Howard, Jon went to the metrics team (being a PhD and all) while
+Nik and Will shared a desk and started learning Python to port SuperPoke! over to Slide's stack
+to allow it to scale faster and better than could have been possible on the PHP/MySQL stack it
+used at the time. Prior to joining Slide, the SuperPoke! application icon was some picture of a goat
+Nik had plucked from the internets, by joining Slide they had access to **real**
+designers, not goats from Google Image Search. Slide's most senior designer, Johnnie, can
+be credited with helping define the brand that would ultimately be synonymous with the Facebook
+platform and Slide: the SuperPoke sheep. While SuperPoke! and X Me battled it out for 4th and 5th place
+in the application rankings, journalists started writing articles discussing the Facebook platform,
+in both positive and negative light, without fail mentiong the absurdity of "throwing sheep" at
+your friends. I always got the impression that Mark Zuckerberg would have considered the
+Facebook platform successful when IBM ported Lotus Notes to it, being a "utility fetishist", I
+can only imagine how "*delighted*" he must have been with the top applications on the platform
+being the likes of Top Friends, Fortune Cookie, Horoscopes, Graffiti, X Me and SuperPoke!.
+
+After the SP guys had joined Slide, Facebook hosted a mid-morning event at their Palo Alto office
+to help kickstart some developer relations and have top application developers do some
+lightning-round style presentations. The meeting starting at 9, it was only logical that
+Nik, Will, Max and I meet at the Slide offices at 8:45; we piled into Max's BMW M3 (a gorgeous car,
+I highly recommend it) and sped southwards from San Francisco on the 101. Despite driving between 90-100mph
+through rush-hour traffic towards Palo Alto, we arrived fashionably late; walking in
+during a presentation, Dave McClure announced to the whole room "Slide has arrived."
+
+Roll around in an M3 enough, have people announce your arrival enough and you too will feel like
+a Web 2.0 rockstar. Being the "Top Friends guy", I certainly had a bit of an ego going, I still kind
+of do, but I'm far more modest now about being a complete badass.
+
+
+The summer of 2007 was mostly a blur, the majority of my "workdays" ended up being 14-16 hours usually
+ending with Geoff, Sergio, Kasey and I drinking into the wee hours of the morning, pushing code and
+smoking on the fire escape (building management didn't really care for that part). The night before
+the iPhone launched, a bunch of Sliders had arranged to wait in line in shifts at Apple's Market St store
+(we were third in line). Given my schedule at the time, I worked most of the night and then manned
+the 4-7 a.m. shift in line. I didn't even want an iPhone but Tony, the product manager we hired
+for Top Friends, and I hung out on the sidewalk, smoked fancy cigars and watched the streets get
+cleaned. My (now) fianceé was still in Texas finishing up with school, so I had nothing to
+do but hang out, drink, smoke, write code, push the site and sleep every now and again. My
+apartment, right in the middle of the colorful Tenderloin district, only served as a place to
+shower and crash. For the duration of my lease, I didn't own any dishes and rarely had
+anything in the fridge other than left-over pizza and Cokes.
+
+By the latter part of 2007 we hired Keith Rabois to be the VP of Business Development, presumably to help us ink
+deals with big important companies about big important things (with big important sacks of money).
+Initially, I hadn't a clue what the hell Keith did, other than walk around in his shiney silk
+shirts talking on his fancy iPhone, loud enough to hear across the office. The layout of Slide's
+office was such that on one end was the open floorplan engineering "pit" and on the other end,
+separated by a ping pong table and a copy machine were the "non-engineers". The ping pong
+table was usually as far as I went. At some point, I don't remember exactly when, I started
+consulting with Keith on product related matters. He had this chair by his desk, so I would
+stroll over, plop down and gab for longer than he probably had time for about subjects ranging
+from the latest Facebook gossip to long-term strategy; Keith's involvement with
+Top Friends would only increase from then moving forward.
+
+
+By the beginning of 2008, the Facebook platform wasn't fun anymore. Too many emails contained
+the words "policy" and "violation" and often dastardly combinations of the two. At the same time,
+Slide had upped its commitment to Top Friends hiring Jason, who I had known for some time
+from the #facebook IRC channel, his compatriot Paul, and assigning Geoff, a senior QA engineer
+who had put up with my shit on the client team since I joined the company months earlier.
+I was promoted to Engineering Lead and shortly thereafter to Engineering Manager. My role had changed dramatically, no longer
+simply just a monkey coding like there was no tomorrow, I now had people I had to be accountable
+to, all the miserable hacks I had thrown into Top Friends in the previous 8 months I had to
+sheepishly explain to Jason and Paul, mentioning from time to time how I could
+do it better given the time.
+
+Jason and Paul being hired and assigned to my team was likely the luckiest thing that ever happened to me at Slide,
+overnight I went from a hard-working "army of one" to part of a team of four hard-working
+bone crushers with an incredible drive to succeed. In a few short months we had shipped an "Awards"
+feature, built out a "Top Friends Profile" and started pushing our way back to the top.
+
+In June, a reporter for CNet reported on a hole in the Top Friends Profile that allowed
+a user to view information about other users they could not have otherwise seen. The
+reporter used this an instrumental piece of a larger article bashing Facebook
+on their privacy record and the openness of the Faceobok platform.
+When Keith texted me that night, I rushed home and pushed a fix for the hole within the
+hour, went to dinner by myself and had the worst Pad Thai I've ever eaten, watching
+the exchange of emails between Slide's and Facebook's executive team on my Blackberry.
+
+Top Friends had tens of millions of users and with the flick of a switch, Facebook took Top Friends offline.
+
+**Continue on to [part 3](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_3) and [the end](http://unethicalblogger.com/posts/2009/10/end_journey)**
diff --git a/_posts/2009-10-22-my-journey-at-slide-part-3.markdown b/_posts/2009-10-22-my-journey-at-slide-part-3.markdown
new file mode 100644
index 0000000..dde1a62
--- /dev/null
+++ b/_posts/2009-10-22-my-journey-at-slide-part-3.markdown
@@ -0,0 +1,147 @@
+---
+layout: post
+title: My journey at Slide (part 3)
+tags:
+- Slide
+- Opinion
+- Miscellaneous
+created: 1256202485
+---
+*Continuing on from [part 1](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_1) and [part 2](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_2)*
+
+
+Prior to joining Slide, a friend of mine "whurley" had nicknamed
+me the "Angry Young Man" which I promptly put on my first set of
+business cards (my current business cards list my title as "Meta-Chief
+Platform Architect, Enterprise Edition", I received them after mentioning a failed
+poaching attempt by LinkedIn to Max); when Top Friends went dark
+on Facebook, I was a little more than an "angry young man."
+
+Given my close involvement with the product, the amount of sleepless
+nights working on it, the actions against Top Friends felt personal to
+me, regardless of the posturing between Slide and Facebook's
+executives. As hours turned into days offline, it became clear to me
+that the suspension of the application was far less about our privacy hole
+and far more about Facebook making an example out of Top Friends to
+the rest of the platform development community. The message was heard loud
+and clear by the majority of the developers that I knew, this is not your
+platform, these are not your users and you will play by our rules or we
+will wipe you from the face of the site. Building on the platform
+was not only no more fun, it was also a risky business decision.
+
+At the time of the suspension, Keith and I had already started discussing
+what a "TopFriends.com" might look like, as the signals of platform
+instability for applications were already being sent. When Top Friends went
+offline, I prepared a few page outline for Max and Keith detailing "my vision"
+for what Top Friends would become, I was convinced by that time that its
+future lie as a social network unto itself, rather than a network contained
+bu another network (yo dawg..). Not content to simply be "vanity and personal
+expression" inside of Facebook, I wanted Top Friends to become a separate
+entity by itself, your VIP club on the internet, at one point there was
+even executive support for the drawing of users away into a destination site
+for Top Friends. When the seven days of suspension were over and Top Friends
+came back online, Slide's strategy shifted drastically. Our new mission for TF on
+Facebook was to "get as close to Facebook as you can," we were to integrate
+into a user's experience as much as conceivably possible. Previously we
+had wanted to run as far away from Facebook as we could, taking our users
+with us, but the fear that was enstilled by the application suspension
+caused us to rethink that stance and push Top Friends to be a squeeky clean
+platform citizen, while we contemplated a possible exodus for FunSpace and SuperPoke!.
+
+
+Around this time in Slide's history I became quite jaded and cynical with
+regards to the platform, Top Friends had been neutered by Facebook, and my
+notion of what Top Friends should have been was neutered by Max. Regardless,
+we still had plenty of work that needed to be done to try to succeed with our
+new strategy. Months prior, Tony Hsieh (not the Zappos guy) the original
+Top Friends PM had failed to win the visa lottery and moved back to China,
+leaving TF without a product manager for some time. While we continued to
+look for senior PM to take on the role, I had to play both product and engineering
+manager (with help in both places every now and again). Quite the twist of
+fate for me, I had often poked fun at PMs at Slide, once creating a powerpoint (one should
+speak the language) titled "PM Flowchart". The presentation consisted of one slide,
+with a fairly simple state diagram on it, one block labeled "Write Spec" had an
+arrow pointing to another block labeled "Bitch." which pointed back at "Write Spec".
+Suffice to say, product managers and I usually had a tenuous relationship.
+
+Passionate about the product to begin with, I started meeting more and more often
+with Max and Keith to discuss product strategy for TF, in between doing my "real job" of
+Engineering Manager. Some meetings Keith and Max would square off and I would sit back
+and watch, other times Keith and I squared off against Max, I rarely took Max's side against
+Keith's though. Not that I always disagreed with Max, but he was at a slight disadvantage
+in these discussions, Keith and I generally shared a lot of fundamental ideas of what TF should be,
+stemming from months of discussing the product by his desk before he ever "officially" worked
+with the project. The transition over a year and a half from quivering in fear as the director
+of engineering cursed at me on Dave's house phone, to arguing with the CEO about
+the product **he** pitched me on, was surreal to say the least. How I didn't get fired
+is either a testament to my charm or Max's patience.
+
+In fall of 2008, when Seema finally joined as the Top Friends product manager, not only was
+I more than ready to relinquish the post, Top Friends was in the midst of
+an identity crisis. Our "facebook zerg rush" strategy of getting closer and closer
+to the platform played out as you might of expected (hindsight and all), Facebook
+redesigned the profile, changed viral communications channels and did a lot
+of things that were likely good for Facebook, but terrible for applications.
+TF had a lot of momentum on the "old profile" thanks to users dragging the TF
+profile box *all the way up* on their profiles. When Facebook rolled out their new profile
+which put applications not in the backseat, but in the way-back seat, the strategy
+of "be lovey dovey with Facebook" started to break down, they weren't being
+lovey dovey back.
+
+Times were also changing outside of Top Friends at Slide, the SuperPoke! Pets product was
+starting to take off and actually **make** money directly from users. This was
+important! Users, giving us money, for pixels! Brilliant! Being a much more reliable
+revenue stream than the advertising oriented model that FunSpace, SuperPoke! and Top Friends
+had been built around, Pets quickly became the "top" product at Slide.
+With ad revenue drying up for Top Friends, we were tasked
+with experimenting with virtual currency (like Pets) and ultimately "premium items"
+(like Pets) within Top Friends. It seemed almost as if Top Friends was changing
+visions, strategies and directions on a bi-weekly basis. One week we were building
+virtual currency experiments with "Top Dollars", the next, virtual economy
+experiments with an "Own your friends' profiles" feature, the next, premium virtual
+goods with "Top Gifts". As the "Top Friends guy" and the manager of the engineering team,
+I was so confused and disoriented about what we **actually did** and where we were
+actually heading, I didn't stand a chance at convincing Paul, Geoff and Jason of it.
+
+2008 winding down, the writing was on the wall, Top Friends was not going to live long,
+at least the Top Friends Team wasn't. We had gained a reputation of being very
+self-sufficient and competent, but with that autonomy came uncertainty from outsiders.
+I regularly had to remind coworkers that I was a Slide engineer, not a Top Friends
+engineer, regardless of the TF team's internal view of itself as a "microstartup."
+When we failed to meet goals set out for us, it was decided that the staff behind
+Top Friends were too valuable to spend time on a failing product.
+
+Jason, Paul and Seema went to start a new project,
+while Geoff and I, together since the desktop client days, joined the Server/Infrastructure team.
+My personal "love" for Top Friends had all but dissolved by this point, I was sick of
+Top Friends, I was sick of Facebook, I was sick of policy, I didn't care all that
+much about the product anymore. The breaking up of the team though, was crushing.
+As far war metaphors go, the TF team was a small rag-tag group of guerrillas, capable
+of taking large projects and finishing them in record time. We often talked about
+what we did as "playing jazz music" because our work had an improvisational style,
+but the trust and understanding of where we all fit into the act, allowed us
+to tackle large tasks in stride; that was all over though. The dream team was broken up.
+
+
+My time on the server team at Slide is unfortunately a boring story of working
+with stellar engineers capable of writing solid code and deploying it without
+incident. As exciting as wood filler "this worked out just fine, the end."
+After years of frenzy with Top Friends and the Facebook platform,
+my first project for the server team took three weeks to build, was pushed
+without a hitch and has only required two minor updates since. With my nose
+to the grindstone building services and scalable architecture, I went
+months without particularly concerning myself with "product direction", company
+strategy and their ilk. The closest I would come to application development would be
+jumping up into application code to fix bugs, all the while cursing app developers'
+laziness while conveniently forgetting how often I was guilty of the same offense
+in my tenure with Top Friends.
+
+When I finally stuck my head back up, near the end of the summer, I started to
+realize that I was working at a different company than I remember joining. Slide
+had grown tremendously and changed direction once again. Since stepping back from
+the front-lines, I had changed and Slide had changed too.
+
+It was about time Slide and I started seeing other people.
+
+
+**Continue on to [the end](http://unethicalblogger.com/posts/2009/10/end_journey)**
diff --git a/_posts/2009-10-23-daniel-felt-left-out.html b/_posts/2009-10-23-daniel-felt-left-out.html
new file mode 100644
index 0000000..c502f9c
--- /dev/null
+++ b/_posts/2009-10-23-daniel-felt-left-out.html
@@ -0,0 +1,11 @@
+---
+layout: post
+title: Daniel felt left out.
+tags:
+- Slide
+created: 1256345950
+---
+Dear Slide, I luv u guys, srsly. kthxbai.
diff --git a/_posts/2009-10-23-end-of-a-journey.markdown b/_posts/2009-10-23-end-of-a-journey.markdown
new file mode 100644
index 0000000..a2a18ce
--- /dev/null
+++ b/_posts/2009-10-23-end-of-a-journey.markdown
@@ -0,0 +1,53 @@
+---
+layout: post
+title: End of a journey
+tags:
+- Slide
+- Opinion
+- Miscellaneous
+created: 1256311759
+---
+*See parts [1](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_1), [2](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_2) and [3](http://unethicalblogger.com/posts/2009/10/my_journey_slide_part_2)*
+
+
+My journey at Slide comes to an end today, when I leave this evening
+I will once again return to being a free agent (if only for two days).
+Some of my coworkers have casually referred to my writings over the
+past few days of my "memoirs", which isn't too far off to be honest.
+When I leave Slide this evening, my employment will have accounted
+for roughly 10% of my entire life and 50% of my adult life. Writing
+my side of the story down, to some extent, has been more about telling
+a story to myself and less about telling it to anybody else (apologies).
+So much of my time spent at Slide has been in a state of controlled
+choas that at times it's hard for me to remember when things were done,
+who was doing them and the order in which they happened.
+
+
+The two questions I've invariably gotten since I gave my notice and
+subsequently started writing this series of posts have been:
+why are you leaving and where are you going? My reasons for leaving
+are irrelevant, I will say that if I could take the people I've been working
+with at Slide with me, I would. I've learned such an incredible amount
+from those that I've worked with, both technical and non-technical, while
+at Slide. Whenever I would pitch friends on the idea of joining Slide, my
+take-home point was always "when you join Slide, you will not be the
+smartest person there." I feel lucky that I was given the opportunity to
+"come of age" as a young engineer in a company of so many tremendously talented
+individials, given the chance for a do-over, I would still play my cards the
+way I've played them. I joined Slide a punk kid from Texas, I'm leaving
+Slide a slightly-more-learned punk kid from Texas.
+
+As to where I am going, after an extended vacation of Saturday and Sunday,
+I will be joining my second startup ever (Slide's a pretty good
+first time out) on Monday. When I started looking at other companies I had a couple
+of criteria, I wanted to join a smaller team (Slide's upwards of a hundred people
+or so) and I had to really like who I would be working with. Tristan, Jesse, Can (John)
+and the team from Apture fit both criteria. I'm not going to go into detail
+about what I'm really going to be doing there or where Apture is going as a
+company. I will say that after two and a half years of working and studying
+at Slide, I'm looking forward to employing what I've learned and continuing
+my education at Apture.
+
+
+See you on the beaches of the world.
+
diff --git a/_posts/2009-11-03-do-you-love-git-too.markdown b/_posts/2009-11-03-do-you-love-git-too.markdown
new file mode 100644
index 0000000..70094bc
--- /dev/null
+++ b/_posts/2009-11-03-do-you-love-git-too.markdown
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Do you love Git too?
+tags:
+- Git
+created: 1257317168
+---
+In addition to RSS feeds, one of my favorite sources of reading material is the Git mailing list; I'm not really active, I simply enjoy reading the discussions around code and the best solutions for certain problems. If you read the list long enough, you'll start to appreciate the time and attention the Git core developers (spearce, peff and junio (a.k.a. gitster)) put into cultivating the code and in cultivating new contributors. Of all the open source projects I watch to one extent or another, Git is very effective at bringing in new contributors and getting their contributions vetted for inclusion.
+
+If you're a heavy Git user (like me) you can certainly see the results of their tireless efforts, Junio's (git.git's maintainer) in particular. I highly recommend checking out his Amazon [wishlist](http://www.amazon.com/gp/registry/wishlist/1513KNZE30W63) to thank him for his efforts.
diff --git a/_posts/2009-12-04-on-github-and-how-i-came-to-write-the-fastest-python-json-module-in-town.markdown b/_posts/2009-12-04-on-github-and-how-i-came-to-write-the-fastest-python-json-module-in-town.markdown
new file mode 100644
index 0000000..502410b
--- /dev/null
+++ b/_posts/2009-12-04-on-github-and-how-i-came-to-write-the-fastest-python-json-module-in-town.markdown
@@ -0,0 +1,35 @@
+---
+layout: post
+title: On GitHub and how I came to write the fastest Python JSON module in town
+tags:
+- Software Development
+- Git
+- Python
+created: 1259919009
+---
+Perhaps the title is a bit too much ego stroking, yes, I did write the fastest Python module for decoding JSON strings and encoding Python objects to JSON. I didn't however write the parser behind the scenes.
+
+Over the summer I discovered "Yet Another JSON Library" on GitHub, written by Lloyd Hilaiel, jonesing for a Saturday afternoon project I started the "py-yajl" project to see if I could implement a Python C module atop Lloyd's marvelous parsing library. After tinkering with the project for a while I got a working prototype building (learning how to define custom types in Python along the way) and let the project stagnate as my weekend ended and the workweek resumed.
+
+A little over a week ago "autodata", another GitHub user, sent me a "Pull Request" with some minor changes to make py-yajl build cleaner on amd64; my interest in the project was suddenly reignited, amazing what a little interest can do for motivation. Over the 10 days following autodata's pull request I discovered that a former colleague of mine and fellow GitHub user "teepark" had forked the project as well, working on Python 3 support. Going from zero to **two** people interested in the project, I quickly converted the code from a stagnant, borderline embarrassing, dump of C code into a leak-free, swift JSON library
+for Python. Not one to miss out on the fun, I pinged Lloyd who quickly became as enamored with making py-yajl the best Python JSON module available, he forked the project and almost immediately sent a number of pull requests my way with further optimizations to py-yajl such as:
+
+* Swapping out the use of Python lists to a custom pointer stack for maintaining internal state
+* Accelerating parsing and handling of Number objects
+* Pruning a few memory leaks here and there
+
+Thanks to mikeal's JSON post and jsonperf.py script, Lloyd and I could both see how py-yajl was stacking up against cjson, jsonlib, jsonlib2 and simplejson; things got competitive. Below are the most recent `jsonperf.py` results with py-yajl v0.1.1:
+
+ json.loads: 6470.22037ms
+ simplejson.loads: 202.21063ms
+ yajl.loads: 145.32621ms
+ cjson.decode: 102.44788ms
+
+ json.dumps: 2309.15286ms
+ cjson.encode: 276.49586ms
+ simplejson.dumps: 201.59785ms
+ yajl.dumps: 161.00153ms
+
+Over the coming days or weeks (as time permits) I'm planning on adding JSON stream parsing support, i.e. parsing a stream of data as it's coming in off a socket or file object, as well as a few other miscellaneous tasks.
+
+Given the nature of GitHub's social coding dynamic, py-yajl got off the ground as a project but Yajl itself gained an IRC channel (#yajl on Freenode) and a mailing list (yajl@librelist.com). To date I have over 20 unique repositories on GitHub (i.e. authored by me) but the experience around Yajl has been the most exciting and finally proved the "social coding" concept beneficial to me.
diff --git a/_posts/2009-12-04-server-side-image-transforms-in-python.markdown b/_posts/2009-12-04-server-side-image-transforms-in-python.markdown
new file mode 100644
index 0000000..a8566b2
--- /dev/null
+++ b/_posts/2009-12-04-server-side-image-transforms-in-python.markdown
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Server-side image transforms in Python
+tags:
+- Miscellaneous
+- Software Development
+- Python
+created: 1259995893
+---
+While working at Slide, I became enamored with the concept of cooperative threads (coroutines) and the in-house library built around greenlet to implement coroutines for Python. As an engineer on the "server team" I had the joy of working in a coro-environment on a daily basis but now that I'm "out" I've had to find an alternative library to give me coroutines: eventlet. Interestingly enough, eventlet shares common ancestry with Slide's internal coroutine implementation like two different species separated thousands of years ago by continental drift (a story for another day).
+
+A few weekends ago, I had a coroutine itch to scratch one afternoon: an eventlet-based image server for applying transforms/filters/etc. After playing around for a couple hours "PILServ" started to come together. One of the key features I wanted to have in my little image server project was the ability to not only pass the server a URL of an image instead of a local path but also to "chain" transforms in a jQuery-esque style. Using segments of the URL as arguments, a user can arbitrarily chain arguments into PILServ, i.e.:
+
+ http://localhost:8080/flip/filter(blur)/rotate(45)/resize(64x64)/
+
+At the end of the evening I spent on PILServ, I had something going that likely shows off more of the skills of PIL rather than eventlet itself but I still think it's *neat*. Below is a sample of some images transformed by PILServ running locally:
+
+
diff --git a/_posts/2009-12-07-code-review-with-gerrit-a-mostly-visual-guide.markdown b/_posts/2009-12-07-code-review-with-gerrit-a-mostly-visual-guide.markdown
new file mode 100644
index 0000000..9e54ecc
--- /dev/null
+++ b/_posts/2009-12-07-code-review-with-gerrit-a-mostly-visual-guide.markdown
@@ -0,0 +1,159 @@
+---
+layout: post
+title: Code Review with Gerrit, a mostly visual guide
+tags:
+- Software Development
+- Git
+created: 1260254725
+---
+A while ago, when Paul, Jason and I worked together, I became a big fan of code reviews before merging code. It was no surprise really, we were the first to adopt Git at the company and our workflow was quite ad-hoc, the need to federate knowledge within the group meant code reviews were a pretty big deal. At the time, we mostly did code reviews in person by way of "hey, what's this you're doing here?" or by literally sending patch emails with git-format-patch(1) to the team mailing list so all could participate in the discussion about what merits "good code" exhibited versus "less good code." Now that I've left that company and joined another one, I've found myself in another small-team situation, where my teammates place high value on code review. Fortunately this time around better tools exist, namely: Gerrit.
+
+The history behind Gerrit I'm a bit hazy on, what I do know is that it's primary developer Shawn Pearce (spearce) is one of the Git "inner circle" who contributes heavily to Git itself as well as JGit, a Git implementation in Java which sits underneath Gerrit's internals. What makes Gerrit unique in the land of code review systems is how tightly coupled Gerrit is with Git itself, so much so that you submit changes by **pushing** as if the Gerrit server were "just another Git repo."
+
+I recommend building Gerrit from source for now, spearce is planning a proper release of the recent Gerrit developments shortly before Christmas, but who has that kind of patience! To build Gerrit you will need Maven and the Sun JDK 1.6.
+
+
+Setting up the Gerrit daemon
+------------------------------
+
+First you should clone one of Gerrit's dependencies, followed by Gerrit itself:
+
+ banana% git clone git://android.git.kernel.org/tools/gwtexpui.git
+ banana% git clone git://android.git.kernel.org/tools/gerrit.git
+
+Once both clones are complete, you can start by building one and then the other (which might take a while, go grab yourself a coffee, you've earned it):
+
+ banana% (cd gwtexpui && mvn install)
+ banana% cd gerrit && mvn clean package
+
+After Gerrit has finished building, you'll have a `.war` file ready to run Gerrit with (*note:* depending on when you read this article, your path to gerrit.war might have changed). First we'll initialize the directory "/srv/gerrit" as the location where the executing Gerrit daemon will store its logs, data, etc:
+
+ banana% java -jar gerrit-war/target/gerrit-2.0.25-SNAPSHOT.war init -d /srv/gerrit
+ *** Gerrit Code Review v2.0.24.2-72-g4c37167
+ ***
+
+ Initialize '/srv/gerrit' [y/n]? y
+
+ *** Git Repositories
+ ***
+
+ Location of Git repositories [git]:
+
+ *** SQL Database
+ ***
+
+ Database server type [H2/?]:
+
+ *** User Authentication
+ ***
+
+ Authentication method [OPENID/?]:
+
+ *** Email Delivery
+ ***
+
+ SMTP server hostname [localhost]:
+ SMTP server port [(default)]:
+ SMTP encryption [NONE/?]:
+ SMTP username :
+
+ *** SSH Daemon
+ ***
+
+ Gerrit SSH listens on address [*]:
+ Gerrit SSH listens on port [29418]:
+
+ Gerrit Code Review is not shipped with Bouncy Castle Crypto v144
+ If available, Gerrit can take advantage of features
+ in the library, but will also function without it.
+ Download and install it now [y/n]? y
+ Downloading http://www.bouncycastle.org/download/bcprov-jdk16-144.jar ... OK
+ Checksum bcprov-jdk16-144.jar OK
+ Generating SSH host key ... rsa... dsa... done
+
+ *** HTTP Daemon
+ ***
+
+ Behind reverse HTTP proxy (e.g. Apache mod_proxy) [y/n]? n
+ Use https:// (SSL) [y/n]? n
+ Gerrit HTTP listens on address [*]:
+ Gerrit HTTP listens on port [8080]:
+
+ Initialized /srv/gerrit
+
+After running through Gerrit's brief wizard, you'll be ready to start Gerrit itself (*note:* this command will not detach from the terminal, so you might want to start it within screen for now):
+
+ banana% java -jar gerrit-war/target/gerrit-2.0.25-SNAPSHOT.war daemon -d /srv/gerrit
+
+Now that you've reached this point you'll have Gerrit running a web application on port 8080, and listening for SSH connections on port 29418, congratulations! You're most of the way there :)
+
+
+Creating users and groups
+-----------------------------
+Welcome to Gerrit
+
+First thing you should do after starting Gerrit up is log in to make sure your user is the administrator, you can do so by clicking the "Register" link in the top right corner which should present you with an openID login dialog
+
+After logging in with your favorite openID provider, Gerrit will allow you to enter in information about you (SSH key, email address, etc). It's worth noting that the email address is **very** important as Gerrit uses the email address to match your commits to your Gerrit account
+
+When you create your SSH key for Gerrit, it's recommended that you give it a custom entry in `~/.ssh/config` along the lines of:
+
+ Host gerrithost
+ User
+ Port 29418
+ Hostname
+ IdentityFile
+
+After you click "Continue" at the bottom of the user information page, you will be taken to your dashboard which is where your changes waiting to be reviewed as well as changes waiting to be reviewed *by* you will be waiting
+
+
+Now that your account is all set up, let's create a group for "integrators", integrators in Git parlance are those that are responsible for reviewing code and integrating it into the "official" repository (typically integrators are project maintainers or core developers). Be sure to add yourself to the "Integrators" group, we'll use this "Integrators" group later to create more granular permissions on a particular project:
+
+
+
+Projects in Gerrit
+---------------------
+Creating a new project in Gerrit is fairly easy but a little *different* insofar that there isn't a web UI for doing so but there is a command line one:
+
+ banana% ssh gerrithost gerrit create-project -n
+
+For the purposes of my examples moving forward, we'll use a project created in Gerrit for one of the Python modules I maintain, py-yajl. After creating the "py-yajl" project with the command line, I can visit Admin > Projects and select "py-yajl" and edited some of its permissions. Here we'll give "Integrators" the ability to **Verify** changes as well as **Push Branch**.
+
+
+With the py-yajl project all set up in Gerrit, I can return to my Git repository and add a "remote" for Gerrit, and push my master branch to it
+
+ banana% git checkout master
+ banana% git remote add gerritrhost ssh://gerrithost/py-yajl.git
+ banana% git push gerrithost master
+
+This will give Gerrit a baseline for reviewing changes against and allow it to determine when a change has been merged down. Before getting down to business and starting to commit changes, it's recommended that you install the Gerrit Change-Id commit-msg hook documented here which will help Gerrit track changes through rebasing; once that's taken care of, have at it!
+
+ banana% git checkout -b topic-branch
+ banana%
+ banana% git commit
+ banana% git push gerrithost HEAD:refs/for/master
+
+The last command will push my commit to Gerrit, the command is kind of weird looking so feel free to put it behind a git-alias(1). After the push is complete however, my changes will be awaiting review in Gerrit
+
+
+
+
+At this point, you'd likely wait for another reviewer to come along and either comment your code inline in the side-by-side viewer or otherwise approve the commit bu clicking "Publish Comments"
+
+
+After comments have been published, the view in My Dashboard has changed to indicate that the change has not only been reviewed but also verified:
+
+
+Upon seeing this, I can return back to my Git repository and feel comfortable merging my code to the master branch:
+
+ banana% git checkout master
+ banana% git merge topic-branch
+ banana% git push origin master
+ banana% git push gerrithost master
+
+The last command is significant again, by pushing the updated master branch to Gerrit, we indicate that the change has been merged, which is also reflected in My Dashboard
+
+
+Tada! You've just had your code reviewed and subsequently integrated into the upstream tree, pat yourself on the back. It's worth noting that while Gerrit is under steady development it *is* being used by the likes of the Android team, JGit/EGit team and countless others. Gerrit contains a number of nice subtle features, like double-clicking a line inside the side-by-side diff to add a comment to that line specifically, the ability to "star" changes (similar to bookmarking) and a too many others to go into detail in this post.
+
+While it may seem like this was a fair amount of set-up to get code reviews going, the payoff can be tremendous, Gerrit facilitates a solid Git-oriented code review process that scales very well with the number of committers and changes. I hope you enjoy it :)
diff --git a/_posts/2009-12-09-python-json-eat-drink-up-in-san-francisco.markdown b/_posts/2009-12-09-python-json-eat-drink-up-in-san-francisco.markdown
new file mode 100644
index 0000000..8ada506
--- /dev/null
+++ b/_posts/2009-12-09-python-json-eat-drink-up-in-san-francisco.markdown
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Python/JSON Eat/Drink-up in San Francisco
+tags:
+- Miscellaneous
+- Python
+created: 1260347791
+---
+A few weeks ago when I started working more on py-yajl I discovered that there are actually a number of Python developers who work(ed) with JSON parsers in the Bay Area. As luck would have it Lloyd, the author of Yajl, is going to be in town next weekend for Add-on-Con, time to meet up and have some beers! I've invited the authors of: simplejson, jsonlib, jsonlib2 and a few other Python hackers in the Bay Area that I know of.
+
+If you're in San Francisco this Saturday (Dec. 12th) and loves you some Python, don't hesitate to swing by 21st Amendment around 1pm-ish to join us!
+
diff --git a/_posts/2009-12-14-get-out-there-and-buy-me-stuff.markdown b/_posts/2009-12-14-get-out-there-and-buy-me-stuff.markdown
new file mode 100644
index 0000000..ffb2bd9
--- /dev/null
+++ b/_posts/2009-12-14-get-out-there-and-buy-me-stuff.markdown
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Get out there and buy (me) stuff
+tags:
+- Miscellaneous
+created: 1260860248
+---
+A weekend or two ago I sat down and created an Amazon wishlist of stuff that I would like to purchase. In the past I've found Amazon wishlists an ideal way of saying thanks to a number of folks in the open source community whose work I value, at one point I didn't desire any new gadgets and went through a large number of gift cards buying goodies for some of my favorite hackers on Amazon.
+
+On the off chance you appreciate [pictures of Fatso](http://www.flickr.com/photos/agentdero/tags/fatso/), [Cheetah templates](http://github.com/rtyler/cheetah), [@hudsonci on Twitter](http://twitter.com/hudsonci), [py-yajl](http://github.com/rtyler/py-yajl), [Urlenco.de](http://urlenco.de), [tweets on a regular basis](http://twitter.com/agentdero), [watching me talk in a brown corduroy jacket](http://www.flickr.com/photos/8335190@N06/2333319339) or just plain have money to burn, below is my very own Amazon wishlist.
+
+Holy Wishlist Batman!
+
+
+Get out there and buy (me) stuff, our economy depends on it.
diff --git a/_posts/2009-12-17-pyrage-generic-exceptions.markdown b/_posts/2009-12-17-pyrage-generic-exceptions.markdown
new file mode 100644
index 0000000..c25587c
--- /dev/null
+++ b/_posts/2009-12-17-pyrage-generic-exceptions.markdown
@@ -0,0 +1,42 @@
+---
+layout: post
+title: "Pyrage: Generic Exceptions"
+tags:
+- Opinion
+- Software Development
+- Python
+created: 1261116613
+---
+Earlier while talking to Ryan I decided I'd try to coin the term "pyrage" referring to some frustrations I was having with some Python packages. The notion of "pyrage" can extend to anything from a constant irritation to a pure "WTF were you thinking!" kind of moment.
+
+Not one to pass up a good opportunity to bitch publicly, I'll elaborate on some of my favorite sources of "pyrage", starting with generic exceptions. While at Slide, one of the better practices I picked up from Dave was the use of specifically typed exceptions to specific errors. In effect:
+
+ class Connection(object):
+ ## Pretend this object has "stuff"
+ pass
+
+ class InvalidConnectionError(Exception):
+ pass
+ class ConnectionConfigurationError(Exception):
+ pass
+
+ def configureConnection(conn):
+ if not isinstance(conn, Connection):
+ raise InvalidConnectionError('configureConnection requires a Connection object')
+ if conn.connected:
+ raise ConnectionConfigurationError('Connection (%s) is already connected' % conn)
+ ## etc
+
+Django, for example, is pretty stacked with generic exceptions, using builtin exceptions like ValueError and AttributeError for a myriad of different kinds of exceptions. urllib2's HTTPError is good example as well, overloading a large number
+of HTTP errors into one exception leaving a developer to catch them all, and check the code, a la:
+ try:
+ urllib2.urlopen('http://some/url')
+ except urllib2.HTTPError, e:
+ if e.code == 503:
+ ## Handle 503's special
+ pass
+ else:
+ raise
+
+Argh. pyrage!
+
diff --git a/_posts/2009-12-19-one-year-of-cheetah.markdown b/_posts/2009-12-19-one-year-of-cheetah.markdown
new file mode 100644
index 0000000..ee787f6
--- /dev/null
+++ b/_posts/2009-12-19-one-year-of-cheetah.markdown
@@ -0,0 +1,61 @@
+---
+layout: post
+title: One year of Cheetah
+tags:
+- Software Development
+- Cheetah
+- Python
+created: 1261271089
+---
+While working at Slide I had a tendency to self-assign major projects,
+not content with things being "good-enough" I tended to push and over-extend
+myself to improve the state of Slide Engineering. Sometimes these projects
+would fail and I would get uncomfortably close to burning myself out, other times,
+such as the migration from Subversion to Git, turned out to be incredibly rewarding
+and netted noticable improvements in our workflow as a company.
+
+One of my very first major projects was upgrading our installation of Cheetah from 1.0 to
+2.0, at the time I vigorously *hated* Cheetah. My distain of the templating system stemmed
+from using a three year old version (that sucked to begin with) and our usage of Cheetah which
+bordered between "hackish" and "vomitable." At this point in Slide's history, the growth of
+the Facebook applications meant there was going to be far less focus on the Slide.com codebase
+which is where some of the more egregious Cheetah code lived; worth noting that I never "officially"
+worked on the Slide.com codebase. When I successfully convinced Jeremiah and KB that it was worth
+my time and some of their time to upgrade to Cheetah 2.0 which offered a number of improvements
+that we could make use of, I still held some pretty vigorous hatred towards Cheetah. My attitude was
+simple though, temporary pain on my part would alleviate pain inflicted on the rest of the engineering
+team further down the line. Thanks to fantastic QA by Ruben and Sunil, the Cheetah upgrade went down
+relatively issue free, things were looking fine in production and everybody went back to their
+regularly scheduled work.
+
+Months went by without me thinking of Cheetah too much until late 2008, Slide continued to write
+front-end code using Cheetah and developers continued to grumble about it. Frustrated by the
+lack of development on the project, I did the unthinkable, I started fixing it. Over the Christmas
+break, I used git-cvsimport(1) to create a git repository from the Cheetah CVS repo hosted with
+SourceForge and I started applying patches that had circulated on the mailing list. By mid-March
+I had a number of changes and improvements in my fork of Cheetah and I released "Community
+Cheetah". Without project administrator privileges on SourceForge, I didn't have much of a choice
+but to publish a fork on GitHub. Eventually I was able to get a hold of Tavis Rudd, the original
+author of Cheetah who had no problem allowing me to become the maintainer of Cheetah proper,
+in a matter of months I had gone from hating Cheetah to fulfilling the oft touted saying "it's
+open source, fix it!" What was I thinking.
+
+Thanks in part to git and GitHub's collaborative/distributed development model patches started to
+come in and the Cheetah community for all intents and purposes "woke up." Over the course of the
+past year, Cheetah has seen an amazing number of improvements, bugfixes and releases. Cheetah now
+properly supports unicode throughout the system, supports @staticmethod and @classmethod decorators,
+supports use with Django and now supports Windows as a "first-class citizen". While I committed
+the majority of the fixes to Cheetah, five other developers contributed fixes:
+
+* Jean-Baptiste Quenot (unicode fixes)
+* Mike Bonnet (unicode fixes, test fixes)
+* James Abbatiello (Windows support)
+* Arun Kumar
+* Doug Knight (fixes for #raw directive)
+
+In 2008, Cheetah saw 7 commits and 0 releases, while 2009 brought 342 commits and 10 releases;
+something I'm particularly proud of. Unforunately since I've left Slide, I no longer use Cheetah
+in a professional context but I still find it tremendously useful for some of my personal projects.
+
+I am looking forward to what 2010 will bring for the Cheetah project, which started in mid-2001 and has
+seen continued development since thanks to a number of contributors over the years.
diff --git a/_posts/2009-12-24-pyrage-from-toolbox-import-hammer.markdown b/_posts/2009-12-24-pyrage-from-toolbox-import-hammer.markdown
new file mode 100644
index 0000000..ad22d7c
--- /dev/null
+++ b/_posts/2009-12-24-pyrage-from-toolbox-import-hammer.markdown
@@ -0,0 +1,71 @@
+---
+layout: post
+title: "Pyrage: from toolbox import hammer"
+tags:
+- Opinion
+- Software Development
+- Python
+created: 1261643006
+---
+Those that have worked with my directly know I'm a *tad*
+obsessive when it comes to imports in Python. Once upon a
+time I had to write some pretty disgusting import hooks
+to solve a problem and got to learn first-hand how gnarly
+Python's import subsystem can be. I have a couple coding
+conventions that I follow when I'm writing Python for my
+own personal projects that typically follows:
+
+* "strict" system imports first (i.e. `import time`)
+* "from" system imports second (i.e. `from eventlet import api`)
+* "local" imports (`import mymodule`)
+* local "from" imports (`from mypackage import module`)
+
+In all of these sections, I like to list things alphabetically
+as well, just to make sure that at no point are modules ever
+doubley-imported. This results in code that looks clean (in
+my humblest of opinions):
+
+ #!/usr/bin/env python
+ import os
+ import sys
+ from eventlet import api
+
+ import app.util
+ from app.models import account
+
+ ## Etc.
+
+A module importing habit that absolutely drives me up the wall,
+I was introduced to and told "don't-do-that" by Dave: importing
+symbols from modules; in effect: `from MySQLdb import IntegrityError`.
+I have two major reasons for hating the importing of symbols, the
+first one is that it messes with your module's namespace. If the
+symbol import above were in a file called "foo.py", the `foo` module
+would then have the member `foo.IntegrityError`. Additionally, it
+makes the code more difficult to understand when you flatten the module's
+namespace out; 500 lines down in the file if you see `acct_m = AccountManager()`
+as a developer new to the file you'll have to go up to the top and figure
+out where the hell `AccountManager` is actually coming from to understand
+how it works.
+
+As code with these sort of symbol-level imports ages, it becomes more and more
+frustrating to deal with, if I need `OperationalError` in my module now I have
+three options:
+
+* Update the line to say: `from MySQLdb import IntegrityError, OperationalError`
+* Add `import MySQLdb` and just refer to `IntegrityError` and `MySQLdb.OperationalError`
+* Add `import MySQLdb` and update all references to `IntegrityError`
+
+I've seen code in open source projects that have abused the symbol imports
+so badly that an import statement look like: `from mod import CONST1, CONST2, CONST3, SomeError, AnotherClass`
+(ad infinium).
+
+I think poor import style is a good indicator of how one can expect the
+rest of the Python code to look, I cannot recall a single instance where I've
+looked at a Python module with gross import statements and clean classes and functions.
+
+ from MySQLdb import IntegrityError, OperationalError, MySQLError, ProgrammingError, \
+ NotSupportedError, InternalError
+
+PYRAGE!
+
diff --git a/_posts/2009-12-26-using-cheetah-templates-with-django.markdown b/_posts/2009-12-26-using-cheetah-templates-with-django.markdown
new file mode 100644
index 0000000..4c07fe8
--- /dev/null
+++ b/_posts/2009-12-26-using-cheetah-templates-with-django.markdown
@@ -0,0 +1,45 @@
+---
+layout: post
+title: Using Cheetah templates with Django
+tags:
+- Software Development
+- Cheetah
+- Python
+created: 1261859471
+---
+Some time ago after reading a post on [Eric Florenzano's blog](http://www.eflorenzano.com/blog/post/cheetah-and-django/) about hacking together support for Cheetah with Django, I decided to add "proper" support for Cheetah/Django to Cheetah v2.2.1 (released June 1st, 2009). At the time I didn't use Django for anything, so I didn't really think about it too much more.
+
+Now that I work at Apture, which uses Django as part of its stack, Cheetah and Django playing nicely together is more attractive to me and as such I wanted to jot down a quick example project for others to use for getting started with Cheetah and Django. You can find the [django_cheetah_example](http://github.com/rtyler/django_cheetah_example) project on GitHub, but the gist of how this works is as follows.
+
+### Requires
+
+ * [Django](http://www.djangoproject.com/)
+ * [Cheetah](http://cheetahtemplate.org) (>= v2.2.1)
+
+### Getting Started
+
+For all intents and purposes, using Cheetah in place of Django's
+templating system is a trivial change in how you write your *views*.
+
+After following the Django [getting started](http://docs.djangoproject.com/en/1.1/intro/tutorial01/)
+documentation, you'll want to create a directory for your Cheetah templates, such
+as `Cheetar/templates`. Be sure to `touch __init__.py` in your template
+directory to ensure that templates can be imported if they need to.
+
+Add your new template directory to the `TEMPLATE_DIRS` attribute
+in your project's `settings.py`.
+
+Once that is all set up, utilizing Cheetah templates in Django is just
+a matter of a few lines in your view code:
+
+ import Cheetah.Django
+
+ def index(req):
+ return Cheetah.Django.render('index.tmpl', greet=False)
+
+**Note**: Any keyword-arguments you pass into the `Cheetah.Django.render()`
+function will be exposed in the template's "searchList", meaning you can
+then access them with $-placeholders. (i.e. `$greet`)
+
+With the current release of Cheetah ([v2.4.1](http://pypi.python.org/pypi/Cheetah/2.4.1)), there isn't support for using pre-compiled Cheetah templates with Django (it'd be trivial to put together though) which means `Cheetah.Django.render()` uses Cheetah's dynamic compilation mode which can add a bit of overhead since templates are compiled at runtime (your mileage may vary).
+
diff --git a/_posts/2009-12-27-5-tips-for-traveling-with-tux.markdown b/_posts/2009-12-27-5-tips-for-traveling-with-tux.markdown
new file mode 100644
index 0000000..5044b0f
--- /dev/null
+++ b/_posts/2009-12-27-5-tips-for-traveling-with-tux.markdown
@@ -0,0 +1,80 @@
+---
+layout: post
+title: 5 tips for traveling with Tux
+tags:
+- Opinion
+- Linux
+created: 1261912781
+---
+After running a Linux laptop for a number of years and
+having mostly negative travel experiences from messing something up
+along the way, this holiday season I think I've finally figured
+out how to optimally travel with a Linux notebook. The following tips
+are some of the lessons I've had to learn the hard way through trial and
+error over the course of countless flights spanning a few years.
+
+### Purchase a small laptop or netbook
+
+Far and away the best thing I've done for my travel experience thus far
+has been the purchase of my new Thinkpad X200 (12.1"). My previous laptops include
+a MacBook Pro (15"), a Thinkpad T43 (14") and a Thinkpad T64 (14"). Invariably I have
+the same problems with all larger laptops, their size is unwieldy in economy class
+and their power consumption usually allows me very little time to get anything done
+while up in the air. Being 6'4" and consistently cheap, I'm always in coach, quite
+often on redeye flights where the passenger in front of me invariably leans their
+seat back drastically reducing my ability to open a larger laptop and see the screen.
+With a 12" laptop or a netbook (I've traveled with an Eee PC in the past as well) I'm able
+to open the screen enough to see it clearly and actually type comfortbaly on it. Additionally,
+the smaller screen and size of the laptop means less power consumption, allowing me to
+use it for extended periods of time.
+
+
+### Use a basic window manager
+
+Personally, I prefer XMonad, but I believe any simplistic window manager will save
+a noticable number of cycles compared to the Gnome and KDE "desktop environments."
+Unlike Gnome, for example, XMonad does not run a number of background daemons to help
+provide a "nice" experience in the way of applets, widgets, panels and menus.
+
+
+### Disable unneeded services and hardware
+
+Reducing power consumption is a pretty important goal for me while traveling with
+a Linux laptop, I love it when I have sufficient juice to keep myself entertained
+for an entire cross-country flight. Two of the first things I disable before boarding
+a plane are Wireless and Bluetooth via the NetworkManager applet that I run. If I'm on a
+redeye, I'll also set my display as dark as possible which not only saves power but also
+eye strain. It's also important to make sure your laptop is running its CPU in "power-save"
+mode, which means the clockspeed of the chip is reduced, allowing you to save even more power.
+Finally I typically take a look at htop(1) to see if there are any unneeded processes taking
+up cycles/memory that I either don't need or don't intend to use for the flight. The flight
+I'm currently on (Miami to San Francisco) I discovered that Chrome was churning some
+unnecessary cycles and killed it (no web browsing on American Airlines).
+
+### Use an external device for music/video
+
+If you're like me, you travel with a good pair of headphones and a desire to not listen
+to babies crying on the plane. I find a dedicated device purely for music can help avoid
+wasting power on music since most devices can play for 12-40 hours depending on the device.
+It's generally better (in my opinion) to use your $100 iPod for music and your $2000 computer
+for computing, that might just be personal bias though.
+
+
+### Load applications you'll need ahead of time
+
+I generally have an idea of what I want to do before I board a plane, I have a project
+that I'd like to spend some time hacking on or something I want to write out or
+experiment with. Having a "game plan" before I get onto the plane means I can load up
+any and all applications while plugged in at the airport. This might be a minor power
+saver but after I've lowered the CPU clockspeed and disabled some services, I certainly
+don't want to wait around for applications to load up while I sit idly in coach.
+
+
+**Update**: As [Etni3s](http://www.reddit.com/user/Etni3s) from reddit points out, powertop(1) is a pretty handy utility for watching power consumption.
+
+
+As I write this article, I'm probably an hour into my five and half hour flight and the
+battery monitor for my X200 is telling me I have an estimated **eight** hours of juice
+left.
+
+I'm proud to say, Tux is my copilot.
diff --git a/_posts/2009-12-27-and-now-a-video-of-my-cat-being-obnoxious.html b/_posts/2009-12-27-and-now-a-video-of-my-cat-being-obnoxious.html
new file mode 100644
index 0000000..0d657cc
--- /dev/null
+++ b/_posts/2009-12-27-and-now-a-video-of-my-cat-being-obnoxious.html
@@ -0,0 +1,11 @@
+---
+layout: post
+title: And now a video of my cat being obnoxious
+tags:
+- Miscellaneous
+created: 1261964947
+---
+My relationship with this cat is one of constant fluctuation, when he's quiet and/or asleep, he's the best cat in the world. When I come home and he vies for attention, he drives me nuts.
+
+Behold, the powerful lungs of Fatso:
+
diff --git a/_posts/2009-12-27-on-being-a-good-house-guest.markdown b/_posts/2009-12-27-on-being-a-good-house-guest.markdown
new file mode 100644
index 0000000..848ecec
--- /dev/null
+++ b/_posts/2009-12-27-on-being-a-good-house-guest.markdown
@@ -0,0 +1,72 @@
+---
+layout: post
+title: On being a good house guest
+tags:
+- Opinion
+created: 1261976564
+---
+In a past life I traveled quite frequently, being categorically
+poor as I often was, I tended to rely on the kindness of friends,
+family and occasionally total strangers. After breaking the standing
+record for longest-time-spent-on-Dave's couch, I came to consider myself
+a pretty decent house guest. More recently I spent this past week at my
+older sister's house with a swarm of other family members, as I cooked
+breakfast for the family Saturday morning, I decided that I'm not only
+a pretty decent house guest, I'm a pretty stinkin' awesome guest who you
+should invite over if you:
+
+* Feel like cooking a big dinner but don't want to do the dishes
+* Need an expert Rock Band guitarist
+* Have children that need entertaining
+* Are just sick and tired of cooking and really would like somebody else to make you something delicious
+* Feel the need to have a wide-ranging discussion regarding national and international politics with a mildly intelligent person
+
+While I know that you're not *supposed* to stay too long as a house guest,
+I think the social rule comes from a long line of either unwelcome guests
+or guests that just aren't doing it right. Here are the rules I try to
+follow whenever I find myself crashing on some kind person's couch, floor
+or air mattress.
+
+### Keep your things tidy
+
+**Very important**, yes you're likely traveling, the folks you're staying with
+understand that you don't have a closet or dresser you can throw your
+clothes in, it is very important however that you keep as much of your
+belongings tidily stashed away in your suitcase. The extra effort goes
+a long way in making your presence far less impactful on those hosting you.
+Nobody likes a dirty home.
+
+### Offer to cook
+
+Unless your hosts have more money than they should, chances are that they
+have jobs and when they come home from those jobs they have to cook themselves
+and their family dinner. Offering to cook goes a long way with a lot of people,
+especially if you can *actually cook*. (**note:** cooking delicious food is not
+difficult, but really just a test of your ability to **read a recipe**). Not
+everybody will take you up on your offer, some people (myself included) find
+cooking a good way to unwind after a day's work. If you find yourself in this
+situation, linger around the kitchen, socialize and try to be as helpful as
+possible; an extra set of hands and eyes to watch a pot, or peel potatoes is
+almost always appreciated.
+
+
+### Hang out, don't cling
+
+Most people enjoy having company, humans are inherently social animals and
+having a house guest can be an nice change of pace for a lot of people. If
+you're traveling through, you'll have to walk a fine line of hanging out with
+the hosting party long enough to have fun together but not long enough to
+make them feel smothered. The system I've always followed is to be occupied during the day and social with my hosts in the evening. This gives them a chance to have a normal workday or weekend, and gives me the chance to explore my current location on my own and have an adventure. This set up works quite well when traveling abroad since you get the opportunity to regale your hosts with tales of your adventure in their region over dinner (*note;* do not trash their city, people tend to have some amount of pride for their city/region/state).
+
+### Do chores
+
+If you're staying with any host for any time longer than a few days, it is highly
+likely that some cleaning, vacuuming, laundry or dishes will need to be done. A good rule of thumb with chores is not to offer to help but just to help out where you can, a quick "let me give you a hand with that.." will do.
+
+Nobody will turn down a helping hand when it comes to cleaning.
+
+
+
+There are occasions when I've preferred hotels to crashing with friends or family, when I really need a good night's rest and some quiet, but if you're up for a good sociable experience, you really cannot beat crashing on a couch.
+
+Just don't borrow any money, they really hate that.
diff --git a/_posts/2009-12-28-angry-tweeter.markdown b/_posts/2009-12-28-angry-tweeter.markdown
new file mode 100644
index 0000000..83ede54
--- /dev/null
+++ b/_posts/2009-12-28-angry-tweeter.markdown
@@ -0,0 +1,52 @@
+---
+layout: post
+title: Angry Tweeter
+tags:
+- Opinion
+- Miscellaneous
+created: 1262055916
+---
+This year my family celebrated the holidays in north Florida at my older sister's house, fortunately for the location is just as difficult to get to by plane as my parent's house, so I didn't have to miss out on any air travel frustration. My trip to north Florida was *very* boring, my flight out of San Francisco left at 6 a.m. and I arrived in Jacksonville around dinner time (having slept the majority of the flight). The return trip was far more eventful, I left my sister's house around noon to drive to Jacksonville (roughly an hour and a half trip), waited at the airport for my flight at 4 p.m., arrived in Miami at 5:30, waited for hours on a delayed flight, left Miami around 10 p.m., landed in San Francisco a hours later than anticipated, paid my exorbitant parking fee and sped home.
+
+When I woke up the next day, I looked over at how bitchy and whiney my posts to Twitter from the previous day were. I don't *think* I'm normally that big of a jerk but traveling alone, I needed to vent, often. (*note*: times listed are PST, for the majority of the trip I was in EST)
+
+> **11:10 AM** Still kind of amazes me how many young women in the south are running around with babies in tow.
+
+> **11:34 AM** How the news should cover this incident: Guy tries something on plane, passengers take him out. Post-9/11, TSA is pointless
+
+> **12:57 PM** Shit. My first flight today has propellers. Fucking propellers.
+
+> **1:22 PM** Propeller death trap. [http://flic.kr/p/7qzKVn](http://flic.kr/p/7qzKVn)
+
+> **3:20 PM** Step 1 complete; in Miami. Now to SFO.
+
+> **3:29 PM** How does restricting carry-ons make up for the TSA's incompetence? Predictable kneejerkery.
+
+> **3:43 PM** Waiting on a fucking bus to go back to the terminal. My connection is boarding right the hell now :/
+
+> **3:56 PM** "Fortunately" my flight was delayed an hour, so I didn't nearly catch it. Fuckin AA.
+
+> **4:24 PM** Let's just stop flying airplanes, that's the only *real* way to stay safe from the terrurists.
+
+> **4:47 PM** It's okay American Airlines, I really didn't want to go home anyways.
+
+> **5:05 PM** Outlined a couple posts I want to write on the plane; our original delayed departure time has past, I might never get to writing
+
+> **6:03 PM** More delayment. 2nd potential departure time passed
+
+> **6:08 PM** What kind of toolbox gets luggage embroidered with their initials?
+
+> **6:11 PM** Apparently somebody on the previous flight puked, so we're delayed while they scrub vomit off the seats. Worth it.
+
+> **6:26 PM** The snacks in Miami are a bit dry [http://flic.kr/p/7qHbBN](http://flic.kr/p/7qHbBN)
+
+> **6:40 PM** This plane better make it to SFO, I'll be pretty pissed to have waited 3 hours to end up in a field.
+
+> **7:23 PM** OMFG I AM TOTALLY ON THE PLANE. 3.5 hours late.
+
+> **1:45 AM** Made it to SFO, only a few hours late. Now to drive home, find a parking spot and cry in the shower a bit
+
+> **3:05 AM** Finally home. Showered, clipped fingernails, q-tip'd ears. Feeling better.
+
+
+Suffice to say, I don't think I'm flying American Airlines again for some time (or at all for that matter). The whole experienc to Florida and back was grueling to say the least; with the parking fees, baggage fees, meal fees, delays and endless hours breathing recycled air riddled with H1N1 and sneezes, I think I'm going to keep my feet on the ground for a while.
diff --git a/_posts/2009-12-31-pre-tested-commits-with-hudson-and-git.markdown b/_posts/2009-12-31-pre-tested-commits-with-hudson-and-git.markdown
new file mode 100644
index 0000000..420d53a
--- /dev/null
+++ b/_posts/2009-12-31-pre-tested-commits-with-hudson-and-git.markdown
@@ -0,0 +1,60 @@
+---
+layout: post
+title: Pre-tested commits with Hudson and Git
+tags:
+- Software Development
+- Git
+- Hudson
+created: 1262301736
+---
+A few months ago Kohsuke, author of the Hudson continuous integration server,
+introduced me to the concept of the "pre-tested commit", a feature of the TeamCity
+build management and continuous integration system. The concept is simple, the build
+system stands as a roadblock between your commit entering trunk and only after the
+build system determines that your commit doesn't break things does it allow the commit
+to be introduced into version control, where other developers will sync and integrate
+that change into their local working copies. The reasoning and workflow put forth by
+TeamCity for "pre-tested commits" is very dependent on a centralized version control
+system, it is solving an issue Git or Mercurial users don't really run into. Those using
+Git can commit their hearts out all day long and it won't affect their colleagues until they
+**merge** their commits with others.
+
+In some cases, allowing buggy or broken code to be *merged* in from another developer's Git
+repository can be worse than in a central version control system, since the recipient of the
+broken code might perform a knee-jerk git-revert(1) command on the merge! When you revert
+a merge commit in Git, what happens is you not only revert the merge, you revert the commits
+associated with that merge commit; in essence, you're reverting *everything* you just merged in
+when you likely just wanted to get the broken code out of your local tree so you could continue
+working without interruption. To solve for this problem-case, I utilize a "pre-tested commit" or
+"pre-tested merge" workflow with Hudson.
+
+My workflow with Hudson for pre-tested commits involves three separate Git repositories: my local
+repo (local), the canonical/central repo (origin) and my "world-readable" (inside the firewall) repo (public).
+For pre-tested commits, I utilize a constantly changing branch called "pu" (potential updates) on the
+world-readable repo. Inside of Hudson I created a job that polls the world-readable repo (public)
+for changes in the "pu" branch and will kick off builds when updates are pushed. Since the content of
+`public/pu` is constantly changing, the git-push(1) commands to it must be "forced-updates" since I am
+effectively rewriting history every time I push to `public/pu`.
+
+To help forcefully pushing updates from my current local branch to `public/pu` I use the following git alias:
+
+ % git config alias.pup "\!f() { branch=\$(git symbolic-ref HEAD | sed 's/refs\\/heads\\///g');\
+ git push -f \$1 +\${branch}:pu;}; f"
+
+While a little obfuscated, thie `pup` alias forcefully pushes the contents of the current branch to the specified
+remote repository's `pu` branch. I find this is easier than constantly typing out: `git push -f public +topic:pu`
+
+In list form, my workflow for taking a change from inception to `origin` is:
+
+* *hack, hack, hack*
+* commit to `local/topic`
+* `git pup public`
+* Hudson polls `public/pu`
+* Hudson runs potential-updates job
+* Tests fail?
+ * **Yes**: Rework commit, try again
+ * **No**: Continue
+* Rebase onto `local/master`
+* Push to `origin/master`
+
+Using this pre-tested commit workflow I can offload the majority of my testing requirements to the build system's cluster of machines instead of running them locally, meaning I can spend the **majority** of my time writing code instead of waiting for tests to complete on my own machine in between coding iterations.
diff --git a/_posts/2010-01-04-new-years-python-meme.markdown b/_posts/2010-01-04-new-years-python-meme.markdown
new file mode 100644
index 0000000..c3c3d8d
--- /dev/null
+++ b/_posts/2010-01-04-new-years-python-meme.markdown
@@ -0,0 +1,29 @@
+---
+layout: post
+title: New Year's Python Meme
+tags:
+- Python
+created: 1262597316
+---
+While I'm not aggregated into the [Python Planet](http://planet.python.org) I wanted to join in the [meme](http://just-another.net/2009/12/28/new-years-python-meme/) [that's](http://blog.tplus1.com/index.php/2010/01/04/new-years-python-meme/) [already](http://tarekziade.wordpress.com/2009/12/28/new-years-python-meme/) [going](http://coreygoldberg.blogspot.com/2009/12/new-years-python-meme.html) [on](http://www.protocolostomy.com/2009/12/29/2009-python-meme/).
+
+### What’s the coolest Python application, framework or library you have discovered in 2009?
+
+While I didn't discover it until the latter half of 2009, I'd have to say [eventlet](http://eventlet.net) is the coolest Python library I discovered in 2009. After leaving Slide, where I learned the joys of coroutines (a concept previously foreign to me) I briefly contemplated using greenlet to write a coroutines library similar to what is used at Slide. Fortunately I stumbled across eventlet in time, which shares common ancestry with Slide's proprietary library.
+
+
+### What new programming technique did you learn in 2009?
+I'm not sure I really learned any new techniques over the past year, I started writing a *lot* more tests this past year but my habits don't quite qualify as Test Driven Development just yet. As far as Python goes, I've been introduced to the Python C API over the past year (written two entire modules in C [PyECC](http://github.com/rtyler/PyECC) and [py-yajl](http://github.com/rtyler/py-yajl)) and while I wouldn't exactly call implementing Python modules in C a "technique" it's certainly a departure from regular Python (`Py_XDECREF` I'm looking at you)
+
+### What’s the name of the open source project you contributed the most in 2009? What did you do?
+Regular readers of my blog can likely guess which open source project I contributed to most in 2009, [Cheetah](http://cheetahtemplate.org), of which I've become the maintainer. I also authored a number of new Python projects in 2009: [PyECC](http://github.com/rtyler/PyECC) a module implementing Elliptical Curve Cryptography (built on top of [seccure](http://point-at-infinity.org/seccure/)), [py-yajl](http://github.com/rtyler/py-yajl) a module utilizing [yajl](http://lloyd.github.com/yajl) for fast JSON encoding/decoding, [IronWatin](http://github.com/rtyler/IronWatin) an IronPython-based module for writing [WatiN](http://watin.sourceforge.net/) tests in Python (supporting screengrabs as well), [PILServ](http://github.com/rtyler/PILServ) an eventlet-based server to do server-side image transformations with [PIL](http://www.pythonware.com/products/pil/), [TweepyDeck](http://github.com/rtyler/TweepyDeck) a PyGTK+ based Twitter client and [MicroMVC](http://github.com/rtyler/MicroMVC) a teeny-tiny MVC styled framework for Python and WSGI built on eventlet and Cheetah.
+
+### What was the Python blog or website you read the most in 2009?
+
+The [Python reddit](http://reddit.com/r/python) was probably the most read Python-related "blog" I read in 2009, it generally supercedes the [Python Planet](http://planet.python.org) with regards to content but also includes discussions as well as package release posts.
+
+### What are the top three things you want to learn in 2010?
+
+* **Python 3**. After spending a couple weekends trying to get Cheetah into good working order on Python 3, I must say, maintaining a Python-based module on both Python 2.xx and 3.xx really feels like a nightmare. py-yajl on the otherhand, being entirely C, was **trivial** to get compiling and executing perfectly for 2.xx and 3.xx
+* **NoSQL**. Earlier this very evening I dumped a boatload of data out of PostgreSQL into [Redis](http://code.google.com/p/redis/) and the resulting Python code for data access using [redis-py](http://github.com/andymccurdy/redis-py) is shockingly simple. I'm looking forward to finding more places where a relational database is overkill for certain types of stored data, and using Redis instead.
+* **Optimizing Python**. With py-yajl [Lloyd](http://github.com/lloyd) and I had some fun optimizing the C code behind the module, but I'd love to learn some handy tricks to making pure-Python execute as fast as possible.
diff --git a/_posts/2010-01-04-the-one-where-i-gush-about-contegix.markdown b/_posts/2010-01-04-the-one-where-i-gush-about-contegix.markdown
new file mode 100644
index 0000000..ab09a9c
--- /dev/null
+++ b/_posts/2010-01-04-the-one-where-i-gush-about-contegix.markdown
@@ -0,0 +1,22 @@
+---
+layout: post
+title: The one where I gush about Contegix.
+tags:
+- Opinion
+created: 1262676580
+---
+Since joining Apture, I've primarily concerned myself with lower-level backend code and services, including the machines that our site runs on. While not a drastic departure from my role on the server team at Slide, there are a few notable changes, the largest of which being **root**. Given the size of Slide's operations team, a team separate from the "server team" (the latter being developers), my role did not necessitate server management only occasional monitoring. Apture is a different can of beans, we're simply too small for an operations team, so we work with Contegix to maintain a constant watchful eye on our production environment. Self-assigning myself the "backend guy" hat means server maintenance and operations are part of my concern (but not my focus) since the "goings on" of the physical machines will have a direct impact on the performance and level of service my work can ultimately provide to end users.
+
+Last week while planning some changes we can make to our Django-based production environment that will help us grow more effectively, Steven pointed out that we were going to see an influx of usage today (Jan. 4th) given the large number of users returning to the internet after their holiday vacation. Over the weekend I dreaded what Monday would bring, unable to enact any changes to stave off the inevitable in time.
+
+This morning, waking up uncharacteristically early at 7 a.m. PST, bells were already ringing. A 9 a.m. EST spike angered one of our database machines, by the time I got in the office around 8:10 a.m. PST more bells were ringing as the second wave of users once again angered the MySQL Dolphin Gods. With my morning interview candidate already on site, I furiously typed off a few emails to Contegix sounding the alarm, pleading for help, load balancer tweaks, configuration reviews, anything to help squeeze extra juice from the abnormally overloaded machines to keep our desired level of service up. Working with a few of the talented Contegix admins we quickly fixed some issues with the load balancer under utilizing certain machines in favor of others, isolated a few sources of leaked CPU cycles and discovered a few key places to add more caching with memcached(8).
+
+As our normal peak (~9 a.m. PST to around lunchtime) passed, I started to breathe easier when alarms went of **again**. Once again, Contegix admins were right there to help us through one of our longest peak I've seen since joining Apture, 5:30 a.m. until around 4 p.m.
+
+Survival was my primary objective waking up today but thanks to some initiative and good footwork by the folks at Contegix we not only survived but identified and corrected a number of issues detrimental to performance **and** discovered on of the key catalysts of cascading load: I/O strapped database servers (as MySQL servers starve for disk I/O, waiting requests in Apache drive the load on a machine through the roof).
+
+I am admittedly quite smitten with Contegix's work today, I became quite accustomed to KB and his ops team at Slide fixing whatever issues would arise in our production environment and it's comforting to know that we have that level of sysadmin talent at the ready.
+
+
+*A picture is worth a thousand words; here's a cumulative load graph from our production Ganglia instance:*
+
diff --git a/_posts/2010-01-15-book-of-elies.markdown b/_posts/2010-01-15-book-of-elies.markdown
new file mode 100644
index 0000000..01103d9
--- /dev/null
+++ b/_posts/2010-01-15-book-of-elies.markdown
@@ -0,0 +1,15 @@
+---
+layout: post
+title: Book of Elies
+tags:
+- Opinion
+created: 1263542887
+---
+There's quite a big advertising blitz in San Francisco for the "Book of Eli" movie, which as far as I can tell is another in a line of quasi-religious films (fortunately Tom Hanks doesn't star in this one). I now see a billboard that's a derivation of this on my ride home from work:
+
+
+To be honest, I was already **not** going to see this movie but their marketing campaign has hammered the final nail in the cross (er, coffin). Perhaps I'm far more woeful of religion after seeing too many documentaries like "Jesus Camp" and watching clips of Pat Robertson.
+
+In a world of spiteful neo-conservatives hijacking public discourse on important issues with nonsense about the gays, abortion and anything else that can be misconstrued as "christian values." A world where radical sects of Islam kidnap, murder and terrorize; a world where no religion is without blood on their hands, the billboard is *technically* right.
+
+I think that's why it bothers the hell out of me.
diff --git a/_posts/2010-01-16-virtual-hosting-with-haproxy-and-wsgi.markdown b/_posts/2010-01-16-virtual-hosting-with-haproxy-and-wsgi.markdown
new file mode 100644
index 0000000..ab827bb
--- /dev/null
+++ b/_posts/2010-01-16-virtual-hosting-with-haproxy-and-wsgi.markdown
@@ -0,0 +1,87 @@
+---
+layout: post
+title: Virtual Hosting with HAProxy and WSGI
+tags:
+- Software Development
+- Linux
+- Python
+created: 1263688178
+---
+Lately I've fallen in love with a couple of fairly simple but powerful
+technologies: haproxy and WSGI (web server gateway interface). While the latter
+is more of a specification (PEP 333) the concepts it puts forth have made my life
+significantly easier. In combination, the two of them make for a powerful combination
+for serving web applications of all kinds and colors.
+
+HAProxy is a robust, reliable piece of load balancing software that's **very** easy
+to get started with, For the uninitiated, load balancing is a common means of distributing
+the load of a number of inbound requests across a pool of processes, machines, clusters and so on.
+Whenever you hit any web site of non-trivial size, your HTTP requests are invariably transparently
+proxied through a load balancer to a pool of web machines.
+
+I started looking into haproxy when I began to move [Urlenco.de](http://urlenco.de)
+away from my franken-setup of Lighttpd/FastCGI/Mono/ASP.NET to a pure Python stack.
+After poking around some articles about haproxy I discovered it can be used for **virtual hosts**
+as well as simple load balancing. Using a haproxy's ACLs feature (see Section 7 in the
+[configuration.txt](http://haproxy.1wt.eu/download/1.4/doc/configuration.txt)), you can
+redirect requests to one backend or another. While my "virtual hosting" with haproxy is using
+the ability to inspect the HTTP headers of inbound requests, you can use a number of different
+criterion to determine the right backend for serving a request: url matching, request method matching
+(GET/POST), protocol matching (haproxy can load balance any kind of TCP connection) and so on.
+
+
+WSGI (pronounced: *whiskey*) comes into play on the backend side of haproxy, using the
+eventlet.wsgi module which provides a WSGI interface I can build web applications **very**
+quickly, test them and deploy them. When deployed, I can run them as "nobody" in userspace on
+the server, binding to some higher numbered port (i.e. 8080) and haproxy will do the work routing
+to the appropriate WSGI process.
+
+Below is a simple haproxy configuration that I'm using to run [Urlenco.de](http://urlenco.de) and
+a site for [my wedding](http://erinandtylerswedding.com) and many more as soon as I finish them. The section to note is `frontend http-in` in which the ACLs are defined for the different virtually hosted domains and the conditionals for selecting a backend based on those ACLs.
+
+ global
+ maxconn 20000
+ ulimit-n 16384
+ log 127.0.0.1 local0
+ uid 200
+ gid 200
+ chroot /var/empty
+ nbproc 4
+ daemon
+
+ defaults
+ log global
+ mode http
+ option httplog
+ option dontlognull
+ retries 3
+ option redispatch
+ maxconn 2000
+ contimeout 5000
+ clitimeout 50000
+ srvtimeout 50000
+
+ frontend http-in
+ bind *:80
+ acl is_urlencode hdr_end(host) -i urlenco.de
+ acl is_wedding hdr_end(host) -i erinandtylerswedding.com
+
+ use_backend urlencode if is_urlencode
+ use_backend wedding if is_wedding
+ default_backend urlencode
+
+ backend urlencode
+ balance roundrobin
+ cookie SERVERID insert nocache indirect
+ option httpchk HEAD /check.txt HTTP/1.0
+ option httpclose
+ option forwardfor
+ server Local 127.0.0.1:8181 cookie Local
+
+ backend wedding
+ balance roundrobin
+ cookie SERVERID insert nocache indirect
+ option httpchk HEAD /check.txt HTTP/1.0
+ option httpclose
+ option forwardfor
+ server Local 127.0.0.1:8081 cookie Local
diff --git a/_posts/2010-01-18-thread-safety-assumptions-in-django.markdown b/_posts/2010-01-18-thread-safety-assumptions-in-django.markdown
new file mode 100644
index 0000000..5e1e56c
--- /dev/null
+++ b/_posts/2010-01-18-thread-safety-assumptions-in-django.markdown
@@ -0,0 +1,17 @@
+---
+layout: post
+title: Thread-safety assumptions in Django
+tags:
+- Opinion
+- Software Development
+- Python
+created: 1263878606
+---
+These days, the majority of my day job revolves around working with Apture'sDjango-based code which, depending on the situation, can be a blessing or a curse. In some of my recent work to help improve our ability to scale effectively, I started swapping out Apache for Spawning web servers which can more efficiently handle large numbers of concurrent requests. One of the mechanisms by which Spawning accomplishes this task, is by using eventlet's `tpool` (thread pool) module in addition to some other clever tricks. With Apache, we used pre-forked workers to accomplish the work needed to be done and while still using forked child processes with Spawning, threading was also thrown into the mix, that's when "shit got real" (so to speak).
+
+We started seeing sporadic, difficult to reproduce errors. Not a lot, a trickle of exception emails throughout the day. Digging deeper into some of the exceptions, careful stepping through Apture code, into Django code and back again, I started to realize I had **thread-safety problems**. Shock! Panic! Despair! Lunch! Disappointment! Shock! I felt all these things and more. I've long lamented the number of globals used in Django's code base but this is the icing on the cake.
+
+Apparently Django's [threading problems](http://code.djangoproject.com/wiki/DjangoSpecifications/Core/Threading) are sufficiently documented in a [few places](http://y-node.com/blog/2008/oct/30/noreversematch/). Using a slightly older version of the Django framework certainly doesn't help but it doesn't *appear* that recent releases (1.1.1) can guarantee thread-safety anyways. I think it's safe to assume the majority of Django framework users are not using threaded web servers in any capacity, else this would have become a far larger issue (and hopefully of been fixed) by now. From `NoReverseMatch` exceptions, to curious middleware problems to thread-safety [issues](http://code.djangoproject.com/ticket/11193) in the WSGI support layer, Django has potholes lying all along the road to multithreadedness.
+
+Beware.
+
diff --git a/_posts/2010-01-20-better-faster-stronger.markdown b/_posts/2010-01-20-better-faster-stronger.markdown
new file mode 100644
index 0000000..60bf9bf
--- /dev/null
+++ b/_posts/2010-01-20-better-faster-stronger.markdown
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Better, Faster, Stronger
+tags:
+- Software Development
+created: 1264008660
+---
+I'm not going to cross-post but I wrote a little something on the [Apture Blog](http://blog.apture.com) about some of the things we've been doing lately to scale up with Django among other things. I suppose over the coming days I'll have to write a few posts here getting into the nitty-gritty about Spawning vs. Apache and so on, but it's a good start.
+
+[Better, Faster, Stronger](http://blog.apture.com/2010/01/bigger-faster-stronger/)
diff --git a/_posts/2010-01-20-unsubstantiated-rumors-about-apture-and-facebook.markdown b/_posts/2010-01-20-unsubstantiated-rumors-about-apture-and-facebook.markdown
new file mode 100644
index 0000000..f3fae1f
--- /dev/null
+++ b/_posts/2010-01-20-unsubstantiated-rumors-about-apture-and-facebook.markdown
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Unsubstantiated Rumors about Apture and Facebook
+tags:
+- Opinion
+- Miscellaneous
+created: 1264025959
+---
+Yesterday I was pointed to [this post](http://www.readwriteweb.com/archives/who_should_facebook_acquire_next_mark_zuckerberg_w.php) on ReadWriteWeb, suggesting that Facebook should acquire Apture next. Being an Apture employee, I would like to take some time to fuel the rumormill with these COMPLETELY TRUE (read: *false*) rumors:
+
+**Unsubstantiated Rumor #1:**
+
Apture is hiring aggressively in order to bump up their acquisition price
diff --git a/_posts/2010-01-27-using-a-browser-to-piss-off-irc-users-or-spamming-redditdowntime.markdown b/_posts/2010-01-27-using-a-browser-to-piss-off-irc-users-or-spamming-redditdowntime.markdown
new file mode 100644
index 0000000..d91aaa1
--- /dev/null
+++ b/_posts/2010-01-27-using-a-browser-to-piss-off-irc-users-or-spamming-redditdowntime.markdown
@@ -0,0 +1,65 @@
+---
+layout: post
+title: "Using a browser to piss off IRC users, or, spamming #redditdowntime"
+tags:
+- Miscellaneous
+- Software Development
+created: 1264585384
+---
+One of my most favorite sites on the internet, reddit, took [some downtime](http://www.reddit.com/r/announcements/comments/au8tj/reddit_will_be_down_for_maintenance_for_about_two/) this evening while doing some infrastructure (both hardware and software) upgrades. On their down-page, the reddit team invited everybody to join the `#redditdowntime` channel on the Freenode network, ostensibly to help users pass the time waiting for their pics and IAMAs to come back online.
+
+Shortly after reddit started their scheduled outage, I joined the channel to pass the time while I debated what I should do with my evening. Within minutes the channel was **flooded** with a number of users, varying between spouting reddit memes in caps. link-spamming or engaging in casual chit-chat. I complained to one of the ops and fairly well-known-to-redditors employee: jedberg about the lack of moderation and he nearly instantly gave me `+o` (ops) in the channel. Not one to take my ops duty lightly, I started kicking spammers, warning habitual caps-lock users and tried to keep things generally civil through the deluge of messages consuming the channel.
+
+Towards the end of the scheduled outage, some automated link-spamming started to appear and once it started it triggered more and more link-spamming. Clearly whatever was behind the bit.ly link was responsible for the self-propagating nature of the spamming. While the other moderators and myself tried to keep up with banning people I used wget to fetch the destination of the clearly malicious bit.ly URL to determine what we were dealing with. What I found is one of the more clever bits of JavaScript I think I've seen in recent months.
+
+After bringing the site back up for a few minutes, reddit had to take it back down after noticing some problems with the upgrade, so another flood of users filled into the `#redditdowntime` channel and the link-spamming got worse. The most interesting aspect of the JavaScript in the code snippet below is how simple it is, I've commented it up a bit to help explain what's actually going on:
+
+
+
+
+
+
+
+
DIGG ROOLZ! REDDIT DROOLZ!
diff --git a/_posts/2010-01-30-mourning-sun.markdown b/_posts/2010-01-30-mourning-sun.markdown
new file mode 100644
index 0000000..6934ed9
--- /dev/null
+++ b/_posts/2010-01-30-mourning-sun.markdown
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Mourning Sun
+tags:
+- Opinion
+- Software Development
+- Hudson
+created: 1264909912
+---
+Some users of Hudson have already started to notice a subtle addition to the latest release, 1.343, a new background watermark image.
+
+
+
+The commit message ([r26728](http://github.com/kohsuke/hudson/commit/7e1602415ce86fb6ed3630a9e8d6b86a99f6477e)) from Kohsuke, the incredibly talented founder and maintainer of the Hudson project, adds a bit of sadness to the whole affair:
In tribute to Sun Microsystems and all my colleagues who had to go today.
+I hope the community would forgive me for doing this.
+
+Given the incredible speed at which the tech industry grows and moves, it's easy to forget that there are a number of talented engineers that have spent their careers at Sun building technologies that have helped change the face of modern computing, regardless of whether or not Sun could figure out how to sell them: SunOS/Solaris, Java, DTrace, SPARC 64-bit chips, Sun Grid Engine, JRuby, the W3C XML specification, ZFS, OpenOffice (acquisition), MySQL (acquisition), and VirtualBox (acquisition).
+
+As a corporation, I personally think Sun was a failure, as a foundation of engineering in Silicon Valley, I think Sun has been quite successful.
+
+To those that are being pushed out as part of the merger with Oracle, I want to sincerely thank you for your contributions to computing and wish you the best of luck.
+
+Here's the "full" version of the image, which I found via @jtnl's TwitPic stream:
+
diff --git a/_posts/2010-02-09-i-hope-you-bump-your-head.markdown b/_posts/2010-02-09-i-hope-you-bump-your-head.markdown
new file mode 100644
index 0000000..706a477
--- /dev/null
+++ b/_posts/2010-02-09-i-hope-you-bump-your-head.markdown
@@ -0,0 +1,25 @@
+---
+layout: post
+title: I hope you bump your head
+tags:
+- Opinion
+created: 1265786936
+---
+There are few things I truly enjoy in life, things that warm my heart and make me smile from ear to ear, things like hot oatmeal and coffee, cell coverage in San Francisco, back scratches and not dying. If I didn't commute every single day on my bicycle, I'd likely put "bike riding" on the list too but it's hard to be ecstatic about something you start and finish every workday with (except for maybe some recreational yelling). For about 25 minutes every morning and 25 minutes every night, I'm a cyclist in San Francisco, nothing terribly unique, I am one of many cyclists in the city during rush hour and I have been noticing some things lately.
+
+First of all, let me address my fellow cyclists. Some of you (you hopefully know who you are) are unadulterated, complete **fucking-assholes**. I understand that you don't need a license to ride a bicycle but you still have to obey the rules of the road. Among other things this means you should be courteous to those you're sharing the road with which includes:
+
+* Using hand signals
+* Yielding (you can use the dictionary on the iPhone that you're pulling out at intersections to look up what that word means). Despite the ironic t-shirt you're wearing underneath your hoodie, you are not "King of the World".
+* Riding on streets safe for bicycle use. I know you love to ride down Oak St. and Van Ness in rush hour but it does nothing but piss drivers off. There are typically less trafficked streets adjacent to busy streets which are preferred for cyclist use (such as Page and Market St.).
+* Stopping at stop lights. I'm sure Gavin and the SFPD have given you an exemption from basic traffic laws but the drivers coming into the intersection don't know that. You are making things dangerous for everybody around you on the road; stop it.
+
+Given the hours I work, I'm typically riding home in the dark, where I've noticed a group of people who don't share the same love of "not dying" as I do. I'm going to call them the "Suicide Cyclists." This group of morons never cease to disappoint, without fail you'll see one or two of them riding down a busy street (like Market St.) with **no lights** and **no helmet**. Some vindictive part of me really would like to see a car accidentally hit one of them. I don't want them to seriously injure or kill anybody, just a light enough tap to send them to the ground and bump their head *just* hard enough to knock some god-damn sense into it.
+
+There are parts of my bike ride where **I** might even crash into one of these Suicide Cyclists, places where I'm riding on a two-way bike path (through a poorly lit park) or where I'm turning at an intersection. If through some unfortunate turn of events we crash into each other, the cyclist wearing a dark sweatshirt with no helmet or lights on their bicycle, and me, with my plethora of lights and hand signals, you can be certain that the next thing that's going to happen is assault with a U-Lock against some poor schmuck who's too stupid to ride on the right side of the bike path in the dark.
+
+
+To be honest, I can deal with the immense number of drivers not paying enough attention to the bike lanes, red lights or speed limits, the majority of the time cars do not cut through intersections, sidewalks, parks and everywhere else. Their trajectories are far more predictable than some jerk riding his fixie with his corduroy bike cap where ever he damn well pleases.
+
+Grumble.
+
diff --git a/_posts/2010-02-10-writing-for-multiple-blogs.markdown b/_posts/2010-02-10-writing-for-multiple-blogs.markdown
new file mode 100644
index 0000000..825ef4a
--- /dev/null
+++ b/_posts/2010-02-10-writing-for-multiple-blogs.markdown
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Writing for multiple blogs
+tags:
+- Miscellaneous
+- Software Development
+created: 1265873990
+---
+My New Year's resolution this year was incredibly generic insofar that I merely wanted to "write more." No qualifications for what kind of writing that entailed, I simply want to become a better writer (or blogger), with technical subjects in particular I'd like to get better at writing in a fashion that is interesting, parse-able by novices and has sufficient "depth" to interest more technical readers. I'm not sure if I can define what being a "better writer" will entail or how I'll know when I'm there, so for now I'm just trying to write good content. Considering [my last post](/posts/2010/02/i_hope_you_bump_your_head) didn't even pretend to ride the fence between opinionated-article and full-on rant, I think it's safe to say that in order to accomplish my goal I need more venues for writing and more topics to write about.
+
+One of those venues, which I've linked to before is the [Apture Blog](http://blog.apture.com); I have written for the company blog already this year and chances are I will have another few posts go up as we tackle some of the technical challenges we're currently facing (you can view [my posts here](http://blog.apture.com/author/Tyler/)). Unfortunately there's only so many articles I can write for the Apture Blog without giving away any confidential information or turning it completely into a technical blog (hint: it's not).
+
+Looking around at a few of the open source communities that I'm involved in, two groups stick out: Eventlet and Hudson. Eventlet already [has a blog](http://blog.eventlet.net) and I'm certain my usage of Eventlet is not steady enough to warrant any kind of authoritative posts on the subject. The other, Hudson, is something I've used on a daily basis for almost a year and a half. Not only that, I run the @hudsonci twitter account and founded the `#Hudson` channel on Freenode, I've also tried my hand at developing some plugins for Hudson (which is written in Java). Suffice to say, I'm quite the little Hudson cheerleader.
+
+When I floated the idea of an "official" blog for Hudson, which I would help drive, to Kohsuke and some other "core" developers of Hudson, the idea was well received and I set off getting Drupal configured, writing some preliminary content and getting ready for a launch of [Continuous Blog](http://blog.hudson-ci.org). While my writing contributions thus far to Continuous Blog have been sparse, I've gotten to play the delightful role of Editor which is an entirely different experience unto itself.
+
+I'm looking forward to seeing how this develops, I might end up writing for a few other blogs depending on interest and time, but for now my shenanigans can be found on:
+
+* unethical blogger (duh)
+* [Continuous Blog](http://blog.hudson-ci.org/users/posts_by/rtyler)
+* [The Apture Blog](http://blog.apture.com/author/Tyler/)
+
diff --git a/_posts/2010-02-14-building-a-game-for-et-day-1-with-pygame.markdown b/_posts/2010-02-14-building-a-game-for-et-day-1-with-pygame.markdown
new file mode 100644
index 0000000..c1e4014
--- /dev/null
+++ b/_posts/2010-02-14-building-a-game-for-et-day-1-with-pygame.markdown
@@ -0,0 +1,68 @@
+---
+layout: post
+title: Building a game for ET. Day 1 with Pygame
+tags:
+- Python
+created: 1266140124
+---
+Earlier this week I was checking out Pygame, pondering what I could possibly build with it that could keep me motivated enough to finish it. Motivation would like be the primary problem for me with any amount of game programming; I'm not a gamer, I don't harbor a dislike of games, they're just not something I typically spend time playing (I do like to play "haggard late night open-source hacker" though, that's a fun one). Friday night I stumbled across an idea, ET likes to play (casual) games, perhaps we could write a game together; ask any engineer at EA or Ubisoft, there's nothing more romantic than working on a game.
+
+Talking over the idea with ET on the ride home from the office, we talked about creating a typing-oriented game and started to brainstorm. The tricky aspect of a typing-oriented game is you have to walk the fine line of "educational gaming", that is to say, the game's goal is **not** to teach the player how to type. That sucks. Contrasted to some other games where the means of progressing in some games is by solving a puzzle, killing noobs in others, in this game we wanted the player to progress through levels/situations with their typing ability (ET finds this fun, we do not have this in common).
+
+Over pizza we discussed more about how the levels would work, I decided that I wanted to use stories/articles instead of random words for the "content" of the game. We settled on a couple fundamental concepts: the player would earn coins by correctly completing a words as the scrolled from right to left (similar to a ticker tape), they would lose coins if they made a mistake or could not keep up. After a player completed a level (i.e. a "story") they would find themselves in a "store" of sorts, where they could purchase "tools" for future levels with their coins. The tools we decided would be a *very* important, as the player reached their upper bound of typing speed the utility of these various tools would necessary as a means of strategically conquering the level. One of the few things we didn't particularly cover was the "end game", whether the player would simply play increasingly more difficult levels (a la Tetris) or if they could actually "beat" the game. With at least the basics of the concept sketched out, it was time to start writing *some* code.
+
+
+### Starting with Pygame
+It's **incredibly** important to mention that I've *never* programmed a game before. *Never-ever*. From my work with network programming I was already familiar with the concept of the run-loop that's pretty core to Pygame, but I had never really made use of any to animate objects on the screen or deal with handling any kind of events from mouse movements to key presses, etc. Fortunately I'm already a professional Python developer, so writing code wasn't the difficult part so much as laying it out. Orienting things into classes to handle separate components such as animating text (which is a painful in Pygame, in my opinion) to keeping track of user-input.
+
+Animating text across the screen wasn't particularly difficult, with Pygame you first create your primary "surface" (i.e. the window) and then you can render things onto that surface. With text, you end up rendering a surface which contains your text, "hello world" which you then place onto the primary surface. Easy peasy thus far:
+
+ import pygame
+ surface = pygame.display.set_mode((640, 680), pygame.HWSURFACE | pygame.DOUBLEBUF)
+ font = pygame.font.SysFont('Courier', 42)
+ ### render(text, antialias, rgb color tuple
+ font_surface = font.render('hello world', 0, (0, 0, 0))
+ ### draw `font_surface` onto `surface` at (x=0, y=0)
+ start_x, start_y = 0, 0
+ surface.blit(font_surface, (start_x, start_y))
+ while True:
+ ### Holy runloop batman
+ pygame.display.update()
+
+
+That was fun, I now have "hello world" rendered onto my screen, now to animate I suppose I'll just render `font_surface` a little further right every iteration of the runloop, i.e.
+
+ while True:
+ ### Holy runloop batman
+ surface.blit(font_surface, (start_x, start_y))
+ start_x += 0.5
+ pygame.display.update()
+
+This blurs the text however, so I then changed to:
+
+ while True:
+ ### Holy runloop batman
+ surface.blit(font_surface, (start_x, start_y))
+ surface.fill((0, 0, 0))
+ start_x += 0.5
+ pygame.display.update()
+
+This will cause the (primary) surface to be repainted (washed over) every iteration of the runloop ensuring that the text will properly animate, drawing the text in one spot, wiping the surface then drawing it slightly further to the left, resulting in the scrolling animation. All's fine and good until you determine that you want to have *other* elements on the screen and you also don't want to redraw them every time around the carousel. I then discovered how to "fill" just one particular rectangle on the surface, i.e. the rectangle behind the text:
+
+ text_w, text_h = font.size('hello world')
+ while True:
+ ### Holy runloop batman
+ surface.blit(font_surface, (start_x, start_y))
+ surface.fill((0, 0, 0), rect=pygame.Rect(start_x, start_y, text_w, text_h))
+ start_x += 0.5
+ pygame.display.update()
+
+
+Once I was able to get text properly scrolling across the screen, the rest of the afternoon of hacking was far easier. My confidence in my ability to grok Pygame in order to do what I wanted. I then set forth organizing my code into some logical classes, for example I created a `LetterSpool` class which would record the user's progress through the current word, rendering it at the bottom-center of the screen and firing an event when the user hit the space bar (denoting the word "complete"), additionally I wrapped my text animation code into `AnimatedWord` so I could easily string words together to scroll across the screen in conjunction similar to a textual screensaver.
+
+Not a whole lot more to write about with regards to my progress today, hooked up some music and basic sound effects which was trivial after looking at some sample code. Next I need to start addressing some more fundamentals for user-interaction: scoring and level-changing.
+
+
+You can track the progress of the game "Typy" (pronounced: `typey`) [on GitHub](http://github.com/rtyler/typy)
+
+
diff --git a/_posts/2010-02-16-presidents-day-in-photos.markdown b/_posts/2010-02-16-presidents-day-in-photos.markdown
new file mode 100644
index 0000000..ef717fb
--- /dev/null
+++ b/_posts/2010-02-16-presidents-day-in-photos.markdown
@@ -0,0 +1,19 @@
+---
+layout: post
+title: President's Day in Photos
+tags:
+- Photos
+created: 1266327900
+---
+While I don't carry a decent camera around with me, I've found that the camera in my Samsung Jack is usually decent enough if I can hold my hands still (*rare*). Ended up snapping a few photos today and wanted to post them with a little bit of story behind them.
+
+
+My bike route to the office takes me up and down Page St. which runs into Market St. just on the other side of Van Ness Ave. I never saw the accident or another car, I just saw a couple of cops and tow-truck guys standing around this flipped car on the turn from inbound Market St. onto Franklin St. I didn't see any damage on the vehicle so I'm still quite puzzled how it was flipped and which direction it could have possibly been heading.
+
+
+I picked these two figures up from Kid Robot for Apture's Christmas Secret Santa, they ended up going to Josh who didn't take them with him for whatever reason. I've since moved them to a more visible location (right below the Hudson dashboard).
+
+
+
+Given the cloud cover that I normally ride home through I was quite surprised to see clear skies *over* Twin Peaks on my ride home. Of course, it is still February, so the clouds were still there, creeping along the ground.
+
diff --git a/_posts/2010-02-16-yes-that-is-hair-on-my-chin.html b/_posts/2010-02-16-yes-that-is-hair-on-my-chin.html
new file mode 100644
index 0000000..baf8cdc
--- /dev/null
+++ b/_posts/2010-02-16-yes-that-is-hair-on-my-chin.html
@@ -0,0 +1,10 @@
+---
+layout: post
+title: Yes, that is hair on my chin
+tags:
+- Miscellaneous
+created: 1266360300
+---
+And it's taken an eternity to graduate from "adorable peach fuzz" to "smudge of dirt" status, so leave me alone.
+
+I figure by the time it grows long enough to where I stop getting carded for alcohol, my hair will be gray, thus defeating the purpose.
diff --git a/_posts/2010-02-21-supporting-python-3-is-a-ghetto.markdown b/_posts/2010-02-21-supporting-python-3-is-a-ghetto.markdown
new file mode 100644
index 0000000..66cbc9c
--- /dev/null
+++ b/_posts/2010-02-21-supporting-python-3-is-a-ghetto.markdown
@@ -0,0 +1,45 @@
+---
+layout: post
+title: Supporting Python 3 is a Ghetto
+tags:
+- Software Development
+- Cheetah
+- Python
+created: 1266793348
+---
+In my spurious free time I maintain a few Python modules (py-yajl, Cheetah, PyECC) and am semi-involved in a couple others (Django, Eventlet), only one of which properly supports Python 3. For the uninitiated, Python 3 is a backwards incompatible progression of the Python language and CPython implementation thereof, it's represented significant challenges for the Python community insofar that supporting Python 2.xx, which is in wide deployment, and Python 3.xx simultaneously is difficult.
+
+As it stands now my primary development environment is Python 2.6 on Linux/amd64, which means I get to take advantage of some of the nice things that were added to Python 3 and then back-ported to Python 2.6/2.7. Regular readers know about my undying love for Hudson, a Java-based continuous integration server, which I use to test and build all of the Python projects that I work on. While working this weekend I noticed that one of my C-based projects (py-yajl) was failing to link properly on Python 2.4 and 2.5. It might be easy to cut-off support for Python 2.4, which was first released over **four years** ago, there are still a number of heavy users of 2.4 (such as Slide), in fact it's still the default `/usr/bin/python` on Red Hat Enterprise Linux 5. What makes this C-based module special, is that thanks to Travis, it runs properly on Python 3.1 as well. Since the Python C-API has been *fairly* stable through the 2 series into Python 3, maintaining a C-based module that supports multiple versions of Python.
+
+In this case, it's as easy as some simple pre-processor definitions:#if PY_MAJOR_VERSION >= 3
+#define IS_PYTHON3
+#endifWhich I can use further down the line to modify the handling some of the minor internal changes for Python 3:#ifdef IS_PYTHON3
+ result = _internal_decode((_YajlDecoder *)decoder, PyBytes_AsString(bufferstring),
+ PyBytes_Size(bufferstring));
+ Py_XDECREF(bufferstring);
+#else
+ result = _internal_decode((_YajlDecoder *)decoder, PyString_AsString(buffer),
+ PyString_Size(buffer));
+#endif
+
+Not particularly *pretty* but it gets the job done, supporting all major versions of Python.
+
+### Python on Python
+Writing modules in C is fun, can give you pretty good performance, but is not something you would want to do with a **large** package like Django (for example). Python is the language we all know and love to work with, a much more pleasant language to work with than C. If you build packages in pure Python, those packages have a much better chance running on top of IronPython or Jython, and the entire Python ecosystem is better for it.
+
+A few weeks ago when I started to look deeper into the possibility of Cheetah support for Python 3, I found a process riddled with faults. First a disclaimer, Cheetah is almost **ten years** old; it's one of the oldest Python projects I can think of that's still chugging along. This translates into some *very* old looking code, most people who are new to the language aren't familiar with some of the ways the language has changed in the past five years, let alone ten.
+
+The current means of supporting Python 3 with pure Python packages is as follows:
+
+1. Refactor the code enough such that `2to3` can process it
+1. Run 2to3 over the codebase, with the `-w` option to literally write the changes to the files
+1. Test your code on Python 3 (if it fails, go back to step 1)
+1. Create a source tarball, post to PyPI, continue developing in Python 2.xx
+
+I'm hoping you spotted the same problem with this model that I did, due to the reliance on `2to3` you are now trapped into **always** developing Python targeting Python **2**. This model will never succeed in moving people to Python 3, regardless of what amazing improvements it contains (such as the Unladen Swallow work) because you cannot develop on a day-to-day basis with Python 3, it's a magic conversion tool away.
+
+Unlike with a C module for Python, I cannot `#ifdef` certain segments of code in and out, which forces me to constantly use `2to3` *or* fork my code and maintain two separate branches of my project, duplicating the work for every change. With Python 2 sticking around on the scene for years to come (I don;t believe 2.7 will be the last release) I cannot imagine **either** of these workflows making sense long term.
+
+
+At a fundamental level, supporting Python 3 does not make sense for anybody developing modules, particularly open source ones. Despite Python 3 being "the future", it is currently impossible to develop using Python 3, maintaining support for Python 2, which **all** of us have to do. With enterprise operating systems like Red Hat or SuSE only now starting to get on board with Python 2.5 and Python 2.6, you can be certain that we're more than five years away from seeing Python 3 installed by default on any production machines.
+
diff --git a/_posts/2010-02-23-arent-we-just-adorable.markdown b/_posts/2010-02-23-arent-we-just-adorable.markdown
new file mode 100644
index 0000000..0c12e5c
--- /dev/null
+++ b/_posts/2010-02-23-arent-we-just-adorable.markdown
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Aren't we just adorable
+tags:
+- Miscellaneous
+- Photos
+created: 1266968700
+---
+A few weekends ago ET and I had some engagement photos taken, I'm told this is normal, by the husband-and-wife team from [Tibidabo Photography](http://tibidabophotography.com/), Bob and Becky. The duo met us at one of my favorite spots in San Francisco: Duboce Ave and Buena Vista Ave East
+ after which we ran around in Buena Vista Park taking a few shots, then down to Baker Beach. As much as I **hate** having my picture taken, they did a wonderful job and grabbed some really stellar shots.
+
+
diff --git a/_posts/2010-02-23-if-you-want-a-viral-license-use-the-gpl.markdown b/_posts/2010-02-23-if-you-want-a-viral-license-use-the-gpl.markdown
new file mode 100644
index 0000000..eba322e
--- /dev/null
+++ b/_posts/2010-02-23-if-you-want-a-viral-license-use-the-gpl.markdown
@@ -0,0 +1,55 @@
+---
+layout: post
+title: If you want a viral license, use the GPL
+tags:
+- Opinion
+- Python
+created: 1266936300
+---
+My "roots" in the open source community come from the BSD side of the open source spectrum, my first major introduction being involvement with FreeBSD and OpenBSD. It is not surprising that my licensing preferences fall on the BSD (2 or 3 clause) or MIT licenses, the MIT license reading as follows:
Copyright (c) [year] [copyright holders]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+I bring the subject up because I wanted to address a brief "kerfuffle" that occurred recently on the Eventlet mailing list with the maintainer of gevent, a fork/rewrite of Eventlet. Both projects are MIT licensed which gives anybody that would like to fork the source code of either project a great deal of leeway to hack about with the code, commercialize it, etc.
+
+**Disclaimer**: I personally am a fan of Eventlet, use it quite often, and have recently taking up maintaining Spawning, a WSGI server that supports multiple processes/threads, non-blocking I/O and graceful code reloading, built on top of Eventlet.
+
+The "kerfuffle" occurred after Ryan, the maintainer of Eventlet, took a few good modules from gevent; *shocking* as it may seem, a developer working with liberally licensed code took liberally licensed code from a similar project. The issue that the maintainer of gevent took with the incorporation of his code was all about attribution:
+
+> I don't mind you borrowing code from gevent, the license permits it. However, please make it clear where are you getting the code from.
+
+Upon first reading the email, I doubled over to the [eventlet source on Bitbucket](http://bitbucket.org/which_linden/eventlet/), checked the files that were incorporated into the codebase ([timeout.py](http://bitbucket.org/which_linden/eventlet/src/tip/eventlet/timeout.py) and [queue.py](http://bitbucket.org/which_linden/eventlet/src/tip/eventlet/queue.py))and sure enough the copyright attributing the original author were still in tact, surely this is a non-issue?
+
+Unfortunately not, license pedantry is an open source community past-time, right up their with drinking and shouting. When I replied mentioning that the copyrights were correctly in place, mentioning that both projects were MIT licensed so both constraints of the license were met, that is, the MIT license notice was included with the code. In essence the disagreement revolves around what the phrase "this permission notice shall be included" entail, my interpretation of the license is such that the MIT license itself shall be included, not the specific file with additions from one project to another; after sending off my mail, I received the following reply:
+
+> Ok, it's acceptable to use one LICENSE file but only if the copyright notice from gevent is present unchanged.
+>
+> That is, take the notice from here http://bitbucket.org/denis/gevent/src/tip/LICENSE (the line with the url), and put it into eventlet's LICENSE, on a separate line. (It's OK to add "Copyright (c) 2009-2010" before it to make it in line with others).
+>
+> That would settle it.
+
+Slightly pedantic in my opinion, the MIT license enumerates a line for copyright holders which has been hijacked for other information that the maintainer of gevent would like to propagate, I don't necessarily agree, but this is a mailing list not a court of law, so I'll allow it. The thread continues:
+
+> The license did not change. I've only updated the copyright notice to include the url of the project to protect against abusive borrowers, that's it.
+
+This is where I draw the line, go all in, plant my flag in the sand and other unnecessary metaphors. **Abusive borrowers?** Analyzing the semantics of the phrase alone makes my head hurt, I have a mental image of two old ladies wherein one says to the other: "may I borrow a cup of sugar, you horse-faced hunch-backed bucket of moron?" The rest of the email is full of similarly head-hurting quotes, for brevity I won't include them here (you can read the thread [in the archives](https://lists.secondlife.com/pipermail/eventletdev/2010-February/000731.html)).
+
+I'm simply dumbfounded by the ignorance of what the MIT license actually *means*, unlike the LGPL or the GPL license which were specifically drafted to protect against "abusive borrowers", such as Cisco, the MIT license is so open it's *almost* public domain.
+
+To a certain extent I can understand the emotions behind the thread on the mailing list, I don't agree with them. If you're seeking attribution past the copyright line in a header, than perhaps the "original" [4 clause BSD license](http://en.wikipedia.org/wiki/BSD_licenses#4-clause_license_.28original_.22BSD_License.22.29) is for you, or perhaps the LGPL or GPL which give you more control over what happens to the source code you originate? If this is what you're after, the MIT license is the wrong license.
diff --git a/_posts/2010-02-26-pyrage-static-isnt-just-something-on-the-radio.markdown b/_posts/2010-02-26-pyrage-static-isnt-just-something-on-the-radio.markdown
new file mode 100644
index 0000000..907574a
--- /dev/null
+++ b/_posts/2010-02-26-pyrage-static-isnt-just-something-on-the-radio.markdown
@@ -0,0 +1,51 @@
+---
+layout: post
+title: "Pyrage: Static isn't just something on the radio"
+tags:
+- Opinion
+- Software Development
+- Python
+created: 1267191900
+---
+Dealing with statics in Python is something that has bitten me enough times that I have become quite pedantic about them when I see them. I'm sure you're thinking "But Dr. Tyler, Python is a *dynamic* language!", it is indeed, but that does not mean there aren't static variables.
+
+The funny thing about static variables in Python, in my opinion, once you understand a bit about scoping and what you're dealing with, it makes far more sense. Let's take this static class variable for example:
+
+>>> class Foo(object):
+... my_list = []
+...
+>>> f = Foo()
+>>> b = Foo()
+
+You're trying to be clever, defining your class variables with their default variables outside of your `__init__` function, understandable, unless you ever intend on **mutating** that variable.
+>>> f.my_list.append('O HAI')
+>>> print b.my_list
+['O HAI']
+>>>
+
+Still feeling clever? If that's what you *wanted*, I bet you do, but if you wanted each class to have its own internal list you've inadvertantly introduced a bug where *any* and *every* time something mutates `my_list`, it will change for every single instance of `Foo`. The reason that this occurs is because `my_list` is tied to the class object `Foo` and not the **instance** of the `Foo` object (`f` or `b`). In effect `f.__class__.my_list` and `b.__class__.my_list` are the same object, in fact, the `__class__` objects of both those instances is the same as well. >>> id(f.__class__)
+7680112
+>>> id(b.__class__)
+7680112
+
+
+
+When using default/optional parameters for methods you can also run afoul of statics in Python, for example:>>> def somefunc(data=[]):
+... data.append(1)
+... print ('data', data)
+...
+>>> somefunc()
+('data', [1])
+>>> somefunc()
+('data', [1, 1])
+>>> somefunc()
+('data', [1, 1, 1])
+>>>
+
+This comes down to a scoping issue as well, functions and methods in Python are first-class objects. In this case, you're adding the variable `data` to the `somefunc.func_defaults` tuple, which is being mutated when the function is being called. Bad programmer!
+
+
+It all seems simple enough, but I still consistently see these mistakes in plenty of different Python projects (both pony-affiliated, and not). When these bugs strike they're difficult to spot, frustrating to deal with ("who the hell is changing my variable!") and most importantly, easily prevented with a little understanding of how Python scoping works.
+
+PYRAGE!
+
diff --git a/_posts/2010-03-01-programming-as-an-objective-art.markdown b/_posts/2010-03-01-programming-as-an-objective-art.markdown
new file mode 100644
index 0000000..522bc34
--- /dev/null
+++ b/_posts/2010-03-01-programming-as-an-objective-art.markdown
@@ -0,0 +1,65 @@
+---
+layout: post
+title: Programming as an objective art
+tags:
+- Opinion
+- Miscellaneous
+- Software Development
+created: 1267457400
+---
+Writing software is an outlet for artistic expression to many people, myself included.
+For me, solving problems involves a good deal of creativity not only in the actual solution
+but also in the manipulating several moving parts in order to fit the solution into an
+existing code-base. Combining this creative outlet with a beautiful language, such as Python
+results in some developers writing code that holds an masterpiece-level of beauty to them,
+to the untrained eye one might look at a class and think nothing of it, but to the author of
+that code, it might represent a substantial amount of work and personal investment.
+
+Like art, sometimes the beauty is entirely subjective. there has been times where I've been
+immensely pleased with one of my creations, only to turn to wholly unimpressed Dave. Managing
+or working with any team of highly motivated, passionate and creative developers presents this
+problem, as a group: **how can you objectively judge code while preserving the sense of ownership by
+the author?**
+
+The first step to objectively judging code in my opinion, is to separate it from the individual
+who wrote it when discussing the code. For a lot of people this is easier said than done, particularly
+for younger engineers like myself. Younger engineers tend to have "more to prove" and are thereby
+far more emotionally invested in the code that they write, while older engineers whether by experience
+or simply by having written more code than their younger counterparts are able to distance themselves
+emotionally more easily from the code that they write. Not to say older engineers aren't emotionally
+invested in their work, in my experience they typically are, it's just a matter being better at picking battles.
+
+Code review is a common sticking point for a lot of engineers, it's incredibly important for both
+parties in a code review to judge the code objectively, if you are not, a code review can result in
+hurt feelings and resentment, personal differences bubbling up to the surface in a venue they don't belong in. I think it's immensely important to refer to code as an entity unto itself
+once a code review starts, phrases like "your code" are a major taboo. Separating the person who wrote
+the code from the code itself can help both the reviewer but also the original author of the code
+look at the changes in an objective light. "*The code is overly complicated when all it should be doing
+is X.*" "*The patch doesn't appropriately account for condition Y, which can happen if Z.*" With a change
+in semantics, the conversation changes from one developer judging another's work, to two developers
+objectively discussing whether or not the desired goal has been acheived with minimal downside.
+(*Note*: I'm presuming "proper code review" is being performed, devoid of nitpicking on minor style
+differences) You will find behavior like this in many successful open source projects that make
+heavy use of code review, the Git project comes to mind. When patches are posted to the mailing list,
+their merits are discussed as a separate entity, separated from the original author.
+
+This same strategy of separating the individual from the code should also be applied to bugs in the code.
+When using git-blame(1) for example, there is a tendency to look at who authored the change, seek them
+out and pummel them with a herring. In a smaller team dynamic, as well as an open source environment,
+pinning "ownership" of a bug to a particular person is *entirely* non-constructive. Publicly citing
+and referencing somebody else's mistake does nothing other than hurt that individual's ego. The
+important part to refer to with git-blame(1) is the commit hash, and nothing else. With the conversation
+changed from "*Jacob introduced a bug that causes X*" into "*Commit ff612a introduces a bug that causes X*"
+those involved can then look at the code, and determine what about that code causes the issue. For
+simpler bugs the original author will typically pipe up with "*Whoops, forgot about X, here's a fix*" but
+there are also cases where the original author didn't know about the implications of the change, had
+no means of testing for X, or the bug was caused by another change the original author wasn't privvy to. If the code is not separate from the individual, those latter cases can be tension points between developers that need not exist, making it all the more important (especially in small teams) to discuss changes openly and objectively.
+
+
+With code decoupled from the author himself, how does the author maintain that same sense of pride
+and ownership? The original author should be charge with making any changes that arise out of a
+code review (naturally) but also should maintain responsibility for that portion of code moving
+forward; this added responsibility ensures less "fire and forget" changes and adds more pressure on the
+code reviews to yield improvements to the stability and readability of new code.
+
+As soon as more than one developer is working on a project, it becomes increasingly important to recognize the difference between the "works of art" and the artist himself. The ceilings of the Sistine Chapel are an incredible piece of art, not because they were painted by Michelangelo. Writing code should be no different, the art is not the artist and vice versa.
diff --git a/_posts/2010-03-05-hypocrites-on-bikes.markdown b/_posts/2010-03-05-hypocrites-on-bikes.markdown
new file mode 100644
index 0000000..7063fe6
--- /dev/null
+++ b/_posts/2010-03-05-hypocrites-on-bikes.markdown
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Hypocrites on Bikes!
+tags:
+- Opinion
+created: 1267797600
+---
+Typically I read at least one news story a day that irritates me, usually I either don't care enough to gripe about them further, or I forget. After griping at ET about driving in the car with a phone in her hand, I remembered an article I read the [SF Streets Blog](http://sf.streetsblog.org) titled: "Advocates Concerned That Cyclists Are Included in Distracted Driving Bill" ([link](http://sf.streetsblog.org/2010/03/03/advocates-concerned-that-cyclists-are-included-in-distracted-driving-bill/))
+
+One of the choice quotes from the article being:
+
+> The California Bicycle Coalition (CBC), which was an early supporter of the original distracted driving legislation, was not thrilled about the inclusion of cyclists in the bill. CBC Communications Director Jim Brown said that he was confused about the motivation for extending the same level of fines to cyclists, particularly absent data showing distracted cycling as a public safety hazard.
+>
+> "The consequences of a distracted driver are considerably more serious than the consequences of distracted cycling," said Brown, adding that safe riding should be encouraged at all times and that talking on a cell phone or any other practice that distracted a cyclist from riding would not be advisable.
+
+As a member of the San Francisco Bicycle Coalition, I'm partially annoyed by Mr. Brown's comments, but I don't particularly care. Reading further through the article, I found this:
+
+> Andy Thornley, Program Director for The San Francisco Bicycle Coalition, agreed with Winter that lumping cyclists with motorists in this law was not good policy. While the SFBC "teaches and preaches safe, respectful, and mindful bicycling," said Thornley, "we're very leery of any equivalence of penalty when punishing a guilty cyclist or driver for the same offense."
+>
+> "Even worse, we wonder whether bicyclists would be cited more often than motorists because it's so much easier to spot someone texting while pedaling," he added. "It's already a problem of perception that individual bicycle riders seem to be noticed being naughty more than motorists, comfortably anonymous within their glass and steel boxes."
+
+What a hypocrite! Riding your bike while on the phone or worse, **texting** is just as stupid as some of the [no-helmet, no-light nonsense I was incensed over a few weeks ago](http://unethicalblogger.com/posts/2010/02/i_hope_you_bump_your_head), but the fact that these two gentlemen from Bike Coalitions want preferential treatment for cyclists in the most idiotic way possible blows my mind. To be honest, I'm entirely in favor of bicyclists being cited more often than motorists for breaking the law (running red lights or not using signals comes to mind).
+
+This kind of no-distractions law makes a lot of sense to me, and should be applied to just about anybody operating a moving vehicle, bikes, trikes, motorcycles, mopeds, cars, tractors, law mowers, you name it. If you are operating a vehicle distracted you raise your chances of hurting yourself or others on public roads (ever been hit while walking by a cyclist?).
+
+Inside of the San Francisco cycling community, I think we can do our part by shunning or otherwise pushing cyclists into light posts who are on their cell phones while riding. They are clearly morons and in my opinion the CBC or the SFBC has no place defending their idiocy.
+
diff --git a/_posts/2010-03-23-sometimes-software-as-a-service-sucks.markdown b/_posts/2010-03-23-sometimes-software-as-a-service-sucks.markdown
new file mode 100644
index 0000000..71eb314
--- /dev/null
+++ b/_posts/2010-03-23-sometimes-software-as-a-service-sucks.markdown
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Sometimes Software as a Service Sucks
+tags:
+- Opinion
+- Software Development
+- Hudson
+created: 1269352800
+---
+Being a big fan of "continuous integration", particularly with Hudson, I've often thought about the possibilities of turning it into a business. It's no surprise really, my first commercial application as a rogue Mac software developer was a product called [BuildFactory](http://bleepsoft.com/buildfactory/) which, while fun to build, never sold all that many licenses. With the advent of Amazon's EC2 service and the transition of these cloud computing resources into a building block for many businesses, I've long thought about the idea of building "continuous integration as a service."
+
+At face value the idea sounds incredibly fun to build, I'll build a service that integrates with GitHub, Google Code, SourceForge and private source control systems. The end (paying) user would "plug-in" to the "continuous integration grid", they'd work throughout the day, committing code and then the CI grid would pick up those changes, build releases and run tests against a number of different architecture, automatically detecting failures and reporting them back to the developers. It involves some of my favorite challenges in programming:
+
+* Scaling up
+* Efficiently using cycles, and only when needed
+* Building and testing cross-architecture and cross-platform
+
+Unfortunately, it's a crap business idea, I now have second-hand confirmation from a group of guys who've attempted the concept. The folks behind RunCodeRun are [shutting down the service](http://blog.runcoderun.com/post/463439385/saying-goodbye-to-runcoderun). In the post outlining why they're shutting down, they've hit the nail on the head on why "continuous integration as a service" can **never** work:
+
+> Large scale hosted continuous integration is consumed as a commodity but built as a craft, and the rewards, both emotional and financial, are insufficient to support the effort.
+
+Elaborating further on their point, continuous integration by itself is a relatively basic task: build, test, repeat. The biggest problem with continuous integration as a service however, is that no two projects are alike. My build targets or requirements might be vastly different from project to project, let alone customer to customer, making the amount of tweaking and customization per-job too large such that at some point the only benefit that one derives from such a service is the hosting of the machines to perform the task. If you're just taking care of that, why wouldn't your customers just use Hudson in "the cloud" themselves? The CI grid at that point offers no exceptional value.
+
+As much as I regret letting a fun idea die, I think I'll have to file this one under "To do after becoming so rich I'll care about capital gains taxes."
diff --git a/_posts/2010-04-02-a-rebase-based-workflow.markdown b/_posts/2010-04-02-a-rebase-based-workflow.markdown
new file mode 100644
index 0000000..417e644
--- /dev/null
+++ b/_posts/2010-04-02-a-rebase-based-workflow.markdown
@@ -0,0 +1,52 @@
+---
+layout: post
+title: A rebase-based workflow
+tags:
+- Software Development
+- Git
+created: 1270213200
+---
+When I first started working with Git in [mid 2008](http://unethicalblogger.com/posts/2008/07/experimenting_with_git_slide_part_13) I was blissfully oblivious to the concept of a "rebase" and why somebody might ever use it. While at Slide we were **crazy** for merging (*see diagram to the right*), everything pretty much revolved around merges between branches. To add insult to injury, development revolved around a single central repository which *everyone* had the ability to push to. Merges compounded upon merges led to a frustratingly complex merge history.
+
+When I first arrived at Apture, we were still using Subversion, similar to Slide when I arrived (I have a Git-effect on companies). In order to work effectively, I *had* to use git-svn(1) in order to commit changes that weren't quite finished on a day-to-day basis. Rebasing is fundamental to the git-svn(1) workflow, as Subversion requires a linear revision history; I would typically work in the `master` branch and execute `git svn rebase` prior to `git svn dcommit` to ensure that my changes could be properly committed at the head of trunk.
+
+When we finally switched from Subversion to Git we adopted an "integration-manager workflow" which is far more conducive to rebase being useful than the purely centralized repository workflow I had previously used at Slide.
+
+
+
From the [Pro Git](http://progit.org/book/ch5-1.html) site
+
+In addition to the publicly readable repositories for each developer, we use Gerrit religiously which I'll cover in a later post.
+
+We use rebase heavily in this workflow to accomplish three main goals:
+
+* Linear revision history
+* Concise commits covering a logical change
+* Reduction of merge conflicts
+
+Creating a solid linear revision history, while not immediately important, is nicer in the longer term allowing developers (or new hires) to walk the history of a particular file or module and see a clear progression of changes.
+
+Creating concise commits is probably the **most** important reason to use rebase, when working in a topic branch I will typically commit every 20-40 minutes. In order to not break my flow, the commit messages will typically be brief and cover only a few lines of changes, atomic commits are great when writing code but they're lousy at informing other developers about the changes. To do this, an "interactive rebase" can be used, for example, collapsing the commits in a topic branch `ticket-1234` would look like:
+
+* `git checkout ticket-1234`
+* `git rebase -i master`
+
+This will bring up an editor with a list of commits, where you can "squash" commits together and re-write the final commit message to be more informative.
+
+
+
+### The Workflow
+
+For the purposes of the example, let's use the topic branch from above (`ticket-1234`) which we'll assume has 3 commits unique to it.
+
+1. Fetch the latest changes from the upstream "master" branch
+ * `git fetch origin`
+1. Rebase the topic branch, effectively piling the 3 commits on top of the latest tip of the upstream "master" branch
+ * `git rebase origin/master`
+1. Collapse the 3 commits in the topic branch down into one commit
+ * `git rebase -i origin/master`
+1. (*Later*) Bringing those commits down into the "master" branch
+ * `git checkout master && git rebase ticket-1234`
+
+With an interactive rebase, you can chop commits up, re-order them, squash them, etc, with the non-interactive rebase you can pile your commits on top of an upstream head making your changes apply cleanly to the latest code in the upstream repository.
+
+[git ready](http://www.gitready.com/) has a few nice articles on the subject as well, such as an [intro to rebase](http://www.gitready.com/intermediate/2009/01/31/intro-to-rebase.html) and an article on [squashing commits with rebase](http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)
diff --git a/_posts/2010-04-03-a-great-platform-does-not-make-yours-a-good-product.markdown b/_posts/2010-04-03-a-great-platform-does-not-make-yours-a-good-product.markdown
new file mode 100644
index 0000000..a85ad35
--- /dev/null
+++ b/_posts/2010-04-03-a-great-platform-does-not-make-yours-a-good-product.markdown
@@ -0,0 +1,25 @@
+---
+layout: post
+title: A great platform does not make yours a good product
+tags:
+- Opinion
+created: 1270302300
+---
+As I sit here writing, burnt out from the incredible hype surrounding Apple's iPad launch and I cannot help but have flashbacks. Flashbacks to 2004/2005 when "Web 2.0" was at its peak, "ajax" and "mashup" were quite trendy. Flashbacks to mid-2007 when the Facebook Platform was gaining steam, words like "FBML" and "social applications" became the new lingo. Flashbacks to early 2008 when the iPhone SDK launched and hoards of developers rushed to submit their apps to the App Store. All bore a resemblance to today, with the iPad, the newest, hottest thing in the world with everybody and their mother vying for one.
+
+Every step of the way, beneath the almost overwhelming marketing and hype, lies actual technological innovation. With "Web 2.0", the underlying core innovation was the rise of the web as a formidable platform, browsers became capable of supporting immersive applications built in JavaScript, the web "came alive", no longer a lexicon of static pages. With the launch of the Facebook Platform, products could engage not just on a one-to-one level with a user, but with a user's social circle. The iPhone SDK made developers re-think building applications, touch, motion and then location became fundamental building blocks for products. The iPad represents a slightly different innovation, the introduction of "casual computing" to the masses. Personal computers are becoming omnipresent, the smartphone in your pocket, the laptop on your desk and now the tablet on the coffee table.
+
+It comes as no surprise that just as with every other hyped innovation over the past few years, there's a rush of gold-diggers trying to latch onto somebody else's innovation, using it to rocket them to the top. The announcement of a [$200m "iFund" for iPad apps](http://techcrunch.com/2010/03/31/kleiner-perkins-ipad-fund/) reminds me a *lot* of the crazy venture capitalists [establishing Facebook app funds](http://www.insidefacebook.com/2007/07/10/first-venture-capital-fund-for-facebook-applications-launches/) or even the [$100m "iFund" for iPhone apps](http://techcrunch.com/2008/03/06/kleiner-perkins-anounces-100-millioin-ifund-for-iphone-applications/) (from the same group no less).
+
+Venture Capitalists aren't alone in their attempts to ride Apple's innovating coat tails, companies building products are falling for it too, with hundreds of thousands of apps in the iPhone App Store or the hundreds of thousands of Facebook applications, one could deceive themselves into believing tens of thousands of companies are printing money on these platforms!
+
+I would estimate that for every 1000 applications, on any of these platforms, only one is a **good** product. The same thing is going to happen on the iPad, for the exact same reason that it occurred with Web 2.0 sites, the Facebook Platform and the iPhone.
+
+> It's like X, but for the Web / Facebook Platform / iPhone / iPad!
+
+
+Platform innovation is no substitute for product innovation. The [iPad app for the New York Times](http://techcrunch.com/2010/04/02/the-new-york-times-launches-free-ipad-app-for-real-now-paid-app-on-the-way/) comes to mind, which apparently does nothing but format the New York Times and show the user interstitial ads. There is really no added value over using something like [NetNewsWire](http://www.newsgator.com/individuals/netnewswireiphone/default.aspx) or god forbid, browsing to [newyorktimes.com](http://newyorktimes.com) with Safari for consuming content.
+
+Supporting the iPad is *not* a product, it's a feature, if your product isn't already compelling there is nothing intrinsic about the iPad that will make it more compelling just as it was with the launch of the other platforms.
+
+While I won't be buying an iPad, I wish all those jumping on the bandwagon luck. With a word of caution, bring features because your presence on the iPad alone will not be enough.
diff --git a/_posts/2010-04-24-regarding-blippy.markdown b/_posts/2010-04-24-regarding-blippy.markdown
new file mode 100644
index 0000000..ea30d59
--- /dev/null
+++ b/_posts/2010-04-24-regarding-blippy.markdown
@@ -0,0 +1,13 @@
+---
+layout: post
+title: Regarding Blippy
+tags:
+- Opinion
+created: 1272121200
+---
+While I wish my friend Ryan all the luck in the world at Blippy, I *loved* [this comment](http://www.reddit.com/r/programming/comments/bv7if/blippy_leaks_users_credit_card_numbers_ouch/c0opphy) on Reddit regarding the startup from [jacques_chester](http://www.reddit.com/user/jacques_chester)
+
+> Blippy is a company which turns the urges of widely available trendoids at the forefront of the hipster web into venture capital investments for its founders.
+
+
+I still don't understand what the point is though.
diff --git a/_posts/2010-04-28-san-francisco-transit-sucks.markdown b/_posts/2010-04-28-san-francisco-transit-sucks.markdown
new file mode 100644
index 0000000..b642a45
--- /dev/null
+++ b/_posts/2010-04-28-san-francisco-transit-sucks.markdown
@@ -0,0 +1,21 @@
+---
+layout: post
+title: San Francisco (Transit) Sucks
+tags:
+- Opinion
+created: 1272465000
+---
+I was reading [this article](http://www.sfgate.com/cgi-bin/blogs/cityinsider/detail?entry_id=62259&tsp=1) on some of the debates going on with the SF [Board of Supervisors](http://www.sfbos.org/index.aspx?page=1616), where one of the supervisors suggested his intention on bringing a ballot initiative up this November to "*force Muni operators to negotiate their salary, benefits and work rules through collective bargaining.*" Currently, despite the fact that Muni faces service cuts and a budget shortfall, Muni operators are **guaranteed no less than the second-highest transit operator salaries in the nation.**
+
+If you ask *anybody* who knows **anything** about say, capitalism, economics or even *math*, they'll tell you that the arrangement is **batshit insane**.
+
+So let's recap, a supervisor suggests the Muni union be forced to use collective bargaining to determine wages, which seems reasonable, and what happens in City Hall?
+
+> Daly jumped in to respond to Elsbernd's comments, saying that if the city wants to save money, it should look at agreements with all unions, beginning with the police. ''Supervisor Elsbernd targeting basically what amounts to a largely black and/or African American union not only has the issue of racial undertones''
+
+Holy race card Batman! Bargaining, a fundamental tenet of our capitalist society gets one deemed a racist by [Supervisor Daly](http://www.sfbos.org/index.aspx?page=1686)? He's clearly preoccupied with race, which will sure help bail Muni, and the city, out of their budget deficits this year.
+
+For those of you unfamiliar with San Francisco city budgets, this city somehow pisses away an annual budget of [over 6 billion dollars](http://articles.sfgate.com/2009-04-01/bay-area/17192422_1_midyear-cuts-budget-analysts-city-s-rainy-day-fund) a year, and our streets are terrible, homelessness continues to be a big issue, Muni is a mess and Market St still smells like urine.
+
+When my lease is up in June, I'm leaving San Francisco.
+
diff --git a/_posts/2010-04-30-be-a-libor.markdown b/_posts/2010-04-30-be-a-libor.markdown
new file mode 100644
index 0000000..6275323
--- /dev/null
+++ b/_posts/2010-04-30-be-a-libor.markdown
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Be a Libor
+tags:
+- Slide
+- Opinion
+- Software Development
+- Python
+- Apture
+created: 1272638700
+---
+I reflect occasionally on how I've gotten to where I am right now, specifically to how I made the jump from "just some kid at a Piggly Wiggly in Texas" as Dave once said, to the guy who knows *stuff* about **things**. I often think about what pieces of the Slide engineering environment were influential to my personal growth and how I can carry those forward to build as solid an engineering organization at Apture.
+
+The two pillars of engineering at Slide, at least in my naive world-view, were Dave and Libor. I joined Dave's team when I joined Slide, and I left Libor's team when I left Slide. Dave ran the client team, and did exceptionally well at filling a void that existed at Slide bridging engineering prowess with product management. Libor often furrowed his brow and built some of the large distributed systems that gave Slide an edge when dealing with incredible growth. In my first couple years I did my best to emulate Dave, engineers would always vie for Dave's time, asking questions and working through problems until they could return to their desk with the confidence that they understood the forces involved and solve the task at hand. Now that I'm at Apture, I'm trying to emulate Libor.
+
+(*Note*: I do not intend to idolize either of them, but cite important characteristics)
+
+To understand the Libor role, the phrase "the buck stops here" is useful. A Libor is the end of the line for engineering questions, unlike some organizations the "question-chain-of-command" is not the same as the org-chart. If a problem or question progressed up the stack to a Libor, and between an engineer and a Libor the pair cannot solve the problem, *you're screwed*.
+
+What does it take to be a Libor you may be thinking:
+
+* **No Guessing:** When acting as a Libor, *knowing* is crucial. That is not to say you must understand everything about all the nooks and crannies of the code-base, but when you give an answer it is crucial you actually know what the hell you are talking about. The consequences of being wrong are far worst than the consequences of not knowing, if a fellow engineer builds on your guess, when that code ships live in a few days/weeks there is a serious risk of everything falling over.
+
+* **Grok the stack:** A Libor is expected to hold a wealth of information internally, much like a clock maker, a Libor should understand where every single gear and spring fit together in a large complex system. It is not necessary to understand how each component individually works but instead, understand how all the pieces operate in concert. Some amount of acting as a Libor requires direct discussions with the operations team as well as the rest of engineering, when all that JavaScript and Python rolls out to 10, 20, 100, or 1,000 machines, somebody should have at least considered the ramifications of adding 3 more database calls to every request, that's the Libor.
+
+* **Maintenance and accountability:** Typically working at the lower ends of the stack, a Libor has to relive and tolerate last month's and last year's short-sighted decisions over and over. A Libor should not let himself nor colleagues "fire and forget" code, poor judgement will haunt a Libor for much longer than most people's New Year's resolutions. Because of this mistake-longevity, a Libor should be quite concerned with how well thought-out and tested new changes, particularly drastic ones, are.
+
+* **Focus on Engineering:** Code quality and extendability are Libor's primary focus, that is not to say that a Libor's role is to impede product development, but rather ensure that it is properly framed. While a product manager's primary concern may be to get a feature deployed as soon as possible, the primary concern of a Libor is to ensure that once that feature is shipped it doesn't break or otherwise degrade the quality of service of the rest of the site. When interfacing with other engineers a Libor should be asking questions about code, intentions and implementation. Code review is as important as communication with the team, flatly rejecting code is unacceptable, but discussing with engineers the potential pitfalls of certain approaches ensures that the group moves forward.
+
+
+Playing the Libor character at Apture has been interesting to say the least, I've done a lot of work getting a number of systems in place to help educate my decisions, particularly in our production environment. Focusing on the entire stack as a complex system has allowed us to make some adjustments here and there that have literally started to pay dividends the day after they ship.
+
+Non-engineering also benefits from having a Libor character in the organization, at Apture the product development narrative has changed, I find myself emphasizing:
+
+> Tell me what you want, we'll find a way to do it
+
+*That's* [a breakthrough](http://twitter.com/tristanharris/status/8355935929).
diff --git a/_posts/2010-05-07-how-to-using-avro-with-eventlet.markdown b/_posts/2010-05-07-how-to-using-avro-with-eventlet.markdown
new file mode 100644
index 0000000..5224052
--- /dev/null
+++ b/_posts/2010-05-07-how-to-using-avro-with-eventlet.markdown
@@ -0,0 +1,168 @@
+---
+layout: post
+title: "How-to: Using Avro with Eventlet"
+tags:
+- Software Development
+- Python
+- Apture
+created: 1273250700
+---
+Working on the plumbing behind a sufficiently large web application I find
+myself building services to meet my needs more often than not. Typically I
+try to build single-purpose services, following in the unix philosophy, cobbling
+together more complex tools based on a collection of distinct building blocks.
+In order to connect these services a solid, fast and easy-to-use RPC library is
+a requirement; enter [Avro](http://hadoop.apache.org/avro/).
+
+----
+
+*Note:* You can skip ahead and just start reading some source code by cloning my
+[eventlet-avro-example](http://github.com/rtyler/eventlet-avro-example) repository
+from GitHub.
+
+----
+
+Avro is part of the Hadoop project and has two primary components, data serialization
+and RPC support. Some time ago I chose Avro for serializing all of Apture's metrics and logging
+information, giving us a standardized framework for recording new events and processing
+them after the fact. It was not until recently I started to take advantage of Avro's
+RPC support when building services with Eventlet. I've talked about Eventlet [before](http://unethicalblogger.com/posts/2010/01/new_years_python_meme), but
+to recap:
+
+> Eventlet is a concurrent networking library for Python that allows you to change how you run your code, not how you write it
+
+What this means in practice is that you can write highly concurrent network-based
+services while keeping the code "synchronous" and easy to follow. Underneath
+Eventlet is the "greenlet" library which implements coroutines for Python, which
+allows Eventlet to switch between coroutines, or "green threads" whenever a network
+call blocks.
+
+
+Eventlet meets Avro RPC in an unlikely (in my opinion) place: WSGI. Instead of building
+their own transport layer for RPC calls, Avro sits on top of HTTP for its transport
+layer, POST'ing binary data to the server and processing the response. Since Avro can sit on top of HTTP, we can use [eventlet.wsgi](http://eventlet.net/doc/modules/wsgi.html) for building a fast, simple RPC server.
+
+### Defining the Protocol
+The first part of any Avro RPC project should be to define the protocol for RPC calls.
+With Avro this entails a JSON-formatted specification, for our echo server example,
+we have the following protocol:
+
+ {"protocol" : "AvroEcho",
+ "namespace" : "rpc.sample.echo",
+ "doc" : "Protocol for our AVRO echo server",
+ "types" : [],
+ "messages" : {
+ "echo" : {
+ "doc" : "Echo the string back",
+ "request" : [
+ {"name" : "query", "type" : "string"}
+ ],
+ "response" : "string",
+ "errors" : ["string"]
+ },
+ "split" : {
+ "doc" : "Split the string in two and echo",
+ "request" : [
+ {"name" : "query", "type" : "string"}
+ ],
+ "response" : "string",
+ "errors" : ["string"]
+ }
+ }}
+
+
+The protocol can be deconstructed into two concrete portions, type definitions and
+a message enumeration. For our echo server we don't need any complex types, so the
+`types` entry is empty. We do have two different messages defined, `echo` and `split`.
+The message definition is a means of defining the actual remote-procedure-call,
+services supporting this defined protocol will need to send responses for both kinds
+of messages. For now, the messages are quite simple, they expect a `query` parameter
+which should be a string, and are expected to return a string. Simple.
+
+(This is defined in [protocol.py](http://github.com/rtyler/eventlet-avro-example/blob/master/protocol.py) in the Git repo)
+
+
+### Implementing a Client
+Implementing an Avro RPC client is simple, and the same whether you're building a
+service with Eventlet or any other Python library so I won't dwell on the subject.
+A client only needs to build two objects, an "HTTPTransceiver" which can be used
+for multiple RPC calls and grafts additional logic on top of `httplib.HTTPConnection`
+and a "Requestor".
+
+ client = avro.ipc.HTTPTransceiver(HOST, PORT)
+ requestor = avro.ipc.Requestor(protocol.EchoProtocol, client)
+ response = requestor.request('echo', {'query' : 'Hello World'})
+
+You can also re-use for same `Requestor` object for multiple messages of the same
+protocol. The three-line snippet above will send an RPC message `echo` to the server
+and then return the response.
+
+(This is elaborated more on in [client.py](http://github.com/rtyler/eventlet-avro-example/blob/master/client.py) in the Git repo)
+
+
+### Building the server
+Building the server to service these Avro RPC messages is the most complicated
+piece of the puzzle, but it's still remarkably simple. Inside the `server.py` you
+will notice that we call `eventlet.monkey_patch()` at the top of the file. While not
+strictly necessary inside the server since we're relying on `eventlet.wsgi`for
+writing to the socket. Regardless it's a good habit to get into when working with
+Eventlet, and would be required if our Avro-server was also an Avro-client, sending
+requests to other services. Focusing on the simple use-case of returning responses
+from the "echo" and "split" messages, first the WSGI server needs to be created:
+
+ listener = eventlet.listen((HOST, PORT))
+ eventlet.wsgi.server(listener, wsgi_handler)
+
+The `wsgi_handler` is a function which accepts the `environment` and `start_response`
+arguments (per the WSGI "standard"). For the actually processing of the message,
+you should refer to the `wsgi_handler` function in `server.py` in the example
+repository.
+
+ def wsgi_handler(env, start_response):
+ ## Only allow POSTs, which is what Avro should be doing
+ if not env['REQUEST_METHOD'] == 'POST':
+ start_response('500 Error', [('Content-Type', 'text/plain')])
+ return ['Invalid REQUEST_METHOD\r\n']
+
+ ## Pull the avro rpc message off of the POST data in `wsgi.input`
+ reader = avro.ipc.FramedReader(env['wsgi.input'])
+ request = reader.read_framed_message()
+ response = responder.respond(request)
+
+ ## avro.ipc.FramedWriter really wants a file-like object to write out to
+ ## but since we're in WSGI-land we'll write to a StringIO and then output the
+ ## buffer in a "proper" WSGI manner
+ out = StringIO.StringIO()
+ writer = avro.ipc.FramedWriter(out)
+ writer.write_framed_message(response)
+
+ start_response('200 OK', [('Content-Type', 'avro/binary')])
+ return [out.getvalue()]
+
+The only notable quirk with using Avro with a WSGI framework like
+`eventlet.wsgi` is that some of Avro's "writer" code expects to be given a raw
+socket to write a response to, so we give it a `StringIO` object to write to and
+return that buffer's contents from `wsgi_handler`. The `wsgi_handler` function
+above is "dumb" insofar that it's simply passing the Avro request object into the
+"responder" which is responsible for doing the work:
+
+ class EchoResponder(avro.ipc.Responder):
+ def invoke(self, message, request):
+ handler = 'handle_%s' % message.name
+ if not hasattr(self, handler):
+ raise Exception('I can\'t handle this message! (%s)' % message.name)
+ return getattr(self, handler)(message, request)
+
+ def handle_split(self, message, request):
+ query = request['query']
+ halfway = len(query) / 2
+ return query[:halfway]
+
+ def handle_echo(self, message, request):
+ return request['query']
+
+
+All in all, minus comments the server code is around 40 lines and fairly easy to
+follow (refer to [server.py](http://github.com/rtyler/eventlet-avro-example/blob/master/server.py) for the complete version). I personally find Avro to be straight-forward enough and enjoyable to work with, being able to integrate it with my existing Eventlet-based stack is just icing on the cake after that.
+
+If you're curious about some of the other work I've been up to with Eventlet, [follow me on GitHub](http://github.com/rtyler) :)
diff --git a/_posts/2010-05-12-is-programming-with-twisted-really-as-awful-as-it-sounds.markdown b/_posts/2010-05-12-is-programming-with-twisted-really-as-awful-as-it-sounds.markdown
new file mode 100644
index 0000000..614563c
--- /dev/null
+++ b/_posts/2010-05-12-is-programming-with-twisted-really-as-awful-as-it-sounds.markdown
@@ -0,0 +1,21 @@
+---
+layout: post
+title: Is programming with Twisted really as awful as it sounds?
+tags:
+- Opinion
+- Python
+created: 1273682700
+---
+Early this week [Can](http://twitter.com/cansar) forwarded [this post on Quora](http://www.quora.com/Is-programming-with-Twisted-really-as-awful-as-it-sounds) to me, which asks the question:
+
+> Is programming with Twisted really as awful as it sounds?
+
+Yes. *Yes*. **YES IT IS**. ***HOLY CRAP IT'S AWFUL***
+
+Here's some good alternatives:
+
+ * [Eventlet](http://eventlet.net), my preference
+ * [gevent](http://gevent.org), an alternative to Eventlet tied to libevent
+ * [Java](http://www.java.com/). because let's face it, if you're using Twisted, you've already decided not to write Python, so use something with proper threading support.
+
+That is all.
diff --git a/_posts/2010-05-13-the-slow-death-of-the-indie-mac-dev.markdown b/_posts/2010-05-13-the-slow-death-of-the-indie-mac-dev.markdown
new file mode 100644
index 0000000..8bfb3ff
--- /dev/null
+++ b/_posts/2010-05-13-the-slow-death-of-the-indie-mac-dev.markdown
@@ -0,0 +1,27 @@
+---
+layout: post
+title: The slow death of the indie mac dev
+tags:
+- Cocoa
+- Opinion
+- Software Development
+created: 1273768200
+---
+Once upon a time I was a Mac developer. I *loved* Cocoa, I *loved* building Mac software, Mac OS X was once upon a time the greatest thing **ever**. I recall writing posts, and even founding a mailing list in the earlier days of Core Data, which I was using in tandem with Cocoa Bindings, which themselves were almost a black art. I was on a couple of podcasts talking about [web services with Cocoa](http://unethicalblogger.com/posts/tyler/im_on_another_podcast) or [MacWorld](http://unethicalblogger.com/posts/tyler/cocoa_radio_im_almost_relevant). I loved the Mac platform, and would have gladly rubbed Steve Jobs' feet and thanked him a thousand times for saving Apple from the despair of the late 1990's. As Apple grew, things slowly started to change, and we started to grow apart.
+
+As I started to drift away, I gave a presentation at [CocoaHeads](http://unethicalblogger.com/posts/tyler/cocoaheads_silicon_valley) presenting some of the changes and improvements to the Windows development stack, not supremely keen on the idea of building Windows applications, I was clearly on the market for "something else". Further and further I drifted, until I eventually traded my MacBook Pro in for a Thinkpad, foregoing any future I might have developing Mac software. My decade long journey of tinkering and learning on Macintosh computers had ended.
+
+
+When Mac OS X was in it's original Rhapsody-phase, in the weird nether-world between Platinum and Aqua, Apple realized that it had been held back by not giving developers tools to build for the platform. Apple began to push Project Builder which became Xcode, which became the **key** to the Intel-transition and has helped transform Mac OS from a perennial loser in the third-party software world to a platform offering the absolute best in third-party software. Third-party applications of impressive quality were built and distributed by the "indie mac devs", Adium, Voodoo Pad and Acorn from Flying Meat, Nicecast and Audio Hijack Pro from Rogue Amoeba, FuzzMeasure Pro from SuperMegaUltraGroovy, Growl, NetNewsWire or MarsEdit originally from Brent Simmons (NetNewsWire is now owned by NewsGator, while MarsEdit was acquired by Daniel Jalkut of Red Sweater Software), Yojimbo and BBEdit from BareBones, even Firefox, Camino and Opera filled the gap while Apple pulled Safari out of it's craptastic version 2 series. Applications were used on Mac OS X instead of web applications because the experience was better, faster and integrated with Address Book, iPhoto, Mail.app, iMovie and all of Apple's own stack.
+
+Then came the iPhone, with its "Web SDK" nonsense. The story, at least at the time, was clear to me. Apple didn't care about me. Apple didn't care about its developers. Build a web application using JavaScript and AJAX (a Microsoft innovation, I might add) over AT&T's **EDGE network**? Fuck you!
+
+A number of months later, back-tracking on the "Web SDK" concept, the iPhone SDK came out at WWDC with a ridiculous NDA, forbidding developers from talking about it publicly. Then the App Store was bundled with iTunes and iPhone OS, with Apple becoming the gatekeeper between indie developer, and Joe User. Of course, more recently in the long line of iPhone/developer related tragedies, the infamous [Section 3.3.1](http://www.maclife.com/article/news/apple_facing_federal_probes_over_section_331_iphone_sdk). There's also some hub-ub about the Apple Design Awards 2010, [only focusing on iPhone and iPad apps](http://www.loopinsight.com/2010/04/28/wwdc-apple-design-awards-eschew-mac-os-x/) which is quite disconcerting for indie mac devs, who routinely compete and win awards for the *best* Mac applications.
+
+The message is clear, Apple wants to completely own users on its platform and sit between developers and their users, dictating terms.
+
+It's no wonder that [@rentzsch](http://twitter.com/rentzsch), a major voice in the indie mac dev community, and organizer of the C4 conference is throwing in the towel on organizing C4 entirely (discussed in [this post](http://rentzsch.tumblr.com/post/592949476/c4-release)).
+
+It's not entirely clear whether the "indie mac dev" community will continue to exist for too much longer, there is some speculation that a "Mac App Store" is brewing in Cupertino right now or perhaps modifications to Mac OS X similar to what is present on the iPhone. If I were still part of the "indie mac dev" tribe, I'd feel *very* nervous right now about what will happen at this year's WWDC, as Dan Wood from Karelia knows, Apple feels no remorse with stomping on Mac developers.
+
+Worst comes to worst, I sincerely invite indie Mac developers to bring their user-experience talent and software-building energy to the weird but exciting world of web software, so long as Google keeps Facebook in check, the web should remain open for a good long while.
diff --git a/_posts/2010-05-17-i-get-lippy-when-i-drink.markdown b/_posts/2010-05-17-i-get-lippy-when-i-drink.markdown
new file mode 100644
index 0000000..3f4450b
--- /dev/null
+++ b/_posts/2010-05-17-i-get-lippy-when-i-drink.markdown
@@ -0,0 +1,25 @@
+---
+layout: post
+title: I get lippy when I drink
+tags:
+- Miscellaneous
+created: 1274112000
+---
+Most folks that know me, either virtually or otherwise, know I have opinions. Plenty of opinions, regardless of whether or not I'm qualified to comment on the subject, chances are, I will. At 21st Amendment last Friday, I was in quite a "mood" and poking fun at a few people, of course Can dutifully posted them to twitter, all of which I feel need explaining.
+
+
+> "no, they just apply synergy to paradigms!" - [via @cansar](http://twitter.com/cansar/status/14008678069)
+
+Some how Chris Messina and David Recordon came up in the conversation, I'm not afraid to say that I've known of them both for almost three years now, and I still don't have a clue what they actually *do*.
+
+> "yeah, well he shops at [El] Pollo Loco" - [via @cansar](http://twitter.com/cansar/status/14009034255)
+
+Apparently Can doesn't know you can buy Bison meat (a tasty alternative to beef), Can also thinks 6 sushi rolls are enough for lunch, suffice to say he has the eating habits of a Maury Povich baby.
+
+> "the UK has very lax [child] labor laws, before that he was a chimney sweep" - [via @cansar](http://twitter.com/cansar/status/14009034514)
+
+When discussing Apture's advisors, Ben Metcalfe came up, smart guy, fun to hang out with but apparently worked for the BBC in his teens, which I didn't know before Friday evening.
+
+In the interest of full-disclosure, I was drinking.
+
+If you're interested in hearing me poke fun at myself, you, your startup, your colleagues or your investors, do join me at 21st Amendment next friday at 5 p.m.
diff --git a/_posts/2010-05-18-being-a-libor-addendum.markdown b/_posts/2010-05-18-being-a-libor-addendum.markdown
new file mode 100644
index 0000000..fac723f
--- /dev/null
+++ b/_posts/2010-05-18-being-a-libor-addendum.markdown
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Being a Libor, Addendum
+tags:
+- Slide
+- Opinion
+- Software Development
+- Python
+- Apture
+created: 1274198400
+---
+A couple of weeks ago I wrote a post on how to "[Be a Libor](http://unethicalblogger.com/posts/2010/04/be_libor)", trying to codify a few points I feel like I learned about building a successful engineering team at Slide. Shortly after the post went live, I discovered that Libor had been promoted to [CTO at Slide](http://www.slide.com/corp/about-us.html).
+
+Over coffee today Libor offered up some finer points on the post in our discussion about building teams. It is important, according to Libor, to maintain a "mental framework" within which the stack fits; guiding decisions with a consistent world-view or ethos about building on top of the foundation laid. This is not to say that you should solve all problems with the same hammer, but rather if the standard operating procedure is to build small single-purpose utilities, you should not attack a new problem with a giant monolithic uber-application that does thirty different things (hyperbole alert!).
+
+Libor also had a fantastic quote from the conversation with regards to approaching new problems:
+
+> Just because there are multiple right answers, doesn't mean there's no wrong answers
+
+Depending on the complexity of the problems you're facing there are likely a number of solutions but you still can get it wrong, particularly if you don't remain consistent with your underlying mental framework for the project/organization.
+
+As usual my discussions with Libor are interesting and enjoyable, he's one of the most capable, thoughtful engineers I know, so I'm interested to see the how Slide Engineering progresses under his careful hand as the new CTO. I hope you join me in wishing him the best of luck in his role, moving from wrangling coroutines, to herding cats.
+
+[God speed mooncat](http://icanhascheezburger.com/2007/05/13/god-speed-moon-cat/)
diff --git a/_posts/2010-06-06-another-video-of-the-cat.html b/_posts/2010-06-06-another-video-of-the-cat.html
new file mode 100644
index 0000000..e90354a
--- /dev/null
+++ b/_posts/2010-06-06-another-video-of-the-cat.html
@@ -0,0 +1,28 @@
+---
+layout: post
+title: Another video of the cat
+tags:
+- Miscellaneous
+created: 1275843600
+---
+
+
+
+
+Reasons the cat meows:
+
+
Hungry
+
Too Cold
+
Annoyed
+
Preparing to jump off the bed
+
Jumping off the bed
+
Successfully landed on the floor
+
Happy
+
Welcoming you home
+
Appreciating being petted
+
Hungry
+
Sleepy
+
Too Warm
+
Unhappy
+
Hungry
+
diff --git a/_posts/2010-06-14-keyboard-synergy.markdown b/_posts/2010-06-14-keyboard-synergy.markdown
new file mode 100644
index 0000000..c1a3eb5
--- /dev/null
+++ b/_posts/2010-06-14-keyboard-synergy.markdown
@@ -0,0 +1,21 @@
+---
+layout: post
+title: Keyboard Synergy
+tags:
+- Miscellaneous
+- Linux
+created: 1276533900
+---
+Over the past year or two I've become quite fond of tiled window managers, the jump to Awesome (which I've [since dropped](http://unethicalblogger.com/posts/2009/07/awesomely_bad)) to [XMonad](http://xmonad.org) was a logical one. My gratuitous use of GNU/screen and [Vim](http://vim.org)'s tabs and split window support, already provided a de-facto tiled window manager within each one of my many terminals. The tiled window manager on top of all those terminals has served to improve my heavily-terminal biased workflow.
+
+One computer has never been enough for me, at the office my work spans three screens and two computers, I've not yet discovered a Thinkpad that can drive three screens alone; at home I typically span three screens and two laptops (let's conveniently ignore the question of *why* I feel I need so much screen real estate). Tying these setups together I use [synergy](http://synergy2.sourceforge.net) to provide my "software KVM" switch. As long as I've used synergy, I've had to switch from one screen to the other with a mouse, which is one of the **few** reasons I still keep one on the desk.
+
+Until I discovered a way around that, thanks to Jean Richard (a.k.a [geemoo](http://github.com/geemoo)) who posted [this little configuration change](http://geemoo.ca/blog/241/synergy-tricks-switch-screens-with-a-keyboard-shortcut) to `synergy.conf`:
+
+
+section: options
+ keystroke(control+alt+l) = switchInDirection(right)
+ keystroke(control+alt+h) = switchInDirection(left)
+end
+
+With this minor configuration change, combined with XMonad, [Vimium](http://github.com/philc/vimium) (Vim-bindings for Chromium) and my usual bunch of terminal-based applications, I can go *nearly* mouse-less for almost everything I need to do during the day.
diff --git a/_posts/2010-06-22-silly-problems.markdown b/_posts/2010-06-22-silly-problems.markdown
new file mode 100644
index 0000000..dd0b1af
--- /dev/null
+++ b/_posts/2010-06-22-silly-problems.markdown
@@ -0,0 +1,25 @@
+---
+layout: post
+title: Silly Problems
+tags:
+- Opinion
+created: 1277221500
+---
+In the next few weeks, ET and I will be moving out of San Francisco, perhaps for good. I am living up on the promise I [made back in April](http://unethicalblogger.com/posts/2010/04/san_francisco_transit_sucks) and leaving. Over the past weekend I was struck by how picky I've become, particularly with where I live.
+
+For starters, living in San Francisco, I live in a place with:
+
+ * A thriving bicycle culture, which is [only looking to get better](http://sf.streetsblog.org/2010/06/21/judge-poses-questions-to-attorneys-on-eve-of-final-bike-injunction-hearing/)
+ * *Hundreds* of restaurants with all sorts of delicious food stuffs
+ * Surprisingly few douchebags (hipsters and Mission bartenders not-withstanding)
+ * Fantastic weather
+ * Low violent crime
+
+And I'm still not happy with it.
+
+In the past, I've lived in places where enormous cars are a status symbol, giant belt buckles that double as shields are accepted; truck nuts. Moving here from Texas I left, stale, windless 100+ degree heat, random people shouting "faggot" at pedestrians from their cars, no tolerance drug policies coupled with binge drinking and drunk driving. To its credit however, Texas is *cheap* and areas like Austin are wonderful (not counting traffic). When I lived in eastern Germany, I was constantly confused, cold and more than once crashed a bike due to black ice on the roads. Before that, Northern Virginia, living dangerously close to the "south will rise again" group of folks, an area of the country where the Ku Klux Klan is still surprisingly strong, albeit more hidden than before.
+
+Every place that I have lived has had its own unique set of problems, San Francisco included; the lack of progress for a progressive city still irritates the hell out of me.
+
+
+There are so many parts of this country that unabashedly **fucking suck** compared to San Francisco, and I'm still not satisfied. What a silly problem to have.
diff --git a/_posts/2010-06-29-fatso-adventures-i-wonder-whats-down-here.markdown b/_posts/2010-06-29-fatso-adventures-i-wonder-whats-down-here.markdown
new file mode 100644
index 0000000..733eb8e
--- /dev/null
+++ b/_posts/2010-06-29-fatso-adventures-i-wonder-whats-down-here.markdown
@@ -0,0 +1,32 @@
+---
+layout: post
+title: "Fatso Adventures: \"I wonder what's down here?\""
+tags:
+- Opinion
+- Miscellaneous
+- Photos
+created: 1277863565
+---
+Quite the mixed bag today has been, I went to court (more on that later), I signed a lease (more on that later too), and I worked from home. Since ET and I are leaving this apartment soon, the management company has been showing the apartment during the day. Not a big deal, strangers walk around the apartment, all the windows are opened, all the lights are turned on, doors are opened and closed and if you're lucky enough to be around, you get to field questions.
+
+About an hour or two after the showing of the apartment was over, ET looks up from the couch and asks "Where's Buddy" (a.k.a. Fatso). After looking in all of the usual hiding places, she grabs a can of food and taps the lid and listens. A faint meowing is heard. She opens the closet door and taps the lid again. Meow, meow, meow. I think to myself "no way in hell is that cat in the closet, so I hold the can out the window and tap, tap, tap. Meows are coming from outside of the bathroom window. Our bathroom window opens onto this tiny area between two buildings, and is rarely opened because the view sucks, and we don't stink up our bathroom too much.
+
+Not entirely sure where the cat is, I go to the other side of this little area, in the buildings stairwell and open the window, climb out, and poke around for Fatso, a.k.a Buddy, a.k.a Missing Kitty #1. I can't see Fatso at all but I can *hear* him. I tapped on the hood for the ventilation shaft and I hear meowing. I tap again, meowing. Reaching my hand around under the hood, I hear more meowing but I don't feel anything.
+
+Thanks to a flashlight and mirror loaned from a friendly neighbor, who's more earthquake prepared than ET and I, I was able to look down the ventilation shaft. and I see Fatso's stupid little face, all the way at the bottom.
+
+
+
+----
+
+Running down to the basement confirms two things, this cat is stuck, secondly, he's stuck in the ventilation inlet to the heating system for the building. *Stupid cat*. While I continue to investigate possible exit strategies, something Fatso clearly hadn't considered, ET is on telephone duty. First we call the management company, who are characteristically useless, then it's on to the fire department's non-emergency line.
+
+When the calvary (see: firemen) arrive, the first thing we do is rip the hood off the ventilation shaft to determine whether we can fish the stupid cat from the depths, which after removing the hood, turns out to be about 15ft. To add insult to injury, there are a couple pieces of wood fastened into place at the top, preventing any beings larger than a 12 pound stupid cat from fitting down the shaft. Looks like we'll have to attack it from the basement, and be "we" I mean the firemen, I'm useless.
+
+The good boys from the SFFD find a seam in the sheet metal where the shaft attaches to the furnace and using some basic tools (pick) and their hands, are able to tear back some sheet metal so I can poke my head in the bottom of the buildings furnace, only to see our stupid cat, a.k.a Fatso, a.k.a Buddy, a.k.a Missing Cat #1, as far away as possible, entirely unwilling to exit the dark bowels of the furnace he's occupied for nigh three hours now.
+
+I explain to the firemen, that I can probably handle it from here since they likely have "real shit to do", but they are unwilling to budge, waiting on "verification" of the cat; they had not actually *seen* the cat at all up until this point. I shove my head back in the furnace, this time with an arm and grab Fatso by the neck and drag him, against his will, from the furnace to greet the four smiling faces of the SFFD's finest (and ET).
+
+The firemen are kind enough to seal the now warped sheet metal enough to hold the system over until the management company can repair the damage, and after thanking them they were on their merry way, ideally to save somebody's life, but most likely to watch Real Housewives of New Jersey back at the station while they wait for something to catch on fire or some stupid cat to poke its head where it doesn't belong.
+
+Fatso's favoring his hind-legs a little right now but is all and all in good condition. I want to say he's learned his lesson, but I'm certain he hasn't.
diff --git a/_posts/2010-07-04-pride.markdown b/_posts/2010-07-04-pride.markdown
new file mode 100644
index 0000000..73d397f
--- /dev/null
+++ b/_posts/2010-07-04-pride.markdown
@@ -0,0 +1,47 @@
+---
+layout: post
+title: Pride
+tags:
+- Opinion
+created: 1278285490
+---
+This fourth of July I find myself thinking a great deal about being an American in the 21st century, and pride. In the back of my head I have that hokey country song "God Bless the USA" with its chorus:
+
+> That I'm proud to be an American,
+> where at least I know I'm free.
+> And I wont forget the men who died,
+> who gave that right to me.
+
+The concept comes off so comical to me, "proud to be an American." What does that even mean? I am no more proud to be an American than I am:
+
+* Proud to have been born in California
+* Proud to be white
+* Proud to be tall
+* Proud to have four sisters
+* Proud to have a grandpa named Bob
+
+I had no control in *any* of it, I won the birth lottery and just *happened* to be born in the United States. I just happened to have grown up to be a tall, white guy with four sisters and a grandpa named Bob, I didn't select this configuration, it just happened to me. What's to be proud of?
+
+Taking pride in one's country however, I entirely understand. I feel that one should take pride in the positive actions that we undertake as a nation, since it's actions are theoretically comprised of our collective wills, by the same token, I think one should feel ashamed of the negative actions.
+
+That said, I'm struggling to find things to be proud of America lately, there's certainly a good bit to be angry and ashamed of:
+
+* Our participating in the secret ACTA treaty negotiations
+* The tarring of the Gulf of Mexico, a body of water I've spent nearly 40% of my life around.
+* Guantanamo
+* [The shrinking middle class](http://en.wikipedia.org/wiki/Household_income_in_the_United_States)
+* Shutting down Shuttle service without a viable Shuttle replacement
+* Four horrifically expensive failed wars:
+ * Drugs
+ * Terror
+ * Afghanistan
+ * Iraq
+* A bloated federal government, with representatives who've forgotten who they represent (looking at you Orrin Hatch)
+* Irrational fear of nuclear power
+
+I could go on, I could even start a whole new list of all the things we've screwed up here in California too, but it just makes angry, then sad, and then sleepy.
+
+I'm sure there are plenty of things that Americans have done lately that one could take pride in, but none are coming to mind.
+
+We have a mighty big hole to dig ourselves out of.
+
diff --git a/_posts/2010-07-07-i-love-sonic-net-already.markdown b/_posts/2010-07-07-i-love-sonic-net-already.markdown
new file mode 100644
index 0000000..db3d763
--- /dev/null
+++ b/_posts/2010-07-07-i-love-sonic-net-already.markdown
@@ -0,0 +1,29 @@
+---
+layout: post
+title: I love Sonic.net already
+tags:
+- Opinion
+- Miscellaneous
+created: 1278558306
+---
+Thanks to [@pemullen](http://twitter.com/pemullen), I was introduced to [Sonic.net](http://sonic.net) some time ago. Unfortunately I never took the time in my old apartment to switch out my AT&T DSL for Sonic.net's Fusion service; the thought of home internet downtime was just too dreadful to even contemplate changing, despite AT&T's absolutely awful service.
+
+Now that I've left that apartment, I can finally take the dive into some delightful Sonic.net service, and while it's not even installed yet, I can tell this is going to be a wonderful relationship just by some of the support emails I've been exchanging with their folks.
+
+**From me:**
+
+> Like an idiot I moved in last weekend instead of this upcoming weekend, so I'm
+> now in the unenviable position of zero home internet service. In the interest
+> of time, can you guys just ship the kit instead of sending some poor tech to
+> Berkeley? :)
+>
+> I understand that AT&T still needs to install a line, but after that I'm hoping
+> to get up and running as soon as possible, I'm almost to the point of
+> considering opening a book to read.
+>
+>
+> Oh the horror.
+
+After only a couple hours **Kelly R.** got back to me:
+
+> Sorry to hear that you've been driven to such desperate measures. I know the lead time takes a while from AT&T, but we here at Sonic.net have been working on expediting our end of the install process as much as possible. I'll keep my fingers crossed that this installation process doesn't result in a library membership.
diff --git a/_posts/2010-07-11-lebron-james.markdown b/_posts/2010-07-11-lebron-james.markdown
new file mode 100644
index 0000000..0f2be63
--- /dev/null
+++ b/_posts/2010-07-11-lebron-james.markdown
@@ -0,0 +1,42 @@
+---
+layout: post
+title: LeBron James
+tags:
+- Miscellaneous
+created: 1278870690
+---
+Saving this thread for posterity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/_posts/2010-07-14-paw-paw.markdown b/_posts/2010-07-14-paw-paw.markdown
new file mode 100644
index 0000000..3e00b41
--- /dev/null
+++ b/_posts/2010-07-14-paw-paw.markdown
@@ -0,0 +1,18 @@
+---
+layout: post
+title: Paw paw?
+tags:
+- Miscellaneous
+created: 1279117947
+---
+I feel like I'm slowly starting to blog like [@cansar](http://twitter.com/cansar) with just excerpts of other stuff that other people have said on the internet, so this is the last non-technical post for a little bit, promise.
+
+**[This thread](http://www.reddit.com/r/WTF/comments/cpcv5/i_just_found_out_my_grampa_is_a_redditor_wtf_i/)** on reddit just about made my morning, well, in addition to that delicious peach I ate.
+
+The mere thought of my own grandfather on reddit or any other online community I frequent is a pretty big stretch, but to have him be a *notable member* of the community is unfathomable (not to mention, run a part of it like [r/mayonnaise](http://www.reddit.com/r/mayonnaise/)).
+
+I suggest you read the whole thread and enjoy a hearty belly laugh, only so long as you're not doing anything important like driving a bus or performing a colonoscopy.
+
+----
+
+**Updated:** As with most things, [too good to be true](http://www.reddit.com/r/reddit.com/comments/cpl94/i_hate_to_do_this_but_our_beloved_grandapwiggly/). Although, I must say one of the most well done trolling performances I've seen yet. I remain unrepentant in my enjoying of a good belly laugh however
diff --git a/_posts/2010-08-28-unclog-the-tubes-blocking-detection-in-eventlet.markdown b/_posts/2010-08-28-unclog-the-tubes-blocking-detection-in-eventlet.markdown
new file mode 100644
index 0000000..1f269d2
--- /dev/null
+++ b/_posts/2010-08-28-unclog-the-tubes-blocking-detection-in-eventlet.markdown
@@ -0,0 +1,60 @@
+---
+layout: post
+title: Unclog the tubes; blocking detection in Eventlet
+tags:
+- Software Development
+- Python
+created: 1283033527
+---
+Colleagues of mine are all very familiar with my admiration of [Eventlet](http://eventlet.net), a
+Python concurrency library, built on top of [greenlet](http://pypi.python.org/pypi/greenlet), that
+provides lightweight "greenthreads" that naturally yield around I/O points. For me, the biggest draw of Eventlet
+besides its maturity, is how well it integrates with standard Python code. Any code that uses the built-in
+`socket` module can be "monkey-patched" (i.e. modified at runtime) to use the "green" version of the socket
+module which allows Eventlet to turn regular ol' Python into code with asynchronous I/O.
+
+The problem with using libraries like Eventlet, is that some Python code just **blocks**, meaning that
+code will hit an I/O point and *not* yield but instead block the entire process until that network operation
+completes.
+
+In practical terms, imagine you have a web crawler that uses 10 "green threads", each crawling a
+different site. The first greenthread (GT1) will send an HTTP request to the first site, then it will yield
+to GT2 and so on. If each HTTP request blocks for 100ms, that means when crawling the 10 sites, you're going
+to block the whole process, preventing anything from running, for a whole second. Doesn't sound too terrible,
+but imagine you've got 1000 greenthreads, instead of everything smoothly yielding from one thread to another
+the process will lock up very often resulting in painful slowdowns.
+
+
+Starting with Eventlet 0.9.10 "blocking detection" code has been incorporated into Eventlet to make
+it far easier for developers to find these portions of code that can block the entire process.
+
+ import eventlet.debug
+ eventlet.debug.hub_blocking_detection(True)
+
+
+While using the blocking detection is fairly simple, its implementation is a bit "magical" in that
+it's not entirely obvious how it works. The detector is built around signals, inside of Eventlet a signal
+handler is set up prior to firing some code and then after said code has executed, if a certain time-threshhold
+has passed, an alarm is raised dumping a stack trace to the console. I'm not entirely convinced I'm explaining this
+appropriately so here's some pseudo-code:
+
+
+ def runloop():
+ while True:
+ signal.alarm(handler, 1)
+ execute_next_block()
+ if (time.time() - start) < resolution:
+ clear_signal() # Clear the signal if we're less than a second, otherwise it will alarm
+
+
+The blocking detection is a bit crude and can raise false positives if you have bits of code that churn
+the CPU for longer than a second but it has been instrumental in incorporating **non-blocking DNS** support
+into Eventlet, which was also introduced in 0.9.10 (ported over from Slide's [gogreen](http://github.com/slideinc/gogreen)
+package).
+
+
+
+If you are using Eventlet, I highly recommend running your code periodically with blocking detection enabled,
+it is an invaluable tool for determining whether you're running as fast and as asynchronous as possible. In my
+case, it has been the difference between web services that are fast in development but slow under heavy stress,
+and web services that are fast **always** regardless of load.
diff --git a/_posts/2010-08-30-whats-in-a-name.markdown b/_posts/2010-08-30-whats-in-a-name.markdown
new file mode 100644
index 0000000..354824f
--- /dev/null
+++ b/_posts/2010-08-30-whats-in-a-name.markdown
@@ -0,0 +1,30 @@
+---
+layout: post
+title: What's in a name?
+tags:
+- Opinion
+- Miscellaneous
+created: 1283180400
+---
+Tomorrow morning I will be in court, hopefully finalizing a process I started earlier this year. I will be changing my name.
+
+When I was first considering it, I found the entire idea a bit scary. I have worked tremendously hard to make a name for myself, from my work in the open source community to conferences I've spoken at and interactions with numerous companies and people who have been instrumental in my whittling out a career in software engineering. I have been very particular about being referred to as "R. Tyler Ballance," ensuring that my "self-branding" remains consistent, netting me somewhere north of **36,000** results when [searching Google](http://www.google.com/search?ie=UTF-8&q=%22R.+Tyler+Ballance%22).
+
+Tomorrow I intend on throwing all that out the window, there are more important things in life than Google results (as shocking as that may sound).
+
+
+I'm hesitant to go too much into the motivations for the change, knowing full well that everything I publish might as well be set in stone on the internet.
+
+Those close to me know that my parents divorced when I was young. After a particularly nasty divorce, my mother and my three sisters parted ways with my father who I have since only had sporadic contact with. After a couple dark years for my sisters and I, my mother married another Navy man, George P. Croy, III. George came into the marriage with his daughter, bringing my sister-count up to four.
+
+Over the past fifteen years or so, I have become George's son. Successfully exploring his emotional spectrum from tears of joy to turning him a bright crimson shade of pissed-off, never once treating me as if I were anything less than his kin. I'm convinced my attitudes towards family, women and friends not to mention my strong opinions on honor and integrity have all been heavily influenced by him
+
+Plainly put, I would not be the man I am today without his guiding hand.
+
+
+
+Provided everything goes well at the courthouse, I enter as R. Tyler Ballance and leave as R. Tyler Croy.
+
+
+Might as well update your address books.
+
diff --git a/_posts/2010-09-03-being-a-croy.markdown b/_posts/2010-09-03-being-a-croy.markdown
new file mode 100644
index 0000000..340f593
--- /dev/null
+++ b/_posts/2010-09-03-being-a-croy.markdown
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Being a Croy
+tags:
+- Opinion
+- Miscellaneous
+created: 1283529600
+---
+The name change that I mentioned in [my previous post](http://www.unethicalblogger.com/posts/2010/08/whats_name) is now official. This means I now have to update **everything**. I'm in for a world of hurt between the DMV, banks, brothels and strip-Parcheesi clubs.
+
+The only thing you need to do is update your address book, lucky you! I know at least one friend of mine has, who messaged me to say:
+
+> *I put your old surname in the "Maiden Name" field in Address Book. Just thought you'd want to know.*
+
+
+I spoke to my step-dad George on the phone immediately after the hearing was over and asked if there are "any perks to being a Croy?"
+
+
+Still haven't gotten a response to that one yet.
diff --git a/_posts/2010-11-04-so-im-married.markdown b/_posts/2010-11-04-so-im-married.markdown
new file mode 100644
index 0000000..cd90b6c
--- /dev/null
+++ b/_posts/2010-11-04-so-im-married.markdown
@@ -0,0 +1,22 @@
+---
+layout: post
+title: So. I'm married.
+tags:
+- Opinion
+created: 1288881900
+---
+A few weeks ago I finally tied the knot after a rather long engagement, putting my relationship with then-fianceé into a legally binding relationship. While a wedding should hold a very special place in the bride and groom's heart forever, I feel like it is safe to say that our wedding **objectively rocked.**
+
+I don't want to dive too much into the nitty-gritty details of the entire weekend which culminated in a great ceremony and reception at the phenomenal [Madrona Manor](http://madronamanor.com/) Restaurant and Inn. The entire atmosphere, from both families having a great time together, to impeccable weather and the fantastically prepared dinner, was damned near perfect. Cue a brief slideshow of pictures taken by my good friends [Dave Young](http://twitter.com/stuffonfire) and [Annika Lindner](http://twitter.com/Artichoke13):
+
+
+
+
+
+Now that we're properly married, and no longer engaged, the typical annoying question has changed from "**When are you getting married?**" to "**When are you having children?**"
+
+Considering I can barely take care of our [big moron of a cat](http://www.flickr.com/photos/agentdero/tags/cat/), I don't think children are in the cards anytime soon. I'm curious what milestone comes after children though, "when are you going to retire" might be next and then perhaps "when are you going to die" after that.
+
+
+
+Either way, I think it's safe to say, it's all down hill from here.
diff --git a/_posts/2010-11-08-experimenting-with-reddits-self-serve-ads.markdown b/_posts/2010-11-08-experimenting-with-reddits-self-serve-ads.markdown
new file mode 100644
index 0000000..8e70c60
--- /dev/null
+++ b/_posts/2010-11-08-experimenting-with-reddits-self-serve-ads.markdown
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Experimenting with reddit's self-serve ads
+tags:
+- Opinion
+- Apture
+created: 1289224800
+---
+A couple weeks ago I decided to try out reddit's self-serve advertising system for one of our products at Apture: the [Apture Highlights](http://apture.com/extension/) browser extension. While I am an Apture employee, I've also turned into a rabid user of our browser plugin while browsing the web, I've found it to be perfect at answering a number of quick questions like "what does this word mean?" or "who the hell is this?" In a mix of curiosity regarding reddit's advertising system and advocacy for our browser extension, I decided to run a trial campaign on reddit.
+
+
+
+If you've not been exposed to reddit's self-serve advertising platform, here's a quick overview. The entire system is bid-based, with minimum bids starting at 20 USD a day. Ads are created by users (like me) and submitted for approval with tentative dates. Once the ad is approved by reddit, it is scheduled to run on a particular day. From my understanding of the system, the number of impressions given to your advertisement is based on your bid and the demand for ad impressions on the given day. On top of this basic structure, you can run advertisements "targeted" to a specific [subreddit](https://secure.wikimedia.org/wikipedia/en/wiki/Reddit#Subreddits) or reddit-wide.
+
+For the purposes of my campaign, I wanted to try both reddit-wide and targeted ads, for my targeted portion of the campaign I ran my ad for two days on the [/r/todayilearned](http://www.reddit.com/r/todayilearned), a subreddit with nearly 80,000 subscribers who all are looking to share an interesting nugget of information that they have learned today.
+
+In addition to targeting the ad to the specific subreddit, I tried to make the copy of the advertisement as compelling as possible for my potential clickers:
+
+
+(*note:* The acronym "TIL" generally is used as a substitute for "today I learned" in threads on reddit)
+
+
+This ad ran for two days on [/r/todayilearned](http://www.reddit.com/r/todayilearned) and for one day reddit-wide, bringing my total campaign expenditure to $60. The breakdown in numbers is as follows:
+
+
+**Impressions (unique -> total)**: 21,420 -> 141,037
+**Clicks (unique -> total)**: 146 -> 157
+
+
+While the click-through rate is frustratingly low, what I found astonishing was the huge disparity between unique and non-unique impressions. What that indicates to me is that readers have a tendency to refresh a page (such as the subreddit homepage) a number of times during the day.
+
+What you cannot tell from those numbers above is how many of the clicks came from the targeted placement (/r/todayilearned) versus the reddit-wide run. When the ad ran reddit-wide it received **zero-clicks**, not only did the targeting to /r/todayilearned garner more repeated (non-unique) impressions, it received **all** of the clicks received throughout the entire campaign.
+
+
+The big take-away lesson for me from this brief trial advertising on reddit was: **avoid reddit-wide advertising**. Finding a subreddit with a large number of passionate users isn't that difficult, so you should be able to identify a subreddit that overlaps with your target market and advertise to them specifically. Other than that, I don't have any great "analysis" to offer, it was an interesting experiment but not a rigorously scientific one.
+
+If you'd like to download the CSV with the data from the campaign, [you can grab that here](http://agentdero.cachefly.net/unethicalblogger.com/reddit_ad_results.csv). The columns are: date, impression_unique, impression_total, click_unique, click_total, clickrate_unique, clickrate_total.
diff --git a/_posts/2010-11-11-gnu-parallel-changed-my-life.markdown b/_posts/2010-11-11-gnu-parallel-changed-my-life.markdown
new file mode 100644
index 0000000..cd9574b
--- /dev/null
+++ b/_posts/2010-11-11-gnu-parallel-changed-my-life.markdown
@@ -0,0 +1,34 @@
+---
+layout: post
+title: GNU/Parallel changed my life
+tags:
+- Software Development
+- Linux
+created: 1289497712
+---
+
+
+Over the past month or so I've fallen in love with an incredibly simple command line tool: [GNU/Parallel](http://www.gnu.org/software/parallel/). Parallel has more or less replaced my use of [xargs](https://secure.wikimedia.org/wikipedia/en/wiki/xargs) when piping data around on the many machines that I use.
+Unlike `xargs` however, Parallel lets me make use of the **many** cores that I have access to, either on my laptop or the many quad and octocore machines we have lying around the [Apture](http://twitter.com/apture) office.
+
+
+Using Parallel is *incredibly* easy, in fact the [docs](http://savannah.gnu.org/projects/parallel/) enumerate just about every possible incantation of Parallel you might want to use, but starting simple you can just pipe stuff to it:
+
+
+> `cat listofthings.txt | parallel --max-procs=8 --group 'echo "Thing: {}"'`
+
+The command above will run at most eight concurrent processes and group the output of each of the processes when the entire thing completes, simple and in this case not too much different than running with `xargs`
+
+
+With some simple Python scripting, Parallel becomes infinitely more useful:
+
+> `python generatelist.py | parallel --max-procs=8 --group 'wget "{}" -O - | python processpage.py'`
+
+
+There's not really a whole lot say about GNU/Parallel other than **you should use it**. I find myself increasingly impatient when a single process takes longer than a couple minutes to complete, so I've been using GNU/Parallel in more and more different ways across almost all the machines that I work on to make things *faster* and *faster*. So much so that I've started to pine for a quad-core notebook instead of this weak dual core Thinkpad of mine :)
+
+
+
+### GNU/Parallel Demo
+
+
diff --git a/_posts/2010-12-06-ada-surely-you-jest-mr-pythonman.markdown b/_posts/2010-12-06-ada-surely-you-jest-mr-pythonman.markdown
new file mode 100644
index 0000000..9fa7bb1
--- /dev/null
+++ b/_posts/2010-12-06-ada-surely-you-jest-mr-pythonman.markdown
@@ -0,0 +1,72 @@
+---
+layout: post
+title: Ada? Surely you jest Mr. Pythonman
+tags:
+- Opinion
+- Software Development
+- Ada
+created: 1291647600
+---
+
+
+The past couple weeks I've been spending my [BART](http://bart.gov) commutes
+learning the [Ada programming
+language](https://secure.wikimedia.org/wikipedia/en/wiki/Ada_(programming_language)).
+Prior to starting to research Ada, I sat in my office frustrated with Python
+for my free time hackery. Don't get me wrong, I **love** the Python language,
+I have enjoyed the ease of use, dynamic model, rapid prototyping and expressiveness of the
+Python language, I just fall into slumps occasionally where some of Python's
+"quirks" utterly infuriating. Quirks such as its loosey-goosey type system
+(which I admittedly take advantage of often), lack of **good** concurrency in
+the language, import subsystem which has driven lesser men mad and its
+difficulty in scaling organically for larger projects (I've not yet seen a large
+Python codebase that hasn't been borderline "clusterfuck".)
+
+
+Before you whip out the COBOL and Fortran jokes, I'd like to let it known up
+front that Ada is a *modern* language (as I [mentioned on reddit](http://www.reddit.com/r/programming/comments/eh462/ada_surely_you_jest_mr_pythonman/c181zqy), the first Ada specification was in 1983, 11 years after C debuted, and almost 30 years after COBOL and Fortran were designed). It was most recently updated with the
+"Ada 2005" revision and supports a lot of the concepts one expects from modern
+programming languages. For me, Ada has two strong-points that I find
+attractive: extra-strong typing and built-in concurrency.
+
+### Incredibly strong typing
+
+The typing in Ada is unlike anything I've ever worked with before, coming from
+a C-inspired languages background. Whereas one might use the plus sign operator
+in Python to add an `int` and a `float` together without an issue, in Ada
+there's literally **zero** auto-casting (as far as I've learned) between types.
+To the inexperienced user (read: me) this might seem annoying at first, but
+it's fundamental to Ada's underlying philosophy of "no assumptions." If you're
+passing an `Integer` into a procedure that expects a `Float`, there will be no
+casting, the statement will error at compile time.
+
+
+### Concurrency built-in
+
+Unlike C, Java, Objective-C and Python (languages I've used before), Ada has
+concurrency defined as part of the language, as opposed to an abstraction on
+
+top of an OS level library (pthreads). In Ada this concept is called
+"[tasking](https://secure.wikimedia.org/wikibooks/en/wiki/Ada_Programming/Tasking)"
+which allows for building easily concurrent applications. Unlike OS level
+bindings built on top of pthreads (for example) Ada provides built in
+mechanisms for communicating between "tasks" called "rendezvous" along with
+scheduling primitives.
+
+
+Being able to define a "task" as this concurrent execution unit that uses this
+rendezvous feature to provide "entries" to communicate with it is something I
+still haven't wrapped my head around to be honest. The idea of a language where
+concurrency is a core component is so new to me I'm not sure how much I can do
+with it.
+
+
+For my first "big" project with Ada, I've been tinkering with a [memcached
+client in Ada](https://github.com/rtyler/memcache-ada) which will give me the
+opportunity to learn some Ada fundamentals before I step on to bigger projects.
+Disregarding the condescending jeers from other programmers who one could
+classify as "leet Django haxxorz", I've been enjoying the experience of
+learning a new ***vastly*** different language than one that I've tried before.
+
+So stop picking on me you big meanies :(
+
diff --git a/_posts/2011-01-01-twenty-eleven.markdown b/_posts/2011-01-01-twenty-eleven.markdown
new file mode 100644
index 0000000..a5423d8
--- /dev/null
+++ b/_posts/2011-01-01-twenty-eleven.markdown
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Twenty Eleven
+tags:
+- Miscellaneous
+created: 1293923346
+---
+I wanted to wish everybody foolish enough to keep my RSS feed in their news reader a happy twenty eleven from Victoria, Canada. While I won't do a big 2010 "year in review" style post, I wanted to point out some milestones the year has had for me:
+
+
+ * In 2010, I became a married man. Hooray new tax status!
+ * In 2010, [Slide](http://www.slide.com) was acquired by Google, giving me the liquidity to use previously purchased stock to buy a ***nice*** BLT sandwich on Wed. September 15th.
+ * In 2010, my lovely wife finished her paralegal studies. Bringing her degree count to **two**, eclipsing my **zero**.
+ * In 2010, I moved from San Francisco to Berkeley, adding two more modes of transportation to my morning commute
+ * In 2010, I managed to not die in any fashion, comically or otherwise.
+
+
+
+
diff --git a/_posts/2011-01-24-catch-me-at-scale.markdown b/_posts/2011-01-24-catch-me-at-scale.markdown
new file mode 100644
index 0000000..0a1f0b4
--- /dev/null
+++ b/_posts/2011-01-24-catch-me-at-scale.markdown
@@ -0,0 +1,23 @@
+---
+layout: post
+title: Catch me at SCALE!
+tags:
+- Linux
+created: 1295895600
+---
+
+
+Let's all pretend I have a Geeko-related pun for "SCALE." Anyhoo, [SCALE](http://www.socallinuxexpo.org/scale9x/), otherwise known as the Southern California Linux Expo, is coming up in February (25th - 27th) and yours truly will be present and accounted for.
+
+
+
+Yes, those are ***bus tickets*** you see there. I will be heading down from Oakland to Los Angeles by ***bus*** instead of flying for ideological reasons, so I'll *try* to be in a good mood when I arrive!
+
+At this year's SCALE, the openSUSE project is making a [*big* splash](http://www.socallinuxexpo.org/scale9x/exhibitors/opensuse). Contributors and ambassadors will be showing up from all over the globe to show off openSUSE, talk nerdy, socialize and eat tasty snacks supplied by Cruise Director, GNOME Accessibility contributor and openSUSE Board Member [Bryen Yunashko](http://twitter.com/BryenY), who just got his [annual haircut](http://twitter.com/omgsuse/status/26004394378010624) in preparation for the momentous occasion! ;)
+
+If you're in the area, check out this [amazing speakers listing](http://www.socallinuxexpo.org/scale9x/speakers) and be sure to **[register](https://www.socallinuxexpo.org/reg7/)** as soon as possible!
+
+
+I'll be covering the specifics of SCALE more in the coming weeks on [OMG! SUSE!](http://www.omgsuse.com), so stay tuned and I hope to see you there!
+
+----
diff --git a/_posts/2011-01-24-s-a-d-seasonal-ada-disorder.markdown b/_posts/2011-01-24-s-a-d-seasonal-ada-disorder.markdown
new file mode 100644
index 0000000..634d9a8
--- /dev/null
+++ b/_posts/2011-01-24-s-a-d-seasonal-ada-disorder.markdown
@@ -0,0 +1,55 @@
+---
+layout: post
+title: S.A.D. - Seasonal Ada Disorder
+tags:
+- Opinion
+- Software Development
+- Ada
+created: 1295881200
+---
+Last Sunday, I announced the "0.1" release of my
+[memcache-ada](http://adacommons.org/Memcache) project on
+[comp.lang.ada](http://groups.google.com/group/comp.lang.ada/browse_thread/thread/c70dc869310ffb51#),
+thus ending a 2 month experiment with the Ada programming language.
+
+In my [previous
+post](http://unethicalblogger.com/posts/2010/12/ada_surely_you_jest_mr_pythonman)
+on the topic, I mentioned some of the things that interested me with regards to
+Ada and while I didn't use all the concepts that make Ada a powerful language,
+I can now confidentally say that I know enough to be dangerous (not much more
+though).
+
+
This is what my coworkers thought of me, learning Ada.
+
+All said and done I spent *less than* two months off and on creating
+memcache-ada, mostly on my morning and evening commutes. The exercise of
+beginning and ending my day with a language which tends to be incredibly strict
+was interesting to say the least. Due to the lack of an REPL such as Python's,
+I found myself writing more and more unit and integration tests to get a *feel*
+for the language and the behavior of my library.
+
+Due to my "fluency" in Python, I tend to think in Python when scratching out
+code, similar to how a native speaker of a language will write or speak "from the hip" instead of doing
+large amount of mental work to construct statements. With Ada, not only
+am I not yet "fluent", the langauge won't let me get away with as much as
+Python allows me.
+
+The overhead of writing Ada, in my opinion, is a double-edged sword, I can very
+quickly informally test, debug and rewrite Python but with Ada such a process
+is (in my opinion) onerous. My 20 minute walk to the train station would be
+spent contemplating how and what I wanted to write and where. By the
+time I sat down on the train, I had thought out and designed things internally, so I would
+immediately write out tests around my ideas and assumptions before writing code to pass the
+tests. The time spent writing code was minimal since I rarely had to rewrite code, I can think of only one function that had to be rewritten after it had passed tests (botched some socket reading) in the whole project.
+
+
+
+I'm not yet sure what will be my next project in Ada, I am certain that I don't
+want to build anything of consequence in C again. Working with a language, like
+C, that not only gives you the rope with which to hang yourself but will often
+times push you off the chair is more masochism than I feel comfortable with
+these days. Ada on the other hand will allow you to hang yourself, but it'll
+make damn certain that have the perseverence to go through with it. Frankly, I
+don't have that kind of drive to really shoot myself in the foot anymore. I
+want to build software that works with a language that doesn't want to make me
+suffer, which means I'll be in a weird Ada + Python love triangle until future notice.
diff --git a/_posts/2011-04-05-sent-from-my-iphone.markdown b/_posts/2011-04-05-sent-from-my-iphone.markdown
new file mode 100644
index 0000000..d6e3dcf
--- /dev/null
+++ b/_posts/2011-04-05-sent-from-my-iphone.markdown
@@ -0,0 +1,61 @@
+---
+layout: post
+title: Sent from my iPhone
+tags:
+- Opinion
+created: 1302019200
+---
+
+
+Since moving to Berkeley a little under a year ago, I've started to have a
+commute. A good and proper, bored to tears commute via
+[BART](http://www.bart.gov). A commute combined with a proper smartphone means
+I spent the first and last 40 minutes of every single workday answering emails
+and reading [reddit](http://www.reddit.com).
+
+While firing off some emails this evening I noticed the signature I added a
+*long* time ago: "*Sent from my Nokia n900*"
+
+Originally I added the signature as a caddy jab at
+[iPhone](http://en.wikipedia.org/wiki/IPhone) users who have had
+the "Sent from my iPhone" appended to every email sent from the device going
+back to January of 2007. The more I started to
+over-analyze think about it, these signatures actually make a
+**lot** of sense and should be included on just about every device that offers
+a limited email client.
+
+
+If for no other reason than to inform the reader(s) of the email that it might
+suck, for a number of legitimate reasons.
+
+
+**Goddamn autocorrect**: sending a grammatically flawness email from a
+smartphone is impossible. Invariable an phone will auto-correct "schmidt" to
+"schlong" and all of a sudden you look like a moron. Having a "Sent from my
+`mobile device`" footer is like a disclaimer. To whom it may concern, my email
+may be riddled with mistakes, you'll have to forgive me, I'm walking down the
+street responding to emails that could probably wait.
+
+
+**Top posting**: for the record, I *hate* top-posts and typically try to avoid
+them at every turn, for reasons that I won't go into in this post. If your
+top-posted message contains your "mobile disclaimer", it's acceptable. Trying
+*not* to top-post on smartphones these days is near-impossible, so nobody will
+think any less of you.
+
+
+**Brevity**: let's face it, there's a lot of extra words in sentences that
+exist purely to provide some inter-personal lubricant. "Hey Jared, would you
+mind checking on those services running on those machines when you get a
+chance, thanks, love you too, etc." When emailing on the go, particularly when
+you're in an on-call situation, brevity is key (especially if somehow your
+production machines are offline). "Check services on machines 1-12" without the
+mobile disclaimer might make the reader think I'm an impatient twat (I am, but
+irregardless), instead of being strapped for time.
+
+----
+
+On the flip-side of all these reasons, if you're using a desktop/web client, I
+expect you to put as much thought into composing your email as you expect me to
+put into reading it. You know who you are.
+
diff --git a/_posts/2011-04-25-new-light-on-dark-energy.markdown b/_posts/2011-04-25-new-light-on-dark-energy.markdown
new file mode 100644
index 0000000..2a6dc39
--- /dev/null
+++ b/_posts/2011-04-25-new-light-on-dark-energy.markdown
@@ -0,0 +1,43 @@
+---
+layout: post
+title: New Light on Dark Energy
+tags:
+- Opinion
+- Academia
+- Photos
+created: 1303797461
+---
+Last night I was fortunate enough to squeeze into a packed house in the
+Berkeley Repertory Theatre for a [panel titled "New Light on Dark
+Energy"](http://today.lbl.gov/2011/04/11/science-at-the-theater-talk-sheds-%E2%80%98new-light-on-dark-energy%E2%80%99/).
+Suffice to say, I was thrilled about the entire event, I didn't expect such a
+massive line and a [**filled** 600 seat
+theatre](http://www.flickr.com/photos/agentdero/5655954215/in/photostream).
+
+
+
+
+After I managed to grab one of the last three or four open seats in the
+audience for the two hour long series of presentations and Q&A session.
+
+