From f39fc802fe6df36b062301d20c721c1552bd3362 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Sun, 15 May 2011 18:30:00 -0700 Subject: [PATCH] Add node_ids to all the posts to allow disqus to recognize pages properly --- _posts/2007-01-03-another-blog.html | 1 + _posts/2007-01-03-new-blogthing.html | 1 + _posts/2007-01-03-scp1-resume.html | 1 + ...01-04-dear-hp-fall-on-something-sharp.html | 1 + _posts/2007-01-04-going-on-tour.html | 1 + _posts/2007-01-05-academic-masochism.html | 1 + _posts/2007-01-06-roadshow-departing.html | 1 + _posts/2007-01-06-texas-is-bloody-big.html | 1 + _posts/2007-01-09-meeting-a-comic-genius.html | 1 + _posts/2007-01-10-its-just-diddy.html | 1 + _posts/2007-01-11-emission-coming-soon.html | 1 + _posts/2007-01-15-being-white-rocks.html | 1 + ...-01-16-cocoa-radio-im-almost-relevant.html | 1 + _posts/2007-01-18-howdy.html | 1 + _posts/2007-01-19-educating-engineers.html | 1 + ...20-baby-ill-panic-your-kernel-anytime.html | 1 + ...how-to-ruin-a-publicly-traded-company.html | 1 + _posts/2007-01-21-ichat-hates-me.html | 1 + _posts/2007-01-21-mono-incorporated.html | 1 + _posts/2007-01-22-get-your-dance-on.html | 1 + ...07-01-22-no-really-what-are-you-doing.html | 1 + ...2-webservicescore-on-the-radar-screen.html | 1 + ...ervicescore-why-hath-thou-forsaken-me.html | 1 + _posts/2007-01-23-ftgl.html | 1 + .../2007-01-23-thread-cancellation-in-c.html | 1 + ...terbot-no-really-i-need-to-be-stopped.html | 1 + ...7-01-24-twitterbot-is-now-open-source.html | 1 + ...7-01-26-publishing-war-on-the-horizon.html | 1 + ...p-authentication-with-webservicescore.html | 1 + _posts/2007-01-31-were-all-retarded.html | 1 + _posts/2007-02-01-im-on-another-podcast.html | 1 + ...2007-02-01-webservices-with-dumbarton.html | 1 + _posts/2007-02-02-absolute-frustration.html | 1 + .../2007-02-02-mono-winforms-tao-and-me.html | 1 + ...7-02-03-kernel-panics-do-weird-things.html | 1 + _posts/2007-02-05-mono-winforms-update.html | 1 + _posts/2007-02-07-tiring.html | 1 + ...007-02-09-i-aint-shipley-but-pmpmyapp.html | 1 + _posts/2007-02-09-internal-server-error.html | 1 + _posts/2007-02-14-terminally-ill.html | 1 + .../2007-02-16-in-the-news-last-week-drm.html | 1 + ...rbot-basic-http-authentication-errors.html | 1 + _posts/2007-02-21-completely-off-topic.html | 1 + _posts/2007-02-23-im-shocked.html | 1 + .../2007-03-02-the-visual-basic-stigma.html | 1 + _posts/2007-03-06-barcamp-austin-again.html | 1 + _posts/2007-03-11-teeny-tiny-updates.html | 1 + _posts/2007-03-12-soldiers-of-fortune.html | 1 + ...2007-03-14-a-review-the-metamorphosis.html | 1 + ...7-03-18-perforce-on-the-road-p4tunnel.html | 1 + _posts/2007-03-22-im-seriously-famous.html | 1 + _posts/2007-03-31-in-the-fifth-dimension.html | 1 + .../2007-04-11-cocoaheads-silicon-valley.html | 1 + _posts/2007-04-21-city-of-lost-boys.html | 1 + ...choosing-a-platform-windows-and-linux.html | 1 + _posts/2007-04-29-site-upgrade.html | 1 + _posts/2007-04-30-im-in-ur-phonez.html | 1 + ...7-04-30-windows-eye-for-the-cocoa-guy.html | 1 + _posts/2007-05-01-twitterbot-recap.html | 1 + ...dows-eye-for-the-cocoa-guy-the-series.html | 1 + _posts/2007-05-06-my-guilty-pleasure.html | 1 + ...employees-are-our-most-valuable-asset.html | 1 + _posts/2007-05-19-sp4mz0r.html | 1 + _posts/2007-05-26-conference-season-osbc.html | 1 + _posts/2007-06-03-almost-there.html | 1 + ...-06-08-long-live-the-license-flamewar.html | 1 + _posts/2007-06-24-insanity.html | 1 + ...6-26-thriving-in-a-development-vacuum.html | 1 + _posts/2007-07-04-mono-meet-facebook.html | 1 + ...07-10-conference-season-iphonedevcamp.html | 1 + _posts/2007-07-21-new-email-etc.html | 1 + _posts/2007-07-21-starting-with-openmoko.html | 1 + _posts/2007-07-23-ironru-ooh-shiney.html | 1 + ...ow-were-trying-to-take-over-the-world.html | 1 + .../2007-07-28-songbird-a-visual-review.html | 1 + .../2007-07-30-hacking-with-ironpython.html | 1 + ...3-subversion-branching-with-less-pain.html | 1 + _posts/2007-08-05-ordered-filled.html | 1 + .../2007-08-06-ironpython-for-macports.html | 1 + _posts/2007-08-08-meet-openmoko.html | 1 + ...aling-with-your-smart-platform-choice.html | 1 + .../2007-08-11-openmoko-2007-2-preview.html | 1 + _posts/2007-08-12-video-hello-moko.html | 1 + ...-14-another-facebook-developer-meetup.html | 1 + ...cess-scaling-on-the-facebook-platform.html | 1 + _posts/2007-08-19-i-just-saved-150.html | 1 + ...8-21-scaling-with-mysql-a-brief-guide.html | 1 + _posts/2007-08-22-my-boss-is-a-robot.html | 1 + _posts/2007-08-23-back-to-the-basics.html | 1 + ...5-facebook-developer-garage-palo-alto.html | 1 + ...-26-facebook-developer-garage-wrap-up.html | 1 + ...08-29-video-facebook-developer-garage.html | 1 + _posts/2007-09-07-time-for-a-road-trip.html | 1 + _posts/2007-09-13-for-what-its-worth.html | 1 + ...-14-cmon-down-to-silverlightdevcampsf.html | 1 + ...urfer-try-out-silverlight-on-mac-os-x.html | 1 + ...-09-19-channel9-silverlight-interview.html | 1 + ...icial-facebook-hackathon-in-palo-alto.html | 1 + ...9-23-contemplating-remix-07-in-boston.html | 1 + ...007-09-27-popfly-how-to-lose-the-buzz.html | 1 + .../2007-09-29-operation-iraqi-freedom.html | 1 + ...cial-building-your-first-app-workshop.html | 1 + _posts/2007-10-03-remix-07-boston-woohoo.html | 1 + ...ference-season-communitynext-platform.html | 1 + ...10-06-introducing-why-are-you-awesome.html | 1 + ...-facebook-app-development-101-wrap-up.html | 1 + ...10-07-why-are-you-awesome-source-code.html | 1 + .../2007-10-08-in-boston-at-remix-phew.html | 1 + ...d-of-400-microsoft-developers-awesome.html | 1 + ...lal-facebook-developers-meetup-boston.html | 1 + ...cazas-remix-07-boston-keynote-address.html | 1 + .../2007-10-12-remix-07-boston-wrap-up.html | 1 + ...0-13-google-search-inside-of-facebook.html | 1 + .../2007-10-15-speaking-at-widget-summit.html | 1 + _posts/2007-10-16-widget-summit-slides.html | 1 + ...-any-unemployed-net-developers-in-nyc.html | 1 + .../2007-10-24-my-new-favorite-chuckle.html | 1 + ...007-10-25-the-superpoke-facebook-song.html | 1 + _posts/2007-10-28-on-investing.html | 1 + .../2007-11-03-silicon-valley-gangstas.html | 1 + ...7-11-04-your-order-has-been-completed.html | 1 + ...a-note-to-my-graphing-social-students.html | 1 + .../2007-11-06-building-mono-on-leopard.html | 1 + _posts/2007-11-08-bug-number-seven.html | 1 + ...7-11-15-why-are-you-awesome-meet-mono.html | 1 + ...17-facebook-flyers-make-my-eyes-bleed.html | 1 + ...07-11-22-turning-famousosity-up-to-11.html | 1 + ...007-11-24-ichatagent-leaks-in-leopard.html | 1 + _posts/2007-12-01-missed-spain.html | 1 + ...lenco-de-mono-lighttpd-and-postgresql.html | 1 + ...07-12-16-fun-way-to-crash-leopard-159.html | 1 + ...o-and-fastcgi-an-awkward-relationship.html | 1 + _posts/2007-12-17-my-new-startup.html | 1 + ...2-18-comparing-ironpython-and-cpython.html | 1 + ...007-12-18-what-a-heaping-pile-of-fail.html | 1 + _posts/2007-12-31-sxswi-and-me.html | 1 + ...2008-01-05-perforce-backups-revisited.html | 1 + _posts/2008-01-06-just-curious.html | 1 + ...08-01-23-five-and-seven-zeroes-is-big.html | 1 + ...our-voice-interface-is-fucking-stupid.html | 1 + _posts/2008-01-26-fbrubbar-chikken.html | 1 + _posts/2008-01-28-sigsegv-in-my-brane.html | 1 + ...2008-02-01-are-free-gifts-still-gifts.html | 1 + _posts/2008-02-02-on-funding-my-startup.html | 1 + ...ips-for-beginning-facebook-developers.html | 1 + _posts/2008-02-03-trying-out-adsense.html | 1 + ...ips-for-beginning-facebook-developers.html | 1 + ...-speaking-at-graphing-social-patterns.html | 1 + .../2008-02-17-facebooks-bleeding-edge.html | 1 + _posts/2008-02-17-upgraded-to-drupal-6-0.html | 1 + _posts/2008-02-23-i-hate-mac-os-x.html | 1 + .../2008-02-24-graphing-social-appnite.html | 1 + _posts/2008-03-17-gsp-west-and-sxsw-2008.html | 1 + ...cript-wonks-missing-after-property-id.html | 1 + _posts/2008-03-24-srsly-ur-doin-it-wrong.html | 1 + .../2008-03-26-dashboard-for-linux-users.html | 1 + .../2008-04-02-data-binding-with-jquery.html | 1 + _posts/2008-04-07-a-few-changes.html | 1 + _posts/2008-04-08-hi5-goes-100.html | 1 + _posts/2008-04-13-an-informal-poll.html | 1 + .../2008-05-03-parsing-html-with-python.html | 1 + .../2008-05-04-nant-and-asp-net-on-mono.html | 1 + ...erimenting-with-git-at-slide-part-1-3.html | 1 + _posts/2008-07-30-lets-swap-ipods.html | 1 + ...2008-08-20-one-line-automated-testing.html | 1 + ...-06-don-quixotes-new-side-kick-hudson.html | 1 + .../2008-09-11-resurgange-of-the-shell.html | 1 + .../2008-09-15-lazily-loading-attributes.html | 1 + .../2008-09-16-chase-auto-finance-fail.html | 1 + ...8-hudson-notifications-with-libnotify.html | 1 + ...acebook-be-riddled-with-swashbucklers.html | 1 + ...29-team-development-with-git-part-2-3.html | 1 + ...version-mostly-automagically-part-3-3.html | 1 + .../2008-10-04-hudson-build-bookmarklet.html | 1 + ...9-i-hate-it-when-the-onion-is-factual.html | 1 + .../2008-11-05-reliable-locks-in-hudson.html | 1 + ...08-11-22-delightfully-wrong-about-git.html | 1 + ...-git-integration-with-hudson-and-trac.html | 1 + ...t-protip-stash-the-goods-yo-git-stash.html | 1 + ...008-11-24-why-we-chose-git-a-rebuttal.html | 1 + ...ip-learning-from-your-history-git-log.html | 1 + ...hat-revision-you-fucked-us-git-revert.html | 1 + ...ing-git-because-it-makes-me-feel-cool.html | 1 + ...remely-brief-review-of-the-nokia-n810.html | 1 + .../2009-01-05-find-me-on-github-rtyler.html | 1 + ...09-01-12-but-who-will-write-the-tests.html | 1 + ...imuse-an-imap-capable-fuse-filesystem.html | 1 + ...ure-is-worth-a-thousand-words-git-tag.html | 1 + _posts/2009-01-26-amazon-sucks-too.html | 1 + _posts/2009-01-26-old-navy-sucks.html | 1 + _posts/2009-03-05-head-in-the-clouds.html | 1 + ...nding-the-anatomy-of-a-bug-git-bisect.html | 1 + ...3-09-v8-and-fastcgi-exploring-an-idea.html | 1 + ...-13-do-not-fear-continuous-deployment.html | 1 + ...e-into-a-dead-open-source-project.markdown | 61 ++-- _posts/2009-04-07-slide-open-source.markdown | 17 +- _posts/2009-05-16-template-theory.markdown | 143 ++++---- ...g-glibs-gtester-results-in-hudson.markdown | 23 +- ...7-21-jython-jgit-and-co-in-hudson.markdown | 103 +++--- _posts/2009-07-25-awesomely-bad.markdown | 91 ++--- ...stability-or-i-hate-writing-tests.markdown | 141 ++++---- _posts/2009-08-10-im-a-cat-person-now.html | 1 + ...nvestment-strategy-for-developers.markdown | 161 ++++----- ...ying-around-with-asp-net-mvc-and-nant.html | 1 + ...-less-very-continuous-integration.markdown | 161 ++++----- ...on-and-java-just-monkeying-around.markdown | 59 ++-- ...2009-10-13-ironwatin-mind-the-gap.markdown | 73 ++-- ...-10-19-my-journey-at-slide-part-1.markdown | 193 +++++------ ...-10-20-my-journey-at-slide-part-2.markdown | 245 +++++++------- ...-10-22-my-journey-at-slide-part-3.markdown | 275 +++++++-------- _posts/2009-10-23-daniel-felt-left-out.html | 1 + _posts/2009-10-23-end-of-a-journey.markdown | 89 ++--- .../2009-11-03-do-you-love-git-too.markdown | 5 +- ...astest-python-json-module-in-town.markdown | 53 +-- ...r-side-image-transforms-in-python.markdown | 17 +- ...with-gerrit-a-mostly-visual-guide.markdown | 303 ++++++++--------- ...son-eat-drink-up-in-san-francisco.markdown | 9 +- ...14-get-out-there-and-buy-me-stuff.markdown | 17 +- ...9-12-17-pyrage-generic-exceptions.markdown | 67 ++-- .../2009-12-19-one-year-of-cheetah.markdown | 103 +++--- ...pyrage-from-toolbox-import-hammer.markdown | 125 +++---- ...ing-cheetah-templates-with-django.markdown | 73 ++-- ...-27-5-tips-for-traveling-with-tux.markdown | 143 ++++---- ...now-a-video-of-my-cat-being-obnoxious.html | 1 + ...12-27-on-being-a-good-house-guest.markdown | 129 +++---- _posts/2009-12-28-angry-tweeter.markdown | 87 ++--- ...ested-commits-with-hudson-and-git.markdown | 101 +++--- .../2010-01-04-new-years-python-meme.markdown | 43 +-- ...e-one-where-i-gush-about-contegix.markdown | 29 +- _posts/2010-01-15-book-of-elies.markdown | 15 +- ...ual-hosting-with-haproxy-and-wsgi.markdown | 157 ++++----- ...read-safety-assumptions-in-django.markdown | 17 +- ...2010-01-20-better-faster-stronger.markdown | 5 +- ...-rumors-about-apture-and-facebook.markdown | 31 +- ...-users-or-spamming-redditdowntime.markdown | 113 +++---- _posts/2010-01-30-mourning-sun.markdown | 29 +- ...0-02-09-i-hope-you-bump-your-head.markdown | 37 +- ...-02-10-writing-for-multiple-blogs.markdown | 29 +- ...g-a-game-for-et-day-1-with-pygame.markdown | 121 +++---- ...10-02-16-presidents-day-in-photos.markdown | 25 +- ...010-02-16-yes-that-is-hair-on-my-chin.html | 1 + ...1-supporting-python-3-is-a-ghetto.markdown | 73 ++-- ...2010-02-23-arent-we-just-adorable.markdown | 9 +- ...-want-a-viral-license-use-the-gpl.markdown | 93 ++--- ...-isnt-just-something-on-the-radio.markdown | 85 ++--- ...1-programming-as-an-objective-art.markdown | 111 +++--- .../2010-03-05-hypocrites-on-bikes.markdown | 41 +-- ...times-software-as-a-service-sucks.markdown | 29 +- ...010-04-02-a-rebase-based-workflow.markdown | 87 ++--- ...oes-not-make-yours-a-good-product.markdown | 35 +- _posts/2010-04-24-regarding-blippy.markdown | 11 +- ...04-28-san-francisco-transit-sucks.markdown | 29 +- _posts/2010-04-30-be-a-libor.markdown | 51 +-- ...7-how-to-using-avro-with-eventlet.markdown | 317 +++++++++--------- ...sted-really-as-awful-as-it-sounds.markdown | 25 +- ...e-slow-death-of-the-indie-mac-dev.markdown | 35 +- ...10-05-17-i-get-lippy-when-i-drink.markdown | 35 +- ...2010-05-18-being-a-libor-addendum.markdown | 25 +- .../2010-06-06-another-video-of-the-cat.html | 1 + _posts/2010-06-14-keyboard-synergy.markdown | 25 +- _posts/2010-06-22-silly-problems.markdown | 35 +- ...ventures-i-wonder-whats-down-here.markdown | 47 +-- _posts/2010-07-04-pride.markdown | 81 ++--- ...10-07-07-i-love-sonic-net-already.markdown | 41 +-- _posts/2010-07-11-lebron-james.markdown | 69 ++-- _posts/2010-07-14-paw-paw.markdown | 21 +- ...es-blocking-detection-in-eventlet.markdown | 103 +++--- _posts/2010-08-30-whats-in-a-name.markdown | 45 +-- _posts/2010-09-03-being-a-croy.markdown | 21 +- _posts/2010-11-04-so-im-married.markdown | 29 +- ...nting-with-reddits-self-serve-ads.markdown | 57 ++-- ...1-11-gnu-parallel-changed-my-life.markdown | 51 +-- ...-ada-surely-you-jest-mr-pythonman.markdown | 125 +++---- _posts/2011-01-01-twenty-eleven.markdown | 25 +- _posts/2011-01-24-catch-me-at-scale.markdown | 31 +- ...01-24-s-a-d-seasonal-ada-disorder.markdown | 91 ++--- .../2011-04-05-sent-from-my-iphone.markdown | 109 +++--- ...11-04-25-new-light-on-dark-energy.markdown | 69 ++-- ...2011-05-15-learnings-week-19-2011.markdown | 13 +- 279 files changed, 3188 insertions(+), 2909 deletions(-) diff --git a/_posts/2007-01-03-another-blog.html b/_posts/2007-01-03-another-blog.html index 163b524..983341c 100644 --- a/_posts/2007-01-03-another-blog.html +++ b/_posts/2007-01-03-another-blog.html @@ -3,6 +3,7 @@ layout: post title: Another Blog? tags: - miscellaneous +nodeid: 6 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.
diff --git a/_posts/2007-01-03-new-blogthing.html b/_posts/2007-01-03-new-blogthing.html index 940fadd..7101aad 100644 --- a/_posts/2007-01-03-new-blogthing.html +++ b/_posts/2007-01-03-new-blogthing.html @@ -3,6 +3,7 @@ layout: post title: New Blogthing tags: - miscellaneous +nodeid: 4 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.
diff --git a/_posts/2007-01-03-scp1-resume.html b/_posts/2007-01-03-scp1-resume.html index a6c9e8c..1e22946 100644 --- a/_posts/2007-01-03-scp1-resume.html +++ b/_posts/2007-01-03-scp1-resume.html @@ -3,6 +3,7 @@ layout: post title: scp(1) resume tags: - miscellaneous +nodeid: 7 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.
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 index fca5ed7..0b0933d 100644 --- a/_posts/2007-01-04-dear-hp-fall-on-something-sharp.html +++ b/_posts/2007-01-04-dear-hp-fall-on-something-sharp.html @@ -3,6 +3,7 @@ layout: post title: Dear HP, Fall On Something Sharp tags: - opinion +nodeid: 10 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.
diff --git a/_posts/2007-01-04-going-on-tour.html b/_posts/2007-01-04-going-on-tour.html index dbfafce..ff823b4 100644 --- a/_posts/2007-01-04-going-on-tour.html +++ b/_posts/2007-01-04-going-on-tour.html @@ -3,6 +3,7 @@ layout: post title: Going on Tour tags: - miscellaneous +nodeid: 8 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.
diff --git a/_posts/2007-01-05-academic-masochism.html b/_posts/2007-01-05-academic-masochism.html index 3d2aa58..a46bf52 100644 --- a/_posts/2007-01-05-academic-masochism.html +++ b/_posts/2007-01-05-academic-masochism.html @@ -3,6 +3,7 @@ layout: post title: Academic Masochism tags: - academia +nodeid: 11 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.
diff --git a/_posts/2007-01-06-roadshow-departing.html b/_posts/2007-01-06-roadshow-departing.html index f55cdc7..4a1adf7 100644 --- a/_posts/2007-01-06-roadshow-departing.html +++ b/_posts/2007-01-06-roadshow-departing.html @@ -3,6 +3,7 @@ layout: post title: Roadshow Departing tags: - miscellaneous +nodeid: 12 created: 1168127995 --- Over 3,500 miles.
diff --git a/_posts/2007-01-06-texas-is-bloody-big.html b/_posts/2007-01-06-texas-is-bloody-big.html index 7ebd6d0..ad3c3b8 100644 --- a/_posts/2007-01-06-texas-is-bloody-big.html +++ b/_posts/2007-01-06-texas-is-bloody-big.html @@ -3,6 +3,7 @@ layout: post title: Texas is bloody big tags: - miscellaneous +nodeid: 13 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.
diff --git a/_posts/2007-01-09-meeting-a-comic-genius.html b/_posts/2007-01-09-meeting-a-comic-genius.html index 4887b06..3e96771 100644 --- a/_posts/2007-01-09-meeting-a-comic-genius.html +++ b/_posts/2007-01-09-meeting-a-comic-genius.html @@ -3,6 +3,7 @@ layout: post title: Meeting a Comic Genius tags: - media +nodeid: 14 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 index 54118ea..a157396 100644 --- a/_posts/2007-01-10-its-just-diddy.html +++ b/_posts/2007-01-10-its-just-diddy.html @@ -3,6 +3,7 @@ layout: post title: It's Just Diddy tags: - opinion +nodeid: 15 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.
diff --git a/_posts/2007-01-11-emission-coming-soon.html b/_posts/2007-01-11-emission-coming-soon.html index 216617d..6fbbe44 100644 --- a/_posts/2007-01-11-emission-coming-soon.html +++ b/_posts/2007-01-11-emission-coming-soon.html @@ -3,6 +3,7 @@ layout: post title: Emission, Coming Soon tags: - cocoa +nodeid: 16 created: 1168542122 --- As some of you (both rather) may have noticed, the bleepsoft.com homepage is a bit different these days.
diff --git a/_posts/2007-01-15-being-white-rocks.html b/_posts/2007-01-15-being-white-rocks.html index e42c26c..5f920c4 100644 --- a/_posts/2007-01-15-being-white-rocks.html +++ b/_posts/2007-01-15-being-white-rocks.html @@ -3,6 +3,7 @@ layout: post title: Being White Rocks tags: - opinion +nodeid: 17 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."
diff --git a/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html b/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html index f32d70a..2c5eb06 100644 --- a/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html +++ b/_posts/2007-01-16-cocoa-radio-im-almost-relevant.html @@ -3,6 +3,7 @@ layout: post title: Cocoa Radio, I'm Almost Relevant tags: - cocoa +nodeid: 18 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.
diff --git a/_posts/2007-01-18-howdy.html b/_posts/2007-01-18-howdy.html index 60301d1..bf9004c 100644 --- a/_posts/2007-01-18-howdy.html +++ b/_posts/2007-01-18-howdy.html @@ -3,6 +3,7 @@ layout: post title: Howdy? tags: - opinion +nodeid: 20 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.
diff --git a/_posts/2007-01-19-educating-engineers.html b/_posts/2007-01-19-educating-engineers.html index 3fb739d..39d829d 100644 --- a/_posts/2007-01-19-educating-engineers.html +++ b/_posts/2007-01-19-educating-engineers.html @@ -3,6 +3,7 @@ layout: post title: Educating Engineers tags: - academia +nodeid: 21 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.
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 index 5b38978..903fe5f 100644 --- a/_posts/2007-01-20-baby-ill-panic-your-kernel-anytime.html +++ b/_posts/2007-01-20-baby-ill-panic-your-kernel-anytime.html @@ -3,6 +3,7 @@ layout: post title: Baby, I'll Panic Your Kernel Anytime tags: - software development +nodeid: 19 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).
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 index 87970ae..4554dd5 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: How To Ruin A Publicly Traded Company tags: - software development +nodeid: 22 created: 1169343041 --- Step 1: Stop developing a product
diff --git a/_posts/2007-01-21-ichat-hates-me.html b/_posts/2007-01-21-ichat-hates-me.html index 95ed554..22298d9 100644 --- a/_posts/2007-01-21-ichat-hates-me.html +++ b/_posts/2007-01-21-ichat-hates-me.html @@ -3,6 +3,7 @@ layout: post title: iChat hates me tags: - media +nodeid: 24 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.
diff --git a/_posts/2007-01-21-mono-incorporated.html b/_posts/2007-01-21-mono-incorporated.html index 6549930..d8a73f3 100644 --- a/_posts/2007-01-21-mono-incorporated.html +++ b/_posts/2007-01-21-mono-incorporated.html @@ -3,6 +3,7 @@ layout: post title: Mono Incorporated tags: - mono +nodeid: 23 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.
diff --git a/_posts/2007-01-22-get-your-dance-on.html b/_posts/2007-01-22-get-your-dance-on.html index 0bf7996..1b11381 100644 --- a/_posts/2007-01-22-get-your-dance-on.html +++ b/_posts/2007-01-22-get-your-dance-on.html @@ -3,6 +3,7 @@ layout: post title: Get Your Dance On tags: - media +nodeid: 27 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 index 1250488..a3f6705 100644 --- a/_posts/2007-01-22-no-really-what-are-you-doing.html +++ b/_posts/2007-01-22-no-really-what-are-you-doing.html @@ -3,6 +3,7 @@ layout: post title: No Really, What Are You Doing? tags: - miscellaneous +nodeid: 28 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.
diff --git a/_posts/2007-01-22-webservicescore-on-the-radar-screen.html b/_posts/2007-01-22-webservicescore-on-the-radar-screen.html index b16871a..b034f06 100644 --- a/_posts/2007-01-22-webservicescore-on-the-radar-screen.html +++ b/_posts/2007-01-22-webservicescore-on-the-radar-screen.html @@ -3,6 +3,7 @@ layout: post title: WebServicesCore, On The Radar Screen tags: - cocoa +nodeid: 26 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:
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 index 4abc742..6b98fca 100644 --- a/_posts/2007-01-22-webservicescore-why-hath-thou-forsaken-me.html +++ b/_posts/2007-01-22-webservicescore-why-hath-thou-forsaken-me.html @@ -3,6 +3,7 @@ layout: post title: WebServicesCore, Why Hath Thou Forsaken Me tags: - cocoa +nodeid: 25 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.
diff --git a/_posts/2007-01-23-ftgl.html b/_posts/2007-01-23-ftgl.html index 123ae46..bde433c 100644 --- a/_posts/2007-01-23-ftgl.html +++ b/_posts/2007-01-23-ftgl.html @@ -3,6 +3,7 @@ layout: post title: FTGL# tags: - mono +nodeid: 30 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.
diff --git a/_posts/2007-01-23-thread-cancellation-in-c.html b/_posts/2007-01-23-thread-cancellation-in-c.html index c7d686e..5a64469 100644 --- a/_posts/2007-01-23-thread-cancellation-in-c.html +++ b/_posts/2007-01-23-thread-cancellation-in-c.html @@ -3,6 +3,7 @@ layout: post title: Thread Cancellation in C# tags: - mono +nodeid: 31 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:
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 index bcf84d5..99cf2a4 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: Twitterbot. No Really, I Need To Be Stopped tags: - mono +nodeid: 29 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.
diff --git a/_posts/2007-01-24-twitterbot-is-now-open-source.html b/_posts/2007-01-24-twitterbot-is-now-open-source.html index e3fe6a5..4da7cf0 100644 --- a/_posts/2007-01-24-twitterbot-is-now-open-source.html +++ b/_posts/2007-01-24-twitterbot-is-now-open-source.html @@ -3,6 +3,7 @@ layout: post title: Twitterbot Is Now Open Source tags: - mono +nodeid: 32 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.
diff --git a/_posts/2007-01-26-publishing-war-on-the-horizon.html b/_posts/2007-01-26-publishing-war-on-the-horizon.html index d662482..3bc19cf 100644 --- a/_posts/2007-01-26-publishing-war-on-the-horizon.html +++ b/_posts/2007-01-26-publishing-war-on-the-horizon.html @@ -3,6 +3,7 @@ layout: post title: Publishing War on the Horizon tags: - academia +nodeid: 33 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):
diff --git a/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html b/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html index 2a0bbd1..dfbbce4 100644 --- a/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html +++ b/_posts/2007-01-31-basic-http-authentication-with-webservicescore.html @@ -3,6 +3,7 @@ layout: post title: Basic HTTP Authentication with WebServicesCore tags: - cocoa +nodeid: 34 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.
diff --git a/_posts/2007-01-31-were-all-retarded.html b/_posts/2007-01-31-were-all-retarded.html index 42c0689..e014c31 100644 --- a/_posts/2007-01-31-were-all-retarded.html +++ b/_posts/2007-01-31-were-all-retarded.html @@ -3,6 +3,7 @@ layout: post title: We're all retarded. tags: - opinion +nodeid: 35 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."
diff --git a/_posts/2007-02-01-im-on-another-podcast.html b/_posts/2007-02-01-im-on-another-podcast.html index 88e5a95..c743e16 100644 --- a/_posts/2007-02-01-im-on-another-podcast.html +++ b/_posts/2007-02-01-im-on-another-podcast.html @@ -3,6 +3,7 @@ layout: post title: I'm on another podcast tags: - cocoa +nodeid: 37 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.
diff --git a/_posts/2007-02-01-webservices-with-dumbarton.html b/_posts/2007-02-01-webservices-with-dumbarton.html index 4eae518..5846820 100644 --- a/_posts/2007-02-01-webservices-with-dumbarton.html +++ b/_posts/2007-02-01-webservices-with-dumbarton.html @@ -3,6 +3,7 @@ layout: post title: Webservices with Dumbarton tags: - mono +nodeid: 36 created: 1170319882 --- While I have been know to gripe about 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.
diff --git a/_posts/2007-02-02-absolute-frustration.html b/_posts/2007-02-02-absolute-frustration.html index 982cbbb..ec5895f 100644 --- a/_posts/2007-02-02-absolute-frustration.html +++ b/_posts/2007-02-02-absolute-frustration.html @@ -3,6 +3,7 @@ layout: post title: Absolute Frustration tags: - opinion +nodeid: 38 created: 1170446333 --- Time-Warner (again) had an outage this morning, and it has somehow left my Linksys WRT54G absolutely incapable of routing properly.
diff --git a/_posts/2007-02-02-mono-winforms-tao-and-me.html b/_posts/2007-02-02-mono-winforms-tao-and-me.html index f06f9c6..209a22d 100644 --- a/_posts/2007-02-02-mono-winforms-tao-and-me.html +++ b/_posts/2007-02-02-mono-winforms-tao-and-me.html @@ -3,6 +3,7 @@ layout: post title: Mono, Winforms, Tao, and Me tags: - mono +nodeid: 39 created: 1170457820 --- I finally got around to testing FTGL# with Mono on Windows. Didn't require any modification, but there's one oddity ...
diff --git a/_posts/2007-02-03-kernel-panics-do-weird-things.html b/_posts/2007-02-03-kernel-panics-do-weird-things.html index 76c2358..1dfacbc 100644 --- a/_posts/2007-02-03-kernel-panics-do-weird-things.html +++ b/_posts/2007-02-03-kernel-panics-do-weird-things.html @@ -3,6 +3,7 @@ layout: post title: Kernel Panics Do Weird Things tags: - software development +nodeid: 40 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.
diff --git a/_posts/2007-02-05-mono-winforms-update.html b/_posts/2007-02-05-mono-winforms-update.html index dd3ee23..21d36c9 100644 --- a/_posts/2007-02-05-mono-winforms-update.html +++ b/_posts/2007-02-05-mono-winforms-update.html @@ -3,6 +3,7 @@ layout: post title: Mono Winforms Update tags: - mono +nodeid: 41 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.
diff --git a/_posts/2007-02-07-tiring.html b/_posts/2007-02-07-tiring.html index 0e45acd..ea35637 100644 --- a/_posts/2007-02-07-tiring.html +++ b/_posts/2007-02-07-tiring.html @@ -3,6 +3,7 @@ layout: post title: Tiring tags: - miscellaneous +nodeid: 42 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.
diff --git a/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html b/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html index def84ce..6292234 100644 --- a/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html +++ b/_posts/2007-02-09-i-aint-shipley-but-pmpmyapp.html @@ -3,6 +3,7 @@ layout: post title: I ain't Shipley, but PmpMyApp tags: - cocoa +nodeid: 43 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.
diff --git a/_posts/2007-02-09-internal-server-error.html b/_posts/2007-02-09-internal-server-error.html index 3b58195..f2e2780 100644 --- a/_posts/2007-02-09-internal-server-error.html +++ b/_posts/2007-02-09-internal-server-error.html @@ -3,6 +3,7 @@ layout: post title: Internal Server Error tags: - miscellaneous +nodeid: 44 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
diff --git a/_posts/2007-02-14-terminally-ill.html b/_posts/2007-02-14-terminally-ill.html index b80ca48..9d16c54 100644 --- a/_posts/2007-02-14-terminally-ill.html +++ b/_posts/2007-02-14-terminally-ill.html @@ -3,6 +3,7 @@ layout: post title: Terminally ill tags: - miscellaneous +nodeid: 45 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.
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 index fa2854e..8846b89 100644 --- a/_posts/2007-02-16-in-the-news-last-week-drm.html +++ b/_posts/2007-02-16-in-the-news-last-week-drm.html @@ -3,6 +3,7 @@ layout: post title: "In the news last week: DRM" tags: - opinion +nodeid: 46 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.
diff --git a/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html b/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html index 85f9f6f..180b326 100644 --- a/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html +++ b/_posts/2007-02-19-twitterbot-basic-http-authentication-errors.html @@ -3,6 +3,7 @@ layout: post title: Twitterbot Basic HTTP Authentication Errors tags: - mono +nodeid: 47 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:
diff --git a/_posts/2007-02-21-completely-off-topic.html b/_posts/2007-02-21-completely-off-topic.html index a276c3a..9e0acb0 100644 --- a/_posts/2007-02-21-completely-off-topic.html +++ b/_posts/2007-02-21-completely-off-topic.html @@ -3,6 +3,7 @@ layout: post title: Completely Off-topic tags: - opinion +nodeid: 48 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.
diff --git a/_posts/2007-02-23-im-shocked.html b/_posts/2007-02-23-im-shocked.html index 779b08d..02b558e 100644 --- a/_posts/2007-02-23-im-shocked.html +++ b/_posts/2007-02-23-im-shocked.html @@ -3,6 +3,7 @@ layout: post title: I'm Shocked tags: - opinion +nodeid: 49 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?
diff --git a/_posts/2007-03-02-the-visual-basic-stigma.html b/_posts/2007-03-02-the-visual-basic-stigma.html index 22b7a68..9668496 100644 --- a/_posts/2007-03-02-the-visual-basic-stigma.html +++ b/_posts/2007-03-02-the-visual-basic-stigma.html @@ -3,6 +3,7 @@ layout: post title: The Visual Basic Stigma tags: - software development +nodeid: 50 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.
diff --git a/_posts/2007-03-06-barcamp-austin-again.html b/_posts/2007-03-06-barcamp-austin-again.html index 2ff9ac8..24406a0 100644 --- a/_posts/2007-03-06-barcamp-austin-again.html +++ b/_posts/2007-03-06-barcamp-austin-again.html @@ -3,6 +3,7 @@ layout: post title: BarCamp Austin, Again tags: - software development +nodeid: 51 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 index 08a4886..b870ed3 100644 --- a/_posts/2007-03-11-teeny-tiny-updates.html +++ b/_posts/2007-03-11-teeny-tiny-updates.html @@ -3,6 +3,7 @@ layout: post title: Teeny-tiny Updates tags: - miscellaneous +nodeid: 52 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.
diff --git a/_posts/2007-03-12-soldiers-of-fortune.html b/_posts/2007-03-12-soldiers-of-fortune.html index 2c35d3e..cb47fc1 100644 --- a/_posts/2007-03-12-soldiers-of-fortune.html +++ b/_posts/2007-03-12-soldiers-of-fortune.html @@ -3,6 +3,7 @@ layout: post title: Soldiers of Fortune tags: - opinion +nodeid: 53 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.
diff --git a/_posts/2007-03-14-a-review-the-metamorphosis.html b/_posts/2007-03-14-a-review-the-metamorphosis.html index 5965289..aabc3b0 100644 --- a/_posts/2007-03-14-a-review-the-metamorphosis.html +++ b/_posts/2007-03-14-a-review-the-metamorphosis.html @@ -3,6 +3,7 @@ layout: post title: "A Review: The Metamorphosis" tags: - literature +nodeid: 54 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.
diff --git a/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html b/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html index 41a76a3..6e74c20 100644 --- a/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html +++ b/_posts/2007-03-18-perforce-on-the-road-p4tunnel.html @@ -3,6 +3,7 @@ layout: post title: Perforce On The Road, p4tunnel tags: - software development +nodeid: 55 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:
diff --git a/_posts/2007-03-22-im-seriously-famous.html b/_posts/2007-03-22-im-seriously-famous.html index b944a51..38d3cd8 100644 --- a/_posts/2007-03-22-im-seriously-famous.html +++ b/_posts/2007-03-22-im-seriously-famous.html @@ -3,6 +3,7 @@ layout: post title: I'm Seriously Famous tags: - mono +nodeid: 56 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 index 69cb602..bbe431b 100644 --- a/_posts/2007-03-31-in-the-fifth-dimension.html +++ b/_posts/2007-03-31-in-the-fifth-dimension.html @@ -4,6 +4,7 @@ title: In the fifth dimension tags: - slide - miscellaneous +nodeid: 57 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).
diff --git a/_posts/2007-04-11-cocoaheads-silicon-valley.html b/_posts/2007-04-11-cocoaheads-silicon-valley.html index b0375ca..4c05ec7 100644 --- a/_posts/2007-04-11-cocoaheads-silicon-valley.html +++ b/_posts/2007-04-11-cocoaheads-silicon-valley.html @@ -3,6 +3,7 @@ layout: post title: CocoaHeads Silicon Valley tags: - cocoa +nodeid: 58 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.
diff --git a/_posts/2007-04-21-city-of-lost-boys.html b/_posts/2007-04-21-city-of-lost-boys.html index e82bd77..00b526d 100644 --- a/_posts/2007-04-21-city-of-lost-boys.html +++ b/_posts/2007-04-21-city-of-lost-boys.html @@ -3,6 +3,7 @@ layout: post title: City of Lost Boys tags: - opinion +nodeid: 59 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 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 index a972654..f0b2ac4 100644 --- a/_posts/2007-04-25-choosing-a-platform-windows-and-linux.html +++ b/_posts/2007-04-25-choosing-a-platform-windows-and-linux.html @@ -3,6 +3,7 @@ layout: post title: Choosing a platform, Windows and Linux tags: - software development +nodeid: 60 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.
diff --git a/_posts/2007-04-29-site-upgrade.html b/_posts/2007-04-29-site-upgrade.html index 507a549..a7f06f9 100644 --- a/_posts/2007-04-29-site-upgrade.html +++ b/_posts/2007-04-29-site-upgrade.html @@ -3,6 +3,7 @@ layout: post title: Site Upgrade tags: - miscellaneous +nodeid: 61 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 index 03adee2..1c614ee 100644 --- a/_posts/2007-04-30-im-in-ur-phonez.html +++ b/_posts/2007-04-30-im-in-ur-phonez.html @@ -3,6 +3,7 @@ layout: post title: Im in ur phonez tags: - software development +nodeid: 63 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.
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 index fd4b863..1831a38 100644 --- a/_posts/2007-04-30-windows-eye-for-the-cocoa-guy.html +++ b/_posts/2007-04-30-windows-eye-for-the-cocoa-guy.html @@ -3,6 +3,7 @@ layout: post title: Windows Eye for the Cocoa Guy tags: - software development +nodeid: 64 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.
diff --git a/_posts/2007-05-01-twitterbot-recap.html b/_posts/2007-05-01-twitterbot-recap.html index 163bdb0..96f6a1a 100644 --- a/_posts/2007-05-01-twitterbot-recap.html +++ b/_posts/2007-05-01-twitterbot-recap.html @@ -3,6 +3,7 @@ layout: post title: Twitterbot Recap tags: - mono +nodeid: 65 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).
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 index e747c73..ac64467 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: Windows Eye for the Cocoa Guy, The Series tags: - windows eye for the cocoa guy +nodeid: 66 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.
diff --git a/_posts/2007-05-06-my-guilty-pleasure.html b/_posts/2007-05-06-my-guilty-pleasure.html index d215a98..76f0f5c 100644 --- a/_posts/2007-05-06-my-guilty-pleasure.html +++ b/_posts/2007-05-06-my-guilty-pleasure.html @@ -3,6 +3,7 @@ layout: post title: My Guilty Pleasure tags: - media +nodeid: 67 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.
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 index c2c487a..d6efbbc 100644 --- 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 @@ -4,6 +4,7 @@ title: Our employees are our most valuable asset tags: - slide - software development +nodeid: 68 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.
diff --git a/_posts/2007-05-19-sp4mz0r.html b/_posts/2007-05-19-sp4mz0r.html index 810de58..acd5d0d 100644 --- a/_posts/2007-05-19-sp4mz0r.html +++ b/_posts/2007-05-19-sp4mz0r.html @@ -3,6 +3,7 @@ layout: post title: Sp4mz0r tags: - miscellaneous +nodeid: 69 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 :)
diff --git a/_posts/2007-05-26-conference-season-osbc.html b/_posts/2007-05-26-conference-season-osbc.html index cbb76dc..bdceed4 100644 --- a/_posts/2007-05-26-conference-season-osbc.html +++ b/_posts/2007-05-26-conference-season-osbc.html @@ -3,6 +3,7 @@ layout: post title: "Conference Season: OSBC" tags: - opinion +nodeid: 70 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:
diff --git a/_posts/2007-06-03-almost-there.html b/_posts/2007-06-03-almost-there.html index c9bc506..917c0a8 100644 --- a/_posts/2007-06-03-almost-there.html +++ b/_posts/2007-06-03-almost-there.html @@ -4,6 +4,7 @@ title: Almost There tags: - slide - miscellaneous +nodeid: 71 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.
diff --git a/_posts/2007-06-08-long-live-the-license-flamewar.html b/_posts/2007-06-08-long-live-the-license-flamewar.html index e831cbf..eac9f3d 100644 --- a/_posts/2007-06-08-long-live-the-license-flamewar.html +++ b/_posts/2007-06-08-long-live-the-license-flamewar.html @@ -3,6 +3,7 @@ layout: post title: Long Live the License Flamewar tags: - opinion +nodeid: 72 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.
diff --git a/_posts/2007-06-24-insanity.html b/_posts/2007-06-24-insanity.html index bbb4441..0338cfd 100644 --- a/_posts/2007-06-24-insanity.html +++ b/_posts/2007-06-24-insanity.html @@ -5,6 +5,7 @@ tags: - slide - software development - facebook +nodeid: 73 created: 1182691338 --- It's been exactly one month since the F8 event (Facebook Platform Launch) changed everything, and it's still going.
diff --git a/_posts/2007-06-26-thriving-in-a-development-vacuum.html b/_posts/2007-06-26-thriving-in-a-development-vacuum.html index a283292..10efa30 100644 --- a/_posts/2007-06-26-thriving-in-a-development-vacuum.html +++ b/_posts/2007-06-26-thriving-in-a-development-vacuum.html @@ -3,6 +3,7 @@ layout: post title: Thriving in a Development Vacuum tags: - software development +nodeid: 74 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.
diff --git a/_posts/2007-07-04-mono-meet-facebook.html b/_posts/2007-07-04-mono-meet-facebook.html index 2f86c34..dfc2677 100644 --- a/_posts/2007-07-04-mono-meet-facebook.html +++ b/_posts/2007-07-04-mono-meet-facebook.html @@ -5,6 +5,7 @@ tags: - mono - slide - facebook +nodeid: 75 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.
diff --git a/_posts/2007-07-10-conference-season-iphonedevcamp.html b/_posts/2007-07-10-conference-season-iphonedevcamp.html index b198a49..69593b3 100644 --- a/_posts/2007-07-10-conference-season-iphonedevcamp.html +++ b/_posts/2007-07-10-conference-season-iphonedevcamp.html @@ -3,6 +3,7 @@ layout: post title: "Conference Season: iPhoneDevCamp" tags: - software development +nodeid: 76 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 royally screwing us developers by trying to spin web technologies as an SDK, a lot of people still banded together to develop web applications that target the iPhone. Not that the iPhone isn't a cool device, but the browser is an absolute crap platform. As so many people have already pointed out, Cocoa rocks, Javascript, not so much.
diff --git a/_posts/2007-07-21-new-email-etc.html b/_posts/2007-07-21-new-email-etc.html index dd346b0..4195163 100644 --- a/_posts/2007-07-21-new-email-etc.html +++ b/_posts/2007-07-21-new-email-etc.html @@ -3,6 +3,7 @@ layout: post title: New Email, etc tags: - mono +nodeid: 78 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.
diff --git a/_posts/2007-07-21-starting-with-openmoko.html b/_posts/2007-07-21-starting-with-openmoko.html index 0da54fe..f620547 100644 --- a/_posts/2007-07-21-starting-with-openmoko.html +++ b/_posts/2007-07-21-starting-with-openmoko.html @@ -4,6 +4,7 @@ title: Starting with OpenMoko. tags: - linux - openmoko +nodeid: 77 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.
diff --git a/_posts/2007-07-23-ironru-ooh-shiney.html b/_posts/2007-07-23-ironru-ooh-shiney.html index dd2c199..a7e9b91 100644 --- a/_posts/2007-07-23-ironru-ooh-shiney.html +++ b/_posts/2007-07-23-ironru-ooh-shiney.html @@ -3,6 +3,7 @@ layout: post title: IronRu..OOH SHINEY! tags: - mono +nodeid: 79 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).
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 index d1e812f..2e765ef 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - facebook +nodeid: 80 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.
diff --git a/_posts/2007-07-28-songbird-a-visual-review.html b/_posts/2007-07-28-songbird-a-visual-review.html index 2f0123f..e3ce499 100644 --- a/_posts/2007-07-28-songbird-a-visual-review.html +++ b/_posts/2007-07-28-songbird-a-visual-review.html @@ -3,6 +3,7 @@ layout: post title: Songbird, a visual review tags: - opinion +nodeid: 81 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:

diff --git a/_posts/2007-07-30-hacking-with-ironpython.html b/_posts/2007-07-30-hacking-with-ironpython.html index 4c3418b..e8d8bb4 100644 --- a/_posts/2007-07-30-hacking-with-ironpython.html +++ b/_posts/2007-07-30-hacking-with-ironpython.html @@ -4,6 +4,7 @@ title: Hacking with IronPython tags: - mono - linux +nodeid: 82 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.
diff --git a/_posts/2007-08-03-subversion-branching-with-less-pain.html b/_posts/2007-08-03-subversion-branching-with-less-pain.html index 9b63b6b..38e3de3 100644 --- a/_posts/2007-08-03-subversion-branching-with-less-pain.html +++ b/_posts/2007-08-03-subversion-branching-with-less-pain.html @@ -4,6 +4,7 @@ title: "Subversion branching with less Pain\xE2\x84\xA2" tags: - slide - software development +nodeid: 83 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.
diff --git a/_posts/2007-08-05-ordered-filled.html b/_posts/2007-08-05-ordered-filled.html index 2563864..a61c05a 100644 --- a/_posts/2007-08-05-ordered-filled.html +++ b/_posts/2007-08-05-ordered-filled.html @@ -3,6 +3,7 @@ layout: post title: Ordered Filled tags: - openmoko +nodeid: 84 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.
diff --git a/_posts/2007-08-06-ironpython-for-macports.html b/_posts/2007-08-06-ironpython-for-macports.html index 13b3623..d000674 100644 --- a/_posts/2007-08-06-ironpython-for-macports.html +++ b/_posts/2007-08-06-ironpython-for-macports.html @@ -3,6 +3,7 @@ layout: post title: IronPython for MacPorts tags: - mono +nodeid: 85 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 IronPython MacPort a try.
diff --git a/_posts/2007-08-08-meet-openmoko.html b/_posts/2007-08-08-meet-openmoko.html index d622cd7..25d9959 100644 --- a/_posts/2007-08-08-meet-openmoko.html +++ b/_posts/2007-08-08-meet-openmoko.html @@ -4,6 +4,7 @@ title: Meet OpenMoko tags: - linux - openmoko +nodeid: 87 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.
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 index c0c1c90..836fa63 100644 --- a/_posts/2007-08-09-scaling-with-your-smart-platform-choice.html +++ b/_posts/2007-08-09-scaling-with-your-smart-platform-choice.html @@ -3,6 +3,7 @@ layout: post title: Scaling, with your "smart platform choice" tags: - software development +nodeid: 88 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.
diff --git a/_posts/2007-08-11-openmoko-2007-2-preview.html b/_posts/2007-08-11-openmoko-2007-2-preview.html index 0e39bd8..f69142b 100644 --- a/_posts/2007-08-11-openmoko-2007-2-preview.html +++ b/_posts/2007-08-11-openmoko-2007-2-preview.html @@ -4,6 +4,7 @@ title: OpenMoko 2007.2 Preview tags: - linux - openmoko +nodeid: 89 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.
diff --git a/_posts/2007-08-12-video-hello-moko.html b/_posts/2007-08-12-video-hello-moko.html index 9487e08..5cf8ba2 100644 --- a/_posts/2007-08-12-video-hello-moko.html +++ b/_posts/2007-08-12-video-hello-moko.html @@ -4,6 +4,7 @@ title: "Video: Hello Moko" tags: - linux - openmoko +nodeid: 90 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.
diff --git a/_posts/2007-08-14-another-facebook-developer-meetup.html b/_posts/2007-08-14-another-facebook-developer-meetup.html index cd07daa..6ae845d 100644 --- a/_posts/2007-08-14-another-facebook-developer-meetup.html +++ b/_posts/2007-08-14-another-facebook-developer-meetup.html @@ -6,6 +6,7 @@ tags: - miscellaneous - software development - facebook +nodeid: 91 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.F8 Badge 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.
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 index c374c81..eb48355 100644 --- 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 @@ -6,6 +6,7 @@ tags: - miscellaneous - software development - facebook +nodeid: 92 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.
diff --git a/_posts/2007-08-19-i-just-saved-150.html b/_posts/2007-08-19-i-just-saved-150.html index 24b725a..a30ddf7 100644 --- a/_posts/2007-08-19-i-just-saved-150.html +++ b/_posts/2007-08-19-i-just-saved-150.html @@ -3,6 +3,7 @@ layout: post title: I just saved $150! tags: - miscellaneous +nodeid: 94 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.
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 index 206a73e..d010893 100644 --- a/_posts/2007-08-21-scaling-with-mysql-a-brief-guide.html +++ b/_posts/2007-08-21-scaling-with-mysql-a-brief-guide.html @@ -5,6 +5,7 @@ tags: - opinion - software development - facebook +nodeid: 95 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.
diff --git a/_posts/2007-08-22-my-boss-is-a-robot.html b/_posts/2007-08-22-my-boss-is-a-robot.html index 876226f..afc010d 100644 --- a/_posts/2007-08-22-my-boss-is-a-robot.html +++ b/_posts/2007-08-22-my-boss-is-a-robot.html @@ -4,6 +4,7 @@ title: My Boss is a Robot. tags: - slide - miscellaneous +nodeid: 96 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.
diff --git a/_posts/2007-08-23-back-to-the-basics.html b/_posts/2007-08-23-back-to-the-basics.html index c38f3ad..fcf4833 100644 --- a/_posts/2007-08-23-back-to-the-basics.html +++ b/_posts/2007-08-23-back-to-the-basics.html @@ -3,6 +3,7 @@ layout: post title: Back to the Basics tags: - academia +nodeid: 97 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.
diff --git a/_posts/2007-08-25-facebook-developer-garage-palo-alto.html b/_posts/2007-08-25-facebook-developer-garage-palo-alto.html index 8728392..443b177 100644 --- a/_posts/2007-08-25-facebook-developer-garage-palo-alto.html +++ b/_posts/2007-08-25-facebook-developer-garage-palo-alto.html @@ -6,6 +6,7 @@ tags: - miscellaneous - software development - facebook +nodeid: 98 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.
diff --git a/_posts/2007-08-26-facebook-developer-garage-wrap-up.html b/_posts/2007-08-26-facebook-developer-garage-wrap-up.html index c9fb089..2b524e7 100644 --- a/_posts/2007-08-26-facebook-developer-garage-wrap-up.html +++ b/_posts/2007-08-26-facebook-developer-garage-wrap-up.html @@ -6,6 +6,7 @@ tags: - miscellaneous - software development - facebook +nodeid: 99 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.
diff --git a/_posts/2007-08-29-video-facebook-developer-garage.html b/_posts/2007-08-29-video-facebook-developer-garage.html index 318cb06..db98797 100644 --- a/_posts/2007-08-29-video-facebook-developer-garage.html +++ b/_posts/2007-08-29-video-facebook-developer-garage.html @@ -4,6 +4,7 @@ title: "Video: Facebook Developer Garage" tags: - slide - facebook +nodeid: 101 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.
diff --git a/_posts/2007-09-07-time-for-a-road-trip.html b/_posts/2007-09-07-time-for-a-road-trip.html index 3dd266c..54fa5c8 100644 --- a/_posts/2007-09-07-time-for-a-road-trip.html +++ b/_posts/2007-09-07-time-for-a-road-trip.html @@ -3,6 +3,7 @@ layout: post title: Time for a Road Trip tags: - miscellaneous +nodeid: 102 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.
diff --git a/_posts/2007-09-13-for-what-its-worth.html b/_posts/2007-09-13-for-what-its-worth.html index 67e58d1..bad5548 100644 --- a/_posts/2007-09-13-for-what-its-worth.html +++ b/_posts/2007-09-13-for-what-its-worth.html @@ -3,6 +3,7 @@ layout: post title: For what it's worth tags: - miscellaneous +nodeid: 103 created: 1189711474 --- I'm back in San Francisco, and I'm not dead.
diff --git a/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html b/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html index 31d62e2..848a0d4 100644 --- a/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html +++ b/_posts/2007-09-14-cmon-down-to-silverlightdevcampsf.html @@ -4,6 +4,7 @@ title: C'mon down to SilverlightDevCampSF tags: - mono - software development +nodeid: 105 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.
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 index cfa8372..6a557d1 100644 --- 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 @@ -4,6 +4,7 @@ title: SIlverSurfer, Try out Silverlight on Mac OS X tags: - mono - software development +nodeid: 106 created: 1189920348 --- At the SilverlightDevCampSF this past couple days, I discovered a couple things while hacking around with both Moonlight, and Silverlight.
diff --git a/_posts/2007-09-19-channel9-silverlight-interview.html b/_posts/2007-09-19-channel9-silverlight-interview.html index 3f8255f..a4dbbc2 100644 --- a/_posts/2007-09-19-channel9-silverlight-interview.html +++ b/_posts/2007-09-19-channel9-silverlight-interview.html @@ -5,6 +5,7 @@ tags: - mono - miscellaneous - software development +nodeid: 107 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.
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 index 8a2742d..220d512 100644 --- a/_posts/2007-09-21-unofficial-facebook-hackathon-in-palo-alto.html +++ b/_posts/2007-09-21-unofficial-facebook-hackathon-in-palo-alto.html @@ -3,6 +3,7 @@ layout: post title: (Unofficial) Facebook Hackathon in Palo Alto tags: - facebook +nodeid: 108 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 index a1f8bab..b10e074 100644 --- a/_posts/2007-09-23-contemplating-remix-07-in-boston.html +++ b/_posts/2007-09-23-contemplating-remix-07-in-boston.html @@ -5,6 +5,7 @@ tags: - mono - miscellaneous - software development +nodeid: 109 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:
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 index c6967f0..21c7817 100644 --- a/_posts/2007-09-27-popfly-how-to-lose-the-buzz.html +++ b/_posts/2007-09-27-popfly-how-to-lose-the-buzz.html @@ -5,6 +5,7 @@ tags: - mono - opinion - facebook +nodeid: 110 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.
diff --git a/_posts/2007-09-29-operation-iraqi-freedom.html b/_posts/2007-09-29-operation-iraqi-freedom.html index 50ab40e..df90b5d 100644 --- a/_posts/2007-09-29-operation-iraqi-freedom.html +++ b/_posts/2007-09-29-operation-iraqi-freedom.html @@ -3,6 +3,7 @@ layout: post title: Operation Iraqi Freedom tags: - opinion +nodeid: 111 created: 1191098802 --- Where's the call to war to freedom for our fellow democracy seeking people in Burma?
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 index b1ffc9c..7f2de75 100644 --- 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 @@ -4,6 +4,7 @@ title: Graphing Social, Building your first app workshop. tags: - slide - facebook +nodeid: 113 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.
diff --git a/_posts/2007-10-03-remix-07-boston-woohoo.html b/_posts/2007-10-03-remix-07-boston-woohoo.html index 7ea9423..e7a2029 100644 --- a/_posts/2007-10-03-remix-07-boston-woohoo.html +++ b/_posts/2007-10-03-remix-07-boston-woohoo.html @@ -4,6 +4,7 @@ title: Remix 07 Boston, Woohoo! tags: - mono - miscellaneous +nodeid: 112 created: 1191394907 ---
diff --git a/_posts/2007-10-06-conference-season-communitynext-platform.html b/_posts/2007-10-06-conference-season-communitynext-platform.html index 32ea6f5..16a11c9 100644 --- a/_posts/2007-10-06-conference-season-communitynext-platform.html +++ b/_posts/2007-10-06-conference-season-communitynext-platform.html @@ -4,6 +4,7 @@ title: "Conference Season: CommunityNext Platform" tags: - slide - facebook +nodeid: 114 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.
diff --git a/_posts/2007-10-06-introducing-why-are-you-awesome.html b/_posts/2007-10-06-introducing-why-are-you-awesome.html index 4440e18..efd4319 100644 --- a/_posts/2007-10-06-introducing-why-are-you-awesome.html +++ b/_posts/2007-10-06-introducing-why-are-you-awesome.html @@ -4,6 +4,7 @@ title: "Introducing: \"Why are you awesome?\"" tags: - software development - facebook +nodeid: 115 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.
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 index 86c9aee..4ef9fa5 100644 --- a/_posts/2007-10-07-facebook-app-development-101-wrap-up.html +++ b/_posts/2007-10-07-facebook-app-development-101-wrap-up.html @@ -4,6 +4,7 @@ title: Facebook App Development 101 Wrap-up tags: - slide - facebook +nodeid: 117 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.
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 index 429305b..791d85e 100644 --- a/_posts/2007-10-07-why-are-you-awesome-source-code.html +++ b/_posts/2007-10-07-why-are-you-awesome-source-code.html @@ -3,6 +3,7 @@ layout: post title: "\"Why are you awesome? Source Code" tags: - facebook +nodeid: 116 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.
diff --git a/_posts/2007-10-08-in-boston-at-remix-phew.html b/_posts/2007-10-08-in-boston-at-remix-phew.html index 4acdd1a..11d8c31 100644 --- a/_posts/2007-10-08-in-boston-at-remix-phew.html +++ b/_posts/2007-10-08-in-boston-at-remix-phew.html @@ -5,6 +5,7 @@ tags: - mono - miscellaneous - software development +nodeid: 118 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.
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 index 453c082..81fc8e8 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: Miguel questions the manhood of 400 Microsoft Developers. Awesome. tags: - mono +nodeid: 119 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.
diff --git a/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html b/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html index 2b75fdb..41edd54 100644 --- a/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html +++ b/_posts/2007-10-08-unofficlal-facebook-developers-meetup-boston.html @@ -3,6 +3,7 @@ layout: post title: "Unofficlal Facebook Developers Meetup: Boston" tags: - facebook +nodeid: 120 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.
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 index 61344a8..2f8b8d5 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: Miguel de Icaza's Remix 07 Boston Keynote Address tags: - mono +nodeid: 121 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.
diff --git a/_posts/2007-10-12-remix-07-boston-wrap-up.html b/_posts/2007-10-12-remix-07-boston-wrap-up.html index 44c98d4..4556154 100644 --- a/_posts/2007-10-12-remix-07-boston-wrap-up.html +++ b/_posts/2007-10-12-remix-07-boston-wrap-up.html @@ -6,6 +6,7 @@ tags: - slide - miscellaneous - facebook +nodeid: 122 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).
diff --git a/_posts/2007-10-13-google-search-inside-of-facebook.html b/_posts/2007-10-13-google-search-inside-of-facebook.html index da6bfa5..263b863 100644 --- a/_posts/2007-10-13-google-search-inside-of-facebook.html +++ b/_posts/2007-10-13-google-search-inside-of-facebook.html @@ -4,6 +4,7 @@ title: Google Search Inside of Facebook tags: - miscellaneous - facebook +nodeid: 123 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.
diff --git a/_posts/2007-10-15-speaking-at-widget-summit.html b/_posts/2007-10-15-speaking-at-widget-summit.html index 30696f1..569b8d1 100644 --- a/_posts/2007-10-15-speaking-at-widget-summit.html +++ b/_posts/2007-10-15-speaking-at-widget-summit.html @@ -5,6 +5,7 @@ tags: - slide - miscellaneous - facebook +nodeid: 124 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).
diff --git a/_posts/2007-10-16-widget-summit-slides.html b/_posts/2007-10-16-widget-summit-slides.html index 9a13561..af64c70 100644 --- a/_posts/2007-10-16-widget-summit-slides.html +++ b/_posts/2007-10-16-widget-summit-slides.html @@ -4,6 +4,7 @@ title: Widget Summit Slides tags: - slide - facebook +nodeid: 125 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.
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 index 35be114..cda8c5a 100644 --- a/_posts/2007-10-20-any-unemployed-net-developers-in-nyc.html +++ b/_posts/2007-10-20-any-unemployed-net-developers-in-nyc.html @@ -5,6 +5,7 @@ tags: - mono - miscellaneous - software development +nodeid: 127 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).
diff --git a/_posts/2007-10-24-my-new-favorite-chuckle.html b/_posts/2007-10-24-my-new-favorite-chuckle.html index f501179..08e9af5 100644 --- a/_posts/2007-10-24-my-new-favorite-chuckle.html +++ b/_posts/2007-10-24-my-new-favorite-chuckle.html @@ -4,6 +4,7 @@ title: My new favorite chuckle tags: - miscellaneous - facebook +nodeid: 128 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"

diff --git a/_posts/2007-10-25-the-superpoke-facebook-song.html b/_posts/2007-10-25-the-superpoke-facebook-song.html index c0a8127..f343aad 100644 --- a/_posts/2007-10-25-the-superpoke-facebook-song.html +++ b/_posts/2007-10-25-the-superpoke-facebook-song.html @@ -4,6 +4,7 @@ title: The SuperPoke Facebook Song tags: - slide - facebook +nodeid: 129 created: 1193337683 --- We recently stumbled across this here at Slide, and it's pretty awesome, check it out, and of course, check out SuperPoke!.
diff --git a/_posts/2007-10-28-on-investing.html b/_posts/2007-10-28-on-investing.html index 956802b..a41eae6 100644 --- a/_posts/2007-10-28-on-investing.html +++ b/_posts/2007-10-28-on-investing.html @@ -3,6 +3,7 @@ layout: post title: On Investing tags: - miscellaneous +nodeid: 130 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?
diff --git a/_posts/2007-11-03-silicon-valley-gangstas.html b/_posts/2007-11-03-silicon-valley-gangstas.html index 524af4f..4701e25 100644 --- a/_posts/2007-11-03-silicon-valley-gangstas.html +++ b/_posts/2007-11-03-silicon-valley-gangstas.html @@ -4,6 +4,7 @@ title: Silicon Valley Gangstas tags: - miscellaneous - media +nodeid: 131 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."
diff --git a/_posts/2007-11-04-your-order-has-been-completed.html b/_posts/2007-11-04-your-order-has-been-completed.html index 6988a88..ccad0f4 100644 --- a/_posts/2007-11-04-your-order-has-been-completed.html +++ b/_posts/2007-11-04-your-order-has-been-completed.html @@ -3,6 +3,7 @@ layout: post title: Your order has been completed tags: - miscellaneous +nodeid: 132 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.
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 index 72a7108..b009b7d 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: A note to my Graphing Social "students" tags: - facebook +nodeid: 133 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.
diff --git a/_posts/2007-11-06-building-mono-on-leopard.html b/_posts/2007-11-06-building-mono-on-leopard.html index f093959..fff345d 100644 --- a/_posts/2007-11-06-building-mono-on-leopard.html +++ b/_posts/2007-11-06-building-mono-on-leopard.html @@ -3,6 +3,7 @@ layout: post title: Building Mono on Leopard tags: - mono +nodeid: 134 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).
diff --git a/_posts/2007-11-08-bug-number-seven.html b/_posts/2007-11-08-bug-number-seven.html index 248610a..29b653f 100644 --- a/_posts/2007-11-08-bug-number-seven.html +++ b/_posts/2007-11-08-bug-number-seven.html @@ -3,6 +3,7 @@ layout: post title: Bug Number Seven tags: - facebook +nodeid: 135 created: 1194520600 --- One of my favorite Facebookers, Ari Steinberg, just resolved bug #7 in Facebook's bugzilla.
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 index 48e667e..5e15ee4 100644 --- a/_posts/2007-11-15-why-are-you-awesome-meet-mono.html +++ b/_posts/2007-11-15-why-are-you-awesome-meet-mono.html @@ -4,6 +4,7 @@ title: "\"Why are you awesome?\" meet Mono" tags: - mono - facebook +nodeid: 136 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).
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 index 277e9b4..8905b8c 100644 --- a/_posts/2007-11-17-facebook-flyers-make-my-eyes-bleed.html +++ b/_posts/2007-11-17-facebook-flyers-make-my-eyes-bleed.html @@ -3,6 +3,7 @@ layout: post title: Facebook Flyers Make My Eyes Bleed. tags: - facebook +nodeid: 137 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".
diff --git a/_posts/2007-11-22-turning-famousosity-up-to-11.html b/_posts/2007-11-22-turning-famousosity-up-to-11.html index d94ca7d..514a1a9 100644 --- a/_posts/2007-11-22-turning-famousosity-up-to-11.html +++ b/_posts/2007-11-22-turning-famousosity-up-to-11.html @@ -4,6 +4,7 @@ title: Turning Famousosity Up To 11. tags: - slide - facebook +nodeid: 138 created: 1195728896 --- Sergio, one of our talented web monkeys, sent an email out today that started with "OMFGBBQ!"
diff --git a/_posts/2007-11-24-ichatagent-leaks-in-leopard.html b/_posts/2007-11-24-ichatagent-leaks-in-leopard.html index c1db6d1..1436277 100644 --- a/_posts/2007-11-24-ichatagent-leaks-in-leopard.html +++ b/_posts/2007-11-24-ichatagent-leaks-in-leopard.html @@ -5,6 +5,7 @@ tags: - cocoa - miscellaneous - software development +nodeid: 139 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.
diff --git a/_posts/2007-12-01-missed-spain.html b/_posts/2007-12-01-missed-spain.html index 9ae19ef..7820503 100644 --- a/_posts/2007-12-01-missed-spain.html +++ b/_posts/2007-12-01-missed-spain.html @@ -3,6 +3,7 @@ layout: post title: Missed Spain :( tags: - mono +nodeid: 140 created: 1196542797 --- I hope everybody enjoyed their stay this past week in Madrid for the Mono Summit 2007.
diff --git a/_posts/2007-12-12-urlenco-de-mono-lighttpd-and-postgresql.html b/_posts/2007-12-12-urlenco-de-mono-lighttpd-and-postgresql.html index 6883922..fdf4114 100644 --- a/_posts/2007-12-12-urlenco-de-mono-lighttpd-and-postgresql.html +++ b/_posts/2007-12-12-urlenco-de-mono-lighttpd-and-postgresql.html @@ -4,6 +4,7 @@ title: "Urlenco.de: Mono, Lighttpd, and PostgreSQL." tags: - mono - miscellaneous +nodeid: 141 created: 1197456339 --- During the nigh 12 hour break I had between regular work over Thanksgiving, I spent about four hours writing a little utility that I wanted to use instead of TinyURL, and found a fantastic domain name for it too: Urlenco.de. I also wanted to use the opportunity to explore using Npgsql, the .NET connector for PostgreSQL, which was a very pleasant experience after using the MySQL .NET connector (part of the pleasant experience was using PostgreSQL itself, of course). Another new thing to explore was the FastCGI support for Mono/ASP.NET, I'll be sure to jot down my experiences with Mono's FastCGI support in a later post since my brain is too fried to talk about it coherently in detail.
diff --git a/_posts/2007-12-16-fun-way-to-crash-leopard-159.html b/_posts/2007-12-16-fun-way-to-crash-leopard-159.html index ded659b..4b5aa07 100644 --- a/_posts/2007-12-16-fun-way-to-crash-leopard-159.html +++ b/_posts/2007-12-16-fun-way-to-crash-leopard-159.html @@ -3,6 +3,7 @@ layout: post title: "\"Fun\" way to crash Leopard #159" tags: - miscellaneous +nodeid: 143 created: 1197812856 --- Earlier this week I noticed that the Facebook home page would not stop loading, in the sense that the entire page would load and render, but one resource would continue to load. As I popped open Safari's Activity Monitor I found that the "one resource" was a server-generated image that was effectively streaming to my browser window, since the server would not stop sending data for the file.
diff --git a/_posts/2007-12-16-mono-and-fastcgi-an-awkward-relationship.html b/_posts/2007-12-16-mono-and-fastcgi-an-awkward-relationship.html index f4373f0..065b937 100644 --- a/_posts/2007-12-16-mono-and-fastcgi-an-awkward-relationship.html +++ b/_posts/2007-12-16-mono-and-fastcgi-an-awkward-relationship.html @@ -4,6 +4,7 @@ title: Mono and FastCGI. An awkward relationship. tags: - mono - miscellaneous +nodeid: 142 created: 1197801370 --- I've spent the week tweaking and adjusting my lighttpd configuration to where it cooperates better with Mono's FastCGI server, and I finally feel confident enough with the configuration to share.
diff --git a/_posts/2007-12-17-my-new-startup.html b/_posts/2007-12-17-my-new-startup.html index 727b5bc..40af413 100644 --- a/_posts/2007-12-17-my-new-startup.html +++ b/_posts/2007-12-17-my-new-startup.html @@ -3,6 +3,7 @@ layout: post title: My new startup tags: - miscellaneous +nodeid: 144 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.
diff --git a/_posts/2007-12-18-comparing-ironpython-and-cpython.html b/_posts/2007-12-18-comparing-ironpython-and-cpython.html index 21ab5be..66edd89 100644 --- a/_posts/2007-12-18-comparing-ironpython-and-cpython.html +++ b/_posts/2007-12-18-comparing-ironpython-and-cpython.html @@ -4,6 +4,7 @@ title: Comparing IronPython and CPython tags: - mono - software development +nodeid: 146 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).
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 index 8604d33..331521a 100644 --- a/_posts/2007-12-18-what-a-heaping-pile-of-fail.html +++ b/_posts/2007-12-18-what-a-heaping-pile-of-fail.html @@ -4,6 +4,7 @@ title: What a heaping pile of FAIL. tags: - cocoa - miscellaneous +nodeid: 145 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.
diff --git a/_posts/2007-12-31-sxswi-and-me.html b/_posts/2007-12-31-sxswi-and-me.html index 0397ae6..d3a01fe 100644 --- a/_posts/2007-12-31-sxswi-and-me.html +++ b/_posts/2007-12-31-sxswi-and-me.html @@ -6,6 +6,7 @@ tags: - slide - miscellaneous - facebook +nodeid: 148 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)
diff --git a/_posts/2008-01-05-perforce-backups-revisited.html b/_posts/2008-01-05-perforce-backups-revisited.html index 5a8a9eb..afcf1f5 100644 --- a/_posts/2008-01-05-perforce-backups-revisited.html +++ b/_posts/2008-01-05-perforce-backups-revisited.html @@ -4,6 +4,7 @@ title: Perforce Backups, Revisited. tags: - miscellaneous - software development +nodeid: 149 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.
diff --git a/_posts/2008-01-06-just-curious.html b/_posts/2008-01-06-just-curious.html index 4a42e72..9a422c0 100644 --- a/_posts/2008-01-06-just-curious.html +++ b/_posts/2008-01-06-just-curious.html @@ -3,6 +3,7 @@ layout: post title: Just Curious tags: - miscellaneous +nodeid: 150 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 index 21ff8a6..d5ae2de 100644 --- a/_posts/2008-01-23-five-and-seven-zeroes-is-big.html +++ b/_posts/2008-01-23-five-and-seven-zeroes-is-big.html @@ -4,6 +4,7 @@ title: Five and Seven Zeroes is Big. tags: - slide - facebook +nodeid: 153 created: 1201084170 --- It was recently announced that Slide (this little start-up that I work for) raised some more money. Neato.
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 index 6ec5462..3d4eda9 100644 --- a/_posts/2008-01-23-your-voice-interface-is-fucking-stupid.html +++ b/_posts/2008-01-23-your-voice-interface-is-fucking-stupid.html @@ -3,6 +3,7 @@ layout: post title: Your "voice interface" is fucking stupid. tags: - opinion +nodeid: 154 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.
diff --git a/_posts/2008-01-26-fbrubbar-chikken.html b/_posts/2008-01-26-fbrubbar-chikken.html index a05c836..d3c649b 100644 --- a/_posts/2008-01-26-fbrubbar-chikken.html +++ b/_posts/2008-01-26-fbrubbar-chikken.html @@ -4,6 +4,7 @@ title: tags: - slide - facebook +nodeid: 156 created: 1201420542 ---
Courtesy of Adonomics


diff --git a/_posts/2008-01-28-sigsegv-in-my-brane.html b/_posts/2008-01-28-sigsegv-in-my-brane.html index 111a6e1..41f9267 100644 --- a/_posts/2008-01-28-sigsegv-in-my-brane.html +++ b/_posts/2008-01-28-sigsegv-in-my-brane.html @@ -4,6 +4,7 @@ title: SIGSEGV in my brane. tags: - opinion - miscellaneous +nodeid: 157 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.
diff --git a/_posts/2008-02-01-are-free-gifts-still-gifts.html b/_posts/2008-02-01-are-free-gifts-still-gifts.html index c80e85c..a14c2c9 100644 --- a/_posts/2008-02-01-are-free-gifts-still-gifts.html +++ b/_posts/2008-02-01-are-free-gifts-still-gifts.html @@ -4,6 +4,7 @@ title: Are Free Gifts Still Gifts? tags: - opinion - facebook +nodeid: 158 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:
diff --git a/_posts/2008-02-02-on-funding-my-startup.html b/_posts/2008-02-02-on-funding-my-startup.html index fcfc99a..baeac09 100644 --- a/_posts/2008-02-02-on-funding-my-startup.html +++ b/_posts/2008-02-02-on-funding-my-startup.html @@ -4,6 +4,7 @@ title: On funding my startup tags: - opinion - miscellaneous +nodeid: 159 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, Inc announced 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.
diff --git a/_posts/2008-02-03-tips-for-beginning-facebook-developers.html b/_posts/2008-02-03-tips-for-beginning-facebook-developers.html index 13b39d6..d4dac79 100644 --- a/_posts/2008-02-03-tips-for-beginning-facebook-developers.html +++ b/_posts/2008-02-03-tips-for-beginning-facebook-developers.html @@ -5,6 +5,7 @@ tags: - slide - software development - facebook +nodeid: 160 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.
diff --git a/_posts/2008-02-03-trying-out-adsense.html b/_posts/2008-02-03-trying-out-adsense.html index cf763e3..ba1e396 100644 --- a/_posts/2008-02-03-trying-out-adsense.html +++ b/_posts/2008-02-03-trying-out-adsense.html @@ -3,6 +3,7 @@ layout: post title: Trying out AdSense tags: - miscellaneous +nodeid: 161 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.
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 index a2f53e5..f422256 100644 --- a/_posts/2008-02-04-more-tips-for-beginning-facebook-developers.html +++ b/_posts/2008-02-04-more-tips-for-beginning-facebook-developers.html @@ -4,6 +4,7 @@ title: More Tips for Beginning Facebook Developers tags: - software development - facebook +nodeid: 162 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.
diff --git a/_posts/2008-02-16-speaking-at-graphing-social-patterns.html b/_posts/2008-02-16-speaking-at-graphing-social-patterns.html index a8d1428..0b78f77 100644 --- a/_posts/2008-02-16-speaking-at-graphing-social-patterns.html +++ b/_posts/2008-02-16-speaking-at-graphing-social-patterns.html @@ -4,6 +4,7 @@ title: Speaking at Graphing Social Patterns tags: - slide - facebook +nodeid: 163 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.
diff --git a/_posts/2008-02-17-facebooks-bleeding-edge.html b/_posts/2008-02-17-facebooks-bleeding-edge.html index edde096..d279a64 100644 --- a/_posts/2008-02-17-facebooks-bleeding-edge.html +++ b/_posts/2008-02-17-facebooks-bleeding-edge.html @@ -4,6 +4,7 @@ title: Facebook's Bleeding Edge tags: - slide - facebook +nodeid: 166 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.
diff --git a/_posts/2008-02-17-upgraded-to-drupal-6-0.html b/_posts/2008-02-17-upgraded-to-drupal-6-0.html index 27c6399..6cf6824 100644 --- a/_posts/2008-02-17-upgraded-to-drupal-6-0.html +++ b/_posts/2008-02-17-upgraded-to-drupal-6-0.html @@ -3,6 +3,7 @@ layout: post title: Upgraded to Drupal 6.0 tags: - miscellaneous +nodeid: 164 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.
diff --git a/_posts/2008-02-23-i-hate-mac-os-x.html b/_posts/2008-02-23-i-hate-mac-os-x.html index 5b4390c..2cf9213 100644 --- a/_posts/2008-02-23-i-hate-mac-os-x.html +++ b/_posts/2008-02-23-i-hate-mac-os-x.html @@ -5,6 +5,7 @@ tags: - cocoa - opinion - software development +nodeid: 167 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.
diff --git a/_posts/2008-02-24-graphing-social-appnite.html b/_posts/2008-02-24-graphing-social-appnite.html index f31b6a4..203637f 100644 --- a/_posts/2008-02-24-graphing-social-appnite.html +++ b/_posts/2008-02-24-graphing-social-appnite.html @@ -4,6 +4,7 @@ title: Graphing Social AppNite tags: - slide - facebook +nodeid: 168 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.
diff --git a/_posts/2008-03-17-gsp-west-and-sxsw-2008.html b/_posts/2008-03-17-gsp-west-and-sxsw-2008.html index 27e62ec..7e8fed9 100644 --- a/_posts/2008-03-17-gsp-west-and-sxsw-2008.html +++ b/_posts/2008-03-17-gsp-west-and-sxsw-2008.html @@ -4,6 +4,7 @@ title: GSP West and SXSW 2008 tags: - slide - facebook +nodeid: 169 created: 1205745848 --- It's been almost a whole entire week since I left Austin, but it certainly seems better late than never.
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 index 124fa46..a113cbc 100644 --- a/_posts/2008-03-21-javascript-wonks-missing-after-property-id.html +++ b/_posts/2008-03-21-javascript-wonks-missing-after-property-id.html @@ -6,6 +6,7 @@ tags: - miscellaneous - software development - javascript +nodeid: 170 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).
diff --git a/_posts/2008-03-24-srsly-ur-doin-it-wrong.html b/_posts/2008-03-24-srsly-ur-doin-it-wrong.html index 2c8f0de..20c2c0a 100644 --- a/_posts/2008-03-24-srsly-ur-doin-it-wrong.html +++ b/_posts/2008-03-24-srsly-ur-doin-it-wrong.html @@ -5,6 +5,7 @@ tags: - opinion - software development - javascript +nodeid: 173 created: 1206357533 --- Via twitter I have been griping a bit about Javascript 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.
diff --git a/_posts/2008-03-26-dashboard-for-linux-users.html b/_posts/2008-03-26-dashboard-for-linux-users.html index f2a80b1..370c97b 100644 --- a/_posts/2008-03-26-dashboard-for-linux-users.html +++ b/_posts/2008-03-26-dashboard-for-linux-users.html @@ -4,6 +4,7 @@ title: Dashboard for Linux users tags: - miscellaneous - linux +nodeid: 174 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. Pidgin in Gnome 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.
diff --git a/_posts/2008-04-02-data-binding-with-jquery.html b/_posts/2008-04-02-data-binding-with-jquery.html index c8a4b08..1539dc5 100644 --- a/_posts/2008-04-02-data-binding-with-jquery.html +++ b/_posts/2008-04-02-data-binding-with-jquery.html @@ -5,6 +5,7 @@ tags: - slide - miscellaneous - javascript +nodeid: 175 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.
diff --git a/_posts/2008-04-07-a-few-changes.html b/_posts/2008-04-07-a-few-changes.html index 707752d..5b7a483 100644 --- a/_posts/2008-04-07-a-few-changes.html +++ b/_posts/2008-04-07-a-few-changes.html @@ -3,6 +3,7 @@ layout: post title: A few changes tags: - miscellaneous +nodeid: 176 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.
diff --git a/_posts/2008-04-08-hi5-goes-100.html b/_posts/2008-04-08-hi5-goes-100.html index d73d6ab..3659956 100644 --- a/_posts/2008-04-08-hi5-goes-100.html +++ b/_posts/2008-04-08-hi5-goes-100.html @@ -3,6 +3,7 @@ layout: post title: "Hi5 goes 100% " tags: - slide +nodeid: 177 created: 1207661994 --- Lou Moore and Hi5 haz a platfurmIt'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.
diff --git a/_posts/2008-04-13-an-informal-poll.html b/_posts/2008-04-13-an-informal-poll.html index dc944ed..787b2c3 100644 --- a/_posts/2008-04-13-an-informal-poll.html +++ b/_posts/2008-04-13-an-informal-poll.html @@ -3,6 +3,7 @@ layout: post title: An informal poll tags: - miscellaneous +nodeid: 178 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".
diff --git a/_posts/2008-05-03-parsing-html-with-python.html b/_posts/2008-05-03-parsing-html-with-python.html index 4812885..6963b4e 100644 --- a/_posts/2008-05-03-parsing-html-with-python.html +++ b/_posts/2008-05-03-parsing-html-with-python.html @@ -5,6 +5,7 @@ tags: - slide - miscellaneous - software development +nodeid: 180 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.
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 index 0567837..4623bfe 100644 --- a/_posts/2008-05-04-nant-and-asp-net-on-mono.html +++ b/_posts/2008-05-04-nant-and-asp-net-on-mono.html @@ -5,6 +5,7 @@ tags: - mono - miscellaneous - software development +nodeid: 181 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.
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 index 402d789..31a0f66 100644 --- 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 @@ -6,6 +6,7 @@ tags: - opinion - software development - git +nodeid: 182 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)).
diff --git a/_posts/2008-07-30-lets-swap-ipods.html b/_posts/2008-07-30-lets-swap-ipods.html index dba7e3c..1088b8b 100644 --- a/_posts/2008-07-30-lets-swap-ipods.html +++ b/_posts/2008-07-30-lets-swap-ipods.html @@ -4,6 +4,7 @@ title: Let's Swap iPods. tags: - miscellaneous - media +nodeid: 183 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.
diff --git a/_posts/2008-08-20-one-line-automated-testing.html b/_posts/2008-08-20-one-line-automated-testing.html index 00c5463..73e46d2 100644 --- a/_posts/2008-08-20-one-line-automated-testing.html +++ b/_posts/2008-08-20-one-line-automated-testing.html @@ -6,6 +6,7 @@ tags: - opinion - software development - hudson +nodeid: 184 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.
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 index 9ba0128..0be9e10 100644 --- a/_posts/2008-09-06-don-quixotes-new-side-kick-hudson.html +++ b/_posts/2008-09-06-don-quixotes-new-side-kick-hudson.html @@ -5,6 +5,7 @@ tags: - slide - software development - hudson +nodeid: 185 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!).
diff --git a/_posts/2008-09-11-resurgange-of-the-shell.html b/_posts/2008-09-11-resurgange-of-the-shell.html index e56fd7d..3850178 100644 --- a/_posts/2008-09-11-resurgange-of-the-shell.html +++ b/_posts/2008-09-11-resurgange-of-the-shell.html @@ -4,6 +4,7 @@ title: Resurgange of the shell. tags: - mono - javascript +nodeid: 186 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.
diff --git a/_posts/2008-09-15-lazily-loading-attributes.html b/_posts/2008-09-15-lazily-loading-attributes.html index 21e4c4a..fa0ba57 100644 --- a/_posts/2008-09-15-lazily-loading-attributes.html +++ b/_posts/2008-09-15-lazily-loading-attributes.html @@ -5,6 +5,7 @@ tags: - mono - miscellaneous - javascript +nodeid: 187 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:
 Dia FTW

diff --git a/_posts/2008-09-16-chase-auto-finance-fail.html b/_posts/2008-09-16-chase-auto-finance-fail.html index 9d3eebe..4a0d31a 100644 --- a/_posts/2008-09-16-chase-auto-finance-fail.html +++ b/_posts/2008-09-16-chase-auto-finance-fail.html @@ -3,6 +3,7 @@ layout: post title: Chase Auto-Finance FAIL. tags: - opinion +nodeid: 188 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).
diff --git a/_posts/2008-09-18-hudson-notifications-with-libnotify.html b/_posts/2008-09-18-hudson-notifications-with-libnotify.html index 8f7be16..8b85136 100644 --- a/_posts/2008-09-18-hudson-notifications-with-libnotify.html +++ b/_posts/2008-09-18-hudson-notifications-with-libnotify.html @@ -6,6 +6,7 @@ tags: - software development - linux - hudson +nodeid: 189 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.
diff --git a/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html b/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html index 4fb4dca..f2dab85 100644 --- a/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html +++ b/_posts/2008-09-19-facebook-be-riddled-with-swashbucklers.html @@ -3,6 +3,7 @@ layout: post title: Facebook be riddled with swashbucklers! tags: - facebook +nodeid: 190 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)
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 index 12c228e..4319119 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 191 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.
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 index 5c8e327..a2e3cff 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 192 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.
diff --git a/_posts/2008-10-04-hudson-build-bookmarklet.html b/_posts/2008-10-04-hudson-build-bookmarklet.html index a89c2a4..8ed18c1 100644 --- a/_posts/2008-10-04-hudson-build-bookmarklet.html +++ b/_posts/2008-10-04-hudson-build-bookmarklet.html @@ -5,6 +5,7 @@ tags: - miscellaneous - software development - hudson +nodeid: 193 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.
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 index 0280ed7..51f85d5 100644 --- 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 @@ -4,6 +4,7 @@ title: I hate it when The Onion is factual. tags: - opinion - miscellaneous +nodeid: 194 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.
diff --git a/_posts/2008-11-05-reliable-locks-in-hudson.html b/_posts/2008-11-05-reliable-locks-in-hudson.html index aacedd5..8811253 100644 --- a/_posts/2008-11-05-reliable-locks-in-hudson.html +++ b/_posts/2008-11-05-reliable-locks-in-hudson.html @@ -4,6 +4,7 @@ title: Reliable Locks in Hudson tags: - slide - hudson +nodeid: 195 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

diff --git a/_posts/2008-11-22-delightfully-wrong-about-git.html b/_posts/2008-11-22-delightfully-wrong-about-git.html index 67d0050..521ce4f 100644 --- a/_posts/2008-11-22-delightfully-wrong-about-git.html +++ b/_posts/2008-11-22-delightfully-wrong-about-git.html @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 196 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.

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 index ea28e92..6db50e4 100644 --- a/_posts/2008-11-23-git-integration-with-hudson-and-trac.html +++ b/_posts/2008-11-23-git-integration-with-hudson-and-trac.html @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 197 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?

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 index 1cdf835..3a9d471 100644 --- 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 @@ -4,6 +4,7 @@ title: "Git Protip: Stash the goods yo (git stash)" tags: - slide - git +nodeid: 199 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.
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 index 6809231..cfa8909 100644 --- a/_posts/2008-11-24-why-we-chose-git-a-rebuttal.html +++ b/_posts/2008-11-24-why-we-chose-git-a-rebuttal.html @@ -6,6 +6,7 @@ tags: - opinion - software development - git +nodeid: 198 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]"
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 index 62b016f..f56e554 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 200 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.
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 index 38998f6..7d96df8 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 201 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.
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 index 2be9e3f..0d7a3db 100644 --- 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 @@ -7,6 +7,7 @@ tags: - software development - linux - git +nodeid: 202 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.
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 index 2f3866d..bf3522e 100644 --- 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 @@ -4,6 +4,7 @@ title: Extremely brief review of the Nokia n810 tags: - opinion - linux +nodeid: 203 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!)
diff --git a/_posts/2009-01-05-find-me-on-github-rtyler.html b/_posts/2009-01-05-find-me-on-github-rtyler.html index df0a1f1..5de8425 100644 --- a/_posts/2009-01-05-find-me-on-github-rtyler.html +++ b/_posts/2009-01-05-find-me-on-github-rtyler.html @@ -6,6 +6,7 @@ tags: - miscellaneous - software development - git +nodeid: 204 created: 1231149866 --- Rod reminded me with his comment in one of my other posts that I've not yet mentioned github.
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 index 64c6671..61f1d3f 100644 --- a/_posts/2009-01-12-but-who-will-write-the-tests.html +++ b/_posts/2009-01-12-but-who-will-write-the-tests.html @@ -5,6 +5,7 @@ tags: - slide - software development - hudson +nodeid: 206 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.
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 index f976c73..a459be6 100644 --- 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 @@ -4,6 +4,7 @@ title: "Proposal: Imuse, an IMAP-capable FUSE filesystem" tags: - miscellaneous - software development +nodeid: 205 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.
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 index 54a1512..9b0c8da 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 207 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.
diff --git a/_posts/2009-01-26-amazon-sucks-too.html b/_posts/2009-01-26-amazon-sucks-too.html index af66ec2..75651eb 100644 --- a/_posts/2009-01-26-amazon-sucks-too.html +++ b/_posts/2009-01-26-amazon-sucks-too.html @@ -3,6 +3,7 @@ layout: post title: Amazon Sucks Too tags: - opinion +nodeid: 209 created: 1233037275 --- On the topic of online shopping "sucking", I have been sitting on this beautiful screenshot for a while.
diff --git a/_posts/2009-01-26-old-navy-sucks.html b/_posts/2009-01-26-old-navy-sucks.html index 50cc6ca..5ab3f7b 100644 --- a/_posts/2009-01-26-old-navy-sucks.html +++ b/_posts/2009-01-26-old-navy-sucks.html @@ -3,6 +3,7 @@ layout: post title: Old Navy Sucks. tags: - opinion +nodeid: 208 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.
diff --git a/_posts/2009-03-05-head-in-the-clouds.html b/_posts/2009-03-05-head-in-the-clouds.html index e232128..956ab5d 100644 --- a/_posts/2009-03-05-head-in-the-clouds.html +++ b/_posts/2009-03-05-head-in-the-clouds.html @@ -5,6 +5,7 @@ tags: - slide - software development - hudson +nodeid: 211 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).
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 index 21091aa..53a1eee 100644 --- 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 @@ -5,6 +5,7 @@ tags: - slide - software development - git +nodeid: 212 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.
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 index 96354d6..1bec331 100644 --- a/_posts/2009-03-09-v8-and-fastcgi-exploring-an-idea.html +++ b/_posts/2009-03-09-v8-and-fastcgi-exploring-an-idea.html @@ -5,6 +5,7 @@ tags: - miscellaneous - software development - javascript +nodeid: 213 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.
diff --git a/_posts/2009-03-13-do-not-fear-continuous-deployment.html b/_posts/2009-03-13-do-not-fear-continuous-deployment.html index 82a8a71..d21e72d 100644 --- a/_posts/2009-03-13-do-not-fear-continuous-deployment.html +++ b/_posts/2009-03-13-do-not-fear-continuous-deployment.html @@ -5,6 +5,7 @@ tags: - slide - software development - hudson +nodeid: 214 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.
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 index ffa8d76..09965ef 100644 --- 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 @@ -5,36 +5,37 @@ tags: - miscellaneous - software development - cheetah +nodeid: 215 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). - +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 index c83af8a..dca5ede 100644 --- a/_posts/2009-04-07-slide-open-source.markdown +++ b/_posts/2009-04-07-slide-open-source.markdown @@ -4,13 +4,14 @@ title: "Slide Open Source " tags: - slide - software development +nodeid: 216 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 ;) - +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 index feee164..7d58b0d 100644 --- a/_posts/2009-05-16-template-theory.markdown +++ b/_posts/2009-05-16-template-theory.markdown @@ -5,77 +5,78 @@ tags: - opinion - software development - cheetah +nodeid: 217 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 +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 index 9012b2f..1f5edd2 100644 --- a/_posts/2009-06-18-using-glibs-gtester-results-in-hudson.markdown +++ b/_posts/2009-06-18-using-glibs-gtester-results-in-hudson.markdown @@ -6,17 +6,18 @@ tags: - software development - linux - hudson +nodeid: 218 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. - +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 index 4cddc50..e9e8299 100644 --- a/_posts/2009-07-21-jython-jgit-and-co-in-hudson.markdown +++ b/_posts/2009-07-21-jython-jgit-and-co-in-hudson.markdown @@ -7,56 +7,57 @@ tags: - software development - git - hudson +nodeid: 219 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. - +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 index 310bb74..39cdf64 100644 --- a/_posts/2009-07-25-awesomely-bad.markdown +++ b/_posts/2009-07-25-awesomely-bad.markdown @@ -5,50 +5,51 @@ tags: - opinion - miscellaneous - linux +nodeid: 220 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. - +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 index aafee34..f0ffa09 100644 --- 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 @@ -5,75 +5,76 @@ tags: - slide - opinion - software development +nodeid: 221 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. - +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 index e98b050..ca866f4 100644 --- a/_posts/2009-08-10-im-a-cat-person-now.html +++ b/_posts/2009-08-10-im-a-cat-person-now.html @@ -3,6 +3,7 @@ layout: post title: I'm a cat person now. tags: - miscellaneous +nodeid: 223 created: 1249973118 ---
disregard the mismatched bedding, I'm told we're going to fix that

diff --git a/_posts/2009-08-10-investment-strategy-for-developers.markdown b/_posts/2009-08-10-investment-strategy-for-developers.markdown index cd0fce2..eac5f85 100644 --- a/_posts/2009-08-10-investment-strategy-for-developers.markdown +++ b/_posts/2009-08-10-investment-strategy-for-developers.markdown @@ -5,85 +5,86 @@ tags: - slide - opinion - software development +nodeid: 222 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. - +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 index debb950..b723972 100644 --- 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 @@ -4,6 +4,7 @@ title: Toying around with ASP.NET MVC and NAnt tags: - mono - miscellaneous +nodeid: 224 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.
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 index bd82042..b093d09 100644 --- 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 @@ -5,85 +5,86 @@ tags: - miscellaneous - software development - hudson +nodeid: 226 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 ---------------- - - +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 index 6c883ef..591eaaa 100644 --- 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 @@ -4,34 +4,35 @@ title: Crazysnake; IronPython and Java, just monkeying around tags: - mono - miscellaneous +nodeid: 230 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. - +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 index 7805d00..955ddce 100644 --- a/_posts/2009-10-13-ironwatin-mind-the-gap.markdown +++ b/_posts/2009-10-13-ironwatin-mind-the-gap.markdown @@ -6,41 +6,42 @@ tags: - slide - software development - hudson +nodeid: 231 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. - +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 index 5d8a0ea..3aa961f 100644 --- a/_posts/2009-10-19-my-journey-at-slide-part-1.markdown +++ b/_posts/2009-10-19-my-journey-at-slide-part-1.markdown @@ -5,101 +5,102 @@ tags: - slide - opinion - miscellaneous +nodeid: 232 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)** - +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 index a1a1dc8..5b32655 100644 --- a/_posts/2009-10-20-my-journey-at-slide-part-2.markdown +++ b/_posts/2009-10-20-my-journey-at-slide-part-2.markdown @@ -5,127 +5,128 @@ tags: - slide - opinion - miscellaneous +nodeid: 233 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. - -SuperPoke!'s Original Logo -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)** +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. + +SuperPoke!'s Original Logo +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 index 7ef50e9..7067100 100644 --- a/_posts/2009-10-22-my-journey-at-slide-part-3.markdown +++ b/_posts/2009-10-22-my-journey-at-slide-part-3.markdown @@ -5,143 +5,144 @@ tags: - slide - opinion - miscellaneous +nodeid: 234 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. - - +*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 index 12ca8e5..43ed61a 100644 --- a/_posts/2009-10-23-daniel-felt-left-out.html +++ b/_posts/2009-10-23-daniel-felt-left-out.html @@ -3,6 +3,7 @@ layout: post title: Daniel felt left out. tags: - slide +nodeid: 236 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 index 0bd2440..23cb12d 100644 --- a/_posts/2009-10-23-end-of-a-journey.markdown +++ b/_posts/2009-10-23-end-of-a-journey.markdown @@ -5,49 +5,50 @@ tags: - slide - opinion - miscellaneous +nodeid: 235 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. - +*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 index a663e49..ef90b5a 100644 --- a/_posts/2009-11-03-do-you-love-git-too.markdown +++ b/_posts/2009-11-03-do-you-love-git-too.markdown @@ -3,8 +3,9 @@ layout: post title: Do you love Git too? tags: - git +nodeid: 237 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. - +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 index 7dc8a0e..775e1f4 100644 --- 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 @@ -5,31 +5,32 @@ tags: - software development - git - python +nodeid: 239 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. +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 index 2da311a..3e0cd27 100644 --- a/_posts/2009-12-04-server-side-image-transforms-in-python.markdown +++ b/_posts/2009-12-04-server-side-image-transforms-in-python.markdown @@ -5,14 +5,15 @@ tags: - miscellaneous - software development - python +nodeid: 240 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: - +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 index 1052056..0239e2a 100644 --- 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 @@ -4,156 +4,157 @@ title: Code Review with Gerrit, a mostly visual guide tags: - software development - git +nodeid: 241 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 :) +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 index c403c9c..05018cf 100644 --- 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 @@ -4,9 +4,10 @@ title: Python/JSON Eat/Drink-up in San Francisco tags: - miscellaneous - python +nodeid: 242 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! - +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 index 3371b32..e74beb3 100644 --- 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 @@ -3,13 +3,14 @@ layout: post title: Get out there and buy (me) stuff tags: - miscellaneous +nodeid: 243 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. +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 index 01d6bed..3602637 100644 --- a/_posts/2009-12-17-pyrage-generic-exceptions.markdown +++ b/_posts/2009-12-17-pyrage-generic-exceptions.markdown @@ -5,38 +5,39 @@ tags: - opinion - software development - python +nodeid: 244 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! - +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 index 4014e78..b0f2e29 100644 --- a/_posts/2009-12-19-one-year-of-cheetah.markdown +++ b/_posts/2009-12-19-one-year-of-cheetah.markdown @@ -5,57 +5,58 @@ tags: - software development - cheetah - python +nodeid: 245 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 +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 index 1221293..8b9ce03 100644 --- a/_posts/2009-12-24-pyrage-from-toolbox-import-hammer.markdown +++ b/_posts/2009-12-24-pyrage-from-toolbox-import-hammer.markdown @@ -5,67 +5,68 @@ tags: - opinion - software development - python +nodeid: 246 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! - +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 index 18010ce..5378212 100644 --- a/_posts/2009-12-26-using-cheetah-templates-with-django.markdown +++ b/_posts/2009-12-26-using-cheetah-templates-with-django.markdown @@ -5,41 +5,42 @@ tags: - software development - cheetah - python +nodeid: 247 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). - +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 index dc0f7ef..c6e66e7 100644 --- a/_posts/2009-12-27-5-tips-for-traveling-with-tux.markdown +++ b/_posts/2009-12-27-5-tips-for-traveling-with-tux.markdown @@ -4,77 +4,78 @@ title: 5 tips for traveling with Tux tags: - opinion - linux +nodeid: 248 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. - +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 index 8c0f62e..231e807 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: And now a video of my cat being obnoxious tags: - miscellaneous +nodeid: 249 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.
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 index f5fe315..e459666 100644 --- a/_posts/2009-12-27-on-being-a-good-house-guest.markdown +++ b/_posts/2009-12-27-on-being-a-good-house-guest.markdown @@ -3,70 +3,71 @@ layout: post title: On being a good house guest tags: - opinion +nodeid: 250 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. - +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 index 5e74193..35ef310 100644 --- a/_posts/2009-12-28-angry-tweeter.markdown +++ b/_posts/2009-12-28-angry-tweeter.markdown @@ -4,49 +4,50 @@ title: Angry Tweeter tags: - opinion - miscellaneous +nodeid: 252 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. - - +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 index d1bb77e..8307d44 100644 --- 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 @@ -5,56 +5,57 @@ tags: - software development - git - hudson +nodeid: 254 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` - +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 index 71ad5a7..f369d55 100644 --- a/_posts/2010-01-04-new-years-python-meme.markdown +++ b/_posts/2010-01-04-new-years-python-meme.markdown @@ -3,27 +3,28 @@ layout: post title: New Year's Python Meme tags: - python +nodeid: 255 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. +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 index 620c7dd..fb18e93 100644 --- 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 @@ -3,20 +3,21 @@ layout: post title: The one where I gush about Contegix. tags: - opinion +nodeid: 256 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:* +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 index b3dbdf4..cdaa45b 100644 --- a/_posts/2010-01-15-book-of-elies.markdown +++ b/_posts/2010-01-15-book-of-elies.markdown @@ -3,13 +3,14 @@ layout: post title: Book of Elies tags: - opinion +nodeid: 257 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. - +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 index e030053..8c78628 100644 --- a/_posts/2010-01-16-virtual-hosting-with-haproxy-and-wsgi.markdown +++ b/_posts/2010-01-16-virtual-hosting-with-haproxy-and-wsgi.markdown @@ -5,83 +5,84 @@ tags: - software development - linux - python +nodeid: 258 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 +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 index 44a6a7c..0a066a4 100644 --- a/_posts/2010-01-18-thread-safety-assumptions-in-django.markdown +++ b/_posts/2010-01-18-thread-safety-assumptions-in-django.markdown @@ -5,13 +5,14 @@ tags: - opinion - software development - python +nodeid: 259 created: 1263878606 --- -These days, the majority of my day job revolves around working with Apture's Django-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. - +These days, the majority of my day job revolves around working with Apture's Django-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 index 18cb8f0..c3d5616 100644 --- a/_posts/2010-01-20-better-faster-stronger.markdown +++ b/_posts/2010-01-20-better-faster-stronger.markdown @@ -3,8 +3,9 @@ layout: post title: Better, Faster, Stronger tags: - software development +nodeid: 260 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. - +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 index 1fd64f5..6380825 100644 --- a/_posts/2010-01-20-unsubstantiated-rumors-about-apture-and-facebook.markdown +++ b/_posts/2010-01-20-unsubstantiated-rumors-about-apture-and-facebook.markdown @@ -4,21 +4,22 @@ title: Unsubstantiated Rumors about Apture and Facebook tags: - opinion - miscellaneous +nodeid: 261 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:** -
A shadowy figure in a black Northface jacket has been spotted lingering around 539 Bryant St in San Francisco
- -**Unsubstantiated Rumor #2:** -
Apture's CTO is seen regularly in Palo Alto
- -**Unsubstantiated Rumor #3:** -
Apture employees were issued company Adidas sandals last December
- -**Unsubstantiated Rumor #4:** -
Mark Zuckerberg and Tristan Harris talk regularly at meetings of the Bay Area Strip-Parcheesi Club in Redwood City
- -**Unsubstantiated Rumor #5:** +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:** +
A shadowy figure in a black Northface jacket has been spotted lingering around 539 Bryant St in San Francisco
+ +**Unsubstantiated Rumor #2:** +
Apture's CTO is seen regularly in Palo Alto
+ +**Unsubstantiated Rumor #3:** +
Apture employees were issued company Adidas sandals last December
+ +**Unsubstantiated Rumor #4:** +
Mark Zuckerberg and Tristan Harris talk regularly at meetings of the Bay Area Strip-Parcheesi Club in Redwood City
+ +**Unsubstantiated Rumor #5:**
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 index 0f3f908..d2acfdd 100644 --- 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 @@ -4,62 +4,63 @@ title: "Using a browser to piss off IRC users, or, spamming #redditdowntime" tags: - miscellaneous - software development +nodeid: 262 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: - - - - - - - +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 index 2280377..456b556 100644 --- a/_posts/2010-01-30-mourning-sun.markdown +++ b/_posts/2010-01-30-mourning-sun.markdown @@ -5,20 +5,21 @@ tags: - opinion - software development - hudson +nodeid: 263 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: +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 index 27b9b71..69f956c 100644 --- a/_posts/2010-02-09-i-hope-you-bump-your-head.markdown +++ b/_posts/2010-02-09-i-hope-you-bump-your-head.markdown @@ -3,23 +3,24 @@ layout: post title: I hope you bump your head tags: - opinion +nodeid: 264 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. - +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 index a99ab1c..9792bd6 100644 --- a/_posts/2010-02-10-writing-for-multiple-blogs.markdown +++ b/_posts/2010-02-10-writing-for-multiple-blogs.markdown @@ -4,19 +4,20 @@ title: Writing for multiple blogs tags: - miscellaneous - software development +nodeid: 265 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/) - +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 index d2a9780..39f1ceb 100644 --- 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 @@ -3,66 +3,67 @@ layout: post title: Building a game for ET. Day 1 with Pygame tags: - python +nodeid: 266 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) - +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 index 95991ec..e463372 100644 --- a/_posts/2010-02-16-presidents-day-in-photos.markdown +++ b/_posts/2010-02-16-presidents-day-in-photos.markdown @@ -3,17 +3,18 @@ layout: post title: President's Day in Photos tags: - photos +nodeid: 268 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. - -
That's new
-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. - -
Leela and Zoidberg (Kid Robot figures)
-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). - - -
Twin Peaks shrouded in cloudery
-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. - +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. + +
That's new
+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. + +
Leela and Zoidberg (Kid Robot figures)
+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). + + +
Twin Peaks shrouded in cloudery
+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 index fd24d13..71f82e0 100644 --- 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 @@ -3,6 +3,7 @@ layout: post title: Yes, that is hair on my chin tags: - miscellaneous +nodeid: 267 created: 1266360300 --- And it's taken an eternity to graduate from "adorable peach fuzz" to "smudge of dirt" status, so leave me alone.
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 index 957855b..c3c2499 100644 --- a/_posts/2010-02-21-supporting-python-3-is-a-ghetto.markdown +++ b/_posts/2010-02-21-supporting-python-3-is-a-ghetto.markdown @@ -5,41 +5,42 @@ tags: - software development - cheetah - python +nodeid: 269 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. - +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 index 5702dbc..f6dfdab 100644 --- a/_posts/2010-02-23-arent-we-just-adorable.markdown +++ b/_posts/2010-02-23-arent-we-just-adorable.markdown @@ -4,9 +4,10 @@ title: Aren't we just adorable tags: - miscellaneous - photos +nodeid: 271 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. - -
There's a bit of a height difference
+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. + +
There's a bit of a height difference
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 index 0efb0a8..d00ee84 100644 --- 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 @@ -4,52 +4,53 @@ title: If you want a viral license, use the GPL tags: - opinion - python +nodeid: 270 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. - +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 index 10e39fd..7260b2e 100644 --- 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 @@ -5,47 +5,48 @@ tags: - opinion - software development - python +nodeid: 272 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! - +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 index d4711e6..9bf28e6 100644 --- a/_posts/2010-03-01-programming-as-an-objective-art.markdown +++ b/_posts/2010-03-01-programming-as-an-objective-art.markdown @@ -5,61 +5,62 @@ tags: - opinion - miscellaneous - software development +nodeid: 273 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. - +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 index 96ccd5b..e046cc0 100644 --- a/_posts/2010-03-05-hypocrites-on-bikes.markdown +++ b/_posts/2010-03-05-hypocrites-on-bikes.markdown @@ -3,25 +3,26 @@ layout: post title: Hypocrites on Bikes! tags: - opinion +nodeid: 274 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. - +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 index 9d3d4fe..e1988ab 100644 --- a/_posts/2010-03-23-sometimes-software-as-a-service-sucks.markdown +++ b/_posts/2010-03-23-sometimes-software-as-a-service-sucks.markdown @@ -5,20 +5,21 @@ tags: - opinion - software development - hudson +nodeid: 275 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. - +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 index 580ce19..5bffbcf 100644 --- a/_posts/2010-04-02-a-rebase-based-workflow.markdown +++ b/_posts/2010-04-02-a-rebase-based-workflow.markdown @@ -4,49 +4,50 @@ title: A rebase-based workflow tags: - software development - git +nodeid: 276 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. - +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 index f065047..e7d27ea 100644 --- 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 @@ -3,23 +3,24 @@ layout: post title: A great platform does not make yours a good product tags: - opinion +nodeid: 277 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. - +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 index e7a85ce..38bc065 100644 --- a/_posts/2010-04-24-regarding-blippy.markdown +++ b/_posts/2010-04-24-regarding-blippy.markdown @@ -3,11 +3,12 @@ layout: post title: Regarding Blippy tags: - opinion +nodeid: 279 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. - - +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 index bf9a2e4..4f315aa 100644 --- a/_posts/2010-04-28-san-francisco-transit-sucks.markdown +++ b/_posts/2010-04-28-san-francisco-transit-sucks.markdown @@ -3,19 +3,20 @@ layout: post title: San Francisco (Transit) Sucks tags: - opinion +nodeid: 280 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. - +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 index d8ad479..250ce66 100644 --- a/_posts/2010-04-30-be-a-libor.markdown +++ b/_posts/2010-04-30-be-a-libor.markdown @@ -7,31 +7,32 @@ tags: - software development - python - apture +nodeid: 281 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 - +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 index 14cbd00..e259283 100644 --- a/_posts/2010-05-07-how-to-using-avro-with-eventlet.markdown +++ b/_posts/2010-05-07-how-to-using-avro-with-eventlet.markdown @@ -5,164 +5,165 @@ tags: - software development - python - apture +nodeid: 282 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. - +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 index e0cee1c..5be69f6 100644 --- 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 @@ -4,18 +4,19 @@ title: Is programming with Twisted really as awful as it sounds? tags: - opinion - python +nodeid: 283 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. - +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 index 8772f34..7dd4ed0 100644 --- 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 @@ -5,23 +5,24 @@ tags: - cocoa - opinion - software development +nodeid: 284 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. - +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 index 95eae56..70d487b 100644 --- a/_posts/2010-05-17-i-get-lippy-when-i-drink.markdown +++ b/_posts/2010-05-17-i-get-lippy-when-i-drink.markdown @@ -3,23 +3,24 @@ layout: post title: I get lippy when I drink tags: - miscellaneous +nodeid: 285 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. - +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 index d224624..584271f 100644 --- a/_posts/2010-05-18-being-a-libor-addendum.markdown +++ b/_posts/2010-05-18-being-a-libor-addendum.markdown @@ -7,18 +7,19 @@ tags: - software development - python - apture +nodeid: 286 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. - +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 index 4a6ca98..1047162 100644 --- a/_posts/2010-06-06-another-video-of-the-cat.html +++ b/_posts/2010-06-06-another-video-of-the-cat.html @@ -3,6 +3,7 @@ layout: post title: Another video of the cat tags: - miscellaneous +nodeid: 287 created: 1275843600 ---

diff --git a/_posts/2010-06-14-keyboard-synergy.markdown b/_posts/2010-06-14-keyboard-synergy.markdown index e7cf7f7..3385587 100644 --- a/_posts/2010-06-14-keyboard-synergy.markdown +++ b/_posts/2010-06-14-keyboard-synergy.markdown @@ -4,18 +4,19 @@ title: Keyboard Synergy tags: - miscellaneous - linux +nodeid: 288 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 - +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 index 279f112..063fffe 100644 --- a/_posts/2010-06-22-silly-problems.markdown +++ b/_posts/2010-06-22-silly-problems.markdown @@ -3,23 +3,24 @@ layout: post title: Silly Problems tags: - opinion +nodeid: 289 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. - - +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 index 23a5b52..57a8a82 100644 --- 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 @@ -5,28 +5,29 @@ tags: - opinion - miscellaneous - photos +nodeid: 290 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. The 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. - -
The inlet
- ----- - -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. From the garage - -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 escape route - -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. +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. The 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. + +
The inlet
+ +---- + +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. From the garage + +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 escape route + +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 index 5c2c3f0..4c021a4 100644 --- a/_posts/2010-07-04-pride.markdown +++ b/_posts/2010-07-04-pride.markdown @@ -3,45 +3,46 @@ layout: post title: Pride tags: - opinion +nodeid: 291 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. - +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 index 15dc3d4..823374d 100644 --- a/_posts/2010-07-07-i-love-sonic-net-already.markdown +++ b/_posts/2010-07-07-i-love-sonic-net-already.markdown @@ -4,26 +4,27 @@ title: I love Sonic.net already tags: - opinion - miscellaneous +nodeid: 295 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: - +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 index 6e3f921..e5c65a4 100644 --- a/_posts/2010-07-11-lebron-james.markdown +++ b/_posts/2010-07-11-lebron-james.markdown @@ -3,40 +3,41 @@ layout: post title: LeBron James tags: - miscellaneous +nodeid: 296 created: 1278870690 --- -Saving this thread for posterity - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Saving this thread for posterity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_posts/2010-07-14-paw-paw.markdown b/_posts/2010-07-14-paw-paw.markdown index 06c41d6..97380fe 100644 --- a/_posts/2010-07-14-paw-paw.markdown +++ b/_posts/2010-07-14-paw-paw.markdown @@ -3,16 +3,17 @@ layout: post title: Paw paw? tags: - miscellaneous +nodeid: 297 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. - ----- - +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 index d304f94..7a46157 100644 --- 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 @@ -4,57 +4,58 @@ title: Unclog the tubes; blocking detection in Eventlet tags: - software development - python +nodeid: 298 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, +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 index 35fb558..843890c 100644 --- a/_posts/2010-08-30-whats-in-a-name.markdown +++ b/_posts/2010-08-30-whats-in-a-name.markdown @@ -4,27 +4,28 @@ title: What's in a name? tags: - opinion - miscellaneous +nodeid: 299 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. - +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 index cd5b578..41bf3b9 100644 --- a/_posts/2010-09-03-being-a-croy.markdown +++ b/_posts/2010-09-03-being-a-croy.markdown @@ -4,16 +4,17 @@ title: Being a Croy tags: - opinion - miscellaneous +nodeid: 300 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?" - - +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 index b6c24c2..9a1a6b6 100644 --- a/_posts/2010-11-04-so-im-married.markdown +++ b/_posts/2010-11-04-so-im-married.markdown @@ -3,20 +3,21 @@ layout: post title: So. I'm married. tags: - opinion +nodeid: 301 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. - - - +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 index a579d58..3734601 100644 --- a/_posts/2010-11-08-experimenting-with-reddits-self-serve-ads.markdown +++ b/_posts/2010-11-08-experimenting-with-reddits-self-serve-ads.markdown @@ -4,34 +4,35 @@ title: Experimenting with reddit's self-serve ads tags: - opinion - apture +nodeid: 302 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. - -Looking up 'Voyager' with Apture - -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:
-
Add more TIL to every thread on reddit with the Apture Highlights browser extension
- -(*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. - +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. + +Looking up 'Voyager' with Apture + +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:
+
Add more TIL to every thread on reddit with the Apture Highlights browser extension
+ +(*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 index 53d0f6e..839da9c 100644 --- a/_posts/2010-11-11-gnu-parallel-changed-my-life.markdown +++ b/_posts/2010-11-11-gnu-parallel-changed-my-life.markdown @@ -4,30 +4,31 @@ title: GNU/Parallel changed my life tags: - software development - linux +nodeid: 303 created: 1289497712 --- -The @Apture ElephantsOver 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 - -
- +The @Apture ElephantsOver 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 index 84f3ead..4d7fa26 100644 --- a/_posts/2010-12-06-ada-surely-you-jest-mr-pythonman.markdown +++ b/_posts/2010-12-06-ada-surely-you-jest-mr-pythonman.markdown @@ -5,67 +5,68 @@ tags: - opinion - software development - ada +nodeid: 304 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 :( - + +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 index 04a1192..23ac0a3 100644 --- a/_posts/2011-01-01-twenty-eleven.markdown +++ b/_posts/2011-01-01-twenty-eleven.markdown @@ -3,17 +3,18 @@ layout: post title: Twenty Eleven tags: - miscellaneous +nodeid: 305 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. - - -
Empress by Night
- +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. + + +
Empress by Night
+ diff --git a/_posts/2011-01-24-catch-me-at-scale.markdown b/_posts/2011-01-24-catch-me-at-scale.markdown index eace7b0..1d16f9d 100644 --- a/_posts/2011-01-24-catch-me-at-scale.markdown +++ b/_posts/2011-01-24-catch-me-at-scale.markdown @@ -3,21 +3,22 @@ layout: post title: Catch me at SCALE! tags: - linux +nodeid: 307 created: 1295895600 --- -
This is a cross-post from another silly blog I run calledOMG! SUSE!
- -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. - -
Tickets to SCALE!
- -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! - +
This is a cross-post from another silly blog I run calledOMG! SUSE!
+ +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. + +
Tickets to SCALE!
+ +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 index 9b274df..3b761da 100644 --- a/_posts/2011-01-24-s-a-d-seasonal-ada-disorder.markdown +++ b/_posts/2011-01-24-s-a-d-seasonal-ada-disorder.markdown @@ -5,51 +5,52 @@ tags: - opinion - software development - ada +nodeid: 306 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). - -
Old school
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 +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). + +
Old school
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 index 8b4ec71..5cfe53f 100644 --- a/_posts/2011-04-05-sent-from-my-iphone.markdown +++ b/_posts/2011-04-05-sent-from-my-iphone.markdown @@ -3,59 +3,60 @@ layout: post title: Sent from my iPhone tags: - opinion +nodeid: 308 created: 1302019200 --- -This gif is stupid - -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 -" 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. - +This gif is stupid + +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 +" 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 index f98e138..1a75303 100644 --- a/_posts/2011-04-25-new-light-on-dark-energy.markdown +++ b/_posts/2011-04-25-new-light-on-dark-energy.markdown @@ -5,39 +5,40 @@ tags: - opinion - academia - photos +nodeid: 309 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). - - -
Folks lining up for the Dark Energy panel
- -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. - -
Dark Energy seminar is FULL
- -During the Q&A session I managed to get up to a microphone to ask a softball -question to the panelists: "*If we could give you an infinite supply of funds -and grad students, what would you focus on to identify 'Dark Energy' in your -life time?*" Panelist Greg Aldering had a fantastic response that ellicited a -number of laughs and sad-pplause from the audience (paraphrased) "The concept -of infinite resources is more mind boggling to us than any of the stuff we've -talked about tonight." - - -The night was a blast, if you're in the Bay Area I highly recommend you check -out the [Friends of the Berkeley Lab](http://www.lbl.gov/LBL-PID/fobl/) -newsletter and attend some of their seminars and panels in the future. - - -SCIENCE! - - -([full flickr gallery here](http://www.flickr.com/photos/agentdero/sets/72157626580565494/)) - +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). + + +
Folks lining up for the Dark Energy panel
+ +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. + +
Dark Energy seminar is FULL
+ +During the Q&A session I managed to get up to a microphone to ask a softball +question to the panelists: "*If we could give you an infinite supply of funds +and grad students, what would you focus on to identify 'Dark Energy' in your +life time?*" Panelist Greg Aldering had a fantastic response that ellicited a +number of laughs and sad-pplause from the audience (paraphrased) "The concept +of infinite resources is more mind boggling to us than any of the stuff we've +talked about tonight." + + +The night was a blast, if you're in the Bay Area I highly recommend you check +out the [Friends of the Berkeley Lab](http://www.lbl.gov/LBL-PID/fobl/) +newsletter and attend some of their seminars and panels in the future. + + +SCIENCE! + + +([full flickr gallery here](http://www.flickr.com/photos/agentdero/sets/72157626580565494/)) + diff --git a/_posts/2011-05-15-learnings-week-19-2011.markdown b/_posts/2011-05-15-learnings-week-19-2011.markdown index d0f6ea0..a4a7245 100644 --- a/_posts/2011-05-15-learnings-week-19-2011.markdown +++ b/_posts/2011-05-15-learnings-week-19-2011.markdown @@ -3,12 +3,13 @@ layout: post title: Learnings Week 19 2011 tags: - learnings +nodeid: 310 created: 1305475200 --- -I saw this on another person's blog and I figured I'd give it a try. I've been keeping a note in [Evernote](http://www.evernote.com) this week with all the little interesting tidbits I've learned this week. Nothing major or ground-breaking, just little facts and snippets of information I was fortunate enough to absorb over the course of the week. - -* How to use "gemsets" with [RVM](https://rvm.beginrescueend.com/) effectively thanks to [this blog post](http://gillesfabio.com/blog/2011/03/01/rvm-for-pythonistas-virtualenv-for-rubyists/) which compares it with Python's [virtualenv](http://pypi.python.org/pypi/virtualenv) tool -* CalTrans runs a [Bike Shuttle](http://www.dot.ca.gov/dist4/shuttle.htm) from the MacArthur BART Station in the east bay to the Transbay Terminal in San Francisco during rush hour commute times. The cost, $1.00 (for reference Ashby -> Downtown SF is a $3.50 ticket) -* Provided you give Wells Fargo enough lead-time (about a week), they will order you a stack of $2 bills ($200) -* Using [elinks](http://elinks.or.cz/) with [Tor](https://www.torproject.org) is fast enough to make browsing with Tor not completely painful +I saw this on another person's blog and I figured I'd give it a try. I've been keeping a note in [Evernote](http://www.evernote.com) this week with all the little interesting tidbits I've learned this week. Nothing major or ground-breaking, just little facts and snippets of information I was fortunate enough to absorb over the course of the week. + +* How to use "gemsets" with [RVM](https://rvm.beginrescueend.com/) effectively thanks to [this blog post](http://gillesfabio.com/blog/2011/03/01/rvm-for-pythonistas-virtualenv-for-rubyists/) which compares it with Python's [virtualenv](http://pypi.python.org/pypi/virtualenv) tool +* CalTrans runs a [Bike Shuttle](http://www.dot.ca.gov/dist4/shuttle.htm) from the MacArthur BART Station in the east bay to the Transbay Terminal in San Francisco during rush hour commute times. The cost, $1.00 (for reference Ashby -> Downtown SF is a $3.50 ticket) +* Provided you give Wells Fargo enough lead-time (about a week), they will order you a stack of $2 bills ($200) +* Using [elinks](http://elinks.or.cz/) with [Tor](https://www.torproject.org) is fast enough to make browsing with Tor not completely painful * Most single-window WebKitGTK+ browsers (`vimprobable2` comes to mind) don't do proper certificate checking, making you extremely vulnerable to man-in-the-middle attacks, particularly with misbehaving exit nodes on Tor