unethical blogger - Opinion http://unethicalblogger.com/taxonomy/term/4/0 Opinion posts en S.A.D. - Seasonal Ada Disorder http://unethicalblogger.com/posts/2011/01/sad_seasonal_ada_disorder <p>Last Sunday, I announced the "0.1" release of my <a href="http://adacommons.org/Memcache">memcache-ada</a> project on <a href="http://groups.google.com/group/comp.lang.ada/browse_thread/thread/c70dc869310ffb51#">comp.lang.ada</a>, thus ending a 2 month experiment with the Ada programming language.</p> <p>In my <a href="http://unethicalblogger.com/posts/2010/12/ada_surely_you_jest_mr_pythonman">previous post</a> 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).</p> <p><center><img src="http://agentdero.cachefly.net/unethicalblogger.com/images/terminaloperator.png" alt="Old school"/><br><em>This is what my coworkers thought of me, learning Ada.</em></center></p> <p>All said and done I spent <em>less than</em> 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 <em>feel</em> for the language and the behavior of my library. <!--break--> 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.</p> <p>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.</p> <p>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.</p> http://unethicalblogger.com/posts/2011/01/sad_seasonal_ada_disorder#comments Ada Opinion Software Development Mon, 24 Jan 2011 15:00:00 +0000 R. Tyler Croy 306 at http://unethicalblogger.com Ada? Surely you jest Mr. Pythonman http://unethicalblogger.com/posts/2010/12/ada_surely_you_jest_mr_pythonman <p><a href="http://www.amazon.com/gp/product/0070116075?ie=UTF8&tag=unethicalblog-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0070116075"><img hspace="10" align="right" border="0" src="http://ecx.images-amazon.com/images/I/41HUUCwx7%2BL._SL160_.jpg"></a><img src="http://www.assoc-amazon.com/e/ir?t=unethicalblog-20&l=as2&o=1&a=0070116075" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> The past couple weeks I've been spending my <a href="http://bart.gov">BART</a> commutes learning the <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Ada_(programming_language)">Ada programming language</a>. 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 <strong>love</strong> 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 <strong>good</strong> 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".)</p> <p>Before you whip out the COBOL and Fortran jokes, I'd like to let it known up front that Ada is a <em>modern</em> language (as I <a href="http://www.reddit.com/r/programming/comments/eh462/ada_surely_you_jest_mr_pythonman/c181zqy">mentioned on reddit</a>, 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.</p> <h3>Incredibly strong typing</h3> <p>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 <code>int</code> and a <code>float</code> together without an issue, in Ada there's literally <strong>zero</strong> 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 <code>Integer</code> into a procedure that expects a <code>Float</code>, there will be no casting, the statement will error at compile time.</p> <h3>Concurrency built-in</h3> <p>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 <a href="http://www.amazon.com/gp/product/0521866979?ie=UTF8&tag=unethicalblog-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0521866979"><img border="0" hspace="10" align="right" src="http://ecx.images-amazon.com/images/I/41FMkfK74-L._SL160_.jpg"></a><img src="http://www.assoc-amazon.com/e/ir?t=unethicalblog-20&l=as2&o=1&a=0521866979" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> top of an OS level library (pthreads). In Ada this concept is called "<a href="https://secure.wikimedia.org/wikibooks/en/wiki/Ada_Programming/Tasking">tasking</a>" 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.</p> <p>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.</p> <p>For my first "big" project with Ada, I've been tinkering with a <a href="https://github.com/rtyler/memcache-ada">memcached client in Ada</a> 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 <strong><em>vastly</em></strong> different language than one that I've tried before.</p> <p>So stop picking on me you big meanies :( <!--break--></p> http://unethicalblogger.com/posts/2010/12/ada_surely_you_jest_mr_pythonman#comments Ada Opinion Software Development Mon, 06 Dec 2010 15:00:00 +0000 R. Tyler Croy 304 at http://unethicalblogger.com Experimenting with reddit's self-serve ads http://unethicalblogger.com/posts/2010/11/experimenting_reddits_selfserve_ads <p>A couple weeks ago I decided to try out reddit's self-serve advertising system for one of our products at Apture: the <a href="http://apture.com/extension/">Apture Highlights</a> 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.</p> <p><img src="http://agentdero.cachefly.net/unethicalblogger.com/images/voyager_def.jpg" align="right" hspace="10" alt="Looking up 'Voyager' with Apture"/></p> <p>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 <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Reddit#Subreddits">subreddit</a> or reddit-wide.</p> <p>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 <a href="http://www.reddit.com/r/todayilearned">/r/todayilearned</a>, a subreddit with nearly 80,000 subscribers who all are looking to share an interesting nugget of information that they have learned today. <!--break--> 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: <br clear="all"/> <center><a href="http://www.reddit.com/comments/duh72/add_more_til_to_every_thread_on_reddit_with_the/"><img src="http://agentdero.cachefly.net/unethicalblogger.com/images/reddit_ad_grey.jpg" hspace="10" alt="Add more TIL to every thread on reddit with the Apture Highlights browser extension"/></a></center></p> <p>(<em>note:</em> The acronym "TIL" generally is used as a substitute for "today I learned" in threads on reddit)</p> <p>This ad ran for two days on <a href="http://www.reddit.com/r/todayilearned">/r/todayilearned</a> and for one day reddit-wide, bringing my total campaign expenditure to $60. The breakdown in numbers is as follows:</p> <p><strong>Impressions (unique -> total)</strong>: 21,420 -> 141,037<br /> <strong>Clicks (unique -> total)</strong>: 146 -> 157</p> <p>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.</p> <p>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 <strong>zero-clicks</strong>, not only did the targeting to /r/todayilearned garner more repeated (non-unique) impressions, it received <strong>all</strong> of the clicks received throughout the entire campaign.</p> <p>The big take-away lesson for me from this brief trial advertising on reddit was: <strong>avoid reddit-wide advertising</strong>. 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.</p> <p>If you'd like to download the CSV with the data from the campaign, <a href="http://agentdero.cachefly.net/unethicalblogger.com/reddit_ad_results.csv">you can grab that here</a>. The columns are: date, impression_unique, impression_total, click_unique, click_total, clickrate_unique, clickrate_total.</p> http://unethicalblogger.com/posts/2010/11/experimenting_reddits_selfserve_ads#comments Apture Opinion Mon, 08 Nov 2010 14:00:00 +0000 R. Tyler Croy 302 at http://unethicalblogger.com So. I'm married. http://unethicalblogger.com/posts/2010/11/so_im_married <p>A few weeks ago I finally tied the knot after a rather long engagement, putting my relationship with then-fiance&eacute; 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 <strong>objectively rocked.</strong></p> <p>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 <a href="http://madronamanor.com/">Madrona Manor</a> 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 <a href="http://twitter.com/stuffonfire">Dave Young</a> and <a href="http://twitter.com/Artichoke13">Annika Lindner</a>:</p> <p><center><object width="600" height="450"> <param name="flashvars" value="offsite=true&lang=en-us&page_show_url=%2Fphotos%2Fagentdero%2Fsets%2F72157625143811546%2Fshow%2F&page_show_back_url=%2Fphotos%2Fagentdero%2Fsets%2F72157625143811546%2F&set_id=72157625143811546&jump_to="></param> <param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649"></param> <param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowFullScreen="true" flashvars="offsite=true&lang=en-us&page_show_url=%2Fphotos%2Fagentdero%2Fsets%2F72157625143811546%2Fshow%2F&page_show_back_url=%2Fphotos%2Fagentdero%2Fsets%2F72157625143811546%2F&set_id=72157625143811546&jump_to=" width="600" height="450"></embed></object></center></p> <p>Now that we're properly married, and no longer engaged, the typical annoying question has changed from "<strong>When are you getting married?</strong>" to "<strong>When are you having children?</strong>"</p> <p>Considering I can barely take care of our <a href="http://www.flickr.com/photos/agentdero/tags/cat/">big moron of a cat</a>, 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.</p> <p>Either way, I think it's safe to say, it's all down hill from here.</p> http://unethicalblogger.com/posts/2010/11/so_im_married#comments Opinion Thu, 04 Nov 2010 14:45:00 +0000 R. Tyler Croy 301 at http://unethicalblogger.com Being a Croy http://unethicalblogger.com/posts/2010/09/being_croy <p>The name change that I mentioned in <a href="http://www.unethicalblogger.com/posts/2010/08/whats_name">my previous post</a> is now official. This means I now have to update <strong>everything</strong>. I'm in for a world of hurt between the DMV, banks, brothels and strip-Parcheesi clubs.</p> <p>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:</p> <blockquote> <p><em>I put your old surname in the "Maiden Name" field in Address Book. Just thought you'd want to know.</em></p> </blockquote> <p>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?"</p> <p>Still haven't gotten a response to that one yet.</p> http://unethicalblogger.com/posts/2010/09/being_croy#comments Miscellaneous Opinion Fri, 03 Sep 2010 16:00:00 +0000 R. Tyler Croy 300 at http://unethicalblogger.com What's in a name? http://unethicalblogger.com/posts/2010/08/whats_name <p>Tomorrow morning I will be in court, hopefully finalizing a process I started earlier this year. I will be changing my name.</p> <p>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 <strong>36,000</strong> results when <a href="http://www.google.com/search?ie=UTF-8&amp;q=%22R.+Tyler+Ballance%22">searching Google</a>.</p> <p>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).</p> <p>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.</p> <p>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.</p> <p>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</p> <p>Plainly put, I would not be the man I am today without his guiding hand.</p> <p>Provided everything goes well at the courthouse, I enter as R. Tyler Ballance and leave as R. Tyler Croy.</p> <p>Might as well update your address books. <!--break--></p> http://unethicalblogger.com/posts/2010/08/whats_name#comments Miscellaneous Opinion Mon, 30 Aug 2010 15:00:00 +0000 R. Tyler Croy 299 at http://unethicalblogger.com I love Sonic.net already http://unethicalblogger.com/posts/2010/07/i_love_sonicnet_already <p>Thanks to <a href="http://twitter.com/pemullen">@pemullen</a>, I was introduced to <a href="http://sonic.net">Sonic.net</a> some time ago. Unfortunately I never took the time in my old apartment to switch out my AT&amp;T DSL for Sonic.net's Fusion service; the thought of home internet downtime was just too dreadful to even contemplate changing, despite AT&amp;T's absolutely awful service.</p> <p>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.</p> <p><strong>From me:</strong></p> <blockquote> <p>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? :)</p> <p>I understand that AT&amp;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.</p> <p>Oh the horror.</p> </blockquote> <p>After only a couple hours <strong>Kelly R.</strong> got back to me:</p> <blockquote> <p>Sorry to hear that you've been driven to such desperate measures. I know the lead time takes a while from AT&amp;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.</p> </blockquote> http://unethicalblogger.com/posts/2010/07/i_love_sonicnet_already#comments Miscellaneous Opinion Thu, 08 Jul 2010 03:05:06 +0000 R. Tyler Croy 295 at http://unethicalblogger.com Pride http://unethicalblogger.com/posts/2010/07/pride <p>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 "<a id="aptureLink_OES0eNh50a" href="http://en.wikipedia.org/wiki/God%20Bless%20the%20USA">God Bless the USA</a>" with its chorus:</p> <blockquote> <p>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.</p> </blockquote> <p>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:</p> <ul> <li>Proud to have been born in California</li> <li>Proud to be white</li> <li>Proud to be tall</li> <li>Proud to have four sisters</li> <li>Proud to have a grandpa named Bob</li> </ul> <p>I had no control in <em>any</em> of it, I won the birth lottery and just <em>happened</em> 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?</p> <p>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.</p> <p>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:</p> <ul> <li>Our participating in the secret <a id="aptureLink_SKMk8e6ttw" href="http://en.wikipedia.org/wiki/Anti-Counterfeiting%20Trade%20Agreement">ACTA treaty</a> negotiations </li> <li>The tarring of the Gulf of Mexico, a body of water I've spent nearly 40% of my life around.</li> <li><a id="aptureLink_b7jnFE35Wy" href="http://en.wikipedia.org/wiki/Guantanamo%20Bay%20detention%20camp">Guantanamo</a></li> <li><a href="http://en.wikipedia.org/wiki/Household_income_in_the_United_States">The shrinking middle class</a></li> <li>Shutting down Shuttle service without a viable Shuttle replacement</li> <li>Four horrifically expensive failed wars: <ul> <li>Drugs</li> <li>Terror</li> <li>Afghanistan</li> <li>Iraq</li> </ul></li> <li>A bloated federal government, with representatives who've forgotten who they represent (looking at you <a id="aptureLink_wbLX4QyXEl" href="http://projects.washingtonpost.com/congress/members/h000338">Orrin Hatch</a>)</li> <li>Irrational fear of nuclear power</li> </ul> <p>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.</p> <p>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.</p> <p>We have a mighty big hole to dig ourselves out of.</p> http://unethicalblogger.com/posts/2010/07/pride#comments Opinion Sun, 04 Jul 2010 23:18:10 +0000 R. Tyler Croy 291 at http://unethicalblogger.com Fatso Adventures: "I wonder what's down here?" http://unethicalblogger.com/posts/2010/06/fatso_adventures_i_wonder_whats_down_here <p>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.</p> <p>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. <a href="http://www.flickr.com/photos/agentdero/4747139465/" title="The window by agentdero, on Flickr"><img src="http://farm5.static.flickr.com/4115/4747139465_c46fbcf4a1_m.jpg" width="240" height="180" alt="The window" align="right" /></a> 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.</p> <p>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 <em>hear</em> 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.</p> <p>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.</p> <p><center><a href="http://www.flickr.com/photos/agentdero/4747137655/" title="The inlet by agentdero, on Flickr"><img src="http://farm5.static.flickr.com/4078/4747137655_43cf79b08c_m.jpg" width="240" height="180" alt="The inlet" /></a></center></p> <hr /> <p>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. <em>Stupid cat</em>. 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. <a href="http://www.flickr.com/photos/agentdero/4747138561/" title="From the garage by agentdero, on Flickr"><img src="http://farm5.static.flickr.com/4114/4747138561_85521bf4e3_m.jpg" width="240" height="180" alt="From the garage" align="right"/></a></p> <p>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.</p> <p>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.</p> <p>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 <em>seen</em> 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). <a href="http://www.flickr.com/photos/agentdero/4747780668/" title="The escape route by agentdero, on Flickr"><img src="http://farm5.static.flickr.com/4099/4747780668_679dd746c5_m.jpg" width="240" height="180" alt="The escape route" align="left" /></a></p> <p>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.</p> <p>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.</p> http://unethicalblogger.com/posts/2010/06/fatso_adventures_i_wonder_whats_down_here#comments Miscellaneous Opinion Photos Wed, 30 Jun 2010 02:06:05 +0000 R. Tyler Croy 290 at http://unethicalblogger.com Silly Problems http://unethicalblogger.com/posts/2010/06/silly_problems <p>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 <a href="http://unethicalblogger.com/posts/2010/04/san_francisco_transit_sucks">made back in April</a> and leaving. Over the past weekend I was struck by how picky I've become, particularly with where I live.</p> <p>For starters, living in San Francisco, I live in a place with:</p> <ul> <li>A thriving bicycle culture, which is <a href="http://sf.streetsblog.org/2010/06/21/judge-poses-questions-to-attorneys-on-eve-of-final-bike-injunction-hearing/">only looking to get better</a></li> <li><em>Hundreds</em> of restaurants with all sorts of delicious food stuffs</li> <li>Surprisingly few douchebags (hipsters and Mission bartenders not-withstanding) </li> <li>Fantastic weather</li> <li>Low violent crime</li> </ul> <p>And I'm still not happy with it.</p> <p>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 <em>cheap</em> 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.</p> <p>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.</p> <p>There are so many parts of this country that unabashedly <strong>fucking suck</strong> compared to San Francisco, and I'm still not satisfied. What a silly problem to have.</p> http://unethicalblogger.com/posts/2010/06/silly_problems#comments Opinion Tue, 22 Jun 2010 15:45:00 +0000 R. Tyler Croy 289 at http://unethicalblogger.com Being a Libor, Addendum http://unethicalblogger.com/posts/2010/05/being_libor_addendum <p>A couple of weeks ago I wrote a post on how to "<a href="http://unethicalblogger.com/posts/2010/04/be_libor">Be a Libor</a>", 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 <a href="http://www.slide.com/corp/about-us.html">CTO at Slide</a>.</p> <p>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!).</p> <p>Libor also had a fantastic quote from the conversation with regards to approaching new problems:</p> <blockquote> <p>Just because there are multiple right answers, doesn't mean there's no wrong answers</p> </blockquote> <p>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.</p> <p>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.</p> <p><a href="http://icanhascheezburger.com/2007/05/13/god-speed-moon-cat/">God speed mooncat</a></p> http://unethicalblogger.com/posts/2010/05/being_libor_addendum#comments Apture Opinion Python Slide Software Development Tue, 18 May 2010 16:00:00 +0000 R. Tyler Croy 286 at http://unethicalblogger.com The slow death of the indie mac dev http://unethicalblogger.com/posts/2010/05/slow_death_indie_mac_dev <p>Once upon a time I was a Mac developer. I <em>loved</em> Cocoa, I <em>loved</em> building Mac software, Mac OS X was once upon a time the greatest thing <strong>ever</strong>. I recall writing posts, and even founding a mailing list in the earlier days of <a id="aptureLink_XXGfUEOvqS" href="http://en.wikipedia.org/wiki/Core%20Data">Core Data</a>, which I was using in tandem with <a id="aptureLink_tTNWKSVsHe" href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CocoaBindings/CocoaBindings.html">Cocoa Bindings</a>, which themselves were almost a black art. I was on a couple of podcasts talking about <a href="http://unethicalblogger.com/posts/tyler/im_on_another_podcast">web services with Cocoa</a> or <a href="http://unethicalblogger.com/posts/tyler/cocoa_radio_im_almost_relevant">MacWorld</a>. 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.</p> <p>As I started to drift away, I gave a presentation at <a href="http://unethicalblogger.com/posts/tyler/cocoaheads_silicon_valley">CocoaHeads</a> 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.</p> <p>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 <a id="aptureLink_swydUdyeZv" href="http://en.wikipedia.org/wiki/Xcode">Xcode</a>, which became the <strong>key</strong> 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", <a id="aptureLink_5aNmJQju9n" href="http://en.wikipedia.org/wiki/Adium">Adium</a>, Voodoo Pad and Acorn from <a id="aptureLink_eJ9uu2MQ3K" href="http://twitter.com/FlyingMeat">Flying Meat</a>, Nicecast and Audio Hijack Pro from <a id="aptureLink_02KaUAf1q9" href="http://twitter.com/RogueAmoeba">Rogue Amoeba</a>, FuzzMeasure Pro from <a id="aptureLink_zzeQ82Xigx" href="http://www.supermegaultragroovy.com/">SuperMegaUltraGroovy</a>, Growl, NetNewsWire or MarsEdit originally from <a id="aptureLink_JhNPNMLWfy" href="http://twitter.com/brentsimmons">Brent Simmons</a> (NetNewsWire is now owned by NewsGator, while MarsEdit was acquired by <a id="aptureLink_iQz8tXYk37" href="http://twitter.com/danielpunkass">Daniel Jalkut</a> of Red Sweater Software), Yojimbo and BBEdit from <a id="aptureLink_uTlAfmYT0e" href="http://www.barebones.com/">BareBones</a>, 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.</p> <p>Then came the iPhone, with its "<a id="aptureLink_Gd4RKGYWAa" href="http://37signals.com/svn/posts/459-iphone-sdk-its-called-safari">Web SDK</a>" 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&amp;T's <strong>EDGE network</strong>? Fuck you! <!--break--> 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 <a href="http://www.maclife.com/article/news/apple_facing_federal_probes_over_section_331_iphone_sdk">Section 3.3.1</a>. There's also some hub-ub about the Apple Design Awards 2010, <a href="http://www.loopinsight.com/2010/04/28/wwdc-apple-design-awards-eschew-mac-os-x/">only focusing on iPhone and iPad apps</a> which is quite disconcerting for indie mac devs, who routinely compete and win awards for the <em>best</em> Mac applications.</p> <p>The message is clear, Apple wants to completely own users on its platform and sit between developers and their users, dictating terms.</p> <p>It's no wonder that <a href="http://twitter.com/rentzsch">@rentzsch</a>, a major voice in the indie mac dev community, and organizer of the <a id="aptureLink_YzJSA1Egyg" href="http://en.wikipedia.org/wiki/C4%20%28conference%29">C4 conference</a> is throwing in the towel on organizing C4 entirely (discussed in <a href="http://rentzsch.tumblr.com/post/592949476/c4-release">this post</a>).</p> <p>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 <em>very</em> nervous right now about what will happen at this year's WWDC, as <a id="aptureLink_oN0VOqyn0t" href="http://twitter.com/DanWood">Dan Wood</a> from <a id="aptureLink_cWiF9biNCa" href="http://twitter.com/karelia">Karelia</a> knows, Apple feels no remorse with stomping on Mac developers.</p> <p>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.</p> http://unethicalblogger.com/posts/2010/05/slow_death_indie_mac_dev#comments Cocoa Opinion Software Development Thu, 13 May 2010 16:30:00 +0000 R. Tyler Croy 284 at http://unethicalblogger.com Is programming with Twisted really as awful as it sounds? http://unethicalblogger.com/posts/2010/05/programming_twisted_really_awful_it_sounds <p>Early this week <a href="http://twitter.com/cansar">Can</a> forwarded <a href="http://www.quora.com/Is-programming-with-Twisted-really-as-awful-as-it-sounds">this post on Quora</a> to me, which asks the question:</p> <blockquote> <p>Is programming with Twisted really as awful as it sounds?</p> </blockquote> <p>Yes. <em>Yes</em>. <strong>YES IT IS</strong>. <strong><em>HOLY CRAP IT'S AWFUL</em></strong></p> <p>Here's some good alternatives:</p> <ul> <li><a href="http://eventlet.net">Eventlet</a>, my preference</li> <li><a href="http://gevent.org">gevent</a>, an alternative to Eventlet tied to libevent</li> <li><a href="http://www.java.com/">Java</a>. 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.</li> </ul> <p>That is all.</p> http://unethicalblogger.com/posts/2010/05/programming_twisted_really_awful_it_sounds#comments Opinion Python Wed, 12 May 2010 16:45:00 +0000 R. Tyler Croy 283 at http://unethicalblogger.com Be a Libor http://unethicalblogger.com/posts/2010/04/be_libor <p>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 <a id="aptureLink_7fpgpX6rLb" href="http://twitter.com/stuffonfire">Dave</a> once said, to the guy who knows <em>stuff</em> about <strong>things</strong>. I often think about what pieces of the <a id="aptureLink_CJpdUZmrfu" href="http://twitter.com/slideinc">Slide</a> engineering environment were influential to my personal growth and how I can carry those forward to build as solid an engineering organization at <a id="aptureLink_jd3j6BSrUf" href="http://www.apture.com">Apture</a>.</p> <p>The two pillars of engineering at Slide, at least in my naive world-view, were Dave and <a id="aptureLink_xrzzjPhkPZ" href="http://www.facebook.com/libor.michalek">Libor</a>. 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.</p> <p>(<em>Note</em>: I do not intend to idolize either of them, but cite important characteristics)</p> <p>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, <em>you're screwed</em>.</p> <p>What does it take to be a Libor you may be thinking: <!--break--> * <strong>No Guessing:</strong> When acting as a Libor, <em>knowing</em> 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.</p> <ul> <li><p><strong>Grok the stack:</strong> 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.</p></li> <li><p><strong>Maintenance and accountability:</strong> 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.</p></li> <li><p><strong>Focus on Engineering:</strong> 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.</p></li> </ul> <p>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.</p> <p>Non-engineering also benefits from having a Libor character in the organization, at Apture the product development narrative has changed, I find myself emphasizing:</p> <blockquote> <p>Tell me what you want, we'll find a way to do it</p> </blockquote> <p><em>That's</em> <a href="http://twitter.com/tristanharris/status/8355935929">a breakthrough</a>.</p> http://unethicalblogger.com/posts/2010/04/be_libor#comments Apture Opinion Python Slide Software Development Fri, 30 Apr 2010 14:45:00 +0000 R. Tyler Croy 281 at http://unethicalblogger.com San Francisco (Transit) Sucks http://unethicalblogger.com/posts/2010/04/san_francisco_transit_sucks <p>I was reading <a href="http://www.sfgate.com/cgi-bin/blogs/cityinsider/detail?entry_id=62259&amp;tsp=1">this article</a> on some of the debates going on with the SF <a href="http://www.sfbos.org/index.aspx?page=1616">Board of Supervisors</a>, where one of the supervisors suggested his intention on bringing a ballot initiative up this November to "<em>force Muni operators to negotiate their salary, benefits and work rules through collective bargaining.</em>" Currently, despite the fact that Muni faces service cuts and a budget shortfall, Muni operators are <strong>guaranteed no less than the second-highest transit operator salaries in the nation.</strong></p> <p>If you ask <em>anybody</em> who knows <strong>anything</strong> about say, capitalism, economics or even <em>math</em>, they'll tell you that the arrangement is <strong>batshit insane</strong>.</p> <p>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?</p> <blockquote> <p>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''</p> </blockquote> <p>Holy race card Batman! Bargaining, a fundamental tenet of our capitalist society gets one deemed a racist by <a href="http://www.sfbos.org/index.aspx?page=1686">Supervisor Daly</a>? He's clearly preoccupied with race, which will sure help bail Muni, and the city, out of their budget deficits this year.</p> <p>For those of you unfamiliar with San Francisco city budgets, this city somehow pisses away an annual budget of <a href="http://articles.sfgate.com/2009-04-01/bay-area/17192422_1_midyear-cuts-budget-analysts-city-s-rainy-day-fund">over 6 billion dollars</a> 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.</p> <p>When my lease is up in June, I'm leaving San Francisco. <!--break--></p> http://unethicalblogger.com/posts/2010/04/san_francisco_transit_sucks#comments Opinion Wed, 28 Apr 2010 14:30:00 +0000 R. Tyler Croy 280 at http://unethicalblogger.com Regarding Blippy http://unethicalblogger.com/posts/2010/04/regarding_blippy <p>While I wish my friend <a href="http://twitter.com/rromanchuk">Ryan</a> all the luck in the world at Blippy, I <em>loved</em> <a href="http://www.reddit.com/r/programming/comments/bv7if/blippy_leaks_users_credit_card_numbers_ouch/c0opphy">this comment</a> on <a id="aptureLink_M2QkA0F8Rs" href="http://www.reddit.com/">Reddit</a> regarding the startup from <a href="http://www.reddit.com/user/jacques_chester">jacques_chester</a></p> <blockquote> <p>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.</p> </blockquote> <p>I still don't understand what the point is though.</p> http://unethicalblogger.com/posts/2010/04/regarding_blippy#comments Opinion Sat, 24 Apr 2010 15:00:00 +0000 R. Tyler Croy 279 at http://unethicalblogger.com A great platform does not make yours a good product http://unethicalblogger.com/posts/2010/04/great_platform_does_not_make_yours_good_product <p>As I sit here writing, burnt out from the incredible hype surrounding Apple's <a id="aptureLink_LiOsazLOc6" href="http://en.wikipedia.org/wiki/IPad">iPad</a> launch and I cannot help but have flashbacks. Flashbacks to 2004/2005 when "Web 2.0" was at its peak, "ajax" and "<a id="aptureLink_bDGg14iQC7" href="http://en.wikipedia.org/wiki/Mashup%20%28web%20application%20hybrid%29">mashup</a>" were quite trendy. Flashbacks to mid-2007 when the <a id="aptureLink_MvB60hlwfp" href="http://en.wikipedia.org/wiki/Facebook%20Platform">Facebook Platform</a> was gaining steam, words like "FBML" and "social applications" became the new lingo. Flashbacks to early 2008 when the <a id="aptureLink_ijomSI5OcN" href="http://en.wikipedia.org/wiki/IPhone%20OS">iPhone SDK</a> launched and hoards of developers rushed to submit their apps to the <a id="aptureLink_DsKSkKet8H" href="http://www.apple.com/iphone/apps-for-iphone/">App Store</a>. All bore a resemblance to today, with the iPad, the newest, hottest thing in the world with everybody and their mother vying for one.</p> <p>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.</p> <p>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 <a href="http://techcrunch.com/2010/03/31/kleiner-perkins-ipad-fund/">$200m "iFund" for iPad apps</a> reminds me a <em>lot</em> of the crazy venture capitalists <a href="http://www.insidefacebook.com/2007/07/10/first-venture-capital-fund-for-facebook-applications-launches/">establishing Facebook app funds</a> or even the <a href="http://techcrunch.com/2008/03/06/kleiner-perkins-anounces-100-millioin-ifund-for-iphone-applications/">$100m "iFund" for iPhone apps</a> (from the same group no less).</p> <p>Venture Capitalists aren't alone in their attempts to ride Apple's innovating coat tails, companies building products are falling for it too, with <a id="aptureLink_qwK3O4IqBx" href="http://en.wikipedia.org/wiki/App%20Store#Number_of_launched_applications">hundreds of thousands of apps in the iPhone App Store</a> 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!</p> <p>I would estimate that for every 1000 applications, on any of these platforms, only one is a <strong>good</strong> 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.</p> <blockquote> <p>It's like X, but for the Web / Facebook Platform / iPhone / iPad!</p> </blockquote> <p>Platform innovation is no substitute for product innovation. The <a href="http://techcrunch.com/2010/04/02/the-new-york-times-launches-free-ipad-app-for-real-now-paid-app-on-the-way/">iPad app for the New York Times</a> 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 <a href="http://www.newsgator.com/individuals/netnewswireiphone/default.aspx">NetNewsWire</a> or god forbid, browsing to <a href="http://newyorktimes.com">newyorktimes.com</a> with Safari for consuming content.</p> <p>Supporting the iPad is <em>not</em> 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.</p> <p>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.</p> http://unethicalblogger.com/posts/2010/04/great_platform_does_not_make_yours_good_product#comments Opinion Sat, 03 Apr 2010 13:45:00 +0000 R. Tyler Croy 277 at http://unethicalblogger.com Sometimes Software as a Service Sucks http://unethicalblogger.com/posts/2010/03/sometimes_software_service_sucks <p>Being a big fan of "continuous integration", particularly with <a id="aptureLink_PmOzQb3Bo7" href="http://twitter.com/hudsonci">Hudson</a>, 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 <a href="http://bleepsoft.com/buildfactory/">BuildFactory</a> which, while fun to build, never sold all that many licenses. With the advent of Amazon's <a id="aptureLink_SLPMEfLHeR" href="http://en.wikipedia.org/wiki/Amazon%20Elastic%20Compute%20Cloud">EC2</a> 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."</p> <p>At face value the idea sounds incredibly fun to build, I'll build a service that integrates with <a id="aptureLink_q5Kr8iq6a2" href="http://twitter.com/gIthub">GitHub</a>, <a id="aptureLink_BLDvLKGYwy" href="http://www.crunchbase.com/product/google-code">Google Code</a>, <a id="aptureLink_z9njtjnyXs" href="http://en.wikipedia.org/wiki/SourceForge">SourceForge</a> 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:</p> <ul> <li>Scaling up</li> <li>Efficiently using cycles, and only when needed</li> <li>Building and testing cross-architecture and cross-platform</li> </ul> <p>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 <a id="aptureLink_Yb3agfhs2a" href="http://runcoderun.com/">RunCodeRun</a> are <a href="http://blog.runcoderun.com/post/463439385/saying-goodbye-to-runcoderun">shutting down the service</a>. 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 <strong>never</strong> work:</p> <blockquote> <p>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.</p> </blockquote> <p>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.</p> <p>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."</p> http://unethicalblogger.com/posts/2010/03/sometimes_software_service_sucks#comments Hudson Opinion Software Development Tue, 23 Mar 2010 14:00:00 +0000 R. Tyler Croy 275 at http://unethicalblogger.com Hypocrites on Bikes! http://unethicalblogger.com/posts/2010/03/hypocrites_bikes <p>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 <a href="http://sf.streetsblog.org">SF Streets Blog</a> titled: "Advocates Concerned That Cyclists Are Included in Distracted Driving Bill" (<a href="http://sf.streetsblog.org/2010/03/03/advocates-concerned-that-cyclists-are-included-in-distracted-driving-bill/">link</a>)</p> <p>One of the choice quotes from the article being:</p> <blockquote> <p>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.</p> <p>"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.</p> </blockquote> <p>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:</p> <blockquote> <p>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."</p> <p>"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."</p> </blockquote> <p>What a hypocrite! Riding your bike while on the phone or worse, <strong>texting</strong> is just as stupid as some of the <a href="http://unethicalblogger.com/posts/2010/02/i_hope_you_bump_your_head">no-helmet, no-light nonsense I was incensed over a few weeks ago</a>, 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).</p> <p>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?).</p> <p>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. <!--break--></p> http://unethicalblogger.com/posts/2010/03/hypocrites_bikes#comments Opinion Fri, 05 Mar 2010 14:00:00 +0000 R. Tyler Croy 274 at http://unethicalblogger.com Programming as an objective art http://unethicalblogger.com/posts/2010/03/programming_objective_art <p>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.</p> <p>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 <a id="aptureLink_0iGpof5YL6" href="http://twitter.com/stuffonfire">Dave</a>. Managing or working with any team of highly motivated, passionate and creative developers presents this problem, as a group: <strong>how can you objectively judge code while preserving the sense of ownership by the author?</strong> <!--break--> 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.</p> <p>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. "<em>The code is overly complicated when all it should be doing is X.</em>" "<em>The patch doesn't appropriately account for condition Y, which can happen if Z.</em>" 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. (<em>Note</em>: 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.</p> <p>This same strategy of separating the individual from the code should also be applied to bugs in the code. When using <a id="aptureLink_BRxnybEToo" href="http://www.kernel.org/pub/software/scm/git/docs/git-blame.html">git-blame(1)</a> 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 <em>entirely</em> 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 "<em>Jacob introduced a bug that causes X</em>" into "<em>Commit ff612a introduces a bug that causes X</em>" 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 "<em>Whoops, forgot about X, here's a fix</em>" 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.</p> <p>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.</p> <p>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 <a id="aptureLink_C8Ludq175A" href="http://en.wikipedia.org/wiki/Sistine%20Chapel%20ceiling">Sistine Chapel</a> 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.</p> http://unethicalblogger.com/posts/2010/03/programming_objective_art#comments Miscellaneous Opinion Software Development Mon, 01 Mar 2010 15:30:00 +0000 R. Tyler Croy 273 at http://unethicalblogger.com Pyrage: Static isn't just something on the radio http://unethicalblogger.com/posts/2010/02/pyrage_static_isnt_just_something_radio <p>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 <em>dynamic</em> language!", it is indeed, but that does not mean there aren't static variables.</p> <p>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:</p> <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">class</span> Foo<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">... <span style="color: black;">my_list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">... </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> f = Foo<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> b = Foo<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li></ol></pre></div> <p>You're trying to be clever, defining your class variables with their default variables outside of your <code>__init__</code> function, understandable, unless you ever intend on <strong>mutating</strong> that variable.</p> <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> f.<span style="color: black;">my_list</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'O HAI'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> b.<span style="color: black;">my_list</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: black;">&#91;</span><span style="color: #483d8b;">'O HAI'</span><span style="color: black;">&#93;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> </div></li></ol></pre></div> <p>Still feeling clever? If that's what you <em>wanted</em>, I bet you do, but if you wanted each class to have its own internal list you've inadvertantly introduced a bug where <em>any</em> and <em>every</em> time something mutates <code>my_list</code>, it will change for every single instance of <code>Foo</code>. The reason that this occurs is because <code>my_list</code> is tied to the class object <code>Foo</code> and not the <strong>instance</strong> of the <code>Foo</code> object (<code>f</code> or <code>b</code>). In effect <code>f.__class__.my_list</code> and <code>b.__class__.my_list</code> are the same object, in fact, the <code>__class__</code> objects of both those instances is the same as well.</p> <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>f.__class__<span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff4500;">7680112</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">id</span><span style="color: black;">&#40;</span>b.__class__<span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff4500;">7680112</span></div></li></ol></pre></div> <p><br clear="all"/> When using default/optional parameters for methods you can also run afoul of statics in Python, for example:</p> <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">def</span> somefunc<span style="color: black;">&#40;</span>data=<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">... <span style="color: black;">data</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">... <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">'data'</span>, data<span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">... </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> somefunc<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: black;">&#40;</span><span style="color: #483d8b;">'data'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> somefunc<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: black;">&#40;</span><span style="color: #483d8b;">'data'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> somefunc<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: black;">&#40;</span><span style="color: #483d8b;">'data'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> </div></li></ol></pre></div> <p>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 <code>data</code> to the <code>somefunc.func_defaults</code> tuple, which is being mutated when the function is being called. Bad programmer!</p> <p>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.</p> <p>PYRAGE! <!--break--></p> http://unethicalblogger.com/posts/2010/02/pyrage_static_isnt_just_something_radio#comments Opinion Python Software Development Fri, 26 Feb 2010 13:45:00 +0000 R. Tyler Croy 272 at http://unethicalblogger.com If you want a viral license, use the GPL http://unethicalblogger.com/posts/2010/02/if_you_want_viral_license_use_gpl <p>My "roots" in the open source community come from the BSD side of the open source spectrum, my first major introduction being involvement with <a id="aptureLink_Z6pelwUEYA" href="http://en.wikipedia.org/wiki/FreeBSD">FreeBSD</a> and <a id="aptureLink_ZXZxVq5WFh" href="http://en.wikipedia.org/wiki/OpenBSD">OpenBSD</a>. 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:</p> <blockquote><p>Copyright (c) [year] [copyright holders] <p> 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: <p> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. <p> 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.</blockquote> <p>I bring the subject up because I wanted to address a brief "kerfuffle" that occurred recently on the <a id="aptureLink_0mMM3DzSHh" href="http://eventlet.net/">Eventlet</a> mailing list with the maintainer of <a id="aptureLink_BWth7wZxHe" href="http://www.gevent.org/">gevent</a>, 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. <!--break--> <strong>Disclaimer</strong>: 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.</p> <p>The "kerfuffle" occurred after Ryan, the maintainer of Eventlet, took a few good modules from gevent; <em>shocking</em> 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:</p> <blockquote> <p>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.</p> </blockquote> <p>Upon first reading the email, I doubled over to the <a href="http://bitbucket.org/which_linden/eventlet/">eventlet source on Bitbucket</a>, checked the files that were incorporated into the codebase (<a href="http://bitbucket.org/which_linden/eventlet/src/tip/eventlet/timeout.py">timeout.py</a> and <a href="http://bitbucket.org/which_linden/eventlet/src/tip/eventlet/queue.py">queue.py</a>)and sure enough the copyright attributing the original author were still in tact, surely this is a non-issue?</p> <p>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:</p> <blockquote> <p>Ok, it's acceptable to use one LICENSE file but only if the copyright notice from gevent is present unchanged.</p> <p>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).</p> <p>That would settle it.</p> </blockquote> <p>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:</p> <blockquote> <p>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.</p> </blockquote> <p>This is where I draw the line, go all in, plant my flag in the sand and other unnecessary metaphors. <strong>Abusive borrowers?</strong> 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 <a href="https://lists.secondlife.com/pipermail/eventletdev/2010-February/000731.html">in the archives</a>).</p> <p>I'm simply dumbfounded by the ignorance of what the MIT license actually <em>means</em>, unlike the LGPL or the GPL license which were specifically drafted to protect against "abusive borrowers", <a id="aptureLink_grMTA0vhuq" href="http://lwn.net/Articles/51570/">such as Cisco</a>, the MIT license is so open it's <em>almost</em> public domain.</p> <p>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" <a href="http://en.wikipedia.org/wiki/BSD_licenses#4-clause_license_.28original_.22BSD_License.22.29">4 clause BSD license</a> 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.</p> http://unethicalblogger.com/posts/2010/02/if_you_want_viral_license_use_gpl#comments Opinion Python Tue, 23 Feb 2010 14:45:00 +0000 R. Tyler Croy 270 at http://unethicalblogger.com I hope you bump your head http://unethicalblogger.com/posts/2010/02/i_hope_you_bump_your_head <p>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.</p> <p>First of all, let me address my fellow cyclists. Some of you (you hopefully know who you are) are unadulterated, complete <strong>fucking-assholes</strong>. 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:</p> <ul> <li>Using hand signals</li> <li><a id="aptureLink_Si5U0sgWJZ" href="http://en.wikipedia.org/wiki/Yield%20sign">Yielding</a> (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 "<a id="aptureLink_uDlHs7Md5j" href="http://rlv.zcache.com/king_of_the_world_tshirt-p235931495380365736y0wq_210.jpg">King of the World</a>".</li> <li>Riding on streets safe for bicycle use. I know you love to ride down <a id="aptureLink_O8YcZISURN" href="http://maps.google.com/maps?om=0&amp;iwloc=addr&amp;f=q&amp;ll=37.7731392%2C-122.4373851&amp;hl=en&amp;z=15&amp;ie=UTF8">Oak St</a>. and <a id="aptureLink_gVl4SJITix" href="http://maps.google.com/maps?om=0&amp;iwloc=addr&amp;f=q&amp;ll=37.7903592%2C-122.4224114&amp;hl=en&amp;z=15&amp;ie=UTF8">Van Ness</a> 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 <a id="aptureLink_aIV7drHPOv" href="http://maps.google.com/maps?om=0&amp;iwloc=addr&amp;f=q&amp;ll=37.7722061%2C-122.4372057&amp;hl=en&amp;z=15&amp;ie=UTF8">Page</a> and Market St.).</li> <li>Stopping at stop lights. I'm sure <a id="aptureLink_QcM9BG198z" href="http://en.wikipedia.org/wiki/Gavin%20Newsom">Gavin</a> 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.</li> </ul> <p>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 <strong>no lights</strong> and <strong>no helmet</strong>. 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 <em>just</em> hard enough to knock some god-damn sense into it.</p> <p>There are parts of my bike ride where <strong>I</strong> 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 <a id="aptureLink_aNStSgx7tF" href="http://images.google.com/images?q=tbn:XsPZdlOlW4aOlM:weblogs.cltv.com/news/weather/traffic/u-lock.jpg">U-Lock</a> against some poor schmuck who's too stupid to ride on the right side of the bike path in the dark.</p> <p>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.</p> <p>Grumble. <!--break--></p> http://unethicalblogger.com/posts/2010/02/i_hope_you_bump_your_head#comments Opinion Wed, 10 Feb 2010 07:28:56 +0000 R. Tyler Croy 264 at http://unethicalblogger.com Mourning Sun http://unethicalblogger.com/posts/2010/01/mourning_sun <p>Some users of Hudson have already started to notice a subtle addition to the latest release, 1.343, a new background watermark image.</p> <p><center><a href="http://agentdero.cachefly.net/scratch/hudson_1343.png"><img width="600" src="http://agentdero.cachefly.net/scratch/hudson_1343.png" border="0"/></a></center></p> <p>The commit message (<a href="http://github.com/kohsuke/hudson/commit/7e1602415ce86fb6ed3630a9e8d6b86a99f6477e">r26728</a>) from <a id="aptureLink_beuDMdQyLf" href="http://twitter.com/kohsukekawa">Kohsuke</a>, the incredibly talented founder and maintainer of the <a id="aptureLink_iq9IUqnvlG" href="http://twitter.com/hudsonci">Hudson project</a>, adds a bit of sadness to the whole affair:</p> <blockquote>In tribute to Sun Microsystems and all my colleagues who had to go today. I hope the community would forgive me for doing this. </blockquote> <p>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: <a id="aptureLink_lV3vSmeDpY" href="http://en.wikipedia.org/wiki/SunOS">SunOS</a>/<a id="aptureLink_eXvarQ2fAp" href="http://en.wikipedia.org/wiki/Solaris%20%28operating%20system%29">Solaris</a>, <a id="aptureLink_FpOrTgoKGX" href="http://en.wikipedia.org/wiki/Java%20%28programming%20language%29">Java</a>, <a id="aptureLink_FwpJ7pdCVJ" href="http://en.wikipedia.org/wiki/DTrace">DTrace</a>, <a id="aptureLink_p5b1rnrCvM" href="http://www.slideshare.net/pavelanni/sun-sparc-systems-historic-view">SPARC</a> 64-bit chips, <a id="aptureLink_vax0xgKGzx" href="http://en.wikipedia.org/wiki/Sun%20Grid%20Engine">Sun Grid Engine</a>, <a id="aptureLink_yqKUNGZA08" href="http://en.wikipedia.org/wiki/JRuby">JRuby</a>, the W3C <a id="aptureLink_BX8fOLXg1h" href="http://en.wikipedia.org/wiki/XML">XML</a> specification, <a id="aptureLink_6pAltRfGgE" href="http://en.wikipedia.org/wiki/ZFS">ZFS</a>, <a id="aptureLink_g6Nq6uBwMs" href="http://en.wikipedia.org/wiki/OpenOffice.org">OpenOffice</a> (acquisition), <a id="aptureLink_cmRhH6JoZP" href="http://en.wikipedia.org/wiki/MySQL">MySQL</a> (acquisition), and <a id="aptureLink_OS2nUnWdtm" href="http://en.wikipedia.org/wiki/VirtualBox">VirtualBox</a> (acquisition).</p> <p>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.</p> <p>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. <!--break--> Here's the "full" version of the image, which I found via <a href="http://twitter.com/jtnl" target="_blank">@jtnl</a>'s TwitPic stream: <center><a href="http://agentdero.cachefly.net/scratch/ripsun.jpg"><img width="600" src="http://agentdero.cachefly.net/scratch/ripsun.jpg" border="0"/></a></center></p> http://unethicalblogger.com/posts/2010/01/mourning_sun#comments Hudson Opinion Software Development Sun, 31 Jan 2010 03:51:52 +0000 R. Tyler Croy 263 at http://unethicalblogger.com Unsubstantiated Rumors about Apture and Facebook http://unethicalblogger.com/posts/2010/01/unsubstantiated_rumors_about_apture_and_facebook <p>Yesterday I was pointed to <a href="http://www.readwriteweb.com/archives/who_should_facebook_acquire_next_mark_zuckerberg_w.php">this post</a> on <a id="aptureLink_dnAh1RSm8g" href="http://www.crunchbase.com/company/readwriteweb">ReadWriteWeb</a>, 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: <em>false</em>) rumors:</p> <p><strong>Unsubstantiated Rumor #1:</strong></p> <blockquote>A <a id="aptureLink_qY7grmRXt3" href="http://www.crunchbase.com/person/mark-zuckerberg">shadowy figure</a> in a black Northface jacket has been spotted lingering around <a id="aptureLink_IDCAQrIJgd" href="http://maps.google.com/maps?om=0&amp;iwloc=addr&amp;f=q&amp;ll=37.780134%2C-122.396744&amp;hl=en&amp;z=16&amp;ie=UTF8">539 Bryant St in San Francisco</a></blockquote> <p><strong>Unsubstantiated Rumor #2:</strong></p> <blockquote><a id="aptureLink_9miKozqEUo" href="http://www.crunchbase.com/person/can-sar">Apture's CTO</a> is seen regularly in Palo Alto</blockquote> <p><strong>Unsubstantiated Rumor #3:</strong></p> <blockquote>Apture employees were issued company <a id="aptureLink_DcTLIooB8f" href="http://www.flickr.com/photos/bradleypjohnson/53276326/">Adidas sandals</a> last December</blockquote> <p><strong>Unsubstantiated Rumor #4:</strong></p> <blockquote><a id="aptureLink_52G491oPzb" href="http://www.crunchbase.com/person/mark-zuckerberg">Mark Zuckerberg</a> and <a id="aptureLink_WfiV1z3Akq" href="http://www.crunchbase.com/person/tristan-harris">Tristan Harris</a> talk regularly at meetings of the Bay Area <a id="aptureLink_QPJs7zlNBr" href="http://answers.yahoo.com/question/index?qid=20080218204614AAnhfjy">Strip-Parcheesi</a> Club in Redwood City</blockquote> <p><strong>Unsubstantiated Rumor #5:</strong></p> <blockquote>Apture is hiring aggressively in order to bump up their acquisition price</blockquote> http://unethicalblogger.com/posts/2010/01/unsubstantiated_rumors_about_apture_and_facebook#comments Miscellaneous Opinion Wed, 20 Jan 2010 22:19:19 +0000 R. Tyler Croy 261 at http://unethicalblogger.com Thread-safety assumptions in Django http://unethicalblogger.com/posts/2010/01/threadsafety_assumptions_django <p>These days, the majority of my day job revolves around working with <a id="aptureLink_jvAxf3Xyiw" href="http://www.crunchbase.com/company/apture">Apture's</a> <a id="aptureLink_eYCk1i8kej" href="http://www.djangoproject.com/">Django</a>-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 <a id="aptureLink_ybzn7lvyyE" href="http://en.wikipedia.org/wiki/Apache%20HTTP%20Server">Apache</a> for <a id="aptureLink_jDx5yFnmAS" href="http://pypi.python.org/pypi/Spawning">Spawning</a> 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 <a id="aptureLink_hJSBTiL356" href="http://eventlet.net/doc/">eventlet's</a> <code>tpool</code> (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).</p> <p>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 <strong>thread-safety problems</strong>. 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.</p> <p>Apparently Django's <a href="http://code.djangoproject.com/wiki/DjangoSpecifications/Core/Threading">threading problems</a> are sufficiently documented in a <a href="http://y-node.com/blog/2008/oct/30/noreversematch/">few places</a>. Using a slightly older version of the Django framework certainly doesn't help but it doesn't <em>appear</em> 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 <code>NoReverseMatch</code> exceptions, to curious middleware problems to thread-safety <a href="http://code.djangoproject.com/ticket/11193">issues</a> in the WSGI support layer, Django has potholes lying all along the road to multithreadedness.</p> <p>Beware. <!--break--></p> http://unethicalblogger.com/posts/2010/01/threadsafety_assumptions_django#comments Opinion Python Software Development Tue, 19 Jan 2010 05:23:26 +0000 R. Tyler Croy 259 at http://unethicalblogger.com Book of Elies http://unethicalblogger.com/posts/2010/01/book_elies <p>There's quite a big advertising blitz in San Francisco for the "<a id="aptureLink_VJomkqnnZ6" href="http://www.youtube.com/watch?v=JKfZrbS79To">Book of Eli</a>" 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: <center><img src="http://agentdero.cachefly.net/unethicalblogger.com/images/religionispower.jpg"/></center></p> <p>To be honest, I was already <strong>not</strong> 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 "<a id="aptureLink_o7Ky6vz4EV" href="http://www.youtube.com/watch?v=ylLFoD5ZGDk">Jesus Camp</a>" and watching <a id="aptureLink_h1tSlNsqA2" href="http://www.youtube.com/watch?v=S5nraknWoes">clips of Pat Robertson</a>.</p> <p>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 <em>technically</em> right.</p> <p>I think that's why it bothers the hell out of me.</p> http://unethicalblogger.com/posts/2010/01/book_elies#comments Opinion Fri, 15 Jan 2010 08:08:07 +0000 R. Tyler Croy 257 at http://unethicalblogger.com The one where I gush about Contegix. http://unethicalblogger.com/posts/2010/01/one_where_i_gush_about_contegix <p>Since joining <a id="aptureLink_qcOCk4yKQf" href="http://twitter.com/apture">Apture</a>, 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 <a id="aptureLink_hpa0Flz94r" href="http://twitter.com/slideinc">Slide</a>, there are a few notable changes, the largest of which being <strong>root</strong>. 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 <a id="aptureLink_YQWxfVXHgd" href="http://twitter.com/contegix">Contegix</a> 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.</p> <p>Last week while planning some changes we can make to our <a id="aptureLink_vcR6DUxFQW" href="http://en.wikipedia.org/wiki/Django%20%28web%20framework%29">Django</a>-based production environment that will help us grow more effectively, <a id="aptureLink_IES2CuBriY" href="http://twitter.com/kansteven">Steven</a> 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.</p> <p>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 <a id="aptureLink_rBdEmXeIf7" href="http://en.wikipedia.org/wiki/MySQL">MySQL</a> 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 <a id="aptureLink_f7slXLd6zw" href="http://en.wikipedia.org/wiki/memcached">memcached(8)</a>.</p> <p>As our normal peak (~9 a.m. PST to around lunchtime) passed, I started to breathe easier when alarms went of <strong>again</strong>. 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.</p> <p>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 <strong>and</strong> 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).</p> <p>I am admittedly quite smitten with Contegix's work today, I became quite accustomed to <a id="aptureLink_vi7LWqRoql" href="http://www.linkedin.com/pub/ken-brownfield/2/b0/b49">KB</a> 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.</p> <p><em>A picture is worth a thousand words; here's a cumulative load graph from our production <a id="aptureLink_K9W5xziPLP" href="http://ganglia.info/">Ganglia</a> instance:</em> <img width="700" src="http://agentdero.cachefly.net/unethicalblogger.com/images/todays_load.png"/></p> http://unethicalblogger.com/posts/2010/01/one_where_i_gush_about_contegix#comments Opinion Tue, 05 Jan 2010 07:29:40 +0000 R. Tyler Croy 256 at http://unethicalblogger.com Angry Tweeter http://unethicalblogger.com/posts/2009/12/angry_tweeter <p>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 <em>very</em> 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.</p> <p>When I woke up the next day, I looked over at how bitchy and whiney my <a id="aptureLink_CgXlNHL6qd" href="http://twitter.com/agentdero">posts to Twitter</a> from the previous day were. I don't <em>think</em> I'm normally that big of a jerk but traveling alone, I needed to vent, often. (<em>note</em>: times listed are PST, for the majority of the trip I was in EST)</p> <blockquote> <p><strong>11:10 AM</strong> Still kind of amazes me how many young women in the south are running around with babies in tow.</p> <p><strong>11:34 AM</strong> How the news should cover this incident: Guy tries something on plane, passengers take him out. Post-9/11, TSA is pointless</p> <p><strong>12:57 PM</strong> Shit. My first flight today has propellers. Fucking propellers.</p> <p><strong>1:22 PM</strong> Propeller death trap. <a href="http://flic.kr/p/7qzKVn">http://flic.kr/p/7qzKVn</a></p> <p><strong>3:20 PM</strong> Step 1 complete; in Miami. Now to SFO.</p> <p><strong>3:29 PM</strong> How does restricting carry-ons make up for the TSA's incompetence? Predictable kneejerkery.</p> <p><strong>3:43 PM</strong> Waiting on a fucking bus to go back to the terminal. My connection is boarding right the hell now :/</p> <p><strong>3:56 PM</strong> "Fortunately" my flight was delayed an hour, so I didn't nearly catch it. Fuckin AA.</p> <p><strong>4:24 PM</strong> Let's just stop flying airplanes, that's the only <em>real</em> way to stay safe from the terrurists.</p> <p><strong>4:47 PM</strong> It's okay American Airlines, I really didn't want to go home anyways.</p> <p><strong>5:05 PM</strong> Outlined a couple posts I want to write on the plane; our original delayed departure time has past, I might never get to writing</p> <p><strong>6:03 PM</strong> More delayment. 2nd potential departure time passed</p> <p><strong>6:08 PM</strong> What kind of toolbox gets luggage embroidered with their initials?</p> <p><strong>6:11 PM</strong> Apparently somebody on the previous flight puked, so we're delayed while they scrub vomit off the seats. Worth it.</p> <p><strong>6:26 PM</strong> The snacks in Miami are a bit dry <a href="http://flic.kr/p/7qHbBN">http://flic.kr/p/7qHbBN</a></p> <p><strong>6:40 PM</strong> This plane better make it to SFO, I'll be pretty pissed to have waited 3 hours to end up in a field.</p> <p><strong>7:23 PM</strong> OMFG I AM TOTALLY ON THE PLANE. 3.5 hours late.</p> <p><strong>1:45 AM</strong> Made it to SFO, only a few hours late. Now to drive home, find a parking spot and cry in the shower a bit</p> <p><strong>3:05 AM</strong> Finally home. Showered, clipped fingernails, q-tip'd ears. Feeling better.</p> </blockquote> <p>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.</p> http://unethicalblogger.com/posts/2009/12/angry_tweeter#comments Miscellaneous Opinion Tue, 29 Dec 2009 03:05:16 +0000 R. Tyler Croy 252 at http://unethicalblogger.com On being a good house guest http://unethicalblogger.com/posts/2009/12/being_good_house_guest <p>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-<a id="aptureLink_pKpKWKHY7r" href="http://twitter.com/stuffonfire">Dave</a>'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:</p> <ul> <li>Feel like cooking a big dinner but don't want to do the dishes</li> <li>Need an expert <a id="aptureLink_GGsQhmHDZP" href="http://en.wikipedia.org/wiki/Rock%20Band">Rock Band</a> guitarist</li> <li>Have children that need entertaining</li> <li>Are just sick and tired of cooking and really would like somebody else to make you something delicious</li> <li>Feel the need to have a wide-ranging discussion regarding national and international politics with a mildly intelligent person</li> </ul> <p>While I know that you're not <em>supposed</em> 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. <!--break--></p> <h3>Keep your things tidy</h3> <p><strong>Very important</strong>, 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.</p> <h3>Offer to cook</h3> <p>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 <em>actually cook</em>. (<strong>note:</strong> cooking delicious food is not difficult, but really just a test of your ability to <strong>read a recipe</strong>). 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.</p> <h3>Hang out, don't cling</h3> <p>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 (<em>note;</em> do not trash their city, people tend to have some amount of pride for their city/region/state).</p> <h3>Do chores</h3> <p>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.</p> <p>Nobody will turn down a helping hand when it comes to cleaning.</p> <p>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.</p> <p>Just don't borrow any money, they really hate that.</p> http://unethicalblogger.com/posts/2009/12/being_good_house_guest#comments Opinion Mon, 28 Dec 2009 05:02:44 +0000 R. Tyler Croy 250 at http://unethicalblogger.com