<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>OJ's rants</title>
	
	<link>http://buffered.io</link>
	<description>What would OJ do?</description>
	<lastBuildDate>Mon, 06 Sep 2010 09:30:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/OjsRants" /><feedburner:info uri="ojsrants" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><item>
		<title>Webmachine, ErlyDTL and Riak – Part 1</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/Td2NoEkgnCY/</link>
		<comments>http://buffered.io/2010/09/01/webmachine-erlydtl-and-riak-part-1/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 13:29:54 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[Webmachine]]></category>
		<category><![CDATA[ErlyDTL]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Riak]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=851</guid>
		<description><![CDATA[It has been a long time coming, but the first post is finally here! This is the first in a series of post, as promised a while ago, covering off web development using Erlang. This post is the ubiquitous "get up and running" post, which aims to get your environment set up so that you [...]]]></description>
			<content:encoded><![CDATA[<p>It has been a long time coming, but the first post is finally here! This is the first in a series of post, as <a href="http://buffered.io/2009/10/31/the-future-is-erlang/" title="The Future is Erlang">promised a while ago</a>, covering off web development using <a href="http://erlang.org/" title="Erlang">Erlang</a>. This post is the ubiquitous "get up and running" post, which aims to get your environment set up so that you can dive in to development. The next post will detail how to handle a basic end-to-end web request.</p>
<p><img src="http://buffered.io/wp-content/uploads/2010/09/Erlang_logo.png" width="150" style="float:right;margin-left:5px;margin-bottom:5px;"/>First up, a few things we need to be aware of before we begin:</p>
<ol>
<li>The information in this post has only been verified on Linux (<a href="http://linuxmint.com/" title="Linux Mint">Mint</a> to be exact). It <em>should</em> work just fine on Mac OSX. I'm almost certain that it <em>won't</em> work on a Windows machine. So if you're a Windows developer, you'll have to wait for another post down the track which covers off how to get your environment ready to rock.</li>
<li>We'll be downloading, building and installing <a href="http://erlang.org/" title="Erlang">Erlang</a>, <a href="http://github.com/evanmiller/erlydtl" title="ErlyDTL">ErlyDTL</a>, <a href="http://www.basho.com/developers.html#Riak" title="Riak">Riak</a> and <a href="http://www.basho.com/developers.html#Webmachine" title="Webmachine">Webmachine</a>.</li>
<li>Even though it's not yet recommended, I'll be using the latest version of Erlang to power Webmachine and Riak (R14A). If I were to build a production application I would follow the guidelines of the <a href="http://basho.com/" title="Basho Technologies">Basho guys</a> and use R13B04. Since this application isn't a production application happy to take the risk <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </li>
<li><a href="http://www.basho.com/developers.html#Rebar" title="Rebar">Rebar</a> is the tool we'll be using to handle builds, but I won't be covering it in any depth.</li>
<li>You will need the latest versions of both <a href="http://hg-scm.com/" title="Mercurial">Mercurial</a> and <a href="http://git-scm.com/" title="Git">Git</a> so make sure they're downloaded and installed before you follow this article.</li>
<li>We'll be doing <em>some</em> interaction with Riak via <a href="http://curl.haxx.se/" title="cURL and libcurl">curl</a>, so make sure you have it downloaded and installed as well.</li>
<li>This is intended to be a step-by-step guide targeted at those who are very new to web development in Erlang. This may not be the most ideal set up, nor the best way of doing certain things. I am hoping that those people who are more experienced than I will be able to provide feedback and guidance in areas where I am lacking.</li>
<li>Over the course of this series I'll be attempting to build an Erlang version of the <a href="http://bitbucket.org/OJ/codesmackdown" title="Code Smackdown">Code Smackdown</a> site that I've been working on here and there with a <a href="http://secretgeek.net/" title="secretGeek">mate of mine</a>. You'll see that the sample application we're working on is called "csd" for obvious reasons.</li>
</ol>
<p>OK, let's get into it. First up, Erlang. </p>
<h3>Installing Erlang R14B</h3>
<p>Download and installation is fairly simple. Right now we're not worried about enabling all of the features of Erlang, such as interfacing with Java and providing support for GTK. So the boilerplate functionality is enough. Here are the steps to follow:</p>
<pre>
<strong>oj@nix ~/blog $</strong> wget http://erlang.org/download/otp_src_R14A.tar.gz
--2010-09-01 20:18:12--  http://erlang.org/download/otp_src_R14A.tar.gz
Resolving erlang.org... 193.180.168.20
Connecting to erlang.org|193.180.168.20|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 59641065 (57M) [application/x-tar]
Saving to: `otp_src_R14A.tar.gz.1'

  <em>... snip ...</em>

2010-09-01 20:43:43 (38.1 KB/s) - `otp_src_R14A.tar.gz.1' saved [59641065/59641065]

<strong>oj@nix ~/blog $</strong> tar -xvzf otp_src_R14A.tar.gz
otp_src_R14A/
otp_src_R14A/erts/

  <em>... snip ...</em>

otp_src_R14A/system/COPYRIGHT
<strong>oj@nix ~/blog $</strong> cd otp_src_R14A/
<strong>oj@nix ~/blog/otp_src_R14A $</strong> ./configure
Ignoring the --cache-file argument since it can cause the system to be erroneously configured
Disabling caching
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for gcc... gcc

  <em>... snip ...</em>

<strong>oj@nix ~/blog/otp_src_R14A $</strong> make
test X"$ERTS_SKIP_DEPEND" = X"true" || (cd erts/emulator &#038;& ERL_TOP=/home/oj/blog/otp_src_R14A make generate depend)
make[1]: Entering directory `/home/oj/blog/otp_src_R14A/erts/emulator'
make -f x86_64-unknown-linux-gnu/Makefile generate
make[2]: Entering directory `/home/oj/blog/otp_src_R14A/erts/emulator'

  <em>... snip ...</em>

=== Leaving application dialyzer
make[1]: Leaving directory `/home/oj/blog/otp_src_R14A/lib/dialyzer'
<strong>oj@nix ~/blog/otp_src_R14A $</strong> sudo make install

  <em>... snip ...</em>

<strong>oj@nix ~/blog/otp_src_R14A $</strong>
</pre>
<p>Done! Let's confirm that it has been set up correctly:</p>
<pre>
<strong>oj@nix ~/blog $</strong> erl
Erlang R14A (erts-5.8) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8  (abort with ^G)
1> q().
ok
</pre>
<p>Excellent. Next let's get Riak going.</p>
<h3>Installing Riak 0.12</h3>
<p>Considering the power of the software you are about to set up, it is absolutely insane how easy it is to get it running. If any of you have tried to get <a href="http://couchdb.apache.org/" title="CouchDB">CouchDB</a> running you'll no doubt have experienced a few quirks and a bit of pain getting it rolling. Not so with Riak. As mentioned at the start of the article, make sure you have a recent version of <a href="http://hg-scm.com/" title="Mecurial">Mercurial</a> and <a href="http://git-scm.com/" title="Git">Git</a> installed.</p>
<pre>
<strong>oj@nix ~/blog/riak $</strong> hg --version
Mercurial Distributed SCM (version 1.6)

Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
<strong>oj@nix ~/blog/riak $</strong> git --version
git version 1.6.3.3
<strong>oj@nix ~/blog $</strong> hg clone http://hg.basho.com/riak
destination directory: riak
requesting all changes
adding changesets
adding manifests
adding file changes
added 1565 changesets with 4058 changes to 1225 files
updating to branch default
53 files updated, 0 files merged, 0 files removed, 0 files unresolved
<strong>oj@nix ~/blog $</strong> cd riak
<strong>oj@nix ~/blog/riak $</strong> make
./rebar get-deps
==&gt; rel (get-deps)
==&gt; riak (get-deps)
Pulling riak_kv from {hg,"http://bitbucket.org/basho/riak_kv","tip"}

  <em>... snip ...</em>

==&gt; riak_kv (get-deps)
Pulling riak_core from {hg,"http://bitbucket.org/basho/riak_core","tip"}

  <em>... snip ...</em>

Pulling riakc from {hg,"http://bitbucket.org/basho/riak-erlang-client","tip"}

  <em>... snip ...</em>

Pulling luke from {hg,"http://bitbucket.org/kevsmith/luke-mr","tip"}

  <em>... snip ...</em>

Pulling erlang_js from {hg,"http://bitbucket.org/basho/erlang_js",
                           "erlang_js-0.4"}

  <em>... snip ...</em>

Pulling bitcask from {hg,"http://bitbucket.org/basho/bitcask","tip"}

  <em>... snip ...</em>

Pulling ebloom from {hg,"http://bitbucket.org/basho/ebloom","ebloom-1.0.1"}

  <em>... snip ...</em>

==&gt; riak_core (get-deps)
Pulling protobuffs from {hg,"http://bitbucket.org/basho/protobuffs",
                            "protobuffs-0.5.0"}

  <em>... snip ...</em>

Pulling webmachine from {hg,"http://bitbucket.org/basho/webmachine",
                            "webmachine-1.7.1"}

  <em>... snip ...</em>

==&gt; protobuffs (get-deps)
==&gt; webmachine (get-deps)
Pulling mochiweb from {hg,"http://bitbucket.org/basho/mochiweb",
                          "mochiweb-1.7.1"}

  <em>... snip ...</em>

==&gt; mochiweb (get-deps)
==&gt; riakc (get-deps)
==&gt; luke (get-deps)
==&gt; erlang_js (get-deps)
==&gt; ebloom (get-deps)
==&gt; bitcask (get-deps)
./rebar compile
==&gt; protobuffs (compile)
Compiled src/protobuffs.erl

  <em>... snip ...</em>

==&gt; mochiweb (compile)
Compiled src/mochifmt_std.erl

  <em>... snip ...</em>

==&gt; webmachine (compile)
Compiled src/wmtrace_resource.erl

  <em>... snip ...</em>

==&gt; riak_core (compile)
Compiling src/riak_core.proto

  <em>... snip ...</em>

==&gt; riakc (compile)
Compiling src/riakclient.proto

  <em>... snip ...</em>

==&gt; luke (compile)
Compiled src/luke_flow_sup.erl

  <em>... snip ...</em>

==&gt; erlang_js (compile)
Compiled src/js_drv_comm.erl

  <em>... snip ...</em>

Running make -C c_src

  <em>... snip ...</em>

==&gt; ebloom (compile)
Compiled src/ebloom.erl
Compiling c_src/ebloom_nifs.cpp
==&gt; bitcask (compile)
Compiled src/bitcask_sup.erl

  <em>... snip ...</em>

==&gt; riak_kv (compile)
Compiled src/riak_kv_wm_ping.erl

  <em>... snip ...</em>

==&gt; rel (compile)
==&gt; riak (compile)
<strong>oj@nix ~/blog/riak $</strong>
</pre>
<p>I snipped a lot of the make output for obvious reasons. Let's build a few development nodes of Riak and cluster them together as indicated in the <a href="https://wiki.basho.com/display/RIAK/The+Riak+Fast+Track" title="Riak Fast Track">Riak Fast Track</a>:</p>
<pre>
<strong>oj@nix ~/blog/riak $</strong> make devrel
mkdir -p dev
(cd rel &#038;& ../rebar generate target_dir=../dev/dev1 overlay_vars=vars/dev1_vars.config)
==&gt; rel (generate)
mkdir -p dev
(cd rel &#038;& ../rebar generate target_dir=../dev/dev2 overlay_vars=vars/dev2_vars.config)
==&gt; rel (generate)
mkdir -p dev
(cd rel &#038;& ../rebar generate target_dir=../dev/dev3 overlay_vars=vars/dev3_vars.config)
==&gt; rel (generate)
<strong>oj@nix ~/blog/riak $</strong> cd dev
<strong>oj@nix ~/blog/riak/dev $</strong> dev1/bin/riak start
<strong>oj@nix ~/blog/riak/dev $</strong> dev2/bin/riak start
<strong>oj@nix ~/blog/riak/dev $</strong> dev3/bin/riak start
<strong>oj@nix ~/blog/riak/dev $</strong> dev2/bin/riak-admin join dev1
Sent join request to dev1
<strong>oj@nix ~/blog/riak/dev $</strong> dev3/bin/riak-admin join dev1
Sent join request to dev1
<strong>oj@nix ~/blog/riak/dev $</strong> curl -H "Accept: text/plain" http://127.0.0.1:8091/stats
{

  <em>... snip ...</em>

    "nodename": "dev1@127.0.0.1",
    "connected_nodes": [
        "dev2@127.0.0.1",
        "dev3@127.0.0.1"
    ],

  <em>... snip ...</em>

    "ring_members": [
        "dev1@127.0.0.1",
        "dev2@127.0.0.1",
        "dev3@127.0.0.1"
    ],
    "ring_num_partitions": 64,
    "ring_ownership": "[{'dev3@127.0.0.1',21},{'dev2@127.0.0.1',21},{'dev1@127.0.0.1',22}]",

  <em>... snip ...</em>

<strong>oj@nix ~/blog/riak/dev $</strong>
</pre>
<p>As we can see from the curl output, we now have a 3-node Riak cluster up and running. Those three nodes have the following traits:</p>
<table border="1">
<thead>
<tr>
<th>Name</th>
<th>Protobuf Port</th>
<th>HTTP Port</th>
</tr>
</thead>
<tbody>
<tr>
<td>dev1@127.0.0.1</td>
<td>8081</td>
<td>8091</td>
</tr>
<tr>
<td>dev2@127.0.0.1</td>
<td>8082</td>
<td>8092</td>
</tr>
<tr>
<td>dev3@127.0.0.1</td>
<td>8083</td>
<td>8093</td>
</tr>
</tbody>
</table>
<p>We can talk to any of these nodes and they will replicate their data to the other nodes. Nifty! Now that we have a Riak cluster running for development, let's get Webmachine ready.</p>
<h3>Installing Webmachine 0.7.1</h3>
<p>Again, the process is very simple:</p>
<pre>
<strong>oj@nix ~/blog $</strong> hg clone http://hg.basho.com/webmachine
destination directory: webmachine

  <em>... snip ...</em>

<strong>oj@nix ~/blog $</strong> cd webmachine/
<strong>oj@nix ~/blog/webmachine $</strong> make
==&gt; webmachine (get-deps)
Pulling mochiweb from {hg,"http://bitbucket.org/basho/mochiweb",
                          "mochiweb-1.7.1"}

  <em>... snip ...</em>

==&gt; mochiweb (get-deps)
==&gt; mochiweb (compile)
Compiled src/mochifmt_std.erl

  <em>... snip ...</em>

==&gt; webmachine (compile)
Compiled src/wmtrace_resource.erl

  <em>... snip ...</em>
</pre>
<p>As you can see, Webmachine sits on top of the <a href="http://github.com/mochi/mochiweb" title="Mochiweb">Mochiweb</a> web server.</p>
<p>To create our own application which sits on top of Webmachine, we can utilise the <code>new_webmachine.sh</code> script. So let's do that to create our Code Smackdown (csd) site:</p>
<pre>
<strong>oj@nix ~/blog/webmachine $</strong> scripts/new_webmachine.sh
usage: new_webmachine.sh name [destdir]
<strong>oj@nix ~/blog/webmachine $</strong> scripts/new_webmachine.sh csd ..
==&gt; priv (create)
Writing /home/oj/blog/csd/README
Writing /home/oj/blog/csd/Makefile
Writing /home/oj/blog/csd/rebar.config
Writing /home/oj/blog/csd/rebar
Writing /home/oj/blog/csd/start.sh
Writing /home/oj/blog/csd/ebin/csd.app
Writing /home/oj/blog/csd/src/csd.erl
Writing /home/oj/blog/csd/src/csd_app.erl
Writing /home/oj/blog/csd/src/csd_sup.erl
Writing /home/oj/blog/csd/src/csd_resource.erl
Writing /home/oj/blog/csd/priv/dispatch.conf
<strong>oj@nix ~/blog/webmachine $</strong>
</pre>
<p>Webmachine generates a fully functional website out of the box. So we should be able to build it, fire it up and see it in action:</p>
<pre>
<strong>oj@nix ~/blog/webmachine $</strong> cd ../csd
<strong>oj@nix ~/blog/csd $</strong> make
==&gt; csd (get-deps)
Pulling webmachine from {hg,"http://bitbucket.org/basho/webmachine","tip"}

  <em>... snip ...</em>

==&gt; webmachine (get-deps)
Pulling mochiweb from {hg,"http://bitbucket.org/basho/mochiweb",
                          "mochiweb-1.7.1"}

  <em>... snip ...</em>

==&gt; mochiweb (get-deps)
==&gt; mochiweb (compile)
Compiled src/mochifmt_std.erl

  <em>... snip ...</em>

==&gt; webmachine (compile)
Compiled src/wmtrace_resource.erl

  <em>... snip ...</em>

==&gt; csd (compile)
Compiled src/csd_app.erl
Compiled src/csd_resource.erl
Compiled src/csd.erl
Compiled src/csd_sup.erl
<strong>oj@nix ~/blog/csd $</strong> ./start.sh
Erlang R14A (erts-5.8) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

  <em>... snip ...</em>

=PROGRESS REPORT==== 1-Sep-2010::21:19:41 ===
          supervisor: {local,csd_sup}
             started: [{pid,<0.65.0>},
                       {name,webmachine_mochiweb},
                       {mfargs,
                           {webmachine_mochiweb,start,
                               [[{ip,"0.0.0.0"},
                                 {port,8000},
                                 {log_dir,"priv/log"},
                                 {dispatch,[{[],csd_resource,[]}]}]]}},
                       {restart_type,permanent},
                       {shutdown,5000},
                       {child_type,worker}]

=PROGRESS REPORT==== 1-Sep-2010::21:19:41 ===
         application: <strong>csd</strong>
          started_at: nonode@nohost
</pre>
<p>The application is now up and running. As you can see from the output, our csd application has been fired up and is listening on port 8000. Let's fire it up in a web browser to see if it works.</p>
<p><img src="http://buffered.io/wp-content/uploads/2010/09/wm_default.png"/></p>
<p>It's alive! We're almost done. Before we finish up, let's get set up our build to include some dependencies.</p>
<h3>Adding ErlyDTL and Riak Client Dependencies</h3>
<p>Rebar makes this bit a walk in the park (thanks <a href="http://dizzyd.com/" title="Gradual Epiphany">Dave</a>, you rock!). Just make sure you stop your Webmachine node before continuing by typing <code>q().</code> into your Erlang console.</p>
<p>The <code>rebar.config</code> file is what drives rebar's dependency mechanism. We need to open this file and add the entries we need to include in our application. Webmachine's <code>start.sh</code> script by default includes all of the dependencies on start up, so after modifying the configuration, we don't have to do anything else (other than use the library of course).</p>
<p>Open up <code>rebar.config</code> in your <a href="http://www.vim.org/" title="VIM">favourite editor</a>, it should look something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">%%-*- mode: erlang -*-</span>
<span style="color: #109ab8;">&#123;</span>deps<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span>webmachine<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;1<span style="color: #000099; font-weight: bold;">\.</span>7.*&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>hg<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;http://bitbucket.org/basho/webmachine&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;tip&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Edit the file so that it includes both ErlyDTL and the Riak Client:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">%%-*- mode: erlang -*-</span>
<span style="color: #109ab8;">&#123;</span>deps<span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#91;</span>
    <span style="color: #109ab8;">&#123;</span>webmachine<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;1<span style="color: #000099; font-weight: bold;">\.</span>7.*&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>hg<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;http://bitbucket.org/basho/webmachine&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;tip&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>riakc<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;.*&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>hg<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;http://hg.basho.com/riak-erlang-client&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;tip&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span>erlydtl<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;0.6.1&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>git<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;http://github.com/OJ/erlydtl.git&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;master&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span>
  <span style="color: #109ab8;">&#93;</span>
<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>You'll notice that the <code>erlydtl</code> reference points at my own fork of the ErlyDTL project. This is because I have made it compile cleanly with rebar so that any dependent projects are also able to be build with rebar. Feel free to use your own fork if you like, but mine is there if you can't be bothered <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </p>
<p>Save the file and build!</p>
<pre>
==&gt; mochiweb (get-deps)
==&gt; webmachine (get-deps)
==&gt; csd (get-deps)
Pulling riakc from {hg,"http://hg.basho.com/riak-erlang-client","tip"}

  <em>... snip ...</em>

Pulling erlydtl from {git,"http://github.com/OJ/erlydtl.git","master"}

  <em>... snip ...</em>

Initialized empty Git repository in /home/oj/blog/csd/deps/erlydtl/.git/
Already on 'master'
==&gt; riakc (get-deps)
Pulling protobuffs from {hg,"http://bitbucket.org/basho/protobuffs",
                            "protobuffs-0.5.0"}

  <em>... snip ...</em>

==&gt; protobuffs (get-deps)
==&gt; erlydtl (get-deps)
==&gt; mochiweb (compile)
==&gt; webmachine (compile)
==&gt; protobuffs (compile)
Compiled src/protobuffs_compile.erl
Compiled src/protobuffs_parser.erl
Compiled src/protobuffs.erl
Compiled src/pokemon_pb.erl
==&gt; riakc (compile)
Compiling src/riakclient.proto
Compiled src/riakc_obj.erl
Compiled src/riakc_pb.erl
Compiled src/riakc_pb_socket.erl
==&gt; erlydtl (compile)
Compiled src/erlydtl/erlydtl.erl
Compiled src/erlydtl/erlydtl_i18n.erl
Compiled src/erlydtl/erlydtl_runtime.erl
Compiled src/erlydtl/erlydtl_scanner.erl
Compiled src/erlydtl/i18n/po_scanner.erl
Compiled src/erlydtl/i18n/i18n_manager.erl
Compiled src/erlydtl/erlydtl_compiler.erl
Compiled src/erlydtl/i18n/sources_parser.erl
Compiled src/erlydtl/i18n/po_generator.erl
Compiled src/erlydtl/erlydtl_deps.erl
Compiled src/erlydtl/erlydtl_dateformat.erl
Compiled src/erlydtl/erlydtl_filters.erl
Compiled src/tests/erlydtl_dateformat_tests.erl
Compiled src/tests/i18n/sources_parser_unittests.erl
Compiled src/tests/erlydtl_functional_tests.erl
Compiled src/tests/gettext.erl
Compiled src/tests/erlydtl_example_variable_storage.erl
Compiled src/tests/erlydtl_unittests.erl
Compiled src/erlydtl/erlydtl_parser.erl
==&gt; csd (compile)
<strong>oj@nix ~/blog/csd $</strong>
</pre>
<p>Dependencies sorted. For the final part of this blog post, we'll include a basic ErlyDTL template and use it to render the page so we can see how it works.</p>
<h3>Rendering an ErlyDTL Template</h3>
<p>Rebar has built-in support for the compilation of ErlyDTL templates. It can be configured to behave how you want it to, but out of the box it...</p>
<ul>
<li>... looks for <code>*.dtl</code> files in the <code>./templates</code> folder</li>
<li>... compiles each of the found templates into a module called <code>filename_dtl</code> (eg. <code>base.dtl</code> becomes the module base_dtl)</li>
<li>... puts the module beam files into the <code>ebin</code> directory</li>
</ul>
<p>Very handy. Let's create a very simple template by creating a <code>templates</code> folder, and editing a new file in that folder called <code>sample.dtl</code></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>Hello from inside ErlyDTL. You passed in {{ param }}.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>Then open up <code>src/csd_resource.erl</code> and search for the <code>to_html()</code> function. It should look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">to_html</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">ReqData</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span><span style="color: #ff7800;">&quot;&lt;html&gt;&lt;body&gt;Hello, new world&lt;/body&gt;&lt;/html&gt;&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ReqData</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>Modify it to look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">to_html</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">ReqData</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Content</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> sample_dtl:<span style="color: #ff3c00;">render</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span>param<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;Slartibartfast&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Content</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ReqData</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>For now, don't worry about the content of this file. I will cover this off in a future post.</p>
<p>We need to include our template module in our application definition so that rebar doesn't complain at us. So open <code>ebin/csd.app</code> and add the <code>sample_dtl</code> module to the module list:</p>

<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">%%-*- mode: erlang -*-</span>
<span style="color: #109ab8;">&#123;</span>application<span style="color: #6bb810;">,</span> csd<span style="color: #6bb810;">,</span>
 <span style="color: #109ab8;">&#91;</span>
  <span style="color: #109ab8;">&#123;</span>description<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;csd&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#123;</span>vsn<span style="color: #6bb810;">,</span> <span style="color: #ff7800;">&quot;1&quot;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#123;</span>modules<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>
             csd<span style="color: #6bb810;">,</span>
             csd_app<span style="color: #6bb810;">,</span>
             csd_sup<span style="color: #6bb810;">,</span>
             csd_resource<span style="color: #6bb810;">,</span>
&nbsp;
             <span style="color: #666666; font-style: italic;">% ErlyDTL templates</span>
             sample_dtl
            <span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#123;</span>registered<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#123;</span>applications<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>
                  kernel<span style="color: #6bb810;">,</span>
                  stdlib<span style="color: #6bb810;">,</span>
                  crypto<span style="color: #6bb810;">,</span>
                  mochiweb<span style="color: #6bb810;">,</span>
                  webmachine
                 <span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#123;</span>mod<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span> csd_app<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
  <span style="color: #109ab8;">&#123;</span>env<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span>
 <span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span></pre></div></div>

<p>We are done! Let's make, run and view:</p>
<pre><strong>oj@nix ~/blog/csd $</strong> make
==&gt; mochiweb (get-deps)
==&gt; webmachine (get-deps)
==&gt; protobuffs (get-deps)
==&gt; riakc (get-deps)
==&gt; erlydtl (get-deps)
==&gt; csd (get-deps)
==&gt; mochiweb (compile)
==&gt; webmachine (compile)
==&gt; protobuffs (compile)
==&gt; riakc (compile)
==&gt; erlydtl (compile)
==&gt; csd (compile)
Compiled src/csd_resource.erl
Compiled templates/sample.dtl
<strong>oj@nix ~/blog/csd $</strong> ./start.sh
Erlang R14A (erts-5.8) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

  <em>... snip ...</em>

** Found 0 name clashes in code paths 

  <em>... snip ...</em>

=PROGRESS REPORT==== 1-Sep-2010::22:37:59 ===
         application: csd
          started_at: nonode@nohost
</pre>
<p>Notice how ErlyDTL outputs some information to indicate that no template names have clashed with any other modules.</p>
<p>The application is now running, let's see what it looks like:</p>
<p><img src="http://buffered.io/wp-content/uploads/2010/09/wm_erlydtl.png"/></p>
<h3>The End</h3>
<p>We now have a working environment in which to do our development. In the next post, I'll cover some of the basics required to get Webmachine talking to Riak via <a href="http://en.wikipedia.org/wiki/Protocol_Buffers" title="Protocol Buffers">Protocol Buffers</a>.</p>
<p>Feedback and criticism welcome!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=Td2NoEkgnCY:QqnPgOYIUMI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=Td2NoEkgnCY:QqnPgOYIUMI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=Td2NoEkgnCY:QqnPgOYIUMI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=Td2NoEkgnCY:QqnPgOYIUMI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=Td2NoEkgnCY:QqnPgOYIUMI:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/Td2NoEkgnCY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/09/01/webmachine-erlydtl-and-riak-part-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/09/01/webmachine-erlydtl-and-riak-part-1/</feedburner:origLink></item>
		<item>
		<title>BFPG June Meetup</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/nGafjnFWzqo/</link>
		<comments>http://buffered.io/2010/06/25/bfpg-june-meetup/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 10:05:40 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[bfpg]]></category>
		<category><![CDATA[meetup]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=835</guid>
		<description><![CDATA[The time has come for another meeting of the Functional Programming minds! This months BFPG Meetup, starting 6pm Monday 28th, is the first one at our new venue: Microsoft HQ, Waterfront Place, Brisbane. For details on the location, take a look at the BFPG about page. This month we have three speakers, and I am [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://buffered.io/wp-content/uploads/2010/06/Home.png" alt="Erlang Logo" style="float:right; margin-left:5px; margin-bottom: 5px;"/>The time has come for another meeting of the Functional Programming minds! This months <a href="http://www.meetup.com/Brisbane-Functional-Programming-Group-BFG/calendar/12636552/" title="June BFPG Meetup">BFPG Meetup</a>, starting 6pm Monday 28th, is the first one at our new venue: Microsoft HQ, Waterfront Place, Brisbane. For details on the location, take a look at the <a href="http://bfpg.org/about/" title="About BFPG">BFPG about page</a>.</p>
<p><img src="http://buffered.io/wp-content/uploads/2010/06/ruby.png" alt="Erlang Logo" style="float:left; margin-right:5px; margin-bottom: 5px;"/>This month we have three speakers, and I am one of them! In my talk, "Erlang - Why should you care?", I will be giving a fairly non-technical introduction to <a href="http://erlang.org/" title="Erlang">Erlang</a>. I'll be covering off the features of the language, some of its design goals and its history. I aiming to show that this language is not one that was spawned out of academia and that it has been applied in the real-world ever since its conception. If I have time, I'll also be giving a small demonstration of one of the neatest features of the technology.</p>
<p><img src="http://buffered.io/wp-content/uploads/2010/06/haskell-logo-variation.png" alt="Erlang Logo" style="float:right; margin-left:5px; margin-bottom: 5px;"/><br />
I'll be posting the slides and demonstration code here on this blog as well as <a href="http://bfpg.org/" title="BFPG">BFPG's home</a> after the meetup has taken place.</p>
<p>Myself and my comrades, <a href="http://adams.id.au/blog/" title="Nosewheelie">Tom</a> and <a href="http://blog.tmorris.net/" title="Tony's blog">Tony</a>, will aim to provide a fun and interesting evening at our new venue. Based on the RSVPs so far, it looks like we are going to have one of the biggest turn-outs to date. This is probably due to the exposure we got during last month's <a href="http://buffered.io/2010/05/22/dave-thomas-at-yow-nights-brisbane/" title="Dave Thomas at YOW! Nights Brisbane">talk by Dave Thomas</a>. There are still plenty of spots left, so if you're keen to come along, <a href="http://www.meetup.com/Brisbane-Functional-Programming-Group-BFG/calendar/12636552/" title="Sign up for BFPG June 10">go and sign up</a>. Bring your friends, your friend's friends and your mum.</p>
<p>I hope to see you there!</p>
<hr/>
<p><strong>Update (6th July 2010):</strong> We had a fantastic turn-out of just short of 50 people (a record breaker for the group so far!). My talk seemed to be fairly well-received. No rotten tomatoes were thrown and the crowd seemed engaged through most of the talk. It felt good! I think many people wanted to see more code, but since that wasn't the focus of the talk they were a little disappointed. If people are keen for more Erlang goodness at future meetups, then I'll be happy to dive a little deeper.</p>
<p>As promised, here are the slides:</p>
<ol>
<li><a href="https://docs.google.com/leaf?id=0B4v3XvOkiwsCZjNhZTk3OTYtZTgxNy00MjBmLWJiZmYtMzZjMzU3N2E3MDgz&#038;hl=en&#038;authkey=CIaRg_sF">PPTX</a></li>
<li><a href="https://docs.google.com/a/buffered.io/fileview?id=0B4v3XvOkiwsCMjlhMWRjNGItYmZkOC00ODRlLTkzYTUtOTI3ZWZhY2MxOGYx&#038;hl=en&#038;authkey=CM7rtpEO">PDF (Google Docs)</a></li>
<li><a href="https://docs.google.com/a/buffered.io/present/edit?id=0AYv3XvOkiwsCZGdmamd0eGNfN2dnaDh3emhw&#038;hl=en&#038;authkey=CJKBg-MB">PPT (Google Docs)</a></li>
</ol>
<p>If you have issues reading the slide deck, or would like it in another format, then please <a href="http://buffered.io/contact-me">drop me a line</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=nGafjnFWzqo:YLkNwvh9Ejk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=nGafjnFWzqo:YLkNwvh9Ejk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=nGafjnFWzqo:YLkNwvh9Ejk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=nGafjnFWzqo:YLkNwvh9Ejk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=nGafjnFWzqo:YLkNwvh9Ejk:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/nGafjnFWzqo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/06/25/bfpg-june-meetup/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/06/25/bfpg-june-meetup/</feedburner:origLink></item>
		<item>
		<title>Dave Thomas at YOW! Nights Brisbane</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/yhFOkvroOrQ/</link>
		<comments>http://buffered.io/2010/05/22/dave-thomas-at-yow-nights-brisbane/#comments</comments>
		<pubDate>Sat, 22 May 2010 13:30:20 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Being in the Industry]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=830</guid>
		<description><![CDATA[Two nights ago I was fortunate enough to attend a YOW! Nights conference held at the local Microsoft Office here in Brisbane. The speaker for the session was none other than Dave Thomas, the man behind the likes of ObjectMentor. Not only is this guy incredibly switched on, he is thought-provoking and very entertaining to [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://buffered.io/wp-content/uploads/2010/05/haskell-logo-variation.png" alt="Haskell Logo" title="Haskell Logo" width="128" height="128" style="float:right;margin-left:5px;margin-bottom:5px" />Two nights ago I was fortunate enough to attend a <a href="http://yownightbrisbanemay.eventbrite.com/" title="YOW! Nights Brisbane - May 20th">YOW! Nights</a> conference held at the local Microsoft Office here in Brisbane. The speaker for the session was none other than <a href="http://www.davethomas.net/" title="Dave Thomas">Dave Thomas</a>, the man behind the likes of <a href="http://objectmentor.com/" title="Object Mentor">ObjectMentor</a>. Not only is this guy incredibly switched on, he is thought-provoking and very entertaining to boot. I've been to a few of these sessions in the past but I've never seen one as packed out as this one. It was great to see such a turn-out, which no doubt was boosted by the presence of both the <a href="http://www.qmsdnug.org/" title="QMSDNUG">Queensland MSDN Users Group</a> and the <a href="http://bfpg.org/" title="BFPG">Brisbane Functional Programming Group</a>. </p>
<p>The talk was covering <a href="http://en.wikipedia.org/wiki/Functional_programming" title="Functional Programming">Functional Programming</a> and the <a href="http://en.wikipedia.org/wiki/NoSQL" title="NoSQL">NoSQL</a> movement (which, as Dave himself puts it, should be called <em>NoRDB</em>). These are two areas of computing that are currently key interests of mine, so it won't come as a surprise to find that I thoroughly enjoyed the talk. I certainly wasn't the only one. Dave did such a great job of covering the positives of these two movements that we're already seeing more and more people signing up for membership to <a href="http://bfpg.org/" title="BFPG">BFPG</a>.</p>
<p>I'm not going to go into the gory details about what Dave covered in his talk as I don't want to spoil it for other people if he plans on doing it again elsewhere. There are a few things I would like to mention though:</p>
<ul>
<li>Functional Programming is here to stay. If you're not familiar with it, or haven't yet taken a look at it, I suggest you get started!</li>
<li>If you're looking to get involved with FP and you're in or around the Brisbane area, be sure to come to one of our <a href="http://bfpg.org/" title="BFPG">BFPG</a> meetups.</li>
<li>Don't fall into the trap of assuming that if your system needs a back-end data store that an <a href="http://en.wikipedia.org/wiki/Relational_database_management_system" title="Relational Database Management System">RDBMS</a> is the only option, because it's not!</li>
</ul>
<p>This talk has inspired me to not only continue checking out the likes of <a href="http://haskell.org/" title="Haskell">Haskell</a>, <a href="http://erlang.org/" title="Erlang">Erlang</a> and <a href="http://riak.basho.com/" title="Riak">Riak</a>, it's pointed me at some languages that I never knew existed. Languages which are insanely powerful, very dense, yet still extremely useful. Some examples are <a href="http://en.wikipedia.org/wiki/J_(programming_language)" title="J">J</a>, <a href="http://en.wikipedia.org/wiki/K_(programming_language)" title="K">K</a> and <a href="http://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems)" title="Q">Q</a>. <a href="http://www.kx.com/products/database.php" title="KDB+">KDB+</a> in particular is very interesting as it ties in with the use of another type of technology that I was aware of but knew nothing about: <a href="http://en.wikipedia.org/wiki/Column-oriented_DBMS" title="Column Database">Column Databases</a>. Crazy stuff.</p>
<p>After seeing so many people excited by the prospect of Functional Programming after Dave's talk had concluded, I decided to set up a new website for <a href="http://bfpg.org/" title="BFPG">BFPG</a> so that we had a proper home rather than just a spot on <a href="www.meetup.com/Brisbane-Functional-Programming-Group-BFG/" title="BFPG @ Meetup.com">Meetup.com</a>. Check it out and feel free to send through some feedback if you have any, or <a href="http://bfpg.org/contact/" title="Contact BFPG">drop us a line</a> if you have any ideas for talks or would like to present something yourself.</p>
<p>That's it for today's brain-fart <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=yhFOkvroOrQ:pDs7Worexkg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=yhFOkvroOrQ:pDs7Worexkg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=yhFOkvroOrQ:pDs7Worexkg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=yhFOkvroOrQ:pDs7Worexkg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=yhFOkvroOrQ:pDs7Worexkg:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/yhFOkvroOrQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/05/22/dave-thomas-at-yow-nights-brisbane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/05/22/dave-thomas-at-yow-nights-brisbane/</feedburner:origLink></item>
		<item>
		<title>The Issue of Perception</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/k6J9sA5EBlY/</link>
		<comments>http://buffered.io/2010/03/14/the-issue-of-perception/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 12:12:44 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Being in the Industry]]></category>
		<category><![CDATA[perception]]></category>
		<category><![CDATA[professionalism]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=811</guid>
		<description><![CDATA[What is Perception? As cheesy as it sounds, I'm going to start off with a definition ripped straight off Dictionary.com: per·cep·tion –noun the act or faculty of apprehending by means of the senses or of the mind; cognition; understanding. immediate or intuitive recognition or appreciation, as of moral, psychological, or aesthetic qualities; insight; intuition; discernment: [...]]]></description>
			<content:encoded><![CDATA[<h2>What is Perception?</h2>
<p>As cheesy as it sounds, I'm going to start off with a definition ripped straight off <a href="http://dictionary.reference.com/browse/perception" title="Perception | Define Perception at Dictionary.com">Dictionary.com</a>:</p>
<blockquote cite="Dictionary.com"><h3>per·cep·tion</h3>
<p><em><strong>–noun</strong></em>
<ol>
<li>the act or faculty of apprehending by means of the senses or of the mind; cognition; understanding.</li>
<li>immediate or intuitive recognition or appreciation, as of moral, psychological, or aesthetic qualities; insight; intuition; discernment: <em>an artist of rare perception</em>.</li>
<li>the result or product of perceiving, as distinguished from the act of perceiving; percept.</li>
<li><em>Psychology</em>. a single unified awareness derived from sensory processes while a stimulus is present.</li>
<li>Law. the taking into possession of rents, crops, profits, etc.</li>
</ol>
</blockquote>
<p><a href="http://buffered.io/wp-content/uploads/2010/03/escher.jpg" title="A classic Escher" rel="lightbox[811]"><img src="http://buffered.io/wp-content/uploads/2010/03/escher.jpg" alt="A classic Escher" title="A classic Escher" width="250" style="float: right; margin-left: 5px; margin-bottom: 5px;" /></a>Take a moment to digest the meaning of the word. Can you see how subjective it is? One's perception varies greatly depending on the observer. The motivation of the observation is also going to skew how one is perceived. The relationship one has with the observer is also going to impact how that observer perceives you.</p>
<p>Finally, it's important to note that what was <em>perceived</em> and any point in time is not necessarily the same as what <strong>actually occurred</strong>. </p>
<h2>Motivation for Writing</h2>
<p>So why am I talking about this? Earlier this week, the team I am currently working with had its fortnightly iteration <a href="http://agilesoftwaredevelopment.com/blog/peterstev/start-trust-start-retrospective" title="Start with Trust, Start with a Retrospective">retrospective</a>. Quite a few issues were raised. A few <a href="http://www.answers.com/topic/home-truths" title="Home Truths">home truths</a> were revealed. A few of the team members implied that there was a perception issue, in that what appeared to have happened in some cases is not actually what happened.</p>
<p>This whole issue of perception has come up on almost every job I have worked on. This time round it has motivated me to write about it as I feel that for some reason people don't really understand the core of the issue. Not only that, they fail to see that there is actually a great deal of value in learning how to manage it and use it as valuable feedback to improve yourself as a professional.</p>
<h2>How are you Perceived?</h2>
<p>The answer to this question will vary greatly depending on the situation, your relationship with those who are observing you and what lengths you go to in order to portray the right image.</p>
<p>People will look at you differently if you're a <a href="http://buffered.io/2010/03/02/im-so-impressed-i-want-to-pay-you-less/" title="I'm so impressed I want to pay you less">contractor compared to a permanent employee</a>. Their expectations will be higher, and hence when you're being obvserved people will be a little more critical. The expectation is that you're there as a domain expert that is adding value directly proportional to the cost of the service that you provide. As a permanent, the expectation is that you'll do the job to a "sufficient" level, work "enough" hours and "care" enough to get things done... eventually.</p>
<p>There are many shades of grey within these two categories as well as between them. I won't be covering all of them, but I believe there are a few points which apply to all of them when it comes to have they are observed from the perspective of the man who is paying the bills (for example, the Project Manager).</p>
<p>How much time do you spend...</p>
<ul>
<li>... reading and writing emails?</li>
<li>... on the phone?</li>
<li>... reading and writing blogs?</li>
<li>... talking about non-work related stuff?</li>
<li>... messing around with personal gadgets or laptops at work?</li>
<li>... going out for coffee?</li>
<li>... using some sort of instant messaging client and/or social network tools?</li>
<li>... actually at work, at your desk? (ie. do you get in late or leave early)?</li>
</ul>
<p>Don't get me wrong here, everyone does a few of these things when at work, regardless of there position. The question is where to draw the line, to make sure you don't go too far.</p>
<p>Now compare these to how much time you spend...</p>
<ul>
<li>... starting and/or participating in design discussions.</li>
<li>... at your desk actually doing the work you're there to do.</li>
<li>... helping others do the work they do.</li>
<li>... helper others improve the level of quality of their work.</li>
<li>... attempting to add value in areas you're not directly involved with.</li>
<li>... going above and beyond to highlight and rectify problem areas.</li>
</ul>
<p>These are all time-based issues. There are others which relate to attitude as well. How about..?</p>
<ul>
<li>When participating in team discussions, stand-ups or retrospectives, how much do you get involved?</li>
<li>What does your body language say about how you feel or what you're thinking about at any given time?</li>
<li>Do you get involved in discussions that have nothing to do with you?</li>
<li>When dealing with people who you consider to be bad at their job, or people who you either don't like or respect, does your tone of voice give away you feelings?</li>
<li>Do you find yourself getting personal for any reason when discussing issues with other members of your team?</li>
<li>Do you attempt to discuss things that you don't understand while attempting to make it sound like you're an <a href="http://buffered.io/2009/12/11/its-ok-to-fail/" title="It's OK to Fail">expert in the matter</a>?</li>
<li>Do you attempt to abuse your position of power (if you have one) even if it's to the detriment of the project you're working on?</li>
<li>Do you wear appropriate clothing to work?</li>
</ul>
<p>There are so many more, but I won't list them all as it'd make this post even <em>more</em> boring <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';)' class='wp-smiley' /> </p>
<p>Don't underestimate how each of these things can make you look bad if you don't manage your percetpion properly. A few small things can have just as big an impact on how you are perceived as one big thing. This can be bad enough even when the observer is a friend, but it's substantially worse if the person isn't!</p>
<h2>Skewed Perceptions</h2>
<p><a href="http://buffered.io/wp-content/uploads/2010/03/beer-goggles.jpg" title="How perception can vary!  -- Image Courtesy of sofakingdrunk.com" rel="lightbox[811]"><img src="http://buffered.io/wp-content/uploads/2010/03/beer-goggles.jpg" alt="How perception can vary!  -- Image Courtesy of sofakingdrunk.com" title="How perception can vary!  -- Image Courtesy of sofakingdrunk.com" width="220" style="float:left; margin-bottom: 5px; margin-right: 5px;" /></a>This is where it gets nasty. Skewed perceptions can have a drastic effect on the employer's view. Most of the time, the employer's view is made up of those from a selection of people including some which will work alongside you in the trenches every day. If one or more of those people have a reason to dislike you then you have to make extra effort to manage how you are viewed. The smallest things can be blown out of proportion in this situation.</p>
<p>People who have a reason to dislike you will make every little thing you do look worse than it actually is. A slightly delayed email response will "put them back a few hours". A broken build will cause "huge issues with the work they're doing". A controversial email thread will be considered "extremely offensive" and having a laugh with some co-workers will be seen as "highly distracting and obnoxious".</p>
<p>Bear this in mind while going about your daily work.</p>
<h2>Managing Perception</h2>
<p>Ultimately, the best way to manage perception is the most simplest way: <strong>do your job, and do it well!</strong> That's really what it boils down to. If you do your job while you're at work then by definition you're not wasting time. You're not on the phone, you're not reading blogs, and you're not wasting time at all because you're doing what you're paid to do. The only grey area here is email. There are always going to be a plethora of work-related emails, and it's important to manage those and respond to them in a timely manner. Just make sure you don't spend your day in front of <em>*insert email client of choice*</em>.</p>
<p>But let's say that for some reason you aren't doing your job for the full eight hours per day. This isn't an unrealistic scenario, because everyone has something else going on in their lives which can have an effect on them during working hours. What do you do then? How do you make sure that you're not unfairly perceived? Again, it's very simple. Here are some examples.</p>
<ul>
<li><strong>Phone calls</strong>: Don't take personal calls during the day. If you have a wife/partner that you want to speak to then call them during lunch. Make sure that <em>they only call you</em> during lunch or when it's an absolute emergency. If you have some other high-priority thing going on (eg. you're buying a house and you have to make sure the solicitors are doing their job) then make sure that you inform your manager/workmates. Tell them that you're expecting to deal with this issue during the day and that you'll be making an effort to keep it to a minimum. This means that if you're on the phone, people won't be asking questions as to why. Also, when taking calls, do yourself a favour and move away from your desk. Your colleagues don't want to hear the conversation (especially if it involves sentences like "<em>I love you baby. Kissy-wissy! Love you!</em>"). Give your colleages the space they deserve and go outside or to a private room. But make sure you keep it <strong>short</strong>.</li>
<li><strong>Coffee</strong>: I can be bad for this one sometimes. In short, get your coffee before you go to work. Don't take trips out after arriving. This can apply to other things such as late breakfasts.</li>
<li><strong>Care-factor</strong>: So you're in a meeting and you're either pissed off because of something someone said, or you're just not interested. We've all been there right? Er... have we? Anyway, let's say we have. Sitting there looking very disinterested isn't going to do you any favours. Don't constantly look at your watch. Don't glare at people like a sourpuss. Don't check your phone every 60 seconds to see if something more interested has landed in your inbox or Twitter stream. Pay attention! Sit up. Contribute something. At least do your colleagues the justice of listening to them and see if you can add value somewhere.</li>
<li><strong>Passive-aggressive behaviour</strong>: This comes in so many forms. Via emails, via jokes, via general conversation. It's a bad thing to do. It can be as subtle as a comment like "You're the Lead now, it's your problem". Avoid the jibes. Deal with the situation in a professional manner instead of behaving like a petulant child.</li>
<li><strong>Personality clashes</strong>: Someone at work has an issue with you, or you have an issue with them. Rather than let things turn bad, nip it in the bud. Take the person to one side and have a constructive discussion with them. Find out what it is that pisses them off, and try to deal with it. Attempting to work alongside someone when the air not clear not only causes issues for the two of you but can also be very distracting for the rest of the team.</li>
<li><strong>Caring too much</strong>: The work means more to you than the other people you're working with. You care about quality, standards, managing costs and expectations and you make an effort to stay in touch with the world you work in. The fact that your colleagues aren't like you infuriates you. This becomes evident in everything you do purely because of the anger and/or dismissiveness that you display whenever you interact with them. This fits into the professionalism category. Deal with it like a professional. I'm not asking you to <em>like</em> them any more, nor to lower your standards in any way. I'm asking you to learn to work around them. There will always be people that you work with that will make you feel like this (especially if you work in the government or in enterprise software). Learn to manage it and deal with your anger.</li>
<li><strong>Proactivity</strong>: This is something that isn't only going to improve your perception but will ultimately make you a better professional. Demonstrate some forethought for the area you work in. Read up on things in your own time and share them with your colleagues when you get to work. Constantly review your work methods and see how <strong>you</strong> can improve. If you find a way of improving yourself, you can again share that with people, but make sure you emphasise that <strong>you</strong> got a lot of value of it first. Make an effort to preempt some issues and deal with them up front rather than putting them off. Try to look past today's work and see what's coming down the track. Don't just look at the current line of code, be aware of the bigger picture. Don't be constrained to your field. If you're a tester you can improve the life of a developer (and vice versa).</li>
<li><strong>Do your hours</strong>: While a bigger issue for contractors, this definitely applies to permies as well. It's simple: do your hours! You get paid to do around eight hours of work per day. Less if you're a government employee. Eight hours is not that difficult. Whether you like it or not, your hours will in some way be monitored, and the perception of you will change if you don't do what is expected. Getting to work earlier than other doesn't mean you have the right to do less hours. If you rock up earlier, yes you can leave earlier, but if you're taking a lot of time out for personal stuff or lunches, then you should make the effort to stay back longer and make up for the time you have lost.</li>
<li><strong>Punctuality</strong>: Get to work on time, especially if you're a contractor. Rocking up after 9am most days doesn't look good, especially if you leave before 5pm and take a full hour for lunch. Get to meetings on time. There's no excuse for tardiness and it makes you look very unprofessional while wasting other people's time.</li>
<li><strong>Deal with criticism/feedback</strong>: When people have the nerve to come to you and talk openly about issues, be open to them and don't get angry. Don't try and justify your position by pointing out the flaws in other people. Don't attempt to make it sound like you're no different to anybody else. Listen to what people are saying. Use that information to better yourself as a person and as a professional. The best thing to do is separate yourself from the rest by learning from what you hear.</li>
</ul>
<h2>Trying Too Hard</h2>
<p>When the issue of perception raises its ugly head, most people attempt to solve the problem instantly. This cannot be done. Changing people's perception of you is something that takes a long time. It's not something that will happen within a day, a week, or even a month. Expect it to take quite a while.</p>
<p>Here are some sure signs that you're trying too hard:</p>
<ul>
<li>You email everyone every time you do something related to your job. You're attempting to demonstrate that you're doing your work, but all you achieve by doing this is annoying everyone. You don't need to email everyone all the time. Only when it's relevant should you make the effort. Don't add noise, just try to add signal.</li>
<li>You get involved in discussions that are outside of your area of expertise. I don't think I need to elaborate here. (this post is a classic example <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';)' class='wp-smiley' /> ).</li>
<li>You make a point of highlighting other people's faults.</li>
<li>You take the time to add value to anything and everything you can, splattering your workplace with "look how good I am" propoganda.</li>
<li>Including lots of people in email threads when they don't need to be.</li>
</ul>
<p>Instead of putting effort into directly changing how people perceive you, the best thing to do is change the way you work. Focus on doing your job better.</p>
<p>By the way, please let me know if you know of any more signs!</p>
<h2>Conclusion</h2>
<p>Perception tends to be directly related to your quality of work, though it can sometimes be skewed by interpersonal issues. Managing how you're perceived is actually very simple. If you care about your job and you want to do well you'll find that the whole perception issue fades into the background.</p>
<p>If you're floating along in a job you don't like or with people you don't like, and you're not really giving it 100%, then chances are you going to face this problem sooner rather than later.</p>
<p>Step up. Improve yourself for your own benefit, and you'll find that the rest of the perception issues will go away.</p>
<p>Thoughts, feedback, abuse and cheap-shots are, as always, very welcome <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=k6J9sA5EBlY:YH2K40SGG4I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=k6J9sA5EBlY:YH2K40SGG4I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=k6J9sA5EBlY:YH2K40SGG4I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=k6J9sA5EBlY:YH2K40SGG4I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=k6J9sA5EBlY:YH2K40SGG4I:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/k6J9sA5EBlY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/03/14/the-issue-of-perception/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/03/14/the-issue-of-perception/</feedburner:origLink></item>
		<item>
		<title>I’m so impressed I want to pay you less</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/K8eZiPxaR3s/</link>
		<comments>http://buffered.io/2010/03/02/im-so-impressed-i-want-to-pay-you-less/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 02:27:46 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Being in the Industry]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=805</guid>
		<description><![CDATA[The title of this post is a statement that I've heard a few times in the past while at work. The people who said it might not have used those exact words, but the intent is the same. Usually I hear it in the following form: "We're very happy with the work you've done for [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://buffered.io/wp-content/uploads/2010/03/statue-of-liberty_whip_ny-times.jpg" title="Slave driver" rel="lightbox[slave]"><img src="http://buffered.io/wp-content/uploads/2010/03/statue-of-liberty_whip_ny-times.jpg" alt="Slave driver" title="Slave driver" width="150" style="float: left; margin-bottom: 5px; margin-right: 5px;"/></a>The title of this post is a statement that I've heard a few times in the past while at work. The people who said it might not have used those exact words, but the intent is the same. Usually I hear it in the following form:</p>
<p><em>"We're very happy with the work you've done for us as a contractor. We want to keep you on, but would like you to take a job as a permanent employee and continue to work on the project."</em></p>
<p>Once they've made this point, they then feel the need to harp on about the good points of becoming a permanent employee. Things such as job security, sick/annual leave and better hours tend to get mentioned. All of them are complete bullshit of course.</p>
<p>There is <strong>no such thing as job security</strong>. Sick and/or annual isn't enough to make up for the difference in pay. Hours tend to always be worse when you're working for the man, because you're expected to do whatever needs to be done regardless of the hours. This is worse if you're working on mission-critical stuff. </p>
<p>Now I have no aversion to doing my fair share of extra work and mission-critical stuff is way more interesting. I often enjoy it. What I don't enjoy is the expectation for me to give away my free time to my employer for no reward. I don't get extra time off in lieu. I don't get overtime pay. I don't get ownership of the software. I don't get to see the result of the extra effort I put in. I'm just expected to do it. In other situations I'd be happy to do it, but 999 times out of 1000, the situation isn't right.</p>
<p>I've even worked for companies in the past who expect you to give up a lot of your personal time even if there isn't anything critical that needs to be done. I was expected to write small applications and create other assets that the company could use in future projects. At first this seemed like it could be fun. But the cold hard reality was that all of the effort was totally wasted, because none of the things that were created ever got used.</p>
<p>As a contractor, the view from the perspective of the client is different, especially if you're on an hourly rate. Everything boils down to a financial cost. You're more likely to get a fair deal as a contractor than you are as a permy (at least here in the Brisbane market) because you're entitled to make them pay for the time and effort you put in.</p>
<p><a href="http://buffered.io/wp-content/uploads/2010/03/cartoon_farcus.gif" title="Slave of the month" rel="lightbox[slave]"><img src="http://buffered.io/wp-content/uploads/2010/03/cartoon_farcus.gif" alt="Slave of the month" title="Slave of the month" width="150" style="float: right; margin-bottom: 5px; margin-left: 5px;"/></a>I realise that this makes me sound rather mercenary. In all honesty, I'm not mercenary. I love technology. I love building software. I don't go to work just so that I can get paid. In many ways I would work for less pay if the conditions were right. Unfortunately, I am yet to come across a job where those conditions are right. I've certainly given it a shot in the past. I took a substantial pay-cut to work for Electronic Arts back in 2005 so that I could work on something that I really wanted to work on. I thoroughly enjoyed it. As far as the technology and the challenges are concerned, it's the most fun I've ever had at work. Unfortunately, the experience I had there led me to believe that the lifestyle isn't sustainable (at least not for me and my family).</p>
<p>Would I do the same again for another job? Definitely. But the only company I would do it for would be <a href="http://basho.com/" title="Basho">Basho</a> and my <a href="http://erlang.org/" title="Erlang">Erlang-fu</a> is not yet up to scratch so I wouldn't be considered. Outside of Basho I'm not aware of any other company or work that excites me as much. So for now I will probably remain a contractor, and try to move around and add as much value as I can on a variety of projects, keeping up to speed on many different types of technology.</p>
<p>So if you're reading this, give me a few good reasons as to why permanent work is better than contract work. Why should I consider it? Would you consider it? If you're a permy, are you looking to go contracting, and why?</p>
<p>Feedback and comments are appreciated <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=K8eZiPxaR3s:SN8d7TGRCzY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=K8eZiPxaR3s:SN8d7TGRCzY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=K8eZiPxaR3s:SN8d7TGRCzY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=K8eZiPxaR3s:SN8d7TGRCzY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=K8eZiPxaR3s:SN8d7TGRCzY:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/K8eZiPxaR3s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/03/02/im-so-impressed-i-want-to-pay-you-less/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/03/02/im-so-impressed-i-want-to-pay-you-less/</feedburner:origLink></item>
		<item>
		<title>Truncated Pages</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/5MUoSEQDevk/</link>
		<comments>http://buffered.io/2010/02/05/truncated-pages/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 11:42:21 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Fail]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=802</guid>
		<description><![CDATA[Not too long ago I mentioned that I'd setup and installed Nginx on this server. All seemed well to start off with, then on certain occasions I started to notice that some pages were being served truncated while I was at work. I thought that the issue was work-related, as they have a fairly draconian [...]]]></description>
			<content:encoded><![CDATA[<p>Not too long ago I mentioned that I'd <a href="http://buffered.io/2009/09/10/now-running-nginx/" title="Now Running Nginx">setup and installed Nginx</a> on this server. All seemed well to start off with, then on certain occasions I started to notice that some pages were being served truncated while I was at work. I thought that the issue was work-related, as they have a fairly draconian security policy in place and I thought that it had something to do with severing the connection.</p>
<p>This assumption was proved false a few days ago when I received an email about my <a href="http://buffered.io/2009/05/16/setting-up-trac-mercurial-and-ssh-on-windows/">Trac/Mercurial/SSH</a> post not rendering properly in someone else's browser. Dammit!</p>
<p>So this time I actually did a bit of research by delving into the log files (yes, I know.. genius isn't it!) and determined that there was indeed a problem. Thankfully it was fairly simple to resolve. For some reason the <em>fastcgi</em> instances were failing to function periodically when attempting to access a folder on disk. In short, some of the temp folders were owned by the right user, and some of them weren't. After modifying the ownership of the appropriate folders, everything seems to be running nicely.</p>
<p>Yet more proof that <a href="http://buffered.io/2008/12/27/the-admin-is-an-idiot/" title="The Admin is an Idiot">the admin is an idiot</a>.</p>
<p>If after I post this you notice any truncation at all across the site, please let me know! Cheers!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=5MUoSEQDevk:9nUODXhG6Uc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=5MUoSEQDevk:9nUODXhG6Uc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=5MUoSEQDevk:9nUODXhG6Uc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=5MUoSEQDevk:9nUODXhG6Uc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=5MUoSEQDevk:9nUODXhG6Uc:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/5MUoSEQDevk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/02/05/truncated-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/02/05/truncated-pages/</feedburner:origLink></item>
		<item>
		<title>The Wrong Decision by the Wrong Person</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/FOLJNePxPx8/</link>
		<comments>http://buffered.io/2010/01/28/the-wrong-decision-by-the-wrong-person/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 12:35:29 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Being in the Industry]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[WTF]]></category>
		<category><![CDATA[bad decisions]]></category>
		<category><![CDATA[software developer]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=796</guid>
		<description><![CDATA[There is one thing about my industry that I still find truly amazing (and not in a good way). This is despite the fact that it has happened to me so many times that you think I'd be used to it! I'm talking about non-technical people making technical decisions. For some reason, it's a very [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://buffered.io/wp-content/uploads/2010/01/pizza.jpg" title="The wrong tool." rel="lightbox"><img src="http://buffered.io/wp-content/uploads/2010/01/pizza.jpg" alt="The wrong tool." title="The wrong tool." style="float:right; margin-left:5px; margin-bottom:5px;"  width="150"/></a>There is one thing about my industry that I still find truly amazing (and not in a good way). This is despite the fact that it has happened to me so many times that you think I'd be used to it! I'm talking about non-technical people making technical decisions.</p>
<p>For some reason, it's a very common practice for those people who don't have expertise in a certain field to make decisions for people working in that field. The best example I can think of off the top of my head is the answer to the question: <em>"Which technology should we use?"</em></p>
<p>Let me take a step back in time for a moment. </p>
<p>I applied for a job with a certain company (which shall remain nameless) that was looking for a number of C#/.NET developers of a certain level of experience. After confirming an interview date and time, I turned up to find myself facing a panel of 3 interviewers. One of those people held a technical position, though I found out later that the position he held was self-appointed and certainly not an indication of the person's level of technical knowledge or expertise. The other two were in non-technical positions.</p>
<p>During the interview we had the usual discussions and questions around technial knowledge, depth of understanding of certain areas of the .NET framework, views and approaches to dealing with people in teams, agile experience, etc. It all went very well. At the end of the interview I was given my chance to ask a few questions. The main one I wanted to ask was <em>"Why did you decide to use .NET for this project?"</em></p>
<p>For the record, the <em>previous</em> version of the system was written using an older Microsoft technology stack. The decision had been made to go with .NET for this new version. Can you see the correlation?</p>
<p>The answer was quite stunning. The only reason the project was using .NET was because the previous version was a Microsoft-based solution.</p>
<p>The first thing I thought was "surely that can't be it?". As a matter of fact, that wasn't the <em>only</em> reason for it, but it was the <em>main</em> reason. The decision wasn't made by a technical person, it was made by someone in upper management.</p>
<p>Scary huh!?</p>
<p>In my personal opinion, there is one particular technology that I think would have done a much better job of solving this particular problem, and it's not a Microsoft solution. It's not a Sun solution, or any other mainstream option for that matter. In my view, <strong>Erlang</strong> would have been perfect.</p>
<p>I don't think that a company like that would have ever even considered Erlang as a viable option. Mainly for two reasons. The first is that the amount of skilled Erlang developers available on the East Coast of Australia is extremely small. The second is fear of the unknown/non-mainstream tech. That is, companies like to go with what other companies are going with.</p>
<p>The crazy thing about this scenario is that management go to market to hire people who are domain experts, and then proceed to tell them which technologies to use. Surely you would be better off hiring people to know how to solve problem X really well, and then listen to what they have to say about the technology stack that should be put in place? No, not in this industry. Probably not in my lifetime either!</p>
<p>So if you're a non-tech person leading a team of techies, please PLEASE listen to what they have to say. Ask them what they think is the right approach and the right toolset. Don't take control of the technical decisions. Let them do what you hired them to do: Solve the problem, and use the right tool for the job. If they don't know the answer, or the answer is always the same, then you've got the wrong developers.</p>
<p>Thanks for listening <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=FOLJNePxPx8:5fo0FXN9qak:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=FOLJNePxPx8:5fo0FXN9qak:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=FOLJNePxPx8:5fo0FXN9qak:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=FOLJNePxPx8:5fo0FXN9qak:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=FOLJNePxPx8:5fo0FXN9qak:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/FOLJNePxPx8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/01/28/the-wrong-decision-by-the-wrong-person/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/01/28/the-wrong-decision-by-the-wrong-person/</feedburner:origLink></item>
		<item>
		<title>Katacast: Shopping Checkout in Erlang</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/u_WPICmCqhQ/</link>
		<comments>http://buffered.io/2010/01/04/katacast-shopping-checkout-in-erlang/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 07:47:05 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[codekata]]></category>
		<category><![CDATA[katacast]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=785</guid>
		<description><![CDATA[I've recently discovered the joys of CodeKatas. If you're a geek looking for a way to sharpen your saw then I highly recommend taking a look at these and trying a few out. They're great fun and they're a good way of getting your feet wet with new languages (especially if you're tired of Project [...]]]></description>
			<content:encoded><![CDATA[<p>I've recently discovered the joys of <a href="http://codekata.pragprog.com/" title="CodeKata">CodeKatas</a>. If you're a geek looking for a way to <a href="http://en.wikipedia.org/wiki/The_Seven_Habits_of_Highly_Effective_People" title="The Seven Habits of Highly Effective People">sharpen your saw</a> then I highly recommend taking a look at these and trying a few out. They're great fun and they're a good way of getting your feet wet with new languages (especially if you're tired of <a href="http://projecteuler.net/" title="Project Euler">Project Euler</a>). </p>
<p>I can thank <a href="http://twitter.com/gabriellelana" title="Gabrielle on Twitter">Gabrielle Lana</a> for this discovery, as it was his <a href="http://www.vimeo.com/8206748" title="String Calculator in Erlang">attempt at one of the katas</a> that got me into it. He's also the reason I looked into <a href="http://www.katacasts.com/" title="Katacasts">Katacasts</a>, which are simply screencasted recordings of people attempting to solve Code Katas.</p>
<p>This post is about my first Katacast, capturing my attempt at <a href="http://codekata.pragprog.com/2007/01/kata_nine_back_.html" title="Checkout">Code Kata #9</a> using <a href="http://erlang.org/" title="Erlang">Erlang</a> and <a href="http://vim.org/" title="VIM">VIM</a> with <a href="http://rake.rubyforge.org/" title="Ruby Make">Rake</a> as my build system. I've put the video up on <a href="http://vimeo.com/8513414" title="Katacast for Codekata #9 by OJ Reeves">Vimeo</a> for the world to see/share. It's also embedded below for your convenience.</p>
<p>Before watching, I'd like to point out a few things about the video, and things that I have learned from the experience:</p>
<ul>
<li>I captured the video on my Linux Mint install. For some reason, capturing quality video in Linux is proving to be a bit of a pain for me. As a result, the video quality isn't that great. This partly due to the compression of the video, and partly due to the software failing to pick up some screen updates.</li>
<li>I tried really hard to add a backing sound-track but all of my efforts failed in one way or another. If I did manage to get one to work it was either WAY too big (ie. > 1GB in size) or the quality was absolutely terrible.</li>
<li>There were points during the process where I had to alt-tab out to a browser to do a bit of research on something that I didn't know (such as an Erlang syntax quirk). This resulted in a few points where I don't appear to be doing anything. In future, I'll remember to hit pause on the recording when this happens.</li>
<li>I captured it in a non-standard resolution. I'm not sure if that's going to make it look bad or not. Feedback here is appreciated. I think in future I'll capture at a 800x600 resolution.</li>
<li>This video is best viewed in full-screen mode.</li>
</ul>
<p>So please excuse the lack of quality in this first Katacast. I'll be sure to improve when I next create one. That being said, on with the show!</p>
<div style="margin-left: auto; margin-right: auto; width: 400px;"><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8513414&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8513414&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br />
<a href="http://vimeo.com/8513414">Katacast for Codekata #9</a> from <a href="http://vimeo.com/thecolonial">OJ Reeves</a> on <a href="http://vimeo.com">Vimeo</a>.</div>
<p>As always, feedback/criticism/etc is greatly appreciated. I'd love to hear what you guys do and use to capture and edit your screencasts, particularly in Linux.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=u_WPICmCqhQ:xl6YrnkukDA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=u_WPICmCqhQ:xl6YrnkukDA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=u_WPICmCqhQ:xl6YrnkukDA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=u_WPICmCqhQ:xl6YrnkukDA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=u_WPICmCqhQ:xl6YrnkukDA:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/u_WPICmCqhQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2010/01/04/katacast-shopping-checkout-in-erlang/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://buffered.io/2010/01/04/katacast-shopping-checkout-in-erlang/</feedburner:origLink></item>
		<item>
		<title>It’s OK to Fail</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/HdXFa55Xez0/</link>
		<comments>http://buffered.io/2009/12/11/its-ok-to-fail/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 05:42:38 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Being in the Industry]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Fail]]></category>
		<category><![CDATA[ignorance]]></category>
		<category><![CDATA[stagnation]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=775</guid>
		<description><![CDATA[Yes. You read that right. It's OK to fail. Yes, I am talking to you. You... that guy who is part of every team. The one who seems to feel the need to be right about everything. The one who thinks that everything new has already been done 15 years prior. The one who believes [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://buffered.io/wp-content/uploads/2009/12/EpicFail02.jpg" title="Epic Fail" rel="lightbox[775]"><img src="http://buffered.io/wp-content/uploads/2009/12/EpicFail02.jpg" alt="Epic Fail" width="160" style="float:left;padding-bottom:5px;padding-right:5px;" /></a><em>Yes. You read that right. It's OK to fail. Yes, I am talking to you. You... that guy who is part of every team. The one who seems to feel the need to be right about everything. The one who thinks that everything new has already been done 15 years prior. The one who believes that every project they have participated in has been a profound success, and that a project-level failure (which includes missing deadlines or blowing the budget) is something they have never experienced. Failure is not only OK, it's something that you <strong>must</strong> experience somewhere along the way so you know when you've succeeded.</em> </p>
<p><em>It's safe to admit that you just don't know! In fact, it's <strong>better</strong> if you do admit it. Pretending that you know what you don't not only makes you the butt of the jokes, but you end up being detrimental to the success of the project.</em></p>
<p><em>Stop trying to be a know-all. Let go of the idea that you need to be the one to approve everything. Take a step back and be honest to yourself and the rest of the team. You aren't a one-man-band. You aren't the technical guru that you think you are. You aren't even a specialist in a particular area, let alone a jack-of-all-trades.</em></p>
<p><em>When you attempt to do something and you fail, stop trying to make it sound like you haven't failed. Please stop yourself from trying to turn your wrong into a right. <strong>Everyone</strong> fails in one way or another during their working life, and as much as you don't want to admit it, it does include you.</em></p>
<p><em>Change your attitude. You'll be doing yourself a favour.</em></p>
<p><em>And while you're at it, how about you get up to speed with the technology you're working with. Then you won't have to pretend, and the likelihood of you failing will start to decrease.</em></p>
<p><em>Thanks for listening.</em></p>
<hr />
This might seem like an angry rant. I admit it is a little. It's not directed at one particular person. It's aimed at a particuar type, or breed, of person. One that seems to appear in every gig that I work on. This kind of individual can be a bad apple in a barrel of good apples who over time causes long-term rot and frustration amongst the team. Velocity can be seriously affected. Productivity can plummet.</p>
<p>Remember, it's not about you, it's all about the <strong>software</strong>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=HdXFa55Xez0:PlULfHij-1M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=HdXFa55Xez0:PlULfHij-1M:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=HdXFa55Xez0:PlULfHij-1M:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=HdXFa55Xez0:PlULfHij-1M:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=HdXFa55Xez0:PlULfHij-1M:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/HdXFa55Xez0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2009/12/11/its-ok-to-fail/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://buffered.io/2009/12/11/its-ok-to-fail/</feedburner:origLink></item>
		<item>
		<title>The Future is Erlang</title>
		<link>http://feedproxy.google.com/~r/OjsRants/~3/S00W9NN4RUQ/</link>
		<comments>http://buffered.io/2009/10/31/the-future-is-erlang/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 10:28:10 +0000</pubDate>
		<dc:creator>OJ</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Webmachine]]></category>

		<guid isPermaLink="false">http://buffered.io/?p=769</guid>
		<description><![CDATA[For quite a while I've been using my spare cycles to chew over a problem. This problem is not one that hasn't been solved before, but one that I feel can be solved in a much better way. From the bit of research that I've done, I can see at least three areas which can [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://buffered.io/wp-content/uploads/2009/10/erlang.png" alt="erlang" title="erlang" style="float:left;margin-right:5px;margin-bottom:5px;" />For quite a while I've been using my spare cycles to chew over a problem. This problem is not one that hasn't been solved before, but one that I feel can be solved in a much better way. From the bit of research that I've done, I can see at least three areas which can be improved on dramatically. So I've decided, after a long period of deliberation, to go ahead and build my solution and release it to the world as a service!</p>
<p>I know, this kind of thing happens thousands of times a day. Some arbitrary geek decided to build the next killer app and expects to make a crapload of cash out of it. While that would be nice, the ultimate goal isn't the cash. The goal for me is to build something that gets used, and for me to begin to master an area of technology that I've had a quiet passion for for a long period of time now.</p>
<p>My plan is simple. While learning the technologies that I will be using I'll be building another application and blogging about it so that all of you can learn with me. Meanwhile, I shall use my learnings to build this other application at the same time.</p>
<p>The final result should be a series of posts which help other people learn the technology stack, give better coverage and visibility to languages and technologies that a lot of the geek world doesn't know about (and really should!), and for me to carve myself a bit of a niche here on the East coast of Ozland. I am hoping to be able to consult my services out to other businesses as a result.</p>
<p>For those that are interested in following along, here is the full tech stack and toolset that I'll be using:</p>
<ul>
<li><a href="http://erlang.org/" title="Erlang">Erlang</a> - A fantastic cross-platform functional programming language that has some amazing features.</li>
<li><a href="http://bitbucket.org/justin/webmachine/" title="Webmachine HTTP toolkit">Webmachine</a> - A HTTP toolkit which sits on top of <a href="http://code.google.com/p/mochiweb/" title="Mochiweb">Mochiweb</a> that makes it easy to build well-behaved HTTP applications.</li>
<li><a href="http://nitrogenproject.com/" title="Nitrogen Framework">Nitrogen</a> - An Erlang-based framework that makes it easy to build websites.</li>
<li><a href="http://riak.basho.com/" title="Riak">Riak</a> or <a href="http://couchdb.apache.org/" title="CouchDB">CouchDB</a> - Both of these amazing pieces of tech are potential candidates for the back-end storage. I'm not yet sure which one I'll go with.</li>
<li><a href="http://jquery.com/" title="jQuery">jQuery</a> - A great JavaScript library for the front-end.</li>
<li><a href="http://vim.org/" title="VIM text editor">VIM</a> - My favourite text editor <img src='http://buffered.io/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> </li>
<li><a href="http://www.xubuntu.org/" title="Xubuntu">Xubuntu</a> - Ubuntu <a href="http://ubuntu.com/" title="Ubuntu 9.10">Karmic Koala</a> with <a href="http://www.xfce.org/" title="XFCE">XFCE</a> as the window manager.</li>
<li><a href="http://mercurial-scm.org/" title="Mercurial SCM">Mercurial</a> - My favourite version control system.</li>
<li><a href="http://trac.edgewall.org/" title="The Trac Project">Trac</a> - A project tracking tool.</li>
<li><a href="http://www.virtualbox.org/" title="VirtualBox">VirtualBox</a> - My choice for virtualisation. I tend to run Windows 7 as my primary OS, so most of my dev will be in a VM. When I get my desktop machine back up and running (with all three monitors!) it'll most likely multiboot Win 7 and Xubuntu.
<li><a href="http://wave.google.com/" title="Google Wave">Google Wave</a> - I'll be using this for communications with some really switched on people in the Erlang community who have kindly offered to help me with questions and whatnot specific to some of the areas of tech I've mentioned above.</li>
</ul>
<p>During the course of my blogging/learning I'll be focussing on Webmachine, Riak/CouchDB, Erlang and Nitrogen. All the other tools will probably get mentioned along the way, but the primary goal is to focus on these things.</p>
<p>I'm really excited! I'm currently in the process of documenting my goals and the design for the main application. Once that's done, I'll get started with the fun stuff. I've got a lot to do and it should be a fun ride. I hope you enjoy following along!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/OjsRants?a=S00W9NN4RUQ:T8t-vc1g9n4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/OjsRants?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=S00W9NN4RUQ:T8t-vc1g9n4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=S00W9NN4RUQ:T8t-vc1g9n4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/OjsRants?a=S00W9NN4RUQ:T8t-vc1g9n4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/OjsRants?i=S00W9NN4RUQ:T8t-vc1g9n4:V_sGLiPBpWU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/OjsRants/~4/S00W9NN4RUQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://buffered.io/2009/10/31/the-future-is-erlang/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://buffered.io/2009/10/31/the-future-is-erlang/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.920 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-09-06 19:33:34 -->
