<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-20208453</atom:id><lastBuildDate>Fri, 01 Jun 2012 05:02:03 +0000</lastBuildDate><category>barcamp</category><category>flash</category><category>cults</category><category>news</category><category>web</category><category>death</category><category>pune</category><category>france</category><category>art</category><category>open source</category><category>wtf</category><category>war</category><category>nerdery</category><category>nerding</category><category>travel</category><category>cuture</category><category>rails</category><category>spam</category><category>family</category><category>video</category><category>.net</category><category>machines</category><category>work</category><category>blogs</category><category>humor</category><category>business</category><category>java</category><category>dilbert</category><category>thoughtworks</category><category>language</category><category>intellij</category><category>india</category><category>ideas</category><category>lotus notes</category><category>pair programming</category><category>global</category><category>people</category><category>software</category><category>swimming</category><category>common sense</category><category>mac</category><category>america</category><category>design</category><category>sweden</category><category>fun</category><category>ubuntu</category><category>testing</category><category>violin</category><category>google</category><category>ruby</category><category>education</category><category>media</category><category>technology</category><category>podcast</category><category>bizarre</category><category>hipsters</category><category>nerdery mono</category><category>triangles</category><category>sex</category><category>internet</category><category>laptops</category><category>compiz</category><category>code</category><category>canada</category><category>learning</category><category>friends</category><category>linux</category><category>lifehacks</category><category>diversity</category><category>photography</category><category>xtech</category><category>hatred</category><category>politics</category><category>culture</category><category>toilets</category><category>games</category><category>music</category><category>world</category><category>communication</category><category>how-to</category><category>imagination</category><category>not getting things done</category><category>tightpinkproduct</category><category>netbeans</category><category>life</category><category>food</category><category>entertainment</category><category>history</category><category>poetry</category><category>religion</category><category>fame</category><category>microsoft</category><category>humanity</category><category>maps</category><category>mono</category><category>pakistan</category><category>user interfaces</category><category>money</category><title>Hungry, horny, sleepy, curious.</title><description></description><link>http://blog.deobald.ca/</link><managingEditor>noreply@blogger.com (Steven Deobald)</managingEditor><generator>Blogger</generator><openSearch:totalResults>100</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-8012298994900760375</guid><pubDate>Sat, 05 May 2012 05:43:00 +0000</pubDate><atom:updated>2012-05-04T22:43:31.966-07:00</atom:updated><title>defining the interface for rubymonk</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;i&gt;Discussing an interview I had yesterday --quite interesting when delivered with &lt;a href="https://twitter.com/#!/aninda42"&gt;Aninda&lt;/a&gt;-- with a&amp;nbsp;&lt;/i&gt;&lt;i&gt;non-technical&amp;nbsp;&lt;/i&gt;&lt;i&gt;friend, we stumbled on the fact that everything in Computer Science is an interface. From the moment you differentiate data from code, which wasn't immediately obvious to even the first computer programmers twiddling individual bits....&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Everything you build in software is defined by an interface. These are the boundaries, but they're also where the magic happens.&lt;br /&gt;&lt;br /&gt;Here are some interfaces:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f2f2f2; border: #c4c4c4 solid 4px; clear: both; padding: 12px;"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;http://www.c42.in/a_url_is_an_interface/&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;(We'll come back to this.)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f2f2f2; border: #c4c4c4 solid 4px; clear: both; padding: 12px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;$ ps aux | grep clojure&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f2f2f2; border: #c4c4c4 solid 4px; clear: both; padding: 12px;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-46biZWJfmMg/T6DENG2It-I/AAAAAAAAC-E/CLmGWoOZM_k/s1600/functions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-46biZWJfmMg/T6DENG2It-I/AAAAAAAAC-E/CLmGWoOZM_k/s320/functions.png" width="226" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;At this point, I had to stop to explain how a &lt;b&gt;function&lt;/b&gt; works. Does this help?&amp;nbsp;&lt;/i&gt;&lt;i&gt;(Hey Blogger or Google or whoever the heck is in charge: why can't that image be an SVG?)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XELHcW1MOkw/T6DGmwIxr-I/AAAAAAAAC-M/z8uKbchI1PY/s1600/functions-with-values.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-XELHcW1MOkw/T6DGmwIxr-I/AAAAAAAAC-M/z8uKbchI1PY/s320/functions-with-values.png" width="226" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f2f2f2; border: #c4c4c4 solid 4px; clear: both; padding: 12px;"&gt;&lt;b&gt;Objects&lt;/b&gt; are the next interface to consider. They are a bundle of functions. Actually, they're more &lt;a href="http://blip.tv/clojure/stuart-halloway-simplicity-ain-t-easy-4842694"&gt;complex&lt;/a&gt; than that. They are a bunch of &lt;a href="http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent"&gt;closures&lt;/a&gt;... actually, &lt;a href="http://letoverlambda.com/index.cl/guest/chap5.html#sec_7"&gt;dispatching closures&lt;/a&gt;. &lt;i&gt;(Okay, I've lost my non-technical friend at this point. Oh well.)&lt;/i&gt; There are other ways of looking at them, but we'll take the perspective of the function, which we already agree is quite simple. To the function, the object looks like a set of rules about how one defines interfaces with functions. Objects can be made of functions but it's not quite so the other way around (though the object may consider this point contentious or even academic). The function doesn't care. To him, an object is just a cluster -- however small -- of functions who have been told in advance that part of how they behave must change, because of the way they were set up... this time, at least. And what's worse, just because an object has been set up -- it won't necessarily stay that way! Yikes. Looking at it from the outside, the function pities the object. The function can choose to behave this way but the default position of the function is, "I never change!" The object changes himself (or worse, allows other, unknown objects to change him). It takes some work for the function to behave so sloppily; you need multiple functions -- and functions returning functions, no less (as a type's constructor returns a function whose sole purpose is dispatch based on the type of the first parameter and the name of the second -- usually with these parameters taking special positions, like &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;first_is_an_object.second_is_a_method&lt;/span&gt;. I digress.). Such effort forces a conscious choice on the part of the person writing that function. "This risk is worth it!" you say, and an interface of your choice, with complexity of your choice, emerges.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PTcy8cxJwDw/T6F9OtA2aAI/AAAAAAAAC-c/5KOe9gHSZD0/s1600/object.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-PTcy8cxJwDw/T6F9OtA2aAI/AAAAAAAAC-c/5KOe9gHSZD0/s320/object.png" width="226" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #f2f2f2; border: #c4c4c4 solid 4px; clear: both; padding: 12px;"&gt;Finally, at the top of this scale are &lt;b&gt;languages&lt;/b&gt;. They themselves are composed of functions and objects. In fact, most compilers and interpreters for languages can be thought of as pure functions: I give you the language, you give me the binary, assembly, bytecode, or runtime language (JS, these days). This is the most complex interface. Usually, a human still speaks to this interface. In 2012, this interface is fully-manual. These humans are called programmers. And the best of them will make it their task to automate away their own job. But, as of 2012, programs that write programs are risky and difficult. Automation can be seen on any of these other scales (functions and data) without writing your own macro or yet &lt;i&gt;another&lt;/i&gt; compiler or parser. Choose a language which gives you this option when you have no other choice, but be careful to wield such a weapon when you see no other way out. Otherwise, it is a simple interface you want.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://twitter.com/#!/kitallis"&gt;Kitty&lt;/a&gt; pointed out to me that I haven't called out a very important point: All these interfaces are fundamentally the same. They accept some input and produce some output (even if that output is a side-effect). Objects are built of functions, and they're both built of languages. And the languages are built of objects and functions. What differentiates each one is the mental energy required to contend with the interface's complexity. Stateless interfaces -- such as immutable objects, pure functions, and HTTP -- are always easier to understand because there are fewer balls in the air. The "given" of given-when-then doesn't apply if there's nothing to set up. There's only when and then.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This makes the interface for&amp;nbsp;&lt;a href="http://www.rubymonk.com/"&gt;RubyMonk&lt;/a&gt;&amp;nbsp;interesting. There is of course a very cute visual style to rubymonk.com (yeah, we love it too), but the real interface is the user's interaction with the mentor -- how we evaluate their progress and the programs they write. How we assert that something they've done is &lt;i&gt;correct -- &lt;/i&gt;because the programs they write are data to us.&amp;nbsp;As we teach more complex concepts, this interface itself will become increasingly complex by its very nature. Or, perhaps, we will realize the beautiful intrinsic quality of data that is code and code that is data, leading us to discover an elegant solution to the automation of the Hacker Mentor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-8012298994900760375?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2012/05/defining-interface-for-rubymonk.html</link><author>noreply@blogger.com (Steven Deobald)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-46biZWJfmMg/T6DENG2It-I/AAAAAAAAC-E/CLmGWoOZM_k/s72-c/functions.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-8373426341358556838</guid><pubDate>Sun, 25 Mar 2012 15:16:00 +0000</pubDate><atom:updated>2012-03-25T08:16:03.370-07:00</atom:updated><title>zero to emacs in under 5 minutes</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;You want to write Clojure. You want to write it in Emacs. Here's how.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;1. Grab Leiningen.&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;mkdir -p ~/bin&lt;br /&gt;cd ~/bin&lt;br /&gt;wget https://raw.github.com/technomancy/leiningen/stable/bin/lein&lt;br /&gt;chmod +x lein&lt;br /&gt;echo 'PATH=$PATH:~/bin' &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;lein self-install&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;This will get you leiningen, Clojure's build tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;2. Grab Clojure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;cd ~/code&lt;br /&gt;lein new my-first-clojure-project&lt;br /&gt;cd my-first-clojure-project&lt;br /&gt;lein deps&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;`lein deps` will bring down a local copy of Clojure. Look in &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;~/code/my-first-clojure-project/lib&lt;/span&gt;&amp;nbsp;!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;3. Grab swank-clojure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;lein plugin install swank-clojure 1.4.0&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;This gives you the `clojure-jack-in` command in emacs. It's your samurai sword.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;4. Grab a healthy .emacs config. &lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;mv ~/.emacs ~/.emacs.bak&lt;br /&gt;mv ~/.emacs.d ~/.emacs.d.bak&lt;br /&gt;git clone git@github.com:c42/dotfiles.git&lt;br /&gt;ln -s dotfiles/emacs.d ~/.emacs.d&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;5. Grab an emacs. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ubuntu:&amp;nbsp;&lt;a href="https://launchpad.net/~cassou/+archive/emacs"&gt;https://launchpad.net/~cassou/+archive/emacs&lt;/a&gt;&lt;br /&gt;OS X:&amp;nbsp;&lt;a href="http://emacsformacosx.com/emacs-builds/Emacs-pretest-24.0.94-universal-10.6.8.dmg"&gt;http://emacsformacosx.com/emacs-builds/Emacs-pretest-24.0.94-universal-10.6.8.dmg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Running emacs for the first time will automatically install all the packages you need. Now run your first emacs repl!&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;&lt;code&gt;M-x clojure-jack-in&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;TADA!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-8373426341358556838?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2012/03/zero-to-emacs-in-under-5-minutes.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-87490095669793690</guid><pubDate>Tue, 06 Mar 2012 22:26:00 +0000</pubDate><atom:updated>2012-03-06T14:26:27.184-08:00</atom:updated><title>finger brains</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Okay, so now I'm back on my own computerand it's a race against myself. Crap. I still seem to be making mistakes. I guess I just can't type all that well when I've had ad couple. Shit.&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Well, this is all I can think of so I'm going to stop typing in 3 2 1.... &lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;My housemate Nikhil (and not my other housemate Nikhil) and I had a typing race on our two respective keyboards. It lasted only a few seconds. We were racing ourselves to test the keyboards (MacBook Air vs. ThinkPad 410-something-something). We each preferred each other's machines but I would only trade this for an X1 covered in leather. Our conversation led to a cross-comparative question "why should I care about my typing speed?" to which was returned one of my favourite stories:&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Duke Huan was in his hall reading a book. The wheelwright P'ien, who was in the yard below chiseling a wheel, laid down his mallet and chisel, stepped up into the hall, and said to Duke Huan, "This book Your Grace is reading--may I venture to ask whose words are in it?"&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;"The words of the sages," said the duke.&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;"Are the sages still alive?"&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;"Dead long ago," said the duke.&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;"In that case, what you are reading there is nothing but the chaff and dregs of the men of old!"&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;"Since when does a wheelwright have permission to comment on the books I read?" said Duke Huan. "If you have some explanation, well and good. If not, it's your life!"&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Wheelwright P'ien said, "I look at it from the point of view of my own work. When I chisel a wheel, if the blows of the mallet are too gentle, the chisel slides and won't take hold. But if they're too hard, it bites in and won't budge. Not too gentle, not too hard--you can get it in your hand and feel it in your mind. You can't put it into words, and yet there's a knack to it somehow. I can't teach it to my son, and he can't learn it from me. So I've gone along for seventy years and at my age I'm still chiseling wheels. When the men of old died, they took with them the things that couldn't be handed down. So what you are reading there must be nothing but the chaff and the dregs of the men of old."&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Wait. Maybe I meant to read him the one about the buckle-maker who focuses so intently on his craft of making buckles that he couldn't see anything else. It wouldn't be the first time I've confused them. Anyway, if you can't type in one continuous stream (higher speeds are largely irrelevant but a 100wpm minimum wouldn't hurt), you're losing little tiny brain spasms to figuring out which keys to hit. These little tiny brain spasms could be helping you figure out what `self` is in the median of your code while trying to remember how to write a class method which generates class methods in Ruby. Because that's how brogrammers like you and me get our tickles. These little tiny brain spasms are basically the opposite of sleep. Shoot them down with your giant space laser-equipped&amp;nbsp;pelican-shaped airship! And then just run under Bowser because you don't actually have to kill him. The beautiful Mavis Beacon awaits on the other side.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-87490095669793690?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2012/03/finger-brains.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-6554473993005285591</guid><pubDate>Wed, 14 Dec 2011 22:53:00 +0000</pubDate><atom:updated>2011-12-14T14:53:41.213-08:00</atom:updated><title>Programming is for girls!</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;My buddy Anne recently posted some of &lt;a href="http://annejsimmons.com/2011/12/01/programmingisforgirls/"&gt;her favourite articles&lt;/a&gt; on the subject of women in Computer Science. I wrote an article last year which presupposed her question, "Programming is for girls?" My answer? &lt;a href="http://www2.uregina.ca/yourblog/?p=950"&gt;Programming is for everybody&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Granted, not everyone who writes an Excel macro will be so enamored with their creation that they feel the need to master Haskell. The wonderful thing about Computer Science today is that they &lt;a href="http://learnyouahaskell.com/"&gt;&lt;i&gt;could&lt;/i&gt;&lt;/a&gt;. Thanks to the tiny (almost negligible) barrier to entry, the only thing left to tackle is the stigma.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Programming is already social.&lt;/i&gt; I prefer pair programming because I'm ADHD and it's the only way I can ever accomplish anything. But I also get to hang out with friends all day as a side benefit. Code is literature, a communication medium. It's fascinating that our little code-robots do something but it's a great deal more important that it speaks to people.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But: Not every software company is an inherently social environment. Yet.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Programming is already creative&lt;/i&gt;. In many ways, it's a purely creative&amp;nbsp;endeavour. Outside the speed of light, there aren't many limitations placed on the raw imagination in a world of code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But: Many software projects are still about doing the same old thing to a different piece of data.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Programming is already sexy and relevant&lt;/i&gt;. Startups are sexy by their very nature. Everyone knows what you're talking about if you say you work for Google or Apple. Most people you know already have a phone they've used to install software while they ride the bus.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But: Not everyone gets to work for a startup or Apple.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can't have it all but you can certainly have most of it. Think your job isn't sexy? Automate the boring parts or quit. It's a seller's market these days. Try out a new technology, if that excites you. Talk to your coworkers. Work with them directly. Find a broader solution to an entire category of problems. Send your resume to that one company you think is really kicking ass.&lt;br /&gt;&lt;br /&gt;There is a real spectrum of significance to the machines we build and the companies we build them for. Create some partial orderings to demonstrate this to yourself. Which is more significant? Clean water or banking? Auto insurance or rice? Diabetes research or zinc? Middle school education or vodka? Public transportation or plywood?&lt;br /&gt;&lt;br /&gt;Not everyone considers the world in the same way and most of us will change our opinions over the course of our lives... but some parts of our society have obvious gravity. If you're already in software, let that gravity pull you in. If you're considering a career in software, contemplate the fact that a career in software really means a career in any field you want: from water purification to zinc froth flotation.&lt;br /&gt;&lt;br /&gt;Girls, software is already sexy. Get on the trolley.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-6554473993005285591?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2011/12/programming-is-for-girls.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-7005821627593879712</guid><pubDate>Sat, 29 Oct 2011 22:39:00 +0000</pubDate><atom:updated>2011-10-29T15:39:45.621-07:00</atom:updated><title>Clojure Macros: How Evil?</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://www.dan-manges.com/blog"&gt;Dan&lt;/a&gt; asked me at the Chicago Clojure Meetup this week if Clojure macros tend to send developers into the death spiral of metaprogramming Ruby's various hooks did when we first discovered those.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;tl;dr: no.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;The canonical example of evil Ruby metaprogramming is everyone's favourite this-will-trim-8-lines-of-code hack: strings to method names. Have you ever written something like this?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;x.send("#{a}_#{b}")&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Sure you have. It's okay. We've all sinned. Are you prevented from doing this sort of thing in Clojure? Nope. No more than you are prevented from doing it in Java. But in Clojure and Java, the apparent innocence of Ruby's `send` method is revealed to be a sham: Reflection &lt;i&gt;feels&lt;/i&gt; bad in these languages.&lt;br /&gt;&lt;br /&gt;All of Ruby's other metaprogramming hooks have something in common: define_method, const_get, method_missing,&amp;nbsp;every flavour of eval, monkey-patching... and all their friends... happen at runtime.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-k28Dl5ZWxn4/Tqx76JlgGEI/AAAAAAAAClc/pAjQ6KLmLho/s1600/yin_yang_cats.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="253" src="http://1.bp.blogspot.com/-k28Dl5ZWxn4/Tqx76JlgGEI/AAAAAAAAClc/pAjQ6KLmLho/s320/yin_yang_cats.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The behaviour of my first few Clojure macros confused me because&amp;nbsp;I was accustomed to Ruby's runtime powers. Clojure's macros&amp;nbsp;are expanded, go figure, at &lt;i&gt;macro expansion time&lt;/i&gt;. As such, they have a few interesting and related properties:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;macros feel like&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;adding a feature to the language&lt;/span&gt;&lt;/li&gt;&lt;li&gt;ruby metaprogramming feels like &lt;span class="Apple-style-span" style="color: #990000;"&gt;mutating the language&lt;/span&gt;&lt;/li&gt;&lt;li&gt;macros &lt;span class="Apple-style-span" style="color: #38761d;"&gt;cannot use runtime data&lt;/span&gt; to generate dynamic code&lt;/li&gt;&lt;li&gt;ruby metaprogramming&amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;requires runtime data&lt;/span&gt; to generate dynamic code&lt;/li&gt;&lt;li&gt;macros &lt;span class="Apple-style-span" style="color: #38761d;"&gt;require a new way of thinking&lt;/span&gt; about code generation&lt;/li&gt;&lt;li&gt;ruby metaprogramming is just a &lt;span class="Apple-style-span" style="color: #990000;"&gt;higher-level imperative layer&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Macros also have a very clear usage pattern (see Christophe's wonderful &lt;a href="http://www.slideshare.net/cgrand/dsl-5537797"&gt;(not= DSL macros) presentation&lt;/a&gt; from the first ClojureConj):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;data formats &amp;gt; functions &amp;gt; macros&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is to say: Build your functions on top of your data. Build your macros on top of your functions. Macros should always be a convenience rather than a requirement. This one little rule is often enough to remind yourself that "write a macro!" usually isn't the solution you're looking for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're probably better off to avoid comparing Ruby's metaprogramming facilities with macros at all. It makes more sense to compare Ruby's hooks to Clojure's reflection and Ruby's eval to Clojure's eval -- neither of which I've seen used in a production Clojure application. Macros actually stand out on their own, since Ruby doesn't have an equivalent feature.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Can you still write a steaming pile of magic in Clojure? Of course. Once you suffocate your desire for elegance, you can reflect and eval and macro your way into a painful and confusing&amp;nbsp;labyrinth&amp;nbsp;of obfuscated code just as you can in any other modern language. But Clojure's libraries and language features usually display enough power on their own that you aren't tempted to shortcut your way into an impenetrable structural abstraction. At least, I haven't seen it yet.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-7005821627593879712?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2011/10/clojure-macros-how-evil.html</link><author>noreply@blogger.com (Steven Deobald)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-k28Dl5ZWxn4/Tqx76JlgGEI/AAAAAAAAClc/pAjQ6KLmLho/s72-c/yin_yang_cats.jpg' height='72' width='72'/><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-6171540860888695280</guid><pubDate>Tue, 10 May 2011 23:00:00 +0000</pubDate><atom:updated>2011-05-20T06:15:57.730-07:00</atom:updated><title>Open Letter to Pascal</title><description>My friend Pascal recently asked me what books I would recommend he read to learn the basics of programming. He'd been looking into it for a while but simply couldn't decide where to start, given the multitude of programming books available.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I'd be the last to claim I've swum a majority of the book lagoon, but I have found over the years that the majority of programming books are neither timeless nor all that well-written. Pascal's response seems obvious, in retrospect: if I could start it all over, what would I read?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Pascal's case, I'd recommend &lt;a href="http://mitpress.mit.edu/sicp/"&gt;&lt;i&gt;The Structure and Interpretation of Computer Programs&lt;/i&gt;&lt;/a&gt;. As a Math teacher, he should find the calculus-based examples in the early chapters relatively easy -- if not downright intuitive. SICP is easily the richest and most thoughtful programming book I've ever read. Were it not for all the math it assumed familiar to the reader, I'd recommend it to everyone above and beyond all other texts in the discipline.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For everyone else (myself included), I'd put &lt;a href="http://www.ccs.neu.edu/home/matthias/BTLS/"&gt;&lt;i&gt;The Little Schemer&lt;/i&gt;&lt;/a&gt; at the top of the list, quickly followed by &lt;i&gt;The Seasoned Schemer&lt;/i&gt; and &lt;i&gt;The Reasoned Schemer&lt;/i&gt;. The books are a joy to read thanks to their peculiar style and between them convey many of the ideas SICP presents as a more traditional academic text.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Why not &lt;i&gt;Learn to Program&lt;/i&gt; or &lt;i&gt;Learn Java in 21 Days&lt;/i&gt;?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Most introductory programming books and online tutorials (even Why the Lucky Stiff's &lt;i&gt;Poignant Guide to Ruby&lt;/i&gt;, in all its humour and beauty) make a grave mistake in their introduction to programming: They misrepresent syntax as the first principle of writing code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the first chapter of your introductory literature explains the representation of strings and numbers in [insert-your-language-of-choice-here], you've already started your reader off on the wrong foot. Worse yet, there's a temptation to teach new programmers about variables, mutation of state, and side-effects -- such as printing to the console.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One does not require dozens of books and years of practice to understand the essence of writing software. But in my case, it took as much to unlearn the bad habits taught by my first texts.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-6171540860888695280?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2011/05/open-letter-to-pascal.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-4605288934027187491</guid><pubDate>Fri, 11 Feb 2011 18:54:00 +0000</pubDate><atom:updated>2011-02-11T11:10:08.326-08:00</atom:updated><title>FlyMake does not like JRuby</title><description>&lt;div&gt;JRuby often works out-of-the-box wherever MRI does. FlyMake is not one of those cases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Flymake expects a particular format for error messages returned from the interpreter: MRI error messages. &lt;a href="http://www.ruby-forum.com/topic/211566"&gt;Charlie and Friends have decided the MRI error messages can be a bit opaque&lt;/a&gt;, and upgraded them to something a little more readable. Sadly, this breaks anything attempting to parse those messages. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.gaz-jones.com/"&gt;Gaz&lt;/a&gt; and I decided to try switching things back to MRI so we could get our syntax errors highlighted in emacs. Lo and behold! Everything's happy again. As an added bonus, you don't need to wait for JRuby (and thus, a JVM) to start up every time FlyMake runs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can grab our changes with our latest emacs-starter-kit: https://github.com/drwti/emacs-starter-kit&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're using Phil Hagelberg's emacs-starter-kit, make the appropriate change to starter-kit-ruby.el:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;-    (list "ruby" (list "-c" local-file))))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;+    (list "/usr/bin/ruby" (list "-c" local-file))))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-4605288934027187491?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2011/02/flymake-does-not-like-jruby.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-6104797396359200747</guid><pubDate>Wed, 08 Apr 2009 03:53:00 +0000</pubDate><atom:updated>2009-04-07T21:08:57.487-07:00</atom:updated><title>TiddlyBuild, the single-file build light.</title><description>Joel and I threw together a super-simple build light for TeamCity today. The standard project views are too cluttered for broadcasting big colourful messages.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_-c99fYySfc4/SdwhDQCrj9I/AAAAAAAAB8s/p7hrEU_e8C8/s400/tiddly-light.PNG" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 366px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5322165199374618578" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Enjoy &lt;a href="http://deobald.ca/work/tiddly-build.html.txt"&gt;TiddlyBuild&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-6104797396359200747?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2009/04/tiddlybuild-single-file-build-light.html</link><author>noreply@blogger.com (Steven Deobald)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-c99fYySfc4/SdwhDQCrj9I/AAAAAAAAB8s/p7hrEU_e8C8/s72-c/tiddly-light.PNG' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-7710277533210053924</guid><pubDate>Tue, 10 Jun 2008 19:13:00 +0000</pubDate><atom:updated>2008-06-10T12:16:40.724-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>software</category><category domain='http://www.blogger.com/atom/ns#'>design</category><category domain='http://www.blogger.com/atom/ns#'>business</category><title>Tech Leaderisms.</title><description>Are you a developer? Yes? Then I'm sorry to tell you, friend: There is a Tech Lead in you. Rather, someone will try to make you a Tech Lead one day. For your future Tech Lead self, I recommend reading the corresponding articles, &lt;a href="http://www.magpiebrain.com/blog/2006/09/12/a-tech-lead-manifesto/"&gt;A Tech Lead Manifesto&lt;/a&gt; and &lt;a href="http://www.thekua.com/atwork/2008/05/10/behaviours-of-a-tech-lead/"&gt;Behaviours of a Tech Lead&lt;/a&gt; (written by colleagues Sam Newman and Pat Kua, respectively).&lt;br /&gt;&lt;br /&gt;To those insights, I add these recommendations:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Know Your Teammates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before you start, talk to everyone. Understand each developer's goals and fears with respect to your upcoming project. Know the strengths and weaknesses of everyone on your team, and formulate a plan for dealing with both. Sketch out your team roster and ensure that the experience and skill level is balanced.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Use Two-Pizza Teams&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure who first coined this, but I love the idea. I also like the idea of trying it out in reality: Have an in-office team dinner. Order two pizzas. Were you left hungry? Your team is too large. Or you have one gluttonous developer. But probably your team is too large.&lt;br /&gt;&lt;br /&gt;Given an oversized team by this yardstick, work with all stakeholders involved to divide up the project. You may even find additional value in simplifications required to divide up your previously bloated project.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Develop Horizontally Until Release 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It may seem obvious, but I'm still surprised how often this rule is ignored. If you haven't deployed into a production environment yet, build out -- not down. Complex business rules will materialize in every story. They always do. Create new stories from these rules and put them on the shelf until they are truly more important than the next functional story coming down the pipe.&lt;br /&gt;&lt;br /&gt;As a Tech Lead, you share this responsibility with your stakeholders. At the end of the day, they will decide what is most important. However, the unseen complexity of a business is visible to you because it materializes as code; share this with everyone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Build It Yourself &lt;/span&gt;&lt;span style="font-size:130%;"&gt;First&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All too often slogans such as "You Aren't Gonna Need It" are thrown around the the software community until they're almost law. Lately, I find the most troubling to be "Not Invented Here Syndrome"; more often than not, I find the opposite Syndrome afflicting developers: "There's a Framework For That! Syndrome"&lt;br /&gt;&lt;br /&gt;Sure there is. Build it yourself anyway.&lt;br /&gt;&lt;br /&gt;The majority of frameworks are simply implementations of patterns. Whether as ubiquitous as Dependency Injection, or as domain-specific as a shopping cart, try implementing the pattern yourself before reaching for the nearest third-party library. You very well might throw it away, but often you'll end up with an implementation which is significantly lighter and easier to test.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Keep Metrics and Ratchet Your Build&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://skizz.biz"&gt;Chris&lt;/a&gt; wrote about "&lt;a href="http://skizz.biz/blog/2008/03/11/fixing-broken-windows-with-ratcheting/"&gt;ratcheting&lt;/a&gt;" recently. Go read it! The flip side of ratcheting is, of course, preventative medicine. Why wait until you have 60 TODOs before breaking the build? Place as many reasonable limits on yourself as you can, early on. In the thick of the project your motivation to do so might be overruled by the desire to Just Write Code. Tools such as &lt;a href="http://www.panopticode.org/"&gt;Panopticode&lt;/a&gt;, &lt;a href="http://metric-fu.rubyforge.org/"&gt;metric_fu&lt;/a&gt;, &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, and &lt;a href="http://www.mono-project.com/Gendarme"&gt;Gendarme&lt;/a&gt; will help you a great deal, but they're just the tip of the iceberg. Be creative not only in the tools you choose, but the rules you write and the metrics you extract.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-7710277533210053924?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/06/tech-leaderisms.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-5542215360045086293</guid><pubDate>Mon, 09 Jun 2008 13:13:00 +0000</pubDate><atom:updated>2008-06-10T04:06:44.507-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>java</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>software</category><category domain='http://www.blogger.com/atom/ns#'>design</category><title>The C# expatriate: Tips for settling in Java.</title><description>Friday signaled the end of my first Java project in 6 years. Coming from a C#/.NET background, the learning curve was not steep -- but by the end of the project I had learned enough small lessons to serve as the basis for this little document.&lt;br /&gt;&lt;br /&gt;If you happen to move from a .NET project to a Java project, have a look through these pointers. This is all the advice I wish I had when I started this project six months ago.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1. Learn all your new tools, inside and out.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As a C# developer, you're already utterly dependent on &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt;. You will undoubtedly feel at home in IntelliJ. The majority of your day-to-day keyboard shortcuts will remain the same. Those that map directly map closely (CTRL+- is replaced with CTRL+ALT+LEFTARROW).&lt;br /&gt;&lt;br /&gt;However, ReSharper is a plug-in which makes .NET development tolerable. IntelliJ is a work of art -- and it makes programming a joy. Install the &lt;a href="http://plugins.intellij.net/plugin/?id=1003"&gt;Key Promoter&lt;/a&gt; plug-in and never look back.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Find New Tools&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As far as I know, nothing like &lt;a href="http://www.panopticode.org/"&gt;Panopticode&lt;/a&gt; exists for C#. &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt; almost certainly doesn't. Explore the landscape and enjoy the rich open source bibliotheque that we're missing on Microsoft-funded frameworks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Testing and Mocking&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use JUnit 4. Use &lt;a href="http://code.google.com/p/mockito/"&gt;Mockito&lt;/a&gt;. Try &lt;a href="http://jbehave.org/"&gt;jBehave&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Collections&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eagerly write custom collections and provide yourself with methods for collecting, filtering, and all that other fun stuff. You can augment this with &lt;a href="http://code.google.com/p/hamcrest-collections/"&gt;Hamcrest Collections&lt;/a&gt;, but keep in mind it's still v0.1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; 5. Other Wrappers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Be even more aggressive about wrapping standard APIs than you would be in .NET. Why? Like collections, the .NET base class libraries have a (small) leg up on Java, thanks to watching Java grow and change. Because of this, you will periodically find features missing you might expect from the standard API. To be fair, once you've become accustomed to eagerly wrapping standard APIs in Java, carry that back to .NET with you. Chances are good you weren't wrapping enough stuff when you were last writing .NET. (I know I certainly wasn't.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Dates and Times&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Java DateTime libraries are beyond useless; use &lt;a href="http://joda-time.sourceforge.net/"&gt;JodaTime &lt;/a&gt;from day one. If anyone imports the JDK DateTime packages, fail the build. Joda comes with all the Hibernate jazz you need to persist Joda's DateTimes, so you're good there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Apache Commons&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use it. It rocks. When you go back to .NET, steal ideas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-5542215360045086293?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/06/c-expatriate-tips-for-settling-in-java.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-7502836677711045391</guid><pubDate>Fri, 30 May 2008 19:01:00 +0000</pubDate><atom:updated>2008-05-30T12:06:38.459-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>internet</category><category domain='http://www.blogger.com/atom/ns#'>fame</category><title>I am that alien.</title><description>&lt;span style="font-style: italic;"&gt;"Somehow the competing teams of aliens can see our world through our eyes when they want to, and can influence our actions by ramping up or down on our desires. They can't control our specific actions, just our general propensities, making us, for example, &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;hungrier or hornier or lazier&lt;/span&gt; &lt;span style="font-style: italic;"&gt;than normal whenever that would be a strategic advantage in the game."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scott Adams - &lt;a href="http://dilbert.com/blog/entry/sci_fi_plot/"&gt;Sci-Fi Plot&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-7502836677711045391?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/05/i-am-that-alien.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-5595365045640679451</guid><pubDate>Sun, 18 May 2008 05:40:00 +0000</pubDate><atom:updated>2008-05-17T22:40:00.860-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>triangles</category><category domain='http://www.blogger.com/atom/ns#'>humanity</category><category domain='http://www.blogger.com/atom/ns#'>design</category><title>Tables.</title><description>Human beings can comprehend mathematics. At some point, we discovered the triangle -- a brilliant, reusable piece of beauty and simplicity.&lt;br /&gt;&lt;br /&gt;Why do we still build tables with four legs?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-5595365045640679451?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/05/tables.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-5746597466874033648</guid><pubDate>Sun, 18 May 2008 00:42:00 +0000</pubDate><atom:updated>2008-05-17T10:51:53.197-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>news</category><category domain='http://www.blogger.com/atom/ns#'>internet</category><category domain='http://www.blogger.com/atom/ns#'>entertainment</category><category domain='http://www.blogger.com/atom/ns#'>media</category><title>Cartoons and comic books.</title><description>The curiosity of my coworkers at &lt;a href="http://www.thoughtworks.com/"&gt;ThoughtWorks &lt;/a&gt;often leads to a number of healthy and interesting debates, which often occur in the pub, on internal mailing lists, and anywhere in-between. One such discussion, of the mailing list variety, revolved around the topic Chinese economics and politics. Inevitably, the recent Angry Red Dragon issue of The Economist was mentioned in passing as participants shuffled over the topic of general Western opinions on China.&lt;br /&gt;&lt;br /&gt;Most people I know were furious when they saw the Angry Red Dragon. I was elated. For years, I've taken to ribbing any of my friends who read The Economist; although the writing is entertaining, the topics various, and the grammar impeccable, I still find it offensive that such a magazine sells itself as "news" for the same I reason CNN disgusts me. It's not news. It's entertainment. It's a comic book.&lt;br /&gt;&lt;br /&gt;Fox News has been getting it right for years now. &lt;a href="http://www.crooksandliars.com/2007/04/16/kurt-vonneguts-lifefox-news-style/"&gt;Kurt Vonnegut's obituary-thing&lt;/a&gt; is the perfect example -- no one at Fox is pretending they're running a news channel. It's a cartoon and that in itself is not entirely disagreeable. No one I know would take such material at face value.&lt;br /&gt;&lt;br /&gt;Other sources of information, though, seem to slip through this filter simply because their content is well-delivered and free of lunacy. Why is this the case? Even if we find a media outlet without opinion or agenda, what on earth makes us think they could possibly collect all the facts or perform a complete analysis?&lt;br /&gt;&lt;br /&gt;Although we all ask ourselves that exact question and respond with "of course that's silly! I always question everything I'm told," sometimes it's not so obvious. As human beings, we're remarkably fallible. I've read Economist articles in the past and forgotten, mid-stream, that the material I'm consuming is For Entertainment Purposes Only. It's an easy rule to forget -- we all do it -- and there's nothing quite like thinly-veiled racism (or other abhorrent messaging) to remind us that media we consume is largely trash.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-5746597466874033648?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2007/04/cartoons-and-comic-books.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-1854442718423929160</guid><pubDate>Sat, 17 May 2008 16:14:00 +0000</pubDate><atom:updated>2008-05-17T09:56:01.289-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>user interfaces</category><category domain='http://www.blogger.com/atom/ns#'>music</category><category domain='http://www.blogger.com/atom/ns#'>design</category><title>We need more onomy.</title><description>The other day I was listening to assorted tracks in my reading room while enjoying a glass of scotch and puttering away in the codebase of my current project. I was feeling chipper, the sun was shining. On Saturdays I'm willing to play the music loud enough to feel engrossed and I was looking for a bit of a beat in most of what I was listening to.&lt;br /&gt;&lt;br /&gt;I own an iPod Video, and if we discount the fact that Winamp seems to be the only reliable way of getting data on and off the device, it does a satisfactory job of playing music. &lt;span style="font-style: italic;"&gt;Selecting &lt;/span&gt;music, however, is a chore. None of the predefined labels in the iPod taxonomy (or the taxonomy of any other music player I've ever used) satisfy my needs: Artist? Genre? Just what is a "genre," anyway? And how do I differentiate between Electronic, Electronica, and Electronica/Dance? Or Folk, Folk/Country, Folk/Rap, and Reggae/Folk?&lt;br /&gt;&lt;br /&gt;I'd love to see a taxonomy for music based entirely on well-articulated emotion or situation. That is, the primary detail describing the music would be details of potential consumer environments, rather than details of the musical quality itself. Because music is so notoriously difficult to classify in the first place, I don't see why a difficult, albeit inverted, classification scheme isn't worth a go.&lt;br /&gt;&lt;br /&gt;An open-ended tagging scheme would work well for this, so perhaps the folks at last.fm or MusicBrainz have already solved this problem... I don't know. I don't use the internet often enough to pay attention to this stuff. But searching one's own collection for tags such as '&lt;span style="font-family: courier new;"&gt;emotion:elated,complacent&lt;/span&gt;' and '&lt;span style="font-family: courier new;"&gt;situations:alone,underground coffee shop&lt;/span&gt;' would save those of us who don't have the energy to invest in memorizing albums.&lt;br /&gt;&lt;br /&gt;Such a system would actively encourage group classifications to avoid the obvious potential single-minded environmental appreciation of music stemming from individuals producing this meta-data. But then, these classification parties would tend toward an eventual situation of '&lt;span style="font-family: courier new;"&gt;classification party&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;...so maybe it wouldn't work after all. But I still wish UIs for music-selection had improved in the last 15 years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-1854442718423929160?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/05/we-need-more-onomy.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-3538338808841976786</guid><pubDate>Fri, 22 Feb 2008 17:15:00 +0000</pubDate><atom:updated>2008-02-22T09:35:26.306-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>design</category><category domain='http://www.blogger.com/atom/ns#'>wtf</category><category domain='http://www.blogger.com/atom/ns#'>microsoft</category><title>Design oddities from another universe.</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_-c99fYySfc4/R78EiOgp1eI/AAAAAAAABcg/18kJ6MDKnWE/s1600-h/WHATTHEFUCK.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_-c99fYySfc4/R78EiOgp1eI/AAAAAAAABcg/18kJ6MDKnWE/s400/WHATTHEFUCK.PNG" alt="" id="BLOGGER_PHOTO_ID_5169855883301737954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Man. Whose job is it to come up with this shit? Here is what this dialog box says to me:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;blockquote&gt;Hey, sorry. Because the software we wrote for you is riddled with security holes, we have to turn your computer off at random... in the night. Like ninjas. Or vampires. Or ninja-vampires who come in the night to destroy your data and then tie you down to your bed and tickle your feet until you scream. And then suck all the blood out of you through... your nipples. Yeah. And maybe then we'll throw salt on your bloody nipples just for good measure, even though you're already dead. Because we hate you. A lot.&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;Well, I'm starting to hate you too, Microsoft. My current project requires that I use a Windows laptop on a daily basis. I've grown quite accustomed to Ubuntu and OS X over the past few years. As much as I'll harp about the fact that Apple's computer platform blows Windows out of the water when it comes to "how much proprietary do ya gots?" -- at least it works. Windows XP is the new OS/2: it's cute, it worked once, but now we need to convince our co-workers it's time to move on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-3538338808841976786?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/design-oddities-from-another-universe.html</link><author>noreply@blogger.com (Steven Deobald)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_-c99fYySfc4/R78EiOgp1eI/AAAAAAAABcg/18kJ6MDKnWE/s72-c/WHATTHEFUCK.PNG' height='72' width='72'/><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-1895375876858066187</guid><pubDate>Fri, 22 Feb 2008 16:49:00 +0000</pubDate><atom:updated>2008-02-22T09:11:30.051-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>lifehacks</category><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>nerdery</category><title>Rock the shortcuts.</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_-c99fYySfc4/R78ADOgp1bI/AAAAAAAABcI/qez11drCamI/s1600-h/shift-slash.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_-c99fYySfc4/R78ADOgp1bI/AAAAAAAABcI/qez11drCamI/s400/shift-slash.png" alt="" id="BLOGGER_PHOTO_ID_5169850952679282098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Brilliant. I'm not sure how I got through life without this before: &lt;span style="font-weight: bold;"&gt;? (or shift+/) displays all the Gmail and Google Reader keyboard shortcuts immediately on-screen.&lt;/span&gt; Hooray!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-1895375876858066187?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/rock-shortcuts.html</link><author>noreply@blogger.com (Steven Deobald)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_-c99fYySfc4/R78ADOgp1bI/AAAAAAAABcI/qez11drCamI/s72-c/shift-slash.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-3967577025253855447</guid><pubDate>Wed, 06 Feb 2008 16:58:00 +0000</pubDate><atom:updated>2008-02-06T09:16:14.219-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>software</category><category domain='http://www.blogger.com/atom/ns#'>barcamp</category><title>Devcamp Bangalore, Barcamp Pune!</title><description>If you are near the south or west of the subcontinent this college fest season, be sure to sign up for &lt;a href="http://www.devcamp.in/wiki/Register"&gt;devcamp Bangalore&lt;/a&gt; and &lt;a href="http://barcamp.org/BarCampPune4"&gt;Barcamp Pune&lt;/a&gt;. Each unconference will run out of the respective ThoughtWorks office, and Sexy MF will be in attendance. If you're coming to Barcamp, let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-3967577025253855447?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/devcamp-bangalore-barcamp-pune.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-4884770981560223858</guid><pubDate>Wed, 06 Feb 2008 14:37:00 +0000</pubDate><atom:updated>2008-02-06T06:49:50.917-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>india</category><category domain='http://www.blogger.com/atom/ns#'>money</category><category domain='http://www.blogger.com/atom/ns#'>fun</category><category domain='http://www.blogger.com/atom/ns#'>lifehacks</category><title>Outdone.</title><description>Life in India incurs smaller expenses than life in Canada. (Unfortunately, it also involves a smaller salary; my Indian salary is approximately minimum wage in Canada.) Rent is reasonable ($225/mo) and food is as cheap as you'll find it anywhere -- even to eat out ($2 will stuff you in a cheap restaurant).&lt;br /&gt;&lt;br /&gt;But if Geoff can accomplish &lt;a href="http://spreadsheets.google.com/pub?key=peb50bzsN_25TVu3vqMQNAw"&gt;the $10/day February he has planned&lt;/a&gt;, he'll blow me out of the water.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-4884770981560223858?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/outdone.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-4593788979210958756</guid><pubDate>Tue, 05 Feb 2008 18:50:00 +0000</pubDate><atom:updated>2008-02-05T10:56:34.515-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>global</category><category domain='http://www.blogger.com/atom/ns#'>life</category><category domain='http://www.blogger.com/atom/ns#'>politics</category><title>I don't even have the energy to be angry about this anymore.</title><description>One of these things is not like the others.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_-c99fYySfc4/R6iwiEHrHZI/AAAAAAAABbA/9EKKO285PlQ/s1600-h/sigh.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_-c99fYySfc4/R6iwiEHrHZI/AAAAAAAABbA/9EKKO285PlQ/s400/sigh.png" alt="" id="BLOGGER_PHOTO_ID_5163571072048242066" border="0" /&gt;&lt;/a&gt;cnn.com&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-4593788979210958756?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/i-dont-even-have-energy-to-be-angry.html</link><author>noreply@blogger.com (Steven Deobald)</author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_-c99fYySfc4/R6iwiEHrHZI/AAAAAAAABbA/9EKKO285PlQ/s72-c/sigh.png' height='72' width='72'/><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-9052842786623838891</guid><pubDate>Tue, 05 Feb 2008 18:27:00 +0000</pubDate><atom:updated>2008-02-05T10:31:56.186-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>fun</category><category domain='http://www.blogger.com/atom/ns#'>humor</category><category domain='http://www.blogger.com/atom/ns#'>spam</category><title>in honour of russian girl</title><description>Mike gave up on &lt;a href="http://mybillyboiled.blogspot.com"&gt;his blog&lt;/a&gt;, but apparently &lt;a href="http://mybillyboiled.blogspot.com/2008/01/russian-girl.html"&gt;someone else hasn't&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's one that recently slipped through Gmail's filters. You have to admit it's pretty money.&lt;br /&gt;&lt;br /&gt;&lt;h1 class="YfMhcb"&gt;&lt;span id="1eq2" class="VrHWId"&gt;Enormous shlong drive girls mad&lt;/span&gt;&lt;/h1&gt;&lt;blockquote&gt;Your woman lived you alone along of  she had done it with your friend.&lt;br /&gt;&lt;br /&gt;By reason of  the size of his machine drove her crazy with him.&lt;br /&gt;&lt;br /&gt;Dont worry chap. At present you have good chance to Enlarge your male machine length.&lt;br /&gt;&lt;br /&gt;Lengthen your male device size and you'll forget about troubles surely enough.&lt;/blockquote&gt;&lt;br /&gt;-Doctor Samantha Mcgraw&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-9052842786623838891?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/in-honour-of-russian-girl.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-4759216981349752468</guid><pubDate>Sun, 03 Feb 2008 11:22:00 +0000</pubDate><atom:updated>2008-02-03T04:13:35.882-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>how-to</category><category domain='http://www.blogger.com/atom/ns#'>code</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><title>Testing strange web applications using Selenium? Take note.</title><description>&lt;span style="font-size:180%;"&gt;Update to: &lt;a href="http://www.mail-archive.com/selenium-users@lists.public.thoughtworks.org/msg00652.html"&gt;Workaround for &lt;span style="font-family: courier new;"&gt;alert()&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;confirm()&lt;/span&gt; during &lt;span style="font-family: courier new;"&gt;onload()&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A change in Selenium has caused this workaround to stop working for those inclined to simply copy and paste Alistair's original solution. These days, if you want to give Selenium access to &lt;span style="font-family: courier new;"&gt;alert()&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;confirm()&lt;/span&gt; dialogs your application pops up during the &lt;span style="font-family: courier new;"&gt;onload &lt;/span&gt;event, you'll need to reference &lt;span style="font-family: courier new;"&gt;parent.selenium.browserbot&lt;/span&gt; instead. As per the original solution, execute the following code anywhere (either statically in the page or in the &lt;span style="font-family: courier new;"&gt;onload&lt;/span&gt; event itself) before the JavaScript which pops up a dialog:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;var browserbot = parent.selenium.browserbot;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt; if (browserbot) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;    browserbot.modifyWindowToRecordPopUpDialogs(window, browserbot);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tada! You're home free and your QAs can happily automate testing through the UI once again.&lt;br /&gt;&lt;br /&gt;Also of note: If you're popping up alert and confirm dialogs in an &lt;span style="font-family: courier new;"&gt;IFrame &lt;/span&gt;(egads!), you'll need to reference &lt;span style="font-family: courier new;"&gt;parent.parent.selenium.browserbot&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Happy testing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-4759216981349752468?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/testing-strange-web-applications-using.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-9198213211390339983</guid><pubDate>Sun, 03 Feb 2008 06:19:00 +0000</pubDate><atom:updated>2008-02-03T03:19:52.484-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>software</category><category domain='http://www.blogger.com/atom/ns#'>design</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><title>How to be succinct.</title><description>Regarding Singletons, Steve Yegge writes:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt; In my Data Structures course in college, when we got to AVL trees, my prof turned and wrote on the board, in huge, clear letters: &lt;/p&gt;   &lt;p&gt;&lt;span style=";font-size:78%;color:red;"  &gt;&lt;pre&gt; &lt;span style="color: rgb(153, 0, 0);"&gt;AVL Trees are EVIL&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt; &lt;/p&gt;   &lt;p&gt; ...and that's all we had to learn about them. He had us implement red/black trees and splay trees instead. To this day, I have no idea how threaded AVL trees work. But if that's OK with Dan Weld, it's OK with me. &lt;/p&gt;   &lt;p&gt; But now I know how he felt.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Steve, Steve. Follow Mr. Weld's example. Or you could just point people toward "Test-Driven Development By Example", since Mr. Beck has already covered this one pretty well:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;&lt;blockquote&gt;"How do you provide global variables in languages without global variables? Don't. Your programs will thank you for taking the time to think about design instead."&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-9198213211390339983?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/how-to-be-succinct.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-8530194347813134734</guid><pubDate>Sat, 02 Feb 2008 14:54:00 +0000</pubDate><atom:updated>2008-02-02T08:03:04.483-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>fun</category><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>design</category><title>Singularity.</title><description>At lunch the other day, Anay and I were lamenting the sharp bug-detection skills of our team's Business and Quality Analysts over dry, flavourless rotis. At one point, while defending a feature he hadn't implemented yet against accusations of systemic circumvention, Anay blurted out, "That's because you haven't filed a bug for it yet!" (With the standard XXL Anay Grin plastered on his face, of course.)&lt;br /&gt;&lt;br /&gt;However, our humour inadvertently led to revelation. The differences described by experts between "defects" and "features" are purely semantic. And after considering the application of this theory wholesale to our current project, we arrived at a much juicier solution: &lt;span style="font-weight: bold;"&gt;Bug-Driven Development&lt;/span&gt;. Submit a bug, have it implemented by our crack team of developers.&lt;br /&gt;&lt;br /&gt;Subversion is &lt;a href="http://deobald.beanstalkapp.com/singularity"&gt;here&lt;/a&gt;, but we'll probably move to Google Code when we write... some code. (I tried making an issue tracker on &lt;a href="http://www.lighthouseapp.com"&gt;Lighthouse&lt;/a&gt;... but lo-and-behold! It sucks. Thanks Web 2.0 for providing the world with a bunch of over-simplified applications written by 15-year-olds which are only free when they're totally useless. I'm not bitter.)&lt;br /&gt;&lt;br /&gt;Anyway. No software exists yet, but you are welcome to submit bug reports. No development environment exists yet, so bug reports are welcome as comments on this blog post or emails sent to me. A good first bug report would be the lack of a bug reporting system. Maybe the software should be a bug reporting system? Oh, we also don't have any developers yet, so another suggestion for your first bug is recommending the assembly of a team.&lt;br /&gt;&lt;br /&gt;Enough hints! Welcome to Singularity: The First and Last Real Software Ever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-8530194347813134734?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/02/singularity.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-4726046897510569577</guid><pubDate>Sat, 26 Jan 2008 23:17:00 +0000</pubDate><atom:updated>2008-01-26T01:47:46.033-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>india</category><category domain='http://www.blogger.com/atom/ns#'>thoughtworks</category><category domain='http://www.blogger.com/atom/ns#'>life</category><category domain='http://www.blogger.com/atom/ns#'>pune</category><title>Dupies.</title><description>&lt;span style="font-size:180%;"&gt;The Theory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Moving to a new country often involves adjusting to a new currency. As much as my mind can't intuitively wrap itself around miles, I have a hard time with the &lt;span style="font-style: italic;"&gt;feeling&lt;/span&gt; of Rupees here in India. Thankfully, the current economic situation provides us with some easy answers.&lt;br /&gt;&lt;br /&gt;The present economy helpfully provides us North Americans with a nearly-round conversion rate:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;$1 CAD / USD : Rs. 39.1&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;We can exploit this fact by rounding up to Rs. 40 per dollar and taking other factors into consideration. The economy of India is significantly different than that of North America. Housing is &lt;span style="font-weight: bold;"&gt;much&lt;/span&gt; more expensive. Food is &lt;span style="font-weight: bold;"&gt;much&lt;/span&gt; cheaper. Compared to the cost of living in your average Canadian or American city, the cost of living ratio is approximately:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;1 : 4&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;You see where we're going with this, ya? To get a feel for prices in India, all you need to do is apply this ratio:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;1 : 10&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Canadians/Americans:&lt;/span&gt; That is to say, for every dollar you would spend in the US or Canada, you should prepare to spend Rs. 10 in India. This obviously won't be the case. I've spent Rs. 2000 (which feels like $200) on a bad bottle of wine. I've spent Rs. 5 (which feels like $0.50) on a sandwich. But you get the idea.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Indians:&lt;/span&gt; Conveniently, the inverse is true. If you move to the US on a US salary, imagine every dollar you spend is Rs. 10. A $50 bottle of wine should taste as good (probably better) than an Rs. 500 bottle of wine. $400 for an iPhone? That should hurt as much as spending Rs. 4000.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Details&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The difficulty here is that India's economy is a great deal more interesting than North America's. Some people in India live on Rs. 500/month. Could you live in Denver for $50/month? On the other end of the scale, we have inflated prices driven by foreign currency, which complicates the conversion even further. For now, let's assume you're a member of the youthful middle class in either country and examine some sample costs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cleaning Lady&lt;/span&gt;&lt;br /&gt;Rs. 1000 /mo =&gt; $100 / mo&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Salary&lt;/span&gt;&lt;br /&gt;$50,000 =&gt; Rs. 500,000&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rickshaw / Cab ride&lt;/span&gt;&lt;br /&gt;Rs. 50 =&gt; $5&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cheap meal&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;$4 (McDonald's) =&gt; Rs. 40 (&lt;span style="font-style: italic;"&gt;delicious&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Expensive meal&lt;/span&gt;&lt;br /&gt;$200 (&lt;span style="font-style: italic;"&gt;delicious&lt;/span&gt;) =&gt; Rs. 2000 (Meh.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Imported iPod stereo&lt;/span&gt;&lt;br /&gt;Rs. 16,000 =&gt; $1600 (in India)&lt;br /&gt;$400 =&gt; Rs. 4000 (in Canada)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Delicious street-side masala chai / disgusting Starbucks coffee&lt;/span&gt;&lt;br /&gt;Rs. 2.5 =&gt; $0.25 (in India)&lt;br /&gt;$4.25 =&gt; Rs. 42.5&lt;br /&gt;&lt;br /&gt;Those last two items are intended to illustrate the sliding scale. You would never pay $1600 for an off-the-shelf iPod stereo (one hopes), nor would you ever find a coffee shop willing to serve you a cup for $0.25.&lt;br /&gt;&lt;br /&gt;In general, "the high life" is better lived in Western countries... or in India on a Western salary, if you have such a luxury. Otherwise, you'll find the cost of living comparable in India, with regular expenses such as food or tea accounting for very little of your budget.&lt;br /&gt;&lt;br /&gt;Is there an easy conversion rate for two countries you've lived in?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-4726046897510569577?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2007/12/dupies.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-20208453.post-6478350763801210426</guid><pubDate>Sat, 26 Jan 2008 08:56:00 +0000</pubDate><atom:updated>2008-01-26T00:59:18.154-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>blogs</category><category domain='http://www.blogger.com/atom/ns#'>life</category><title>A new theme.</title><description>In the past I've applied "don't think, just do" only when I felt like doing. No more! If you aggregate this thing, you'll probably want to stop. A scratchpad will all facets of my life become.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20208453-6478350763801210426?l=blog.deobald.ca' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.deobald.ca/2008/01/new-theme.html</link><author>noreply@blogger.com (Steven Deobald)</author><thr:total>0</thr:total></item></channel></rss>
