<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>John Hamelink</title>
    <link>https://johnhame.link/</link>
    <description>Recent content on John Hamelink</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>John hamelink</copyright>
    <lastBuildDate>Thu, 06 Jul 2023 22:00:00 +0100</lastBuildDate>
    <atom:link href="https://johnhame.link/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tweaking Emacs for Ruby Development in 2023</title>
      <link>https://johnhame.link/posts/tweaking-emacs-for-ruby-development-in-2023/</link>
      <pubDate>Thu, 06 Jul 2023 22:00:00 +0100</pubDate>
      <guid>https://johnhame.link/posts/tweaking-emacs-for-ruby-development-in-2023/</guid>
      <description>&lt;h2 id=&#34;preamble&#34;&gt;Preamble&lt;/h2&gt;&#xA;&lt;p&gt;Since I started a new job in April, I&amp;rsquo;ve been spending the majority of my time with legacy Ruby code for the first time since 2017 (I&amp;rsquo;d been mainly working on Elixir and Typescript codebases between then and now).&lt;/p&gt;&#xA;&lt;p&gt;Before my start-date at the new job, I spent some time setting up a basic Emacs configuration for Ruby. I&amp;rsquo;d made a good start, but with all those &lt;a href=&#34;https://en.wikipedia.org/wiki/There_are_unknown_unknowns#Origins&#34; title=&#34;I&amp;#39;m not a fan of Mr Rumsfeld by any stretch, but it&amp;#39;s a useful phrase when thinking about project management I think.&#34;&gt;unknown unknowns&lt;/a&gt; swimming around, I was only able to make vague assumptions about what I needed. I&amp;rsquo;ve since done a bunch more tweaking to get a configuration that works well with the development environment in this company.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Configuring DNS for Kubernetes Development</title>
      <link>https://johnhame.link/posts/kubernetes-dns-for-devs/</link>
      <pubDate>Thu, 28 Nov 2019 11:14:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/kubernetes-dns-for-devs/</guid>
      <description>&lt;p&gt;In the intervening 3 years between my last blog and this one, I&amp;rsquo;ve been on quite&#xA;the adventure, partly involving setting up multiple Kubernetes clusters.&lt;/p&gt;&#xA;&lt;p&gt;While I&amp;rsquo;m absolutely sold on the ability of Kubernetes to slash server budgets,&#xA;to drastically improve deployment compared with much of the home-grown CI&#xA;systems out there (I am also guilty of this sin), and to provide a coherent&#xA;configuration system that&amp;rsquo;s free of vendor lock-in poison; in my &lt;a href=&#34;https://www.financial-cloud.com/&#34;&gt;new occupation&lt;/a&gt;&#xA;I&amp;rsquo;m focussed on improving the developer onboarding experience. Allow me to&#xA;explain further below. (If you don&amp;rsquo;t care and just want the juicy stuff, feel&#xA;free to skip down to the section entitled, &amp;ldquo;How to configure DNS for Kubernetes&#xA;Development&amp;rdquo;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenSSL and Elixir</title>
      <link>https://johnhame.link/posts/using-openssl-with-elixir/</link>
      <pubDate>Thu, 17 Mar 2016 12:41:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/using-openssl-with-elixir/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re using the latest OpenSSL package from &lt;a href=&#34;http://brew.sh&#34;&gt;Homebrew&lt;/a&gt;, you might come across&#xA;an error similar to this one from time to time:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt;&amp;gt; fast_tls &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;compile&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiled src/fast_tls_app.erl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiled src/p1_sha.erl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiled src/fast_tls_sup.erl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiled src/fast_tls.erl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiling c_src/fast_tls_drv.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c_src/fast_tls_drv.c:21:10: fatal error: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;openssl/err.h&amp;#39;&lt;/span&gt; file not found&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#include &amp;lt;openssl/err.h&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ^&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt; error generated.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ERROR: compile failed &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;while&lt;/span&gt; processing /Users/john/Public/fap/api/api-2.1/deps/fast_tls: &lt;span style=&#34;color:#b8860b&#34;&gt;rebar_abort&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt;&amp;gt; api&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\*&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;(&lt;/span&gt;Mix&lt;span style=&#34;color:#666&#34;&gt;)&lt;/span&gt; Could not compile dependency :fast_tls, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/Users/john/.asdf/installs/elixir/1.2.3/.mix/rebar compile skip_deps=true deps_dir=&amp;#34;&lt;/span&gt;/Users/john/Public/fap/api/api-2.1/_build/dev/lib&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a2f&#34;&gt;command&lt;/span&gt; failed. You can recompile this dependency with &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;mix deps.compile fast_tls&amp;#34;&lt;/span&gt;, update it with &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;mix deps.update fast_tls&amp;#34;&lt;/span&gt; or clean it with &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;mix deps.clean fast_tls&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The reason why this error is happening is because OpenSSL header files required&#xA;to compile this (in this case) rebar module are in homebrew&amp;rsquo;s &lt;code&gt;/usr/local/opt&lt;/code&gt;&#xA;directory. We can simply fix this by setting LDFLAGS and CFLAGS before compiling:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elixir/Erlang and autoscaled EC2 servers - how to make them best buddies</title>
      <link>https://johnhame.link/posts/elixir-and-ec2/</link>
      <pubDate>Thu, 03 Mar 2016 02:22:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/elixir-and-ec2/</guid>
      <description>&lt;p&gt;At &lt;a href=&#34;https://findaplayer.com&#34;&gt;Find a Player&lt;/a&gt;, we&amp;rsquo;ve been trying to figure out how we want to cluster our&#xA;Elixir servers - so that they can share state between each other - recently.&#xA;Because we come from ruby (ie, not a high-availability background), when we want&#xA;to discover other machines in a network we&amp;rsquo;d traditionally use something like&#xA;&lt;a href=&#34;https://consul.io&#34;&gt;Consul&lt;/a&gt; - of which I wrote a ruby library called &lt;a href=&#34;https://github.com/WeAreFarmGeek/diplomat/&#34;&gt;Diplomat&lt;/a&gt; (which admittedly needs&#xA;some love).&lt;/p&gt;&#xA;&lt;p&gt;However, after chatting with &lt;a href=&#34;https://twitter.com/gordonguthrie&#34;&gt;Gordon Guthrie&lt;/a&gt; - a guy who&amp;rsquo;s been working with&#xA;Erlang for over 13 years - over twitter, he told us to checkout&#xA;&lt;code&gt;:net_adm.world/0&lt;/code&gt;. Which does pretty much exactly what we want, straight out of&#xA;the box.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pull-based Deployment at Find a Player</title>
      <link>https://johnhame.link/posts/pull-based-deployment-at-find-a-player/</link>
      <pubDate>Mon, 21 Sep 2015 13:18:00 +0100</pubDate>
      <guid>https://johnhame.link/posts/pull-based-deployment-at-find-a-player/</guid>
      <description>&lt;p&gt;Most startups care a lot about scalability. &lt;a href=&#34;http://findaplayer.com&#34;&gt;Find a player&lt;/a&gt; is no different. A lot&#xA;of people have asked me how I went about designing Find a Player&amp;rsquo;s deployment&#xA;system, so I thought I&amp;rsquo;d document it here at a high level.&lt;/p&gt;&#xA;&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;&#xA;&lt;p&gt;Before we embarked on this project, we were using ansible to handle push-based&#xA;deployments to multiple servers. However, when we looked into using an&#xA;autoscaler in AWS to handle traffic spikes, we realised that a push-based&#xA;deployment no longer makes sense as it requires an external widget to run the&#xA;deploy on a server if it is spawned. It became very clear that it made much more&#xA;sense to have the spawned server itself run the deploy locally on itself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Perfect Livecoding steam for OSX</title>
      <link>https://johnhame.link/posts/my-perfect-livecoding-stream-for-osx/</link>
      <pubDate>Mon, 31 Aug 2015 12:00:00 +0100</pubDate>
      <guid>https://johnhame.link/posts/my-perfect-livecoding-stream-for-osx/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been interested in live streaming for a while now. I’ve been playing with&#xA;Livecoding.tv on and off, and through this experience I’ve had to deal with the&#xA;crappy internet connections and configuration complications I’ve had to figure&#xA;out. I thought I’d document my current configuration so that I might help make&#xA;other potential streamers’ experiences a bit smoother.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m using OBS to stream on osx Yosemite. I’m using a 15&amp;quot; Macbook Pro Mid-2014.&#xA;I&amp;rsquo;m using Bluetooth headphones which complicate my setup somewhat. My machine&#xA;has 16GB of ram, a 2.2Ghz core i7, and an SSD. Your mileage may vary - this is&#xA;what works for me on my connection, with my computer’s spec. If you interent&#xA;connection is more or less symetric than mine, this configuration will probably&#xA;be sub-optimal, but hopefully it will point you in the right direction.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;ve been tying my laces all wrong</title>
      <link>https://johnhame.link/posts/ive-been-tying-my-laces-all-wrong/</link>
      <pubDate>Sun, 24 May 2015 15:30:00 +0100</pubDate>
      <guid>https://johnhame.link/posts/ive-been-tying-my-laces-all-wrong/</guid>
      <description>&lt;p&gt;When I was young, I had trouble doing something that most young children&#xA;struggle with - tying my shoe laces. I am left handed and my parents are both&#xA;right handed which made learning even more difficult for me than for other&#xA;children. Eventually, an older boy who was also left handed taught me and the&#xA;rest was history.&lt;/p&gt;&#xA;&lt;p&gt;Except that&amp;rsquo;s not the end of this story - I always had problems with tying shoes&#xA;ever since. To be clear, it wasn&amp;rsquo;t the tying of the shoes that was a problem as&#xA;I grew into my teens and beyond - it was the fact that my knots always seemed&#xA;slack, which led to me having to re-tie my shoes constantly, and then eventually&#xA;giving up and just tucking them in, leading to backpain and bad posture.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Consuming Nested API Routes with Ember</title>
      <link>https://johnhame.link/posts/consuming-nested-api-routes-with-ember/</link>
      <pubDate>Sat, 28 Feb 2015 21:39:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/consuming-nested-api-routes-with-ember/</guid>
      <description>&lt;p&gt;At the time of writing I&amp;rsquo;m learning Ember-cli for the first time. It&amp;rsquo;s pretty&#xA;tough as there&amp;rsquo;s not too much up-to-date documentation out there, but I&amp;rsquo;m&#xA;slowly getting there, and I&amp;rsquo;m beginning to feel the power it brings.&lt;/p&gt;&#xA;&lt;p&gt;One of the things I&amp;rsquo;ve been finding especially difficult is grokking how&#xA;Ember consumes API data - specifically how it decides upon what the route&#xA;it wants to consume looks like.&lt;/p&gt;&#xA;&lt;p&gt;After hours of fruitless Googling and reading, I relented and hit IRC:&#xA;#emberjs on Freenode to be specific. After speaking to a few helpful fellows&#xA;on there, it became clear that Ember was not easily able to consume nested API&#xA;routes just yet. Damn! That makes scoping your API data quite hard!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Joining ScreenHero with Slack Credit</title>
      <link>https://johnhame.link/posts/joining-screenhero-with-slack-credit/</link>
      <pubDate>Thu, 29 Jan 2015 10:00:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/joining-screenhero-with-slack-credit/</guid>
      <description>&lt;h2 id=&#34;preamble&#34;&gt;Preamble&lt;/h2&gt;&#xA;&lt;p&gt;You may have heard of &lt;a href=&#34;http://slack.com&#34;&gt;Slack&lt;/a&gt; before - a brilliant team chat service that raised&#xA;$180m from the likes of Andressen Horowitz, Google Ventures, Kleiner Perkins and&#xA;Accel. Very cool.&lt;/p&gt;&#xA;&lt;p&gt;Well, on Wednesday Techcrunch posted an article announcing slack&amp;rsquo;s aquisition of&#xA;&lt;a href=&#34;https://screenhero.com&#34;&gt;Screenhero&lt;/a&gt;, a Ycombinator allum who have a really slick tool for remote pairing&#xA;and screensharing.&lt;/p&gt;&#xA;&lt;p&gt;This provides some really interesting prospects for slack users - being able to&#xA;remotely debug or collaborate on issues through Screenhero directly is the first&#xA;thing that comes to mind. Wouldn&amp;rsquo;t it be cool if we could all try it out before&#xA;it becomes fully available on Slack? Unfortunately Slack disabled Screenhero&#xA;registrations for all new users, but made all existing memberships free.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making Unite.vim use the project root directory</title>
      <link>https://johnhame.link/posts/making-unite-use-project-root/</link>
      <pubDate>Fri, 31 Oct 2014 01:18:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/making-unite-use-project-root/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using vim for quite a while now - I think it&amp;rsquo;s about 3 years . Over&#xA;the short 3 year journey, I&amp;rsquo;ve built up &lt;a href=&#34;https://github.com/johnhamelink/dotfiles/blob/master/vim/vimrc&#34;&gt;a pretty massive vimrc file&lt;/a&gt; which I add&#xA;&amp;amp; tweak almost every day. Over the past week I decided to make the switch over&#xA;to &lt;a href=&#34;https://github.com/Shougo/unite.vim&#34;&gt;Unite.vim&lt;/a&gt;, but coming from &lt;a href=&#34;https://github.com/kien/ctrlp.vim&#34;&gt;ctrlp&lt;/a&gt;, I wasn&amp;rsquo;t satisfied with the default&#xA;behaviour.&lt;/p&gt;&#xA;&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;&#xA;&lt;p&gt;There are plenty of ctrlp snippets out there which approximate ctrlp&amp;rsquo;s&#xA;behaviour, but one thing they don&amp;rsquo;t focus on is ctrlp&amp;rsquo;s ability to find your&#xA;project root and search within its context. For me, this functionality was what&#xA;took ctrlp from an amazing vim plugin, to something that made massive&#xA;improvements to the speed of navigation, and ultimately, my productivity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Distributed Web Systems with Consul, Diplomat, Envoy and HAProxy</title>
      <link>https://johnhame.link/posts/distributed-systems-with-consul-diplomat-envoy-and-haproxy/</link>
      <pubDate>Thu, 24 Jul 2014 01:30:00 +0100</pubDate>
      <guid>https://johnhame.link/posts/distributed-systems-with-consul-diplomat-envoy-and-haproxy/</guid>
      <description>&lt;p&gt;As part as my never-ending quest to improve how I build cool things, I&amp;rsquo;ve been&#xA;working for some time on building out infrastructure to help automate and&#xA;monitor how my apps and servers are doing. &lt;a href=&#34;http://www.postdesk.com/scaling-horizontally-better-web-development&#34;&gt;I&amp;rsquo;ve written about horizontal scaling&#xA;before&lt;/a&gt;, but today I&amp;rsquo;d like to get into one specific facet of its implementation:&#xA;automated network discovery, and how we use it at &lt;a href=&#34;http://farmer.io&#34;&gt;FarmGeek&lt;/a&gt; to build reliable&#xA;applications.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&lt;p&gt;So lets say you have a few servers - a node balancer, two application servers&#xA;and a database server, for example. Everything&amp;rsquo;s working fine until &lt;strong&gt;BAM&lt;/strong&gt;, one&#xA;of your application servers crashes. To make things worse, in this scenario for&#xA;an unexplained reason nobody finds out about this. However your HAProxy checks&#xA;work and so the node leaves the connection pool as expected.&lt;/p&gt;</description>
    </item>
    <item>
      <title>11 Things windows users might not know about Linux</title>
      <link>https://johnhame.link/posts/11-things-windows-users-might-not-know-about-linux/</link>
      <pubDate>Sat, 17 Nov 2012 23:43:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/11-things-windows-users-might-not-know-about-linux/</guid>
      <description>&lt;p&gt;As an avid Linux user for over 5 years, it still surprises me how many people&#xA;don&amp;rsquo;t know basic things about Linux which make it so appealing to people like&#xA;me. If you&amp;rsquo;re thinking about using Linux for the first time, or perhaps you&amp;rsquo;ve&#xA;only just heard about it, here are a few things you might now know that might&#xA;interest you:&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-linux-isn-t-an-operating-system&#34;&gt;1: Linux isn&amp;rsquo;t an operating system&lt;/h2&gt;&#xA;&lt;p&gt;Linux is actually the name given the &amp;ldquo;kernel&amp;rdquo; of one type of operating system.&#xA;There are hundreds of thousands of Linux distributions for you to choose from.&#xA;Linux draws its inheritance back from UNIX which was a proprietary operating&#xA;system back in the 70s. We call the entire thing &amp;ldquo;Linux&amp;rdquo; because its easier and&#xA;simpler for people who are new to Linux. Each one of those versions of Linux is&#xA;referred to as a &amp;ldquo;distribution&amp;rdquo; or &amp;ldquo;flavour&amp;rdquo;. Ubuntu is a popular distribution&#xA;of Linux, as is RedHat, Fedora, SuSE and Debian. Some people like to call linux&#xA;GNU/Linux, because the operating system runs a suite of tools called the GNU&#xA;toolkit on top of its self, in order for it to be complete.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing NodeJS with Jenkins</title>
      <link>https://johnhame.link/posts/testing-node-js-with-jenkins/</link>
      <pubDate>Tue, 13 Nov 2012 18:00:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/testing-node-js-with-jenkins/</guid>
      <description>&lt;p&gt;NodeJS is awesome. I&amp;rsquo;ve used it for many pet projects and have worked on&#xA;commercial projects which have made good use of Node in sticky situations. When&#xA;it comes to testing Node, we&amp;rsquo;re spoiled. My favourite testing framework is &lt;a href=&#34;http://visionmedia.github.com/mocha/&#34;&gt;Mocha&lt;/a&gt;&#xA;and my favourite testing library is &lt;a href=&#34;http://github.com/visionmedia/should.js/&#34;&gt;should.js&lt;/a&gt;. We&amp;rsquo;ll be using that alongside&#xA;Jenkins to build an automated test suite for our demo repository.&lt;/p&gt;&#xA;&lt;h2 id=&#34;you-will-need&#34;&gt;You Will Need&lt;/h2&gt;&#xA;&lt;h3 id=&#34;mocha&#34;&gt;Mocha&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://visionmedia.github.com/mocha/&#34;&gt;Mocha&lt;/a&gt; is our testing framework. We use it to describe the tests we want to make.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Green Developer</title>
      <link>https://johnhame.link/posts/the-green-developer/</link>
      <pubDate>Mon, 12 Nov 2012 18:16:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/the-green-developer/</guid>
      <description>&lt;p&gt;A good developer is energy conscious. A good developer understands the impact he&#xA;has on the environment around him. A good developer is able to take all these&#xA;things and use them to make a positive impact in his universe. A good developer&#xA;is a green developer.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-green-developer-what-are-you-smoking&#34;&gt;A green developer? What are you smoking?&lt;/h2&gt;&#xA;&lt;p&gt;A green developer understands how to build in blocks: he must master the art of&#xA;software &lt;!-- raw HTML omitted --&gt;engineering&lt;!-- raw HTML omitted --&gt; versus software developing. What sets the software&#xA;engineer apart from the developer is not speed, agility or knowledge, it is the&#xA;ability to recognise and compartmentalise everything he does into reusable&#xA;chunks. Why? Simply because reusable code means better code and also half the&#xA;code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What makes for a Good Development Lead?</title>
      <link>https://johnhame.link/posts/what-makes-for-a-good-development-lead/</link>
      <pubDate>Sun, 11 Nov 2012 21:31:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/what-makes-for-a-good-development-lead/</guid>
      <description>&lt;p&gt;Throughout my career so far, I&amp;rsquo;ve mostly worked alone. When I say alone, I&amp;rsquo;ve&#xA;often worked alongside other people, but ultimately I&amp;rsquo;ve been paying them, or I&#xA;had made the choice about whether they were suitable for the project (or for me)&#xA;or not. They&amp;rsquo;ve mostly not been working on the same thing I&amp;rsquo;ve been working on&#xA;either.&lt;/p&gt;&#xA;&lt;p&gt;Ultimately, I&amp;rsquo;ve been the leader of the projects I&amp;rsquo;ve worked on during most of&#xA;my freelance career. While at my current fulltime job however, due to the nature&#xA;of the work I was doing there, I often had to work with other people who I&#xA;couldn&amp;rsquo;t choose. This was a great new experience for me, with some terrible 3rd&#xA;parties from other companies I had to integrate with, and some truly amazing&#xA;developers I got the chance to work alongside. I learned a lot about what I look&#xA;for in a leader during my time there, based on excellent leadership skills I saw&#xA;working with some of the people I worked with, and with other people I saw&#xA;(mostly in other companies I&amp;rsquo;m happy to report) make mistakes, I learned how I&#xA;myself could strive to be that golden leader I wanted so bad. While I don&amp;rsquo;t&#xA;claim to be perfect, I feel I have manage to construct a reasonably good&#xA;guideline on how I should try to conduct myself in order to be the leader I&#xA;would want to lead me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Code is Poetry</title>
      <link>https://johnhame.link/posts/code-is-poetry/</link>
      <pubDate>Fri, 09 Nov 2012 22:19:00 +0000</pubDate>
      <guid>https://johnhame.link/posts/code-is-poetry/</guid>
      <description>&lt;p&gt;I once read &lt;a href=&#34;http://coding.smashingmagazine.com/2010/05/05/the-poetics-of-coding/&#34;&gt;a much better article than this one by Matt Ward&lt;/a&gt; that attempts to&#xA;show the similarity between code and poetry. Matt shows how the flow and syntax&#xA;of good code, that abstract minimalism and lowest common denominator approach,&#xA;is actually very similar to that of a poem.&lt;/p&gt;&#xA;&lt;p&gt;I agree with everything Matt says, but I felt the article was a little lacking&#xA;in showing how the &lt;!-- raw HTML omitted --&gt;coder&lt;!-- raw HTML omitted --&gt; can be a &lt;!-- raw HTML omitted --&gt;poet&lt;!-- raw HTML omitted --&gt; in order to achieve greatness and&#xA;self-fulfillment (that&amp;rsquo;s what poetry and coding are partly about, in my&#xA;opinion). To this end, I&amp;rsquo;ve compiled some advice I&amp;rsquo;ve learned by myself or from&#xA;others over the years in the hope that it will help someone out there on these&#xA;vast pipes we call the Internets.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
