<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='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'><id>tag:blogger.com,1999:blog-1937539813134787961</id><updated>2011-12-22T12:49:37.197-08:00</updated><category term='ruby'/><category term='compiler project'/><category term='javascript'/><category term='clojure'/><category term='firebug'/><category term='fonts'/><category term='gwt'/><category term='qunit'/><category term='c#'/><category term='iphone'/><category term='f#'/><category term='css'/><category term='ergonomics'/><category term='git'/><category term='mocking'/><category term='functional'/><category term='haskell'/><category term='tdd'/><category term='source control'/><category term='eclipse'/><category term='development environment'/><category term='learning'/><category term='art of computer programming'/><category term='rant'/><category term='current'/><category term='scheme'/><category term='programming philosophy'/><category term='emacs'/><category term='scala'/><category term='java'/><category term='san francisco'/><category term='static'/><category term='arc'/><category term='example'/><category term='stm'/><category term='gotchas'/><category term='lisp'/><category term='joy'/><category term='swt'/><category term='google closure'/><category term='visual studio'/><category term='leiningen'/><category term='jquery'/><category term='housekeeping'/><category term='android'/><category term='integration'/><category term='errors'/><category term='mac'/><category term='development enviroment'/><category term='saml'/><category term='asp.net'/><category term='version control'/><category term='ide'/><category term='concatenative'/><title type='text'>Kevin on Code</title><subtitle type='html'>Object-oriented programmer by day.
Functional programmer by night.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-4325545202560745671</id><published>2011-12-22T12:48:00.000-08:00</published><updated>2011-12-22T12:48:13.832-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>My Programming Reading List</title><content type='html'>I started collecting links to reading materials for programmers recently for my own use, but I realized it could be more generally useful. Checkout my list here, and check back often for updates:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/document/pub?id=1A0EVj7f4DUTjbFs4OLqkPJe-WZKG-NvIn5CTgc2F1lI"&gt;Kevin’s Programming Reading List&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-4325545202560745671?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/4325545202560745671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=4325545202560745671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4325545202560745671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4325545202560745671'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/12/my-programming-reading-list.html' title='My Programming Reading List'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-8698738194653546866</id><published>2011-12-07T04:59:00.000-08:00</published><updated>2011-12-07T04:59:10.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='development environment'/><category scheme='http://www.blogger.com/atom/ns#' term='current'/><category scheme='http://www.blogger.com/atom/ns#' term='source control'/><title type='text'>My Git Setup</title><content type='html'>Mostly for my own personal future reference, here is how I setup my Git environment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Multiple Accounts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I love Git for source control, and it is a goal of mine to keep all of my personal projects on GitHub. That is easy enough, but for work, I also need to be able to use&amp;nbsp;Git with two different accounts connecting to two different servers.&lt;br /&gt;&lt;br /&gt;For this example, I am going to assume there are two accounts: a GitHub account associated with a personal email, and an account hosted on an imaginary GitDude service associated with a work email.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1: Create RSA Keys&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Generate a key for GitHub:&lt;br /&gt;ssh-keygen -t rsa -C "personal_email@example.com"&lt;/li&gt;&lt;li&gt;When prompted, choose the following location for your file to go:&lt;br /&gt;/Users/your_username/.ssh/id_rsa_github&lt;/li&gt;&lt;li&gt;Follow instructions in the "Set up Git" section on&amp;nbsp;&lt;a href="http://help.github.com/"&gt;http://help.github.com/&lt;/a&gt;&amp;nbsp;to upload your public key to GitHub. On the same page, follow the instructions for setting your github.user and github.token config values.&lt;/li&gt;&lt;li&gt;Generate a key for GitDude:&lt;br /&gt;ssh-keygen -t rsa -C "work_email@example.com"&lt;/li&gt;&lt;li&gt;When prompted, choose the following location for your file to go:&lt;br /&gt;/Users/your_username/.ssh/id_rsa_gitdude&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Step 2: Setup Config File&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Create a blank file called "config" in your ~/.ssh directory.&lt;/li&gt;&lt;li&gt;Edit the file, and type the following text:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;Host gitdude.com&lt;br /&gt;  HostName git.gitdude.com&lt;br /&gt;  User git&lt;br /&gt;  IdentityFile /Users/your_username/.ssh/id_rsa_gitdude&lt;br /&gt;&lt;br /&gt;Host github.com&lt;br /&gt;  HostName github.com&lt;br /&gt;  User git&lt;br /&gt;  IdentityFile /Users/your_username/.ssh/id_rsa_github&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 3: Setup User Name and Email&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;When using only one account on a computer, you can use global settings for user.name and user.email. However, when using two separate accounts, you need to use local settings for each repo. If you want to still use global settings, you will still need to use local settings for the repos that don't use the global credentials.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;See this to get a list of all global settings:&lt;br /&gt;git config --global -l&lt;/li&gt;&lt;li&gt;Use this to set global git info:&lt;br /&gt;git config --global user.name "First Last"&lt;br /&gt;git config --global user.email "your_email@example.com"&lt;/li&gt;&lt;li&gt;Or this for local:&lt;br /&gt;git config --local user.name "First Last"&lt;br /&gt;git config --local user.email "your_email@example.com"&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Same for github.user and github.token properties, if appropriate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 4: Setup Default Editor&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to write multiline commits, you will want to associate git with an editor:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    git config core.editor emacs&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;This allows you to make commits like "git commit". The editor will then open and allow you to enter a commit message.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://help.github.com/"&gt;GitHub's Help Site&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/tools-and-tips/how-to-work-with-github-and-multiple-accounts/"&gt;How to work with GitHub and multiple accounts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sandarenu.blogspot.com/2011/09/how-to-use-multiple-git-accounts.html"&gt;How to use multiple Git accounts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-8698738194653546866?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/8698738194653546866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=8698738194653546866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/8698738194653546866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/8698738194653546866'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/11/my-git-setup.html' title='My Git Setup'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-374567716915387266</id><published>2011-11-30T10:27:00.001-08:00</published><updated>2011-11-30T10:43:58.013-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='stm'/><title type='text'>Non-Locking Concurrency Control</title><content type='html'>At work this week I have been working on implementing a concurrency control strategy on a system. During the discussions, software transactional memory (STM) came up, as we want to develop a solution that does not involve locking, and since my primary experience with it is Clojure's built-in STM, I brought that up.&lt;br /&gt;&lt;br /&gt;The world seems to be helping out today with a link on Hacker News to an old discussion involving Clojure's creator Rich Hickey:&amp;nbsp;&lt;a class="vt-p" href="http://www.azulsystems.com/blog/cliff/2008-05-27-clojure-stms-vs-locks"&gt;Clojure: STMs vs Locks&lt;/a&gt;.&amp;nbsp;Good food for thought.&lt;br /&gt;&lt;br /&gt;It is great to see that my Clojure knowledge is proving to be surprisingly useful at work. Those years of being a closeted functional programming nerd are paying off!&lt;br /&gt;&lt;br /&gt;I also re-watched &lt;a class="vt-p" href="http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey"&gt;Rich Hickey's talk "Are We There Yet?"&lt;/a&gt; and reread &lt;a class="vt-p" href="http://home.pipeline.com/~hbaker1/ObjectIdentity.html"&gt;"Equal Rights for Functional Objects" by Henry G. Baker&lt;/a&gt;, which are both great resources for really thinking about state in a functional manner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-374567716915387266?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/374567716915387266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=374567716915387266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/374567716915387266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/374567716915387266'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/11/non-locking-concurrency-control.html' title='Non-Locking Concurrency Control'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-3888320213882495499</id><published>2011-11-20T00:36:00.000-08:00</published><updated>2011-11-20T00:36:57.848-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='leiningen'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='current'/><title type='text'>My Clojure Environment Setup</title><content type='html'>Mostly for my own personal future reference, here is how I setup my Clojure environment.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Emacs&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install Emacs 24 (&lt;a class="vt-p" href="https://github.com/technomancy/emacs-starter-kit"&gt;links to the binaries available here&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Install the &lt;a class="vt-p" href="https://github.com/technomancy/emacs-starter-kit"&gt;Emacs Starter Kit&lt;/a&gt;&amp;nbsp;or the &lt;a class="vt-p" href="https://github.com/bbatsov/emacs-prelude"&gt;Emacs Prelude&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Leiningen&lt;/b&gt;&lt;br /&gt;&lt;i&gt;B&lt;span style="background-color: transparent;"&gt;ased on instructions from&amp;nbsp;&lt;/span&gt;&lt;a class="vt-p" href="https://github.com/technomancy/leiningen" style="background-color: transparent;"&gt;Leiningen (github.com)&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get the Leiningen batch script from&amp;nbsp;&lt;a class="vt-p" href="https://raw.github.com/technomancy/leiningen/master/bin/lein.bat"&gt;https://raw.github.com/technomancy/leiningen/master/bin/lein.bat&lt;/a&gt;&amp;nbsp;and edit it to fetch version 1.6.1.1 instead of 2.0.0-SNAPSHOT.&lt;/li&gt;&lt;li&gt;Put lein.bat in a folder. Add that folder to your PATH.&lt;/li&gt;&lt;li&gt;Download wget.exe and curl.exe and add them to your PATH.&lt;/li&gt;&lt;li&gt;Run:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;lein self.install&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Setting Up Emacs for Clojure&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Setup clojure-mode&lt;/li&gt;&lt;li&gt;Setup swank-clojure&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Follow installation instructions from&amp;nbsp;&lt;a class="vt-p" href="https://github.com/technomancy/swank-clojure"&gt;swank-clojure (github.com)&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/div&gt;&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a class="vt-p" href="http://dev.clojure.org/display/doc/Getting+Started+with+Emacs"&gt;Getting Started with Emacs for Clojure (dev.clojure.org)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="vt-p" href="https://github.com/technomancy/leiningen"&gt;Leiningen (github.com)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-3888320213882495499?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/3888320213882495499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=3888320213882495499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/3888320213882495499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/3888320213882495499'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/11/my-clojure-environment-setup.html' title='My Clojure Environment Setup'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-780654874256211927</id><published>2011-05-11T06:17:00.000-07:00</published><updated>2011-05-11T06:17:09.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joy'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='concatenative'/><title type='text'>Mirror of the Joy Programming Language</title><content type='html'>I have been working on a pet project recently which was greatly inspired by fascinating little programming language called Joy. If you can, imagine combining Scheme with Forth, and that is basically what Joy is. It is a wonder of minimal, yet functional, programming language design, and a mind-bender to boot.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any case, a couple of days ago, the original homepage for Joy went down. Considering that the language was created by a retired professor and maintained at his old university, there are any number of reasons why it went down, and seems likely never to come back again. With the hope that this language will not disappear from the web, I have &lt;a href="http://www.kevinalbrecht.com/code/joy-mirror/index.html"&gt;mirrored the complete contents of the original Joy programming language homepage&lt;/a&gt; on my personal site.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-780654874256211927?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/780654874256211927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=780654874256211927' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/780654874256211927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/780654874256211927'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/05/mirror-of-joy-programming-language.html' title='Mirror of the Joy Programming Language'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-2981371652598004871</id><published>2011-04-19T13:35:00.000-07:00</published><updated>2011-05-16T05:19:16.388-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Understanding JavaScript Inheritance</title><content type='html'>JavaScript is a language which can be difficult to understand deeply. As opposed to most object-oriented programming languages, JavaScript is not class-based, it is prototype-based. This means that objects inherit from other objects, not classes. But while it is prototype-based, it has a syntax and features to make it seem like it is class-based. Because JavaScript seems confused about whether it is class-based or prototype-based, it can be difficult to use it correctly in either way. However, with a little bit of information about how JavaScript works behind the scenes, it is possible to emulate class-based inheritance or take full advantage of prototype-based inheritance.&lt;br /&gt;&lt;br /&gt;My goal in this blog post is to try to get to the root of how JavaScript inheritance works in three cases: without explicitly doing it, using modern prototype-based inheritance, and using modern pseudo-class-based inheritance.&lt;br /&gt;&lt;br /&gt;(This post is definitely not for beginners to JavaScript, but for someone who already knows it and wants to understand it a little deeper.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Functions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;function Animal() { }&lt;/pre&gt;&lt;br /&gt;On the surface, this code seems to create a function called Animal. But with JavaScript, the full truth is slightly more complicated. What actually happens when this code executes is that two objects are created. The first object, called Animal, is the constructor function itself. The second object, called Animal.prototype, has a property called Animal.prototype.constructor, which points to&amp;nbsp;Animal.&amp;nbsp;Animal&amp;nbsp;has a property which points back to its prototype,&amp;nbsp;Animal.prototype. This is illustrated in this diagram:&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/-c6xWT93df7A/TalSQmYSn9I/AAAAAAAABQM/DBLPxFXpZ58/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="63" src="http://2.bp.blogspot.com/-c6xWT93df7A/TalSQmYSn9I/AAAAAAAABQM/DBLPxFXpZ58/s400/1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Although not shown in the diagram above,&amp;nbsp;Animal.prototype actually inherits from the Object.prototype object. All objects in Javascript ultimately inherit from the Object.prototype object. A link from the object to the object it inherits from is stored in the internal __proto__ property (which is not publicly available in all browsers). The __proto__ property is illustrated in this diagram with a dashed line:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-JBuX5zNV2Ms/TalSTUKK6JI/AAAAAAAABQQ/b51flwjcSCU/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-JBuX5zNV2Ms/TalSTUKK6JI/AAAAAAAABQQ/b51flwjcSCU/s1600/2.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The "new" Operator&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;function Planet() { }&lt;br /&gt;var earth = new Planet();&lt;/pre&gt;&lt;br /&gt;JavaScript's built-in "new" operator is how JavaScript attempts to emulate class-based inheritance. The "new" operator creates a new object, in this case called "earth", calls the function "Planet" on it, then sets the __proto__ property of the new object to Planet.prototype.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-DvDObg0Kyus/TalSTgQ7MoI/AAAAAAAABQU/-a7BJNLMw4g/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-DvDObg0Kyus/TalSTgQ7MoI/AAAAAAAABQU/-a7BJNLMw4g/s1600/3.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This allows functions to act like classes in some ways, but creating a deep inheritance&amp;nbsp;hierarchy&amp;nbsp;is impossible using just the "new" operator. For example, how could you create a new class that inherits from the Planet "class"?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using the "Object.create" Function to Implement Prototype-Based Inheritance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Because of the fact that most browsers do not let programmers directly access the __proto__ property, it is difficult to create objects in JavaScript that directly inherit from another object--the very definition of prototype-basd inheritance. To simplify this, Douglas Crockford discovered an improved way to create new objects in JavaScript. His function, illustrated below, creates an object which inherits from the object passed to the function, thus providing a simple method of implementing prototypal inheritance.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;function createObject(parent) {&lt;br /&gt;  function TempClass() {}&lt;br /&gt;  TempClass.prototype = parent;&lt;br /&gt;  var child = new TempClass();&lt;br /&gt;  return child;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I will walk through what this function does one line at a time with diagrams.&lt;br /&gt;&lt;br /&gt;1. function TempClass() {}&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-dvya_wAWJjQ/TalST16Fa1I/AAAAAAAABQY/j46dTxNRBX0/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="58" src="http://3.bp.blogspot.com/-dvya_wAWJjQ/TalST16Fa1I/AAAAAAAABQY/j46dTxNRBX0/s400/4.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. TempClass.prototype = parent&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-2PqYx2XFeDk/TalSUBjTwSI/AAAAAAAABQc/0ztzx6HnwAM/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="37" src="http://3.bp.blogspot.com/-2PqYx2XFeDk/TalSUBjTwSI/AAAAAAAABQc/0ztzx6HnwAM/s400/5.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. var child = new TempClass()&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-uQ40kG28AyY/TalSUfMNucI/AAAAAAAABQg/e2-PQhRO0Vc/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="124" src="http://3.bp.blogspot.com/-uQ40kG28AyY/TalSUfMNucI/AAAAAAAABQg/e2-PQhRO0Vc/s320/6.png" style="cursor: move;" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A version of this function is actually implemented on all the newer browsers (including Internet Explorer 9, Firefox 4, and Chrome 9) as "&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create"&gt;Object.create&lt;/a&gt;". But it is easy to implement it yourself if you need to support older browsers, using the formulation above or that described by Douglas Crockford in &lt;a href="http://javascript.crockford.com/prototypal.html"&gt;Prototypal Inheritance in JavaScript&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using the Inherit Function to Emulate Class-Based Inheritance&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Imagine that you wanted to use class-based inheritance in JavaScript. You might want to do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;function Mammal() {&lt;br /&gt;  this.hasHair = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Bear() {&lt;br /&gt;  Mammal.call(this); // Call parent constructor&lt;br /&gt;  this.roars = true;&lt;br /&gt;}&lt;br /&gt;inherit(Bear, Mammal);&lt;br /&gt;&lt;br /&gt;var yogi = new Bear();&lt;br /&gt;alert(yogi.hasHair); // This should display 'true'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note the call to "Mammal.call" in the Bear constructor. This calls the parent constructor, similar to super() in Java or base() in C#. To implement the above, you can create some version of the "inherit" function:&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;function inherit(sub, super) {&lt;br /&gt;  var newSubPrototype = createObject(super.prototype); &lt;br /&gt;  newSubPrototype.constructor = sub; &lt;br /&gt;  sub.prototype = newSubPrototype;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The inherit function takes two classes (functions) as parameters, and makes the first class inherit from the second one. In memory, here is how each line of the inherit function works...&lt;br /&gt;&lt;br /&gt;1. Before the function is run, we have two classes, sub and super:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-P4I-paIzWjk/TalSUlIJHyI/AAAAAAAABQk/RA7EUtWWx9g/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-P4I-paIzWjk/TalSUlIJHyI/AAAAAAAABQk/RA7EUtWWx9g/s1600/7.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. var newSubPrototype = createObject(super.prototype)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-oIeSWsDNJzo/TalSU-dZ97I/AAAAAAAABQo/2iBo8ClTI_o/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-oIeSWsDNJzo/TalSU-dZ97I/AAAAAAAABQo/2iBo8ClTI_o/s1600/8.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. newSubPrototype.constructor = sub&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-YGbpCzcu_JI/TalSVO6SknI/AAAAAAAABQs/pmuzJPmsjxs/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://1.bp.blogspot.com/-YGbpCzcu_JI/TalSVO6SknI/AAAAAAAABQs/pmuzJPmsjxs/s400/9.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. sub.prototype = newSubPrototype&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-PlNgUOiSlEI/TalSVTabvzI/AAAAAAAABQw/IT8TBkFM_YY/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-PlNgUOiSlEI/TalSVTabvzI/AAAAAAAABQw/IT8TBkFM_YY/s1600/10.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Using one of these two methods can allow you to implement whichever inheritance scheme you like, which is one of the reasons why JavaScript can be so powerful if understood correctly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Related Links&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Tim Caswell's&amp;nbsp;&lt;a href="http://howtonode.org/object-graphs"&gt;Learning Javascript with Object Graphs&lt;/a&gt;, &lt;a href="http://howtonode.org/object-graphs-2"&gt;Part 2&lt;/a&gt;, and &lt;a href="http://howtonode.org/object-graphs-3"&gt;Part 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Dmitry A. Soshnikov's &lt;a href="http://dmitrysoshnikov.com/ecmascript/javascript-the-core/"&gt;JavaScript. The core.&lt;/a&gt;&lt;br /&gt;(A deep understanding of scope, inheritance, closures.)&lt;/li&gt;&lt;li&gt;Mozilla's &lt;a href="https://developer.mozilla.org/en/JavaScript/Reference"&gt;JavaScript Reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Douglas Crockford's &lt;a href="http://javascript.crockford.com/prototypal.html"&gt;Prototypal Inheritance in JavaScript&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;i&gt;(Updated&amp;nbsp;&lt;/i&gt;&lt;i&gt;2011-04-23 - Additional clarifications based on comments.)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;(Updated 2011-05-16 - Added missing call to super constructor in Bear constructor.)&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-2981371652598004871?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/2981371652598004871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=2981371652598004871' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2981371652598004871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2981371652598004871'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/04/understanding-javascript-inheritance.html' title='Understanding JavaScript Inheritance'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-c6xWT93df7A/TalSQmYSn9I/AAAAAAAABQM/DBLPxFXpZ58/s72-c/1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-1764206646655596210</id><published>2011-04-04T13:57:00.000-07:00</published><updated>2011-04-04T13:57:39.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='google closure'/><title type='text'>Installing Google's Closure Linter on Windows</title><content type='html'>I am working on a JavaScript project right now, so I decided to try out &lt;a href="http://code.google.com/closure/utilities/index.html"&gt;Closure Linter&lt;/a&gt;, Google's relatively new JavaScript code style verification tool that is part of their Closure Tools collection. I'm using Windows 7 64-bit, and their instructions for using Closure Linter on Windows do not quite make it clear what all needs to be done to get it working.&lt;br /&gt;&lt;br /&gt;In case this is helpful to someone else in the future, here are the steps I took (modified from those found at&amp;nbsp;&lt;a href="http://code.google.com/closure/utilities/docs/linter_howto.html"&gt;How to Use Closure Linter&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Download and install Python 2.7.x for Windows 32-bit.&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; Note that you must choose the 32-bit version of Python from the 2.7.x branch to ensure that you can use the EasyInstaller program needed for the next step.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;b&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Download and install&amp;nbsp;&lt;a href="http://pypi.python.org/pypi/setuptools#files"&gt;SetupTools/EasyInstall for Python 2.7&lt;/a&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Install Closure Linter&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;:&lt;/span&gt;&lt;/li&gt;&lt;/b&gt; &lt;ul&gt;&lt;li&gt;In a command prompt, change directory to to C:\Python27\Scripts&lt;/li&gt;&lt;li&gt;Run this command:&lt;br /&gt;easy_install http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Now you will be able to run Closure Linter using variations on this command:&lt;br /&gt;&lt;span class="code"&gt;C:\Python27\Scripts\gjslint --nojsdoc -r DIRECTORY_TO_LINT&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Good luck with the tool!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-1764206646655596210?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/1764206646655596210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=1764206646655596210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1764206646655596210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1764206646655596210'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/04/installing-googles-closure-linter-on.html' title='Installing Google&apos;s Closure Linter on Windows'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-7133078623028206731</id><published>2011-01-06T13:35:00.000-08:00</published><updated>2011-01-06T13:35:48.652-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='development enviroment'/><title type='text'>Visual Studio Color Themes</title><content type='html'>Whenever I get tired of my color scheme in Visual Studio, I go to &lt;a href="http://studiostyl.es/"&gt;Studio Styles&lt;/a&gt; and try out a new theme. After that, I switch my font to a more readable font, like &lt;a href="http://dejavu-fonts.org/wiki/Main_Page"&gt;Deja Vu Sans Mono&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-7133078623028206731?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/7133078623028206731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=7133078623028206731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/7133078623028206731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/7133078623028206731'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2011/01/visual-studio-color-themes.html' title='Visual Studio Color Themes'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-2810499132885547326</id><published>2010-11-19T02:00:00.000-08:00</published><updated>2010-11-19T02:00:05.346-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='saml'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>SAML 2.0</title><content type='html'>I have been working a lot with SAML recently, which is a protocol for standardizing single sign on (SSO) between sites. A good number of sites and products use SAML as a SSO protocol, including Google Apps and Moodle, important sites to communicate with in my particular case.&lt;br /&gt;&lt;br /&gt;I'm working in .NET 3.5, which unfortunately has no built-in support for SAML 2.0, but there are many third-party libraries and references to build your own support for it.&lt;br /&gt;&lt;br /&gt;Here are some of the best links I have found for learning SAML.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/googleapps/domain/sso/saml_reference_implementation.html"&gt;Google's introduction to SAML SSO&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language"&gt;SAML on Wikipedia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SAML_2.0"&gt;SAML 2.0 on Wikipedia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://saml.xml.org/wiki/saml-wiki-knowledgebase"&gt;Official specs and documentation for SAML&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Examples&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-apps-sso-sample/"&gt;Google App's reference implementation of SAML SSO&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://rnd.feide.no/saml-example-messages-2/"&gt;Example SAML requests and responses&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-2810499132885547326?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/2810499132885547326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=2810499132885547326' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2810499132885547326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2810499132885547326'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2010/11/saml-20.html' title='SAML 2.0'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-1807751172710935443</id><published>2010-10-19T17:30:00.000-07:00</published><updated>2010-10-19T17:30:00.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Importing GWT SDK Samples into Eclipse</title><content type='html'>I've recently started working with the Google Web Toolkit (GWT), which seems pretty sweet from everything I've read so far. It has great integration with an IDE, in this case Eclipse, which is absolutely essential.&lt;br /&gt;&lt;br /&gt;Unfortunately, it was hard to find a way to easily open GWT's sample projects in Eclipse, but after a little trial and error, here is what I came up with. For each sample project you want to use, do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create a new Java project with the name of the sample project you want to use, for example, "Hello". Use all the other default settings, and press "Finish".&lt;/li&gt;&lt;li&gt;Right-click on the project and choose "Import". Choose "General" -&amp;gt; "File System", then press "Next".&lt;/li&gt;&lt;li&gt;Browse to the directory of the sample project you want to import. On my computer, the project was found at something like:&amp;nbsp;&lt;u&gt;C:\Program Files\eclipse\plugins\com.google.gwt.eclipse.sdkbundle...\gwt-2.0.4\samples&lt;/u&gt;.&amp;nbsp;Select all, then press "Finish".&lt;/li&gt;&lt;li&gt;Right-click on the project and choose "Google" -&amp;gt; "Web Toolkit Settings". Check the "Use Google Web Toolkit" check box.&lt;/li&gt;&lt;li&gt;Go the the "Java Build Path" section of the project's properties. Change the default output folder to something like: "/Hello/war/WEB-INF/classes" (This will be different depending on your project name).&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;That's all! Good luck and have fun trying out GWT's samples.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-1807751172710935443?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/1807751172710935443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=1807751172710935443' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1807751172710935443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1807751172710935443'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2010/10/importing-gwt-sdk-samples-into-eclipse.html' title='Importing GWT SDK Samples into Eclipse'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-6947428283531457364</id><published>2009-11-11T17:30:00.000-08:00</published><updated>2009-11-11T17:30:00.123-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='static'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Best Android Apps by Category</title><content type='html'>&lt;b&gt;Social Networking &lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Twidroid (Twitter client)&lt;/li&gt;&lt;li&gt;Facebook&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Podcasts&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.snoggdoggler.com/"&gt;DoggCatcher&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Easy control over when podcasts downloaded&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;b&gt;Desktop Music Syncing Software&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.salling.com/MediaSync/"&gt;Salling Media Sync&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Allows you to sync iTunes with your Android phone&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;b&gt;Music Listening&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Built-in Music App &lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Language Learning&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Anki&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Flashcard app &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Does not sync with Anki Online &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;b&gt;Productivity&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Remember the Milk (Todo list w/ online sync)&lt;/li&gt;&lt;li&gt;Movies by Flixster&lt;/li&gt;&lt;li&gt;FeedR News Reader&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Utilities &lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;WiFi OnOff&lt;/li&gt;&lt;li&gt;Barcode Scanner&lt;/li&gt;&lt;li&gt;Astro (File Browser)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-6947428283531457364?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/6947428283531457364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=6947428283531457364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6947428283531457364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6947428283531457364'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2009/11/best-android-apps-by-category.html' title='Best Android Apps by Category'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-476192894844080273</id><published>2009-02-02T15:19:00.000-08:00</published><updated>2009-02-03T10:12:45.918-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>Creating a Clojure GUI Application with SWT</title><content type='html'>In my explorations of &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, I have been developing a desktop GUI application that uses &lt;a href="http://www.eclipse.org/swt/"&gt;SWT&lt;/a&gt;, the graphics toolkit that Eclipse uses.  Once you get going, SWT is fairly intuitive to program in with Clojure, but you might need a little help to get started.  Here is an example of a barebones app in SWT:&lt;br /&gt;&lt;pre class="code"&gt;(ns swttest&lt;br /&gt;(:import (org.eclipse.swt.widgets Display Shell)&lt;br /&gt;        (org.eclipse.swt.layout GridLayout)&lt;br /&gt;        (org.eclipse.swt.events ShellAdapter)))&lt;br /&gt;&lt;br /&gt;(defn create-shell [display shell]&lt;br /&gt;(let [layout (GridLayout.)]&lt;br /&gt; (doto shell&lt;br /&gt;   (.setText "SWT Test")&lt;br /&gt;   (.setLayout layout)&lt;br /&gt;   (.addShellListener&lt;br /&gt;    (proxy [ShellAdapter] []&lt;br /&gt;      (shellClosed [evt]&lt;br /&gt;        (System/exit 0)))))))&lt;br /&gt;&lt;br /&gt;(defn swt-loop [display shell]&lt;br /&gt;(loop []&lt;br /&gt; (if (.isDisposed shell)&lt;br /&gt;   (.dispose display)&lt;br /&gt;   (do&lt;br /&gt;     (if (not (.readAndDispatch display))&lt;br /&gt;       (.sleep display))&lt;br /&gt;     (recur)))))&lt;br /&gt;&lt;br /&gt;(defn begin []&lt;br /&gt; (let [display (Display.)&lt;br /&gt;       shell (Shell. display)]&lt;br /&gt;   (create-shell display shell)&lt;br /&gt;   (.setSize shell 700 700)&lt;br /&gt;   (.open shell)&lt;br /&gt;   (swt-loop display shell)))&lt;br /&gt;&lt;br /&gt;(begin)&lt;/pre&gt;On Mac, you will need to add the "-XstartOnFirstThread" command line option or your application will crash soon after launching.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt;&lt;br /&gt;I originally left out the line "(create-shell display shell)".  The code above is now corrected.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;See also:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/swt/faq.php#carbonapp"&gt;SWT FAQ Entry on XstartOnFirstThread&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/0458ff5de09c8457/0b66104d6853e5b8?lnk=raot"&gt;Clojure forum thread with SWT example&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-476192894844080273?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/476192894844080273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=476192894844080273' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/476192894844080273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/476192894844080273'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2009/01/creating-clojure-gui-application-with.html' title='Creating a Clojure GUI Application with SWT'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-6864459678902813322</id><published>2009-01-20T14:31:00.000-08:00</published><updated>2009-01-20T14:51:08.671-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version control'/><title type='text'>Google Code and Subversion</title><content type='html'>I recently started using &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt; for hosting a new open source project I'm working on (written in Clojure) in my spare time.  Google Code uses &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; for version control, which &lt;a href="http://www.webmonkey.com/blog/Is_Google_Code_Gearing_up_to_Support_Git_"&gt;some predict is going to change soon to Git&lt;/a&gt;.  While I am pretty familiar with the command line options for the &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; version control system, I'm definitely not with Subversion.  Maybe Google Code will switch to Git soon, but until it does, I needed to use Subversion, so I went looking for some GUI-based Subversion clients to simplify its use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finding a good Windows client was easy. &lt;a href="http://tortoisesvn.tigris.org/"&gt; TortoiseSVN&lt;/a&gt; is an Explorer shell extension that is free, stable, and complete.  It worked right out of the box with Google Code and I didn't have to read a single line of documentation to become proficient at it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mac&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The situation wasn't quite as simple for Mac.  There are multiple non-free clients for Mac, but I wanted to stick with open source if possible.  The closest thing to TortoiseSVN for Mac is something called &lt;a href="http://scplugin.tigris.org/"&gt;SCPlugin&lt;/a&gt;, but it is incomplete and development on it seems to have stalled in 2005 or 2006.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/svnx/"&gt;SvnX&lt;/a&gt; is the one I ended up choosing.  It is not quite as intuitive as TortoiseSVN, but it seems to get the job done.  To get it working with Google Code, I had to run this command on the command line in order to accept the security certificate:&lt;br /&gt;&lt;pre class="code"&gt;svn list https://GOOGLE_CODE_CHECKOUT_URL&lt;/pre&gt;That's it!  Off to do some programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-6864459678902813322?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/6864459678902813322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=6864459678902813322' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6864459678902813322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6864459678902813322'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2009/01/google-code-and-subversion.html' title='Google Code and Subversion'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-8345241038178326859</id><published>2008-12-22T11:26:00.000-08:00</published><updated>2008-12-22T11:56:54.737-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ergonomics'/><title type='text'>My Favorite Mouse</title><content type='html'>As a programmer, I naturally spend a good portion of my waking hours--if not the majority--in front of a computer.  This didn't seem a problem for the first quarter century of my life, but then about three years ago, I started experiencing pain in my mousing wrist.  My first thought was that the beginning of carpal tunnel syndrome was setting in, which freaked me out.&lt;br /&gt;&lt;br /&gt;I immediately set out to try more ergonomic input devices, and I switched to a pen input device at home and a radical ergonomic mouse at work.  While the pen input device worked fairly well, the ergonomic mouse I chose proved to be the single greatest purchase I've ever made.  Since starting to use it, I no longer have any pain in my wrist.  I now realize that with the many viable ergonomic options for mousing that are available, no computer user should be using the very dangerous standard mouse.&lt;br /&gt;&lt;br /&gt;Anyway, the mouse that I wholeheartedly recommend is the &lt;a href="http://solutions.3m.com/wps/portal/3M/en_US/ergonomics/home/products/ergonomicmouse/"&gt;3M Ergonomic Optical Mouse&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cR6PiivNDhc/SU_tk6tYX8I/AAAAAAAAAaI/vQicFdHW5pY/s1600-h/3m-mouse-2.jpg"&gt;&lt;img style="cursor: pointer; width: 254px; height: 215px;" src="http://1.bp.blogspot.com/_cR6PiivNDhc/SU_tk6tYX8I/AAAAAAAAAaI/vQicFdHW5pY/s400/3m-mouse-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5282702106419552194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is definitely a strange looking mouse, but the strange shape is what makes it work so well.  This mouse fixes two problems with traditional mice:&lt;br /&gt;&lt;br /&gt;1. Traditional mice force your arm to twist, causing your tendons to rub against each other, which causes inflammation and pain.  By letting your arm sit in a much more natural arm-shaking position, the ergonomic mouse prevents this.&lt;br /&gt;&lt;br /&gt;2. When using traditional mice, your wrist, with all it's delicate parts, does all the moving.  The ergonomic mouse, on the other hand, keeps the wrist straight and the arm becomes the moving part.&lt;br /&gt;&lt;br /&gt;So again, I highly recommend this mouse (or a pen tablet) to all computer users, and especially to programmers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cR6PiivNDhc/SU_tktub6bI/AAAAAAAAAaA/xzmdiNqHXXg/s1600-h/3m-mouse-1.jpg"&gt;&lt;img style="cursor: pointer; width: 233px; height: 207px;" src="http://3.bp.blogspot.com/_cR6PiivNDhc/SU_tktub6bI/AAAAAAAAAaA/xzmdiNqHXXg/s400/3m-mouse-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5282702102934317490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(Note: Just in case anyone thinks I am advertising for 3M, no, I am not in any way sponsored by or affiliated with them.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-8345241038178326859?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/8345241038178326859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=8345241038178326859' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/8345241038178326859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/8345241038178326859'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/12/my-favorite-mouse.html' title='My Favorite Mouse'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_cR6PiivNDhc/SU_tk6tYX8I/AAAAAAAAAaI/vQicFdHW5pY/s72-c/3m-mouse-2.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-2094188536173102089</id><published>2008-12-16T14:17:00.000-08:00</published><updated>2008-12-16T14:17:26.945-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='qunit'/><category scheme='http://www.blogger.com/atom/ns#' term='firebug'/><title type='text'>Industrial Strength Application Development in JavaScript</title><content type='html'>Inspired by the work of &lt;a href="http://javascript.crockford.com/"&gt;Douglas Crockford&lt;/a&gt;, I have been developing a JavaScript application using full blown development techniques.  JavaScript is definitely a misunderstood and underestimated programming language, and I have found it to be a pretty good hybrid of object-oriented and functional techniques.  I have even done some cool things with it that would not be possible in a statically typed language.  I have found that with proper unit testing and debugging tools, its dynamic typing has caused me few problems.&lt;br /&gt;&lt;br /&gt;So what tools can I recommend for industrial development in JavaScript?  Everything below is an absolute must for my needs:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jquery.com/"&gt;&lt;span style="font-weight: bold;"&gt;jQuery&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What it does: Ajax, DOM-modification, and general utility functions&lt;/li&gt;&lt;li&gt;As Jeff Atwood pointed out, there is &lt;a href="http://www.codinghorror.com/blog/archives/001163.html"&gt;no good reason to write low-level JavaScript&lt;/a&gt; to manipulate the DOM with today, now that there are tons of high quality JavaScript libraries to help out.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a style="font-weight: bold;" href="http://docs.jquery.com/QUnit"&gt;QUnit&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What it does: Simple unit testing, compatible with jQuery&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I tried out a few other unit testing frameworks, but QUnit is the simplest one by far and just gets the job done.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a style="font-weight: bold;" href="http://www.javascriptlint.com/"&gt;JavaScript Lint&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What it does: Identifies most textual errors in JavaScript files.&lt;/li&gt;&lt;li&gt;Indispensable tool to find that missing semicolon that is causing that weird error.&lt;/li&gt;&lt;li&gt;Note for TextMate users: Use the &lt;a href="http://blog.macromates.com/2007/javascript-tools/"&gt;JavaScript Tools bundle&lt;/a&gt; instead of downloading it from the official site.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a style="font-weight: bold;" href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What it does: Firefox plugin.  In addition to excellent DOM manipulation, it makes a great JavaScript debugger.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In Addition, &lt;a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference"&gt;Mozilla's JavaScript Reference&lt;/a&gt; is a must for any serious JavaScript developer.&lt;br /&gt;&lt;br /&gt;Well, I hope this gets you started.  If you have any other suggestions, let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-2094188536173102089?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/2094188536173102089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=2094188536173102089' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2094188536173102089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2094188536173102089'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/12/industrial-strength-application.html' title='Industrial Strength Application Development in JavaScript'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-3776220157626298757</id><published>2008-12-02T11:45:00.000-08:00</published><updated>2008-12-02T12:05:15.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='errors'/><title type='text'>Javascript's Undeclared versus Undefined</title><content type='html'>I learned the hard way that undeclared is different than undefined.  If you try to test the simple way for an undeclared variable, you get an error, which in my environment means an annoying pop-up.&lt;br /&gt;&lt;pre class="code"&gt;/* var a; */  // undeclared&lt;br /&gt;var b;        // undefined&lt;br /&gt;&lt;br /&gt;// This would cause an 'object undefined' error&lt;br /&gt;/*&lt;br /&gt;if (a) {&lt;br /&gt;  alert("a is defined");&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;  alert("a is undefined");&lt;br /&gt;}&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;if (typeof(a) == "undefined") {&lt;br /&gt;  // this will be executed&lt;br /&gt;  alert("a is undeclared or undefined");&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;  alert("a is declared and defined");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (b) {&lt;br /&gt;  alert("b is defined");&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;  // this will be executed&lt;br /&gt;  alert("b is undefined");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (typeof(b) == "undefined") {&lt;br /&gt;  // this will be executed&lt;br /&gt;  alert("b is undeclared or undefined");&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;  alert("b is declared and defined");&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-3776220157626298757?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/3776220157626298757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=3776220157626298757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/3776220157626298757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/3776220157626298757'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/12/javascripts-undeclared-versus-undefined.html' title='Javascript&apos;s Undeclared versus Undefined'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-6357723863891995557</id><published>2008-11-24T09:53:00.001-08:00</published><updated>2008-11-24T10:32:58.327-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Greasemonkey-ing with Gmail's Styles</title><content type='html'>Last week, Google finally gave us some options to &lt;a href="http://googlesystem.blogspot.com/2008/11/gmail-themes.html"&gt;customize the look of Gmail&lt;/a&gt;.  Excitedly, I went through each theme trying to find my replacement for the boring old "Classic" one.  Many of them are graphically appealing, but unfortunately, most of them also have poor contrast compared to "Classic".   I finally settled on the "Mountains" theme, but one thing still bugged me about it: the text color of mail titles were too light.&lt;br /&gt;&lt;br /&gt;Determined to fix this, I broke out &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;, the trusty HTML/CSS inspection plugin for Firefox, and found the offending CSS:&lt;br /&gt;&lt;pre class="code"&gt;.AnqB9d {&lt;br /&gt;   color:#3F586D;&lt;br /&gt;}&lt;/pre&gt;Then, I created this little &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt; script:&lt;br /&gt;&lt;pre class="code"&gt;function addGlobalStyle(css) {&lt;br /&gt;   var head, style;&lt;br /&gt;   head = document.getElementsByTagName('head')[0];&lt;br /&gt;   if (!head) { return; }&lt;br /&gt;   style = document.createElement('style');&lt;br /&gt;   style.type = 'text/css';&lt;br /&gt;   style.innerHTML = css;&lt;br /&gt;   head.appendChild(style);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;addGlobalStyle(&lt;br /&gt;   '.AnqB9d {' +&lt;br /&gt;   '    color: black ! important;' +&lt;br /&gt;   '}'&lt;br /&gt;   );&lt;/pre&gt;Viola!  Readable mailbox items!  Check out before and after shots:&lt;br /&gt;&lt;br /&gt;Before:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cR6PiivNDhc/SSry_i6JXEI/AAAAAAAAATU/8l0uKxXv9Ek/s1600-h/gmail-mountains-bad.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 97px;" src="http://4.bp.blogspot.com/_cR6PiivNDhc/SSry_i6JXEI/AAAAAAAAATU/8l0uKxXv9Ek/s400/gmail-mountains-bad.jpg" alt="" id="BLOGGER_PHOTO_ID_5272293487306955842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cR6PiivNDhc/SSry_hpF-NI/AAAAAAAAATc/sLfspkisfx8/s1600-h/gmail-mountains-fixed.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 97px;" src="http://4.bp.blogspot.com/_cR6PiivNDhc/SSry_hpF-NI/AAAAAAAAATc/sLfspkisfx8/s400/gmail-mountains-fixed.jpg" alt="" id="BLOGGER_PHOTO_ID_5272293486966995154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Related Links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.newmediacampaigns.com/page/gmails-new-default-theme-is-a-step-backwards-for-usability"&gt;Joel Sutherland - Gmail's New Default Theme is a Step Backwards for Usability&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-6357723863891995557?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/6357723863891995557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=6357723863891995557' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6357723863891995557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6357723863891995557'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/11/greasemonkey-ing-with-gmails-styles.html' title='Greasemonkey-ing with Gmail&apos;s Styles'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_cR6PiivNDhc/SSry_i6JXEI/AAAAAAAAATU/8l0uKxXv9Ek/s72-c/gmail-mountains-bad.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-4738726425938558695</id><published>2008-11-07T14:39:00.000-08:00</published><updated>2008-11-07T14:55:49.954-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>F# and Functional Language Respect</title><content type='html'>I have been experimenting with Microsoft's &lt;a href="http://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29"&gt;F# language&lt;/a&gt;, their version of ML / OCaml for the .NET Framework.  Microsoft recently announced that F# will become an official part of Visual Studio, up there with C# and Visual Basic.  I had never really used an ML-based language before, so I was not sure how big the learning curve would be, but I find that my knowledge of Haskell gets me far enough to feel comfortable writing simple programs after looking over the documentation for a few minutes.  On top of that, the current pre-release version of F# has near perfect integration with Visual Studio, including an interactive REPL, debugging, and syntax completion.  If you are in the market for a good functional language and are in the Microsoft developer ecosystem, F# seems like a great choice.&lt;br /&gt;&lt;br /&gt;I'm not sure how much I will use F# at work, if at all, but it is good to see that functional languages are being taken very seriously at Microsoft now.  Not only are the developments of F# encouraging, but each new version of C# adds more functional features, and I find myself using those features daily in my work.&lt;br /&gt;&lt;br /&gt;Recommended Sites:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx"&gt;Microsoft F# Development Center&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-4738726425938558695?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/4738726425938558695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=4738726425938558695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4738726425938558695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4738726425938558695'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/11/f-and-functional-language-respect.html' title='F# and Functional Language Respect'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-4457312280851767811</id><published>2008-10-29T22:41:00.000-07:00</published><updated>2008-10-31T15:26:10.891-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Developing on iPhone and Android</title><content type='html'>When the iPhone SDK came out early this year, I was one of the first to sign up for the beta program.  I was excited by the possibility to develop on the platform and quickly started reading through the documentation and watching developer videos as I began development of what was to be my first iPhone app.  Unfortunately, Apple put one too many roadblocks in place, making the iPhone an undesirable platform for me to work on:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Apple prevented all discussion of iPhone APIs by developers.  I tried to ask a simple API question on an Apple developer board, and although a nice explanation why no one could answer me was sent to the board (see &lt;a href="http://www.cocoabuilder.com/archive/message/cocoa/2008/3/23/202107"&gt;the mailing list archive&lt;/a&gt;), I actually received obscene emails attacking me for having the audacity to break the SDK's non-disclosure agreement.  The draconian NDA clause was removed a few weeks ago, but even then was long after the beta period was over.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apple charged a fee just to get the developer kit working on an actual device, but then never gave many developers, including me, the unlocking codes to do so until long after the beta period ended.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apple is still playing games with developers by occasionally pulling legitimate applications off the App Store.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;In the end, I gave up and decided to work on &lt;a href="http://code.google.com/android/"&gt;Google's Android&lt;/a&gt; instead.  First of all, Google got Android right by making the tools free and the restrictions few.  Another nice benefit was the rich tools available to Android developers due to the Android SDK's use of Java (which has the added bonus of letting me use Scala for Android development!).  So far, developing for the Android has been great-- straight-forward APIs, good tools, good documentation.  Maybe someone got mobile OS development right.&lt;br /&gt;&lt;br /&gt;Related Links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.nabble.com/-scala--mixed-scala-android-eclipse-project-works-td19726752.html#a19726752"&gt;Forum post on developing Android apps in Scala&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scala-lang.org/node/160"&gt;Slightly outdated official documentation on Android apps in Scala&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-4457312280851767811?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/4457312280851767811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=4457312280851767811' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4457312280851767811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4457312280851767811'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/developing-on-iphone-and-android.html' title='Developing on iPhone and Android'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-1622093320606001824</id><published>2008-10-25T10:51:00.000-07:00</published><updated>2008-10-27T13:56:49.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>Bad Code</title><content type='html'>Every programmer has experienced it.  Code that is so bad, you have to share it with someone.  Here are some recent gems I have encountered.&lt;br /&gt;&lt;br /&gt;Poor man's comments.&lt;br /&gt;&lt;pre class="code"&gt;If 1 = 0 Then&lt;br /&gt;...&lt;br /&gt;End If&lt;/pre&gt;Is nameString empty?&lt;br /&gt;&lt;pre class="code"&gt;if (nameString + "x" != "x") {&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;Hmm, is the comment wrong, or the code?&lt;br /&gt;&lt;pre class="code"&gt;// Comma-separated list of numbers&lt;br /&gt;string configurationIds = "254:762:2:236:23:5:21";&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-1622093320606001824?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/1622093320606001824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=1622093320606001824' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1622093320606001824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1622093320606001824'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/bad-code.html' title='Bad Code'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-1206204338982143921</id><published>2008-10-20T09:51:00.000-07:00</published><updated>2008-10-22T08:26:27.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>JUnit Testing Scala in Eclipse</title><content type='html'>Being a fairly new convert to agile development methods, including test driven development, I knew the first thing I would want to get up and running with Scala was a unit testing framework.  The NetBeans plugin has built-in JUnit support which served me very well.  But I also wanted to get some unit testing working with the Eclipse plugin.  It took me a while to get JUnit testing setup with Eclipse, mainly due to my lack of experience in the Java ecosystem.  To help future explorers down this path, here are a few lessons I learned.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Put the your tests in a separate source folder&lt;/span&gt;.  See this &lt;a href="http://open.ncsu.edu/se/tutorials/junit/"&gt;tutorial on setting up JUnit in Eclipse&lt;/a&gt; for more information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Add JUnit to your project's build path&lt;/span&gt;.  Select the project and choose "Build Path" -&gt; "Add Libraries...".  Then choose the JUnit jar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Add the output directory of your project to your build path&lt;/span&gt;.  See this &lt;a href="http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse"&gt;short guide from the makers of Spec&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To get you started, here is a simple test:&lt;br /&gt;&lt;pre class="code"&gt;package tests&lt;br /&gt;&lt;br /&gt;import junit.framework._&lt;br /&gt;import org.junit.Assert._&lt;br /&gt;&lt;br /&gt;class FirstTest extends TestCase {&lt;br /&gt; override def setUp() = {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; override def tearDown() = {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def testOne() = {&lt;br /&gt;   assertEquals(1, 1)&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-1206204338982143921?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/1206204338982143921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=1206204338982143921' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1206204338982143921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/1206204338982143921'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/junit-testing-scala-in-eclipse.html' title='JUnit Testing Scala in Eclipse'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-4328605252191824444</id><published>2008-10-17T11:44:00.000-07:00</published><updated>2008-10-17T16:03:03.468-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='san francisco'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>October's Bay Area Scala Enthusiasts Meetup, Part 2</title><content type='html'>I promised some technical notes on the Bay Area Scala Enthusiasts meetup earlier this week, so here we go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Coding Guidelines&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As I mentioned previously, the presentation by the Twitter folks focused on the informal guidelines they have been using internally for Scala coding (&lt;a href="http://groups.google.com/group/scala-base/web/TwitterOct2008.pdf"&gt;PDF of their presentation&lt;/a&gt;). I like their guidelines generally. Something that may be controversial in the guidelines is their policy not to use implicits. DSLs especially can make good use of implicits, so I would imagine that would have to be the exception to their rule. Maybe someone should take their coding guidelines as a starting point to make a coding guidelines page on the &lt;a href="http://scala.sygneca.com/"&gt;Scala Wiki&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Structural Types&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the topics mentioned at the meetup was structural types, which I hadn't used before, so I checked them out. Structural types seem to be a way to accomplish the same sort of "duck"-typing that you can do in Ruby and Python. Let's say you don't care about what the inheritance hierarchy of a parameter is, just that it can perform some operation. There are at least two ways to do this: traits or structural types.&lt;br /&gt;&lt;br /&gt;Using traits:&lt;br /&gt;&lt;pre class="code"&gt;trait Jumpable {&lt;br /&gt; def jump() : Unit { print("Jumping!") }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Bunny extends Jumpable { ... }&lt;br /&gt;class PogoStick extends Jumpable { ... }&lt;br /&gt;&lt;br /&gt;class Controller {&lt;br /&gt; def makeThemJump(jumpers: List[Jumpable]) = {&lt;br /&gt;   jumpers.foreach { jumper =&gt;&lt;br /&gt;     jumper.jump()&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;Using structural types:&lt;br /&gt;&lt;pre class="code"&gt;class Bunny { def jump(): Unit { print("Jumping!") } }&lt;br /&gt;class PogoStick { def jump(): Unit { print("Jumping!") } }&lt;br /&gt;&lt;br /&gt;class Controller {&lt;br /&gt; def makeThemJump(jumpers: List[{ def jump(): Unit }]) = {&lt;br /&gt;   jumpers.foreach { jumper =&gt;&lt;br /&gt;     jumper.jump()&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;span&gt;The Twitter guys pointed out that it might be a good idea to avoid structural types due to their use of &lt;/span&gt;&lt;span&gt;reflection, which may be slow.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Dependency Injection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How to use dependency injection (DI) with Scala was brought up. There was some argument on how applicable DI was in Scala, with developers coming from a Java background supporting it and those with a Ruby background questioning its relevance to Scala. Either way, this in depth &lt;a href="http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/"&gt;article by Jonas Bonér&lt;/a&gt; was brought up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Development Environment&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There was a short discussion on what ide/editor people were using for Scala.  The Twitter guys were using TextMate or Emacs, and a few people in the audience mentioned Eclipse and NetBeans.  I am really curious what luck developers have had with the different environments.  I am using NetBeans right now, but I am not completely happy with it.  Can anyone make any recommendations?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-4328605252191824444?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/4328605252191824444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=4328605252191824444' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4328605252191824444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4328605252191824444'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/octobers-bay-area-scala-enthusiasts_17.html' title='October&apos;s Bay Area Scala Enthusiasts Meetup, Part 2'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-2851871922408268639</id><published>2008-10-14T23:11:00.000-07:00</published><updated>2008-10-15T23:50:33.365-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='san francisco'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>October's Bay Area Scala Enthusiasts Meetup</title><content type='html'>Tonight I attended a meeting of the &lt;a href="http://svscala.ning.com/"&gt;Bay Area Scala Enthusiasts&lt;/a&gt;, a user group focused on the Scala programming language.  The meeting was held at Twitter's office in San Francisco, only a few blocks from my company's office, so it couldn't have been more convenient for me.  I expected to encounter around 5-10 people there, but I was surprised when around 30 had gathered.  The Scala community is definitely growing!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gracelessfailures.com/"&gt;Alex, Steve, and Robey from Twitter&lt;/a&gt; hosted the meeting, and explained how they are using Scala at Twitter.  They are using it both in middleware and in front-end code and seem to be committed to expanding its use in Twitter-- good things for Scala and Twitter both.  Their main presentation focused on establishing a set of coding conventions for the Scala community, which I think could be a really good help for new programmers to have some structure.  Robey showed us some of his open source code up on github, including &lt;a href="http://github.com/robey/configgy/tree/master"&gt;configgy&lt;/a&gt;, which I plan to take a serious look at soon.&lt;br /&gt;&lt;br /&gt;Some other interesting discussions at the meeting included preferred development environments and strategies to deal with the paradox of being paralyzed by having multiple ways to accomplish the same thing in Scala, usually at least a functional and an object-oriented way of doing things.  The concensus seemed to be that each group will ultimately end up with their own style or Scala programming, somewhere between the extremes of writing Java in Scala or Haskell in Scala.&lt;br /&gt;&lt;br /&gt;We also learned that there are no less than three Scala books in the works:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://pragprog.com/titles/vsscala/programming-scala"&gt;&lt;/a&gt;&lt;a style="font-weight: bold;" href="http://www.artima.com/shop/programming_in_scala"&gt;Programming in Scala&lt;/a&gt; by Odersky, Spoon, and Bill Venners (who was also present and shared some good stories about his experiences in the language as well as the origin of the "/:" operator)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://pragprog.com/titles/vsscala/programming-scala"&gt;&lt;/a&gt;&lt;a href="http://pragprog.com/titles/vsscala/programming-scala"&gt;&lt;span style="font-weight: bold;"&gt;Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine&lt;/span&gt;&lt;/a&gt;&lt;a style="font-weight: bold;" href="http://pragprog.com/titles/vsscala/programming-scala"&gt;&lt;/a&gt; by Venkat Subramaniam&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Programming Scala &lt;/span&gt;by &lt;a href="http://www.al3x.net/"&gt;Alex Payne&lt;/a&gt; and &lt;a href="http://blog.aspectprogramming.com/"&gt;Dean Wampler&lt;/a&gt;, published by O'Reilly&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Notice a pattern in the titles?&lt;br /&gt;&lt;br /&gt;All in all, a great meeting where I meet some very interesting people.  It's great to see the community of Bay Area Scalists so... well, Enthusiastic :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt;&lt;br /&gt;Added exact authors of the new O'Reilly Scala book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-2851871922408268639?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/2851871922408268639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=2851871922408268639' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2851871922408268639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2851871922408268639'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/octobers-bay-area-scala-enthusiasts.html' title='October&apos;s Bay Area Scala Enthusiasts Meetup'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-4012529429962641969</id><published>2008-10-10T13:35:00.000-07:00</published><updated>2008-10-14T00:07:03.952-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Reflections on Scala</title><content type='html'>In my professional programming career, I have been a mostly object-oriented programmer, programming in C#, Java, Python, and C++.  Throughout this time, though, I researched functional programming languages from Scheme to Haskell.  While I was frequently fascinated by them and they definitely stretched my mind, I never found them to be as practically usable as the relatively new language &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Scala describes itself as a fusion of object-oriented and functional programming languages, and while that is true, it certainly does not give the language justice.  Scala has let me leverage my familiarity with object-oriented languages like C# and Java, but add in functional elements as I go along.  This has been great for me since I am most comfortable developing real-world applications in an object-oriented style, as I suspect most professional developers are these days.  After I have the basics of my program done in an object-oriented style, I can start adding in more functional features.  I have never found a language that makes this easier.&lt;br /&gt;&lt;br /&gt;To me, the biggest stumbling block for programmers new to Scala is that most of the official documentation describes Scala's functional features very well, but lacks in depth discussions on how to transition to Scala from an object-oriented background.  My advice if you are new to Scala and you're an object-oriented developer, learn how to program Scala in a object-oriented way first, then add in functional stuff.&lt;br /&gt;&lt;br /&gt;Finally, I have tried two IDE plugins that offer Scala support: one for Eclipse and one for NetBeans.  Of the two, I find NetBeans to be more stable, faster, and better able to deal with Scala syntax than Eclipse.  There are definitely still some bugs for them to solve, but I'll be sticking with the NetBeans plugin for my Scala development in the near term.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-4012529429962641969?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/4012529429962641969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=4012529429962641969' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4012529429962641969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4012529429962641969'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/reflections-on-scala.html' title='Reflections on Scala'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-5409857048891650243</id><published>2008-10-02T15:28:00.000-07:00</published><updated>2008-10-02T15:37:45.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala's Community</title><content type='html'>I am studying the functional/object-oriented language Scala right now and I thought I'd share a few observations about this language and the community around it:&lt;br /&gt;&lt;br /&gt;Last night I was having some issues getting Eclipse's Scala plugin to work correctly.  Frustrated, I went on &lt;a href="irc://irc.freenode.net/scala"&gt;Scala's IRC chat room&lt;/a&gt; and made an off-hand comment on my problems.  The maintainer of the plugin just happened to be in the room at the time, and pointed out my problem, quickly setting me on the right path.  My first "technical support" question solved!&lt;br /&gt;&lt;br /&gt;A great little tutorial for getting someone familiar with Scala from the Java/C# school of object-oriented programming is &lt;a href="http://www.codecommit.com/blog/scala/roundup-scala-for-java-refugees"&gt;Daniel Spiewak's Scala for Java Refugees&lt;/a&gt;.  Highly recommended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-5409857048891650243?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/5409857048891650243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=5409857048891650243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/5409857048891650243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/5409857048891650243'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/10/scalas-community.html' title='Scala&apos;s Community'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-5882424026065840510</id><published>2008-09-03T11:56:00.000-07:00</published><updated>2008-10-17T11:43:57.013-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='mocking'/><title type='text'>Test Driven Development Best Practices for C#</title><content type='html'>&lt;div class="ExternalClassB733F077632D4BCB8BFCADC93592A71C"&gt;As I have mentioned before, my company has recently started to use the Test Driven Development style of programming.  In order to help us write testable code, I came up with this simple list of best practices for making our C# code base more testable.  (Some of the links refer to limitations of Rhino Mocks, a mocking framework for C#, but the rules apply more generally as well.)&lt;br /&gt;&lt;br /&gt;To maximize the testability of code, follow these rules:&lt;br /&gt;&lt;div class="ExternalClass02015F31AB394C3A9A2076F5C9B665C5"&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="left"&gt;&lt;div align="left"&gt;&lt;strong&gt;Write the test first, then the code. (PRIME DIRECTIVE!)&lt;br /&gt;&lt;/strong&gt;Reason: This ensures that you write testable code and that every line of code gets tests written for it.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Design classes using dependency injection.&lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;div align="left"&gt;&lt;strong&gt;&lt;/strong&gt;See: &lt;a href="http://weblogs.asp.net/stephenwalther/archive/2008/03/22/tdd-introduction-to-rhino-mocks.aspx"&gt;Intro to Rhino Mocks (see "Creating Testable Web Applications" section)&lt;/a&gt; and &lt;a href="http://martinfowler.com/articles/injection.html"&gt;Dependency Injection Article&lt;/a&gt;&lt;br /&gt;Reason: You cannot mock or test what cannot be seen.&lt;/div&gt;&lt;/div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Separate UI code from its behavior using Model-View-Controller or Model-View-Presenter.&lt;/span&gt;&lt;br /&gt;&lt;div align="left"&gt;Reason: Allows the business logic to be tested while the parts that can't be tested (the UI) is minimized.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Do not write static methods or classes.&lt;/strong&gt;&lt;br /&gt;&lt;div align="left"&gt;See: &lt;a href="http://weblogs.asp.net/stephenwalther/archive/2008/03/22/tdd-introduction-to-rhino-mocks.aspx"&gt;Intro to Rhino Mocks (see "Creating Testable Web Applications" section)&lt;/a&gt; and &lt;a href="http://www.ayende.com/Wiki/Rhino+Mocks+Limitations.ashx"&gt;Rhino Mocks Limitations&lt;/a&gt;&lt;br /&gt;Reason: Static methods are difficult or impossible to isolate and Rhino Mocks is unable to mock them.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Program off interfaces, not classes.&lt;/strong&gt;&lt;br /&gt;&lt;div align="left"&gt;Reason: Interfaces can be easily mocked using Rhino Mocks and other mocking frameworks.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="left"&gt;&lt;strong&gt;Isolate external dependencies.&lt;/strong&gt;&lt;br /&gt;Reason: Unresolved external dependencies.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="left"&gt;&lt;strong&gt;Mark as virtual the methods you intend to mock.&lt;/strong&gt;&lt;br /&gt;See: &lt;a href="http://www.ayende.com/Wiki/Rhino+Mocks+Limitations.ashx"&gt;Rhino Mocks Limitations&lt;/a&gt;&lt;br /&gt;Reason: Rhino Mocks is unable to mock non-virtual methods.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&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/1937539813134787961-5882424026065840510?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/5882424026065840510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=5882424026065840510' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/5882424026065840510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/5882424026065840510'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/09/test-driven-development-best-practices.html' title='Test Driven Development Best Practices for C#'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-6021135230115824839</id><published>2008-08-16T20:06:00.000-07:00</published><updated>2008-08-18T20:36:34.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='art of computer programming'/><title type='text'>Code Can Be Poetic</title><content type='html'>While learning RSpec (a testing framework for Ruby), my girlfriend was sitting next to me on our couch asking me what color of yarn she should knit some socks in.  While she asked me questions, I came up with these to snippits of code that "tested" if a particular yarn type was correct.  Not very useful, but fun!&lt;br /&gt;&lt;br /&gt;sock.rb:&lt;br /&gt;&lt;pre class="code"&gt;class Sock&lt;br /&gt; attr_accessor :colors&lt;br /&gt;&lt;br /&gt; def initialize&lt;br /&gt;    @colors = [:teal, :olive, :green, :blue, :purple]&lt;br /&gt; end &lt;br /&gt;&lt;br /&gt; def machine_washable?&lt;br /&gt;   true&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;sock_spec.rb:&lt;br /&gt;&lt;pre class="code"&gt;require "sock"&lt;br /&gt;&lt;br /&gt;describe "Socks that Kevin would like" do&lt;br /&gt;&lt;br /&gt; before :each do&lt;br /&gt;   @sock = Sock.new&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; it "should not have pink in it" do&lt;br /&gt;   @sock.colors.include?(:pink).should_not == true&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; it "should not have purple in it" do&lt;br /&gt;   @sock.colors.include?(:purple).should_not == true&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; it "should be machine washable" do&lt;br /&gt;   @sock.should be_machine_washable&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; it "should not have grey in it" do&lt;br /&gt;   @sock.colors.include?(:grey).should_not == true&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; it "should have multiple colors" do&lt;br /&gt;   @sock.colors.length.should &gt; 1&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-6021135230115824839?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/6021135230115824839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=6021135230115824839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6021135230115824839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6021135230115824839'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/08/code-can-be-poetic.html' title='Code Can Be Poetic'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-2568816106271728032</id><published>2008-08-14T10:15:00.000-07:00</published><updated>2008-08-14T11:09:04.390-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='programming philosophy'/><title type='text'>Programming at a High Level</title><content type='html'>Jeff Atwood (of the &lt;a href="http://www.codinghorror.com/"&gt;Coding Horror&lt;/a&gt; blog) this week pointed out that there are many new high-level JavaScript libraries that allow you to ignore the lower-level JavaScript incompatibilities between browsers.  I have used JQuery and can also vouch that using JQuery is incredibly fun and easy to program with.&lt;br /&gt;&lt;br /&gt;This is more broadly applicable to other programming languages and libraries, too: Use the highest-level interface that you are able to use to accomplish your task.  For example, don't use C when you can use C++.  Don't use JavaScript when you can use JQuery.  Don't use C++ when you can use C#.  Don't use Perl when you can use Ruby.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001163.html"&gt;Secrets of the Scripting Ninjas&lt;/a&gt; (Coding Horror blog post)&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-2568816106271728032?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/2568816106271728032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=2568816106271728032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2568816106271728032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/2568816106271728032'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/08/programming-at-high-level.html' title='Programming at a High Level'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-279234678198918045</id><published>2008-08-12T21:12:00.001-07:00</published><updated>2008-10-08T22:19:14.855-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler project'/><title type='text'>Ruby Compiler Project</title><content type='html'>In my spare time (that is, apart from all the other hobbies I have), I have started work on a new programming project.  My goal is to write an interpreter/compiler for a new programming language.  I have no great ambitions, this project is purely for my own enjoyment and to hopefully teach myself something new.&lt;br /&gt;&lt;br /&gt;Goals/Plans:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Develop in Mac OS X&lt;/li&gt;&lt;li&gt;Implement the compiler in Ruby&lt;/li&gt;&lt;li&gt;Use test driven development and the agile process&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-279234678198918045?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/279234678198918045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=279234678198918045' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/279234678198918045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/279234678198918045'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/08/new-project.html' title='Ruby Compiler Project'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-7047576888777145788</id><published>2008-04-24T12:11:00.000-07:00</published><updated>2008-10-17T11:43:11.551-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='programming philosophy'/><title type='text'>Test Driven Development</title><content type='html'>We have started using Test Driven Development at work, which is an entirely new way to program.  This goes along with our existing use of Agile Development, so we are totally embracing the latest and (hopefully) greatest in programming philosophy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-7047576888777145788?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/7047576888777145788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=7047576888777145788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/7047576888777145788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/7047576888777145788'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2008/04/test-driven-development.html' title='Test Driven Development'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-7036676623283443893</id><published>2007-08-14T11:38:00.000-07:00</published><updated>2008-10-17T11:42:24.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='gotchas'/><title type='text'>JavaScript Retardedness</title><content type='html'>I just discovered after dealing with an annoying bug for over an hour, that in JavaScript, this evaluates to true:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;0 == ''&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thankfully, in the newer browsers, they added the === operator to deal with this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-7036676623283443893?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/7036676623283443893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=7036676623283443893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/7036676623283443893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/7036676623283443893'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2007/08/javascript-retardedness.html' title='JavaScript Retardedness'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-6586767945794897303</id><published>2007-07-15T09:12:00.000-07:00</published><updated>2008-04-23T17:59:50.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac OS</title><content type='html'>I've been using Mac for about a year now, so I thought it was time to give a quick review comparing and contrasting the benefits of Mac (compared to my previous experience with Windows).&lt;br /&gt;&lt;br /&gt;Things I like about Mac:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Invisibility of the operating system -- It really does "just work" as Apple claims.  Unless you need to do something very advanced, you could get away with never configuring anything in the OS.&lt;/li&gt;&lt;li&gt;   Visual appeal -- the OS looks very slick while still being functional&lt;/li&gt;&lt;li&gt;Application availability -- there are many applications available (obviously less than Windows, though), and the quality of each application is very high&lt;/li&gt;&lt;li&gt;Application switching -- the application switching features are incredible and very useful&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Things I don't like about Mac:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The WiFi applet responds slowly to user feedback, about a 5-10 second lag between clicks sometimes.&lt;/li&gt;&lt;li&gt;Most applications can't be maximized&lt;/li&gt;&lt;li&gt;Lack of Visual Studio -- Microsoft's Visual Studio development tool is the most user-friendly development tool I've ever used, but it's not available on Mac... Eclipse is a fairly good alternative once you get used to it.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Overall what I've noticed during my switch is how the rise of Internet applications has made it which operating system I use less important.  I use Google Calendar, Gmail, Google Reader, and Firefox, which works on every platform.  Internet based blogs constitute much of my writing. As internet apps get more powerful, this trend will only continue, making the OS you use nearly meaningless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-6586767945794897303?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/6586767945794897303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=6586767945794897303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6586767945794897303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/6586767945794897303'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2007/07/mac-os.html' title='Mac OS'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-4050336972672109457</id><published>2007-05-24T08:13:00.000-07:00</published><updated>2007-05-24T08:31:13.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='arc'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Functional Languages on the Horizon</title><content type='html'>The usefulness of functional languages is really starting to go mainstream now.  In the past, I've learned Haskell, Scheme, and Ruby, and I'm studying Scheme again now.  Trying to learn every technology is impossible so I'm going to stick with Scheme right now because of the great books that are available for learning it.&lt;br /&gt;&lt;br /&gt;Practical reasons for learning some functional languages:&lt;br /&gt;&lt;br /&gt;Scala&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lift Web Framework: &lt;a href="http://liftweb.net/"&gt;http://liftweb.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Java interoperability&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Haskell&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New O'Reilly book, "Real-World Haskell": &lt;a href="http://www.realworldhaskell.org/blog/"&gt;http://www.realworldhaskell.org/blog/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Most modern functional language in semi-mainstream use.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Scheme/Lisp&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Great books: "Lisp in Small Pieces", "The Scheme Programming Language" (by Kent Dybvig), and "The Structure and Interpretation of Computer Programs".&lt;/li&gt;&lt;li&gt;Good, cross-platform IDE: DrScheme&lt;/li&gt;&lt;li&gt;Ability to leverage knowledge for Arc (Paul Graham's language which will almost certainly have a large following due to his popularity)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-4050336972672109457?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/4050336972672109457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=4050336972672109457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4050336972672109457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/4050336972672109457'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2007/05/functional-languages-on-horizon.html' title='Functional Languages on the Horizon'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-3880350822260800917</id><published>2007-05-18T13:02:00.000-07:00</published><updated>2007-05-18T13:05:17.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>PLT Scheme</title><content type='html'>I'm learning Scheme right now in my spare time to expand my programming ability and hopefully find use for it at work.  PLT Scheme seems to be a good implementation: it has a large library, and a good cross-platform IDE. Also, the PLT Scheme user community is large and active compared to many other Scheme implementations.&lt;br /&gt;&lt;br /&gt;There are also some cool extensions for it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ccs.neu.edu/home/samth/typed-scheme.html" title="Typed Scheme"&gt;Typed Scheme&lt;/a&gt;: typing on top of PLT Scheme&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.brown.edu/research/plt/software/divascheme/" title="DivaScheme"&gt;DivaScheme&lt;/a&gt;: environment to improve PLT Scheme&lt;/li&gt;&lt;/ul&gt;And some other good links:&lt;br /&gt;     &lt;ul&gt;&lt;li&gt;&lt;a href="http://scheme.dk/planet/" title="Planet Scheme"&gt;Planet Scheme&lt;/a&gt;: a aggregation of Scheme blogs&lt;/li&gt;&lt;li&gt;&lt;a href="http://schemekeys.blogspot.com/2007/05/keybinding-101-in-drscheme.html" title="Keybinding 101 in PLT Scheme"&gt;Keybinding 101 in PLT Scheme&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-3880350822260800917?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/3880350822260800917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=3880350822260800917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/3880350822260800917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/3880350822260800917'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2007/05/plt-scheme.html' title='PLT Scheme'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1937539813134787961.post-205983647163721212</id><published>2007-05-17T21:10:00.000-07:00</published><updated>2007-05-17T21:13:46.822-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='housekeeping'/><title type='text'>Hello, World!</title><content type='html'>No better way to start a blog about computer programming than with the immortal words of every programmer's first foray into a new programming language.  This blog will mostly be for my own benefit and future reference, but if someone finds it useful, all the better!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1937539813134787961-205983647163721212?l=kevinoncode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kevinoncode.blogspot.com/feeds/205983647163721212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1937539813134787961&amp;postID=205983647163721212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/205983647163721212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1937539813134787961/posts/default/205983647163721212'/><link rel='alternate' type='text/html' href='http://kevinoncode.blogspot.com/2007/05/hello-world.html' title='Hello, World!'/><author><name>Kevin Albrecht</name><uri>https://profiles.google.com/102008555897059696338</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-kfrkB2iRDuk/AAAAAAAAAAI/AAAAAAAAAAA/_QQ9dt2zyHs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
