More Muc Than You Can Handle

Blogs

Music of 2024

music

Last year’s post was fun to write and I like the journalling component of this exercise. Let’s see if I can continue and make it a routine.

A Bumper Crop of Concerts

2024 was an exceptional year for great concerts. 27 of them to be precise! This was a year where my appetite for live music was huge. I made efforts to ensure that my life had space for these shows.

Read more...

How Does One Introduce Rush?

music

Earlier this year I was chatting with a friend about the band Rush. I said they played a fundamental part of who I am and still have an impact on me today. This prompted them to ask how they could learn more. The most wonderful thing for any Rush fan to hear.

I’ll start by describing how I learnt about them. It was through my brothers who are older than me and they still joke about how as a child I would giggle to this guitar part in The Trees. A few years later, as I started learning how to play guitar, they suggested I learn songs like YYZ and Kid Gloves. I was immediately hooked to learning as much Rush as possible on guitar. Eventually I made an online quiz playing snippets of Rush songs on classical guitar. See if you can find YYZ and Kid Gloves there.

Read more...

Music of 2023

music

Music has been a big part of my life since at least 1990. It was a great bonding moment with my oldest brother as we both got into They Might Be Giants - Flood at the same time (and independently). He got me into going to concerts, and indie music.

My joy and participation in music has been a constant and I’ve always enjoyed sharing my experiences and discoveries. This is my attempt at turning what is usually an e-mail to a few friends into a blog post.

Read more...

A Fresh Start in Midlife

Over a year ago I posted a life update, and now it’s time for another! In Nov 2021 I hinted about a new job I was starting. So let’s go back a year and see how that developed.

2022

Entering ClimatePartner

The cliffhanger that I ended the last post with was getting a job with ClimatePartner as a team lead. A team lead in this context was a mix of tech leadership and people management. Along with that, I was bootstrapping the technical organisation in the Berlin office. The job began in Jan of 2022.

Read more...

Life, Work, and Covid

It’s been a while since I’ve done a general life update. I’m no longer active on social media and have left a lot of people out of what’s going on in my life. One effect of my lack of posting was that my immediate family didn’t know much about my day-to-day life. Social media used to be good for this type of communication until it became more of an opinion soap-box.

Read more...

My Goals for 2021

yearly-goals

Reflections on 2020 and Earlier

I can’t recall exactly why I didn’t bother write a goal post (pun?) last year, but let’s ignore that for now. I’m back in action! Let’s start with some reflections:

  • Berlin has now been my home for 3 years. This is the longest I’ve lived somewhere outside of my home city since Calgary (over 11 years ago)! I’m loving my home and my life here so I don’t see myself moving again anytime soon. Here’s a view of my happy place in my flat (Meine Wohnung).

    Read more...

Valuable Links - Git

links

Why a links post about Git? There are plenty of resources, right? Exactly! There’s almost too many resources around Git and you can reach a profiency in Git with just a few.

For fun, check out the results of this search for git books vs svn books. Hopefully this post will help you to never need to go through that list.

Some Opinions

It’s funny to me that git is a tool one can become skilled at. When using svn I never felt that I had to learn advanced things (I did own one of those books listed above though). Perhaps it’s more a sign of the times and the number of people in software has grown immensely; which is great!.

Read more...

The Day the Universe Changed (Me)

Background

The Day the Universe Changed is a documentary (9.1 on imdb) from 1985 that covers the effects of science and technology on western society. I was introduced to the show in grade 8 social studies and I clearly didn’t appreciate the message of the documentary when I was 13-14 years old.

Unfortunately it’s not viewable online. However, this first 10 minutes of the first episode should be enough to get your gears turning.

Read more...

My Resolutions for 2019

yearly-goals

Reflections on 2018

This will be easy because I didn’t set any goals last year! It felt great to take a break from goal setting because 2018 was a big year of transition. I moved yet again and I started a new role at work. I then found that it didn’t fit me and I finally had some self awareness to reach out for help and was able to switch roles again to something that suits me at this moment in time.

Read more...

My Resolutions for 2018

yearly-goals

Reflections on 2017

  • Perform 1 pull up - This didn’t go so well. I’m now the heaviest that I’ve ever been (95kg). My psoriasis (scalp) has become really annoying and gets worse when I exercise. So 2017 wasn’t a good year for my health. It’s very clear that I don’t handle disruption of my routine very well. Below is a graph of my workouts:

Only 1 or 2 of those gaps was related to illness; most of them were due to travel (work and play). The last few months was me being preoccupied with my move to Berlin (yet another excuse).

Read more...

Moving Back to Berlin

Remember that post about moving to Dublin from almost a couple years ago? Consider this a tiny git revert --no-commit of that, modify it slightly to keep my location as Berlin but Pivotal as my employer.

A Pivotal Moment (that has lasted 2 years)

The whole process started with a strong desire to move back to Berlin (I’ll go into why later). I was willing to look for a different job but I really really didn’t want to. Pivotal has been fantastic and I’ve enjoyed it there. Since I joined I’ve worked on 3 different teams over 2 years:

Read more...

Valuable Links - TLS

links tls

This is embarassing to admit but I have to re-learn Transport Layer Security (TLS) on a continuous basis. This post is my cheatsheet to remembering all the itty bitty details, which I’ll forgot shortly after I do whatever TLS related task I have on my plate.

What’s TLS you ask? Take 9 minutes to listen to this fantastic episode on Public key cryptography which will prime (hah!) you up for the rest of the post.

Read more...

Irish Whiskey Appreciation

Disclaimer - I was not paid or propositioned to write this post and/or link to the Mitchell & Son web store. I just enjoyed their course a lot. At the end of the course I was given a 10€ discount on any Green/Yellow spot whiskies. I would also recommend the Celtic Whiskey Shop too.

Over the last month I had the wonderful opportunity of learning all about Irish whiskey. It was held in the Mitchell and Son store in The CHQ Building (where I work) so how could I not participate? If you see them offering it again I highly recommend it! Not only did I learn a lot about Irish whiskey, I learned a lot about whiskey in general.

Read more...

OSX Workstation Setup Automation

DISCLAIMER Try out at your own risk. This setup is not meant to be copy+paste reusable. It’s about keeping MY workstation under source control, and this strategy may destroy the machine you wish to attempt this on.

Objective

IT infrastructure has gone down a long journey of automating all of the things. We have automated deployments, production environments, and regression testing. We can make an API request to Amazon and get a server instances in minutes. The developer workstation is another story. Often, the developer workstation is a finely crafted machine. Just like production, your workstation should be treated like a hotel room rather than an owned residence.

Read more...

My Resolutions for 2017

yearly-goals

2016 was the first time I accomplished my goal!

Reflections on 2016

  • Write in a Journal - This one I am marking as a success. Here are the (manually) calculated stats:
Jan 9
Feb 3
Mar 12
Apr 9
May 15
Jun 9
Jul 13
Aug 14
Sep 12
Oct 14
Nov 9
Dec 12

I wrote 143 journal entries over the course of 2016. After counting them all up there are far fewer than I thought, but the frequency is actually more consistent than I thought. I had imagined I had more months that only had a couple entries. I see this as my first step in writing more and hopefully bringing it to this website. Seeing that my journalling actually increased by the end of the year makes me really happy. I’m going to continue this in 2017 for sure.

Read more...

Dealing With Contempt Culture in the Software World

A few years ago I left ThoughtWorks and was considering leaving IT altogether.

Though I’m listing things related to ThoughtWorks, a lot of my weariness is more from IT in general. It could be an age thing, but I’ve been around long enough to see a lot of terrible things going on in this industry. No one seems to care about security, and the innovation that is making billions in the stock market are consumer products that mean almost nothing to me. It’s hard to be optimistic after Edward Snowden revealed the NSA privacy issues.

Read more...

Joining Pivotal Cloud Foundry and Moving to Dublin

soundcloud cloudfoundry

It’s been a while since I’ve posted a “life update”. The TL;DR is that I have joined Pivotal Cloud Foundry in January and will be moving to Dublin in June.

Reflections on Berlin and SoundCloud

My guess is the most frequent question about this is: what happened? When I posted about my decision to move to Berlin and join SoundCloud it appeared that I had found something I really wanted to do. Looking back at the post you can see subtle hints of doubt, but went with the option that seemed a little more risky. In the end, the risk was worth it as I learned a heck of a lot!

Read more...

My Resolutions For 2016

yearly-goals

This post almost didn’t happen. 2015 holds a lot of dead-air from me in the blogging world, but I’m so compelled by my routines that I felt that I had to do it! Honouring a self-made routine/tradition is my achilles heel and my biggest strength at the same time.

Reflections on 2015

2015 wasn’t a good year for sticking to my goals, but I still learned a lot on the way:

Read more...

How to make Masala Chai

This is the simplest masala chai recipe I know how to make. Compared to the street side chai you would get in India my recipe differs in the fact that mine is less sweet and has a strong black tea and masala flavour (especially the ginger). The wonderful thing about masala chai is that it’s easy to adjust to your own taste and it’s fun to experiment with.

So let’s get started!

Read more...

My Resolutions For 2015

yearly-goals

This has become a bit of a tradition for me so I can’t quite writing these now. This one will be a bit different than the previous ones though. Normally these posts are my technical resolutions. I’m not that ambitious anymore when it comes to technical learning so I’ve dropped that from the title. Even though I tend to despise meaningless dates, I look at resolutions as one large pomodoro. So the tradition lives on!

Read more...

Three Months in India

career break

September 20th - December 16th

Ugh, I left this post until way too late. Unfortunately I’ll have to drop a lot of detail as 3 months is pretty hard to sum up in a single blog post. Hopefully I can do it justice as India is a place I’m very fond of. I feel bad for all the wonderful little experiences that happened and didn’t get written about. I’ll just have to visit India again and properly journal the whole experience.

Read more...

Why I Like Running

running

I’ve been an off and on jogger for the last 2 years, but my goal is to be a jogger for the rest of my life. For some reason I’ve felt compelled to journal my reasons. If one person thinks to take up jogging, then that would be wonderful.

Inspiration

The Oatmeal made a fantastic comic of his reasons for running and found that there’s a lot of overlap. Of course I don’t run ultra marathons, nor have I been running for a decade, but I find this comic inspirational and I look at it every couple months. Please read his comic, it’s that good!

Read more...

What Makes Something a "Devops" Tool?

devops

The term “devops” has only existed for 5 years and the trend is to label your tool as a devops tool in order for it to gain traction. When I look at the landscape of tools, most look like Ops tools, just relabeled.

The reason this has been on my mind is that myself and Subhas released a website called Devops Bookmarks to aggregate all the tools in the landscape. Using a Github Pull Request for contributions results in reviewing a lot of tools and after a short amount of time I found myself second-guessing the need for such a website. It felt that we were diluting the devops term.

Read more...

Joining SoundCloud and Moving to Berlin

career break soundcloud cloudfoundry

I can’t say exactly when the job search began. It began with the creation of a Note in Evernote (great tool for this type of task). It was much different than any other job search I’ve done, though I haven’t done many as I tend to stick to job for at least 4 years at a time. The key difference with this search was that I wasn’t working, and wasn’t in a hurry to find a job. This allowed me to stick to some rules and a manifesto:

Read more...

Siófok/Tihany, Italian Grand Prix, and Istanbul

career break

August 30th - September 19

Hungary for More (Siófok/Tihany)

Remember the woman that I met at the Dream Theater concert? We have kept in touch and she promised to show me around the Hungarian country side! She recommended Balaton Lake area so I found a place to stay in Siófok and worked on scheduling a day to meet up.

Unfortunately the weather did not cooperate as it rained most of the time I was there. On the plus side, I picked up a cold on my way from Ukraine and wasn’t feeling very adventurous anyways. I spent 3 days enjoying the sound of the rain, and watching all of the Harry Potter movies. I picked up some groceries the day I arrived and was able to be pretty self-sufficient.

Read more...

Book Review - A Mind for Numbers by Barbara Oakley

book review

Over the last 4 weeks I’ve been taking the Coursera course Learning how to Learn on the recommendation of my friend Srini. The 2nd assignment in the course is to create a presentation or some form of media to present an understanding of the topics. An accompaniment to the course is the book, A Mind for Numbers by Barbara Oakley (the primary course instructor), which is a short read but very insightful and full of references. I’m thoroughly enjoying the course and love the concept around the assignment. This blog is my way of trying to synthesize ideas that are flying around in my head, which is exactly the purpose of the assignment.

Read more...

Valuable Links - Podcasts

links podcasts

It’s quite surprising that I haven’t really brought up the topic of podcasts on my blog considering that I’ve been consuming them for almost 10 years! My methods and taste have changed a lot over the years. I want a place to point people when asked about what podcasts I listen to, and with a little more context than just a pure list.

Software / Tools

A podcast is such a simple concept (from the technical side) that it allows for a lot of tools and applications to be created around the idea. Nowadays I pretty much use a single application on my phone. I’m generally only concerned with the mobile experience since I try to listen to podcasts when I’m on the move and when I’m not focusing on work. Ask me to listen to a podcast while programming and you’ll discover that I won’t be able to recall anything from the podcast (or that I don’t do any programming). The application I use is PocketCasts. The homepage is full of hyperbole and non-truthes (eg: … deliver the updates instantly…), but it’s an alright application and fits my needs for now. Most importantly, it allows me to export my subscribed shows as an OPML file which I’ve made available to you.

Read more...

Book Review - Learning Continuous Integration with TeamCity by Manoj Mahalingam

book review

Disclaimer - I personally know Manoj and have worked with him in the past. I was asked to review his book, Learning Continuous Integration with TeamCity, by Packt Publishing.

As someone who had spent many years consulting around the benefits of CI and implementing build and release strategies, I was interested in how the minutiae would be brought up in a book.

The book begins by going through the creation and configuration of a similar build process for 3 specific tech stacks: Java, .Net, and Ruby. At first it feels rather repetitive but the repetition actually helps reinforce the importance of consistency. With all tech stacks, the procedure is pretty much the same: Checkout, Build, Test, Package, Deploy, Run UI Tests. This pattern really stands out after going through chapters 4, 5 and 6 and builds up a foundation for the reader so that the rest of the material makes sense.

Read more...

Visiting the Motherland - Ukraine

career break

August 17th - August 29th

Ukraine

The next leg of the journey was a long slog from Vienna to L’viv. I took a noon train to Budapest and had to pass some time there for a little while. From Budapest it was an overnight journey with many frequent stops in the middle of the night for immigration and customs. If you’ve ever played Papers, Please, it felt like that. Ukraine isn’t part of the Schengen agreement so you can’t just cross the border without a documents check. Around a few hours from L’viv the attendant asks me about my purpose in Ukraine. She then points at my “ringless” ring finger and smiles. I knew of the Russian/Ukrainian bride thing, but found it crazy that her first guess was for that purpose. I thought it was a hyped up, but after watching a few youtube documentaries about it, I learned it’s sadly alive and well.

Read more...

Rome, Switzerland, and Vienna

career break

July 30th - August 17th

When in Rome

When I learned that my uncle and his family would be in Rome I looked at my schedule to see if I could make seeing them work. It turned out it fit perfectly! The last time I saw them was in London while they were doing their 2013 summer trip and I was on my Belgian Grand Prix vacation. My aunt and uncle are well versed in the world of business so we had many evenings discussing what I’ve learned from the economics courses and floating ideas of what’s next for my life. Of course I got to catch up with my cousins too. Can’t believe how quickly they are growing up (I won’t mention that I remember seeing them in diapers to avoid their embarassment). They had rented a flat near the Spanish Steps which made it easy for me to cram in a bunch of sight-seeing in a short amount of time.

Read more...

Growing an Open Source Project: The Pester Story

pester

In the Beginning

In 2010 I was on a project that focused on build and release software for a bunch of .Net projects (and a few Java projects). Our “glue” was written in PowerShell because of the wonderful remoting capabilities and it’s integration with Windows automation. Our code was untested and our code base was growing over time because our tools proved to be useful and we were getting more and more feedback. Thus, the code required change more frequently. Without the safety net of tests for the most basic logic, our feedback loop was slow as it required us to run builds and deploys to adequately cover our bases.

Read more...

Prague, Budapest, and the Hungarian Grand Prix

career break

July 22nd - July 29th

Prague

Next portion of the trip is to Eastern Europe! I had a nice simple itinerary to Prague: Heidelberg -> Munich -> Prague. Unfortunately something was going on with the brakes on the train and I missed my train in Munich so it turned into: Heidelberg -> Munich -> Neurberg -> Cheb -> Prague. By now I’m a seasoned itinerary refactorer so this didn’t phase me. These little adjustments of the universe can sometimes end up with interesting things happening. At the Plzen stop, a woman sat across from me in the couchette. She started speaking to me in Czech and my response was the standard Canadian response: I’m sorry?

Read more...

Glasgow, Berlin, Heidelberg and the German Grand Prix

career break

July 7th - July 21st

Reunions in Glasgow

Since my train didn’t leave until after noon, I decided to go back to Bletchley Park and spend the morning there. It was so nice to just spend some idle time in the park and not hurry through the exhibits. Unrushed, I made my way to the train station for a direct train to Glasgow. Upon arrival at the station I was greeted by Derek and Rose who I know from back in the Calgary days. They’ve been super generous and hosting me at their apartment which is close to the train station. It was fun to look back at the tough project we worked on together and look at the experience with fondness and nostalgia. Rose was my concert buddy and Derek was probably the only person I know that likes Green Porno as much as I do.

Read more...

Belgium, France, London and the British Grand Prix

career break

June 24th - July 7th

Shipment Delivered

Upon arrival in Antwerp I saw my taxi from the deck. I had all my belongings ready and made my way down to the port. The ship crew was busy with the offloading of containers so I decided it probably wasn’t a good idea to disturb them to say farewell. It was a long drive to the immigration office, and there I found out that I needed a passenger manifest to get the stamp of approval. This meant going all the way back to the ship and back. This added around an extra hour of taxi travel. The chief mate was ready for my return as he had the document in his hand. After that confusion, I made it to central Antwerp and found a hotel near the train station.

Read more...

Crossing the Atlantic via Container Ship

career break

As I mentioned in my last post, I finished the crossing of the Atlantic ocean via container ship. It was a great experiene that I’ll happily do again. 11 days wasn’t enough, and would be happy to spend a month next time around.

Too Much Twine on my Hands

A blog post probably wouldn’t due the experience justice so I decided to play around with a basic word game engine to give you a more self-directed tour. Hope you enjoy it!

Read more...

Leaving Vancouver and North America

career break

After another relaxing two weeks in Vancouver (and attending Sasquatch), it’s time to leave. Here’s the last sunset I watched from the beach. If you can believe it, the weather in Vancouver was 99% rain free!

Schools Out for Summer

During my downtime I’ve enrolled in the Economics of Banking and Money on Coursera. I never thought I would find learning this stuff so much fun! To supplement the course material, I’ve been listening to the following podcasts too:

Read more...

Testing Powershell Code That Talks to CLR Objects

pester

Several months ago someone posted an excellent question on the Pester Group about a certain problem area in testing PowerShell with Pester. He brings up a relevant example of the difficulties that can occur when writing tests is done afterwards. It also reveals a missing feature of Pester.

First let me display the code that needed tests:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
Add-Type -Path (Join-Path -Path $psScriptRoot "Renci.SshNet.dll")

function Get-FromSFtp {
    $fileList=$null
    try {
        $sftp=New-Object Renci.SshNet.SftpClient("127.0.0.1","test","test")
        $sftp.Connect()
        if($sftp.IsConnected) {
            $sftp.ChangeDirectory("/test")
            $fileList=$sftp.ListDirectory(".")
        }
        return $fileList
    } catch [Exception] {
        Write-Host $_.Exception.ToString()
    } finally {
        if(($sftp -ne $null) -and ($sftp.IsConnected)) {
            $sftp.Disconnect()
        }
    }
}

Here are a couple reasons why this code is difficult to test:

Read more...

Two Weeks Living Off the Clock

career break

For the last two weeks I’ve been house sitting for a friend in the beautiful area of Kitsalano in Vancouver. The goal for the two weeks was to figure out the rest of my travel plans and to meet up with a lot of my friends and acquaintances that I haven’t seen for a while.

According to Plan?

The two weeks went by quickly. I mainly organized myself around other people’s clocks. This meant meeting people for lunch or after work the majority of the time. Since I had gaps in time between meet ups, I spent a lot of time walking everywhere (and sometimes biking). Experiencing many modes of transportation ends up being an influence on me later on. It was refreshing to not be the dictator of my time, albeit my intentions did dictate who to meet. So by a transitive relationship, I was still directing my time?

Read more...

Reflections of Being Unemployed and Homeless for 1 Month

career break

For some context, you may want to read my previous post about quitting my job.

I am homeless and unemployed in probably the most priveleged meaning of the terms. Both states of being are choices I’ve explicitly made. From what I’ve read, I’m not really on a sabbatical, but I’m on a Career Break, except the homeless aspect of it is not as conventional.

So here are the reflections:

Where Am I Sleeping Tonight

On September 1st 2012 I gave up my awesome apartment in Calgary as I prepared for an assignment in India (without really knowing where I was going after that). I changed my mailing address to my brothers place and really didn’t feel much had changed. I had already been travelling weekly for my work assignments since April 2011, and I picked up my life and departed Vancouver to Calgary in January 2010.

Read more...

Leaving a Dream Job and Going on an Adventure

career break

On January 4th 2010 I joined ThoughtWorks and it has been an amazing journey. I’ve seen more systems, worked with more people, and seen more countries than the entire 30 years that preceded that date. I still can’t believe how lucky I’ve been to have such a wonderful opportunity. That’s why it took me a long time to decide to leave it, and go on a bit of an adventure.

Why Leave Such a Good Thing?

For some reason I’ve had every job I’ve had for 4 years since I was 12 years old, so I’m just keeping to my routine! To be honest though, there were a few things that instigated this change.

Read more...

Valuable Links - Devops

links devops

TL;DR - Watch this video and read the 10 myths of DevOps (which also links to what I now find is the best video on devops).

Since I first learned the term devops 4 years ago I’ve gone through many leaps in understanding. I really wish I saw this video (history of devops) before I got involved. As a software developer, I find delivering frequently highly motivating. Devops is a set of principles and practices that aim to ensure delivery goes as smooth as possible. I found this post, A Scientific Basis For Devops Success, to be a great introduction to why devops is important.

Read more...

My Developer Resolutions for 2014

yearly-goals

I was tempted to not write this post. My motivations are changing a bit and growing strong technically isn’t one of my top priorities nowadays.

Reflections on 2013

Last year was very interesting for me. It’s the first time I didn’t really have a home. I’ve split my time between India, United States, and South Africa, (ok, I was in Toronto for a few weeks too). During that time I’ve reflected a lot (probably too much). My work was split between training new software developers and developing tools to deploy the largest and most complex distributed system I’ve ever worked on.

Read more...

Valuable Links - Vim

links vim

Today I’ve decided to start something new. I tend to send my friends and colleagues links about all sorts of things. Usually when they are pertinent to a problem they are having, or to supplement a conversation I’ve had with them. My usual process to reproduce these links ends up being a search in: Twitter, Pocket, History, and my Bookmarks.

Also, when I share my links I tend to write a few sentences about them. It adds a personal touch and a bit of context, so that’s why I’m exploring this channel for displaying them. As opposed to using a bookmarking website.

Read more...

The Most Over-Engineered Thing I Have Made

The other day I overheard some interns boasting about their complicated shell setup. They felt pretty good about using tmux, zsh, and aliasing the heck out of everything. One of them had to re-map copy and paste because they messed that up, but they felt awesome when they figured out a clever work around.

We’ve all been there at some point. It’s something that you grow out of over time. At least I hope so. Here’s a story of the most complicated thing I’ve made and I’ll start with a network diagram of my basement suite circa 2003:

Read more...

Replacing the Kanban Board with a Shark Tank

No, this is not an April Fools joke. This was something that was actually implemented.

After ThoughtWorks University was over we had a backlog of work items that needed to be done before we all went back to billable work. I wanted to put up a Kanban board with 3 columns (TODO, WIP, DONE) to track the work we needed to do. A question popped into my head; is 3 columns the minimum number necessary?

Read more...

Going Against the Flow

Developers like to talk about being in a state of flow. This is when time just seems to fly by and you’re writing more code in a few hours than you do in several days when you’re not “flowing”. While I think flowing can be postive, it often can do more harm than good if going on for too long.

In the past I would complain that the environment around me kept me from the flow. I would look forward to the quiet times in the office when I could zone out for hours and complete some wild and crazy code I was working on. Many times I would return the next day and realize that I could have done it simpler, or there were many other aspects of the problem that I didn’t take into consideration. One of the biggest complaints about flow is that it takes a long time to get into that state. How can we minimize this time, and keep these flows shorter?

Read more...

PowerShell Pester 2 and 1.2 Released!

pester

After a whirlwind of activity on the Pester codebase I’m happy to announce the latest release of Pester. Versions 1.2 and 2 are identical feature wise except for one subtle difference that I’ll get into soon.

New Expectation and Matcher Syntax

In prior versions of Pester, we have the dot notation expectation and matcher syntax

$some_string.should.be("some value")

This required some clever and downright nasty hacks to the PowerShell runtime. This created a few issues for some users and I wanted to get that fixed. It turned out the extension on Object was the root issue so I investigated a pipeline based expectation syntax. Here is the result:

Read more...

Setting up Overtone

Every now and then I like to sit in a coffee shop on a Sunday and focus on writing some code. This weekend I had the pleasure of spending this geeky time with a colleague, Chris Ford(twitter).

Chris has gotten me interested into an open source toolkit for creating sounds and making music called Overtone. Here’s a talk about demonstrates functional composition using clojure through music and overtone.

That talk made me want to play with overtone. Here’s the diary of my workstation setup.

Read more...

My Developer Resolutions for 2013

yearly-goals

2012 started off interesting because I was on on an iOS/ruby project. Nearly everything was new to me, but I liked how my past experiences with other technology stacks were still relevant. Even though I didn’t know the languages very well the patterns I’ve seen before still applied.

The last quarter of the year was spent teaching new software developers in India, which has been one of the most rewarding experiences of my career! It has definitely influenced my goals for 2013.

Read more...

Devops Days 2012 in Summary

DevopsDays is a juxtaposition in the world of IT. Most tech conferences focus on tools and processes, whereas Devops Days focuses on culture and the delivery of value. This year’s conference was no exception and here is a summary of what I experienced:

Day 1

The Audubon Society for Partial Failures

The first presentation was done by Cliff Moon. He argues that there are many common patterns in the IT space and it would be valuable to have a repository of knowledge that we can visit to read about the types of errors that can happen. If we could build a taxonomy for the partial failures that exist we may better understand our systems and explain when full-blown outages occur.

Read more...

Examples of how production like environments can catch bugs early

On a previous project, I witnessed a few interesting build breakages that we caught in CI that could have easily gotten passed our automated quality gates. These issues would have hurt us in downstream environments.

It’s commonly referenced in the Continuous Delivery book that development environments should be as close to production like as possible. This might not be 100% possible but you can come close. What can come that close is your system integration test environment. On this project we had a typical web application architecture: web server, database server, and a load balancer to support multiple web servers. Here are a couple integration failures that we experienced:

Read more...

ChefConf 2012 in Summary

This is a little late coming but figured I should post anyways. ChefConf 2012 was an amazing event and absolutely surprising considering it’s the first conference Opscode has put on. Here are a few things that I noticed:

Culture

The attitude and culture around the people there was incredible. Everyone was focused on the needs of the business that they worked for. Sometimes it meant making developers more productive by being to provide consistent environments or by lessening the pain operations have to go through in order to release software created by development teams.

Read more...

Intentional Programming aka Calling Your Shots

I just read this blog post and it’s inspired me to finally post about something that’s been in the back of my mind for while now.

Back in the day I used to play 8-ball on a fairly regular basis. I would play with a regular group of friends who would all work on improving our game. One of the players was nearly a professional and provided me one training tip that helps me everyday. He would ask me to declare every variable of my shot. Not just what ball and pocket I’m targeting, but what trajectory the cue ball will take after contact and how it will carom off of every rail, and to predict where the cue ball will end up. By doing this it revealed so much more of the game to me. As a novice, your primary concern is potting balls. But to be good, you need be in control of everything on the table.

Read more...

Migrated to Octopress!

It’s funny how many posts there are from people who have migrated to Octopress. What would motivate someone to post their migration experience? I think I understand why. It’s such a shift in thinking that it’s worth talking about. My migration experience was so much pleasant that I feel that I must let everyone know.

So what’s my motivation for moving to a new blogging platform? Was what I was using before broken? Not exactly, but I didn’t enjoy the blogging experience that much because I found the experience to not be a lot of fun. I want to start writing more and feel that removing any barriers to this activity will get more content out there. I also didn’t like having to rely on a server side application server. For a website that changes around 30 times a year, a database backed content management system was overkill. Also, the website was hosted on a friends server that I had no backups for, and didn’t want to spend much effort creating a backup/restoration strategy.

Read more...

Reflections on 2 Years at ThoughtWorks

I cannot believe I’ve been at ThoughtWorks for 2 years now! My colleague Aaron Erickson has written an excellent writeup on why (work at) ThoughtWorks. I couldn’t agree more!

Reading another colleague’s post a while ago inspired me to write a little retrospective of my own. Thanks Rose, you are wise beyond your years!

ThoughtWorks has been a place I wanted to work for since I attended DevTeach in 2007. I met some really smart people who were excellent at articulating their perspective. Also, I observed many of the best blogs I read at the time were written by ThoughtWorkers. Yeah, I was also a BFF (Biggest Fowler Fan), but now my experience has shown me that there’s so much more.

Read more...

My Developer Resolutions for 2012

yearly-goals

An interesting thing about 2011 is that my resolutions from earlier became quite prominent. Given that 8 months of 2011 were spent on a large account with less technical focus, I’m amazed at some of the technical things that I’ve done.

Reflections on 2011 and carry over from 2010:

  • Mouseless Computing (2010) - I think the practice is paying off as a colleague of mine told me “You make Windows fly!”, and he’s a savvy keyboard only Mac OSX user.
  • OSS participation (2010) - I started the following projects:
    • Pester - I’ve blogged about it and it’s getting some traction out there in the wild. It’s a spec based testing framework for Powershell. The first implementation was written on a hung-over new years day!
    • yari - A Windows ruby version manager. Currently being used by a very large client. I wrote this on a whim, because I thought I could do better than what was previously implemented. Turned out the client liked this a lot more and decided to adopt it right away.
    • YDeliver - The beginnings of a Continuous Delivery framework for .Net projects.
    • Misc - Submitted a patch to OpenMRS, a bug report to Puppet, directory additions to PSGet
  • Learn VIM (2011) - This went really well. I’m definitely no expert at this point but I’m continuoully trying to learn new things. I’ve setup a github project for my vimfiles which is a fun way to share my tweaks.
  • Develop an Android App (2011) - Nope, didn’t do anything here. It’s actually dropped off my radar as it’s not really something I’m interested in anymore
  • Learn a server provisioning automation tool (2011) - I barely get a passing grade on this one. I’ve yet to use any of these tools (chef, puppet, etc…) on a project. In my spare time I’ve tried them out and understand the gist of how they work. I do question how necessary they are though. Unless you’re doing massive scaling it seems like they just add extra overhead for simple scenarios.
  • Move this blog (2011) - This will be my last post on this blog engine. I’ve currently setup Octopress and have my new blog ready on github. I just have the task of migrating over all posts (and deleting some). I have more to say about Octopress soon.

Development Goals for 2012:

2012 is going to be different for me development wise. I’m finding myself less focused on technical issues and more on system, culture, and people goals. I’m striving to become more of a leader (clear sign of post-technical syndrome) and I think that’s reflected in my resolutions for this year.

Read more...

Simplifying Ruby Installation in Windows

The one thing that has always annoyed me with installing ruby on Windows is that at some point in time I always need to setup the DevKit because I want to install gems that require native extensions. Also, I want the ability to switch between different versions of ruby.

Introducing Yari

yari is a tool (implemented in Powershell) I’ve made to simplify both of these operations. Right now it’s hard coded to only install the 2 ruby versions I care about right now.

Read more...

The Madness Must Stop! - PowerShell Package Management

As a publisher for a few Powershell modules I’m getting frustrated by the lack of standarization in the community on how to support versioning, deployment and conventions within Powershell module distribution. All I can find is rather adhoc mechanisms of sharing poorly written code with the “use at your own risk” kinds of disclaimers.

I keep on looking at the ruby community with their amazing tools like rvm, ruby gems, and bundler to make ruby scripting highly testable and repeatable. The formalization also means that you don’t see people writing ruby code with random imports and magical includes that only work in very specific scenarios. By creating a community around gems and some basic standards, it’s forced developers to factor their ruby code accordingly and modularize when necessary.

Read more...

PowerShell BDD Testing - Pester Screencast

pester

A few months ago I posted a simple tutorial on how to use Pester (a powershell bdd testing framework). I’m starting to practice the making of screencasts so I thought I would add some audio/visual to the blog post. I start rambling in the last 5 minutes so I won’t feel insulted if you stop paying attention after that part.

Also, I want to thank Manoj Mahalingam and Martin Aatmaa for their feedback and contributions!

Read more...

Adopting PsGet for PowerShell Module Management

For a while now I’ve been waiting for something that can be as close to ruby gems as possible for PowerShell. For a while I thought Nuget was the way but it’s tight coupling to Visual Studio made it feel like it wasn’t quite the right fit for PowerShell.

Mike Chaliy has made probably what could be called the simplest thing that could possibly work, and it works well! It’s called PsGet (not to be confused with another project called PsGet). Take a look at the homepage and bask in its simplicity! Installation is copying/pasting the bootstrap code. Then install modules via name or absolute url to a powershell module.

Read more...

Pester - PowerShell BDD Style Testing For The System Administrator

pester

Hi there and welcome to my demo of Pester, a BDD style testing framework for Powershell. The creation of Pester came out of the desire to test some build/deployment infrastructure we were creating for a project. We wrote nearly all the code without tests and it came to bite us in the end. I wanted to find a way ensure these problems didn’t happen again as well as provide some code coverage to give new entrants to the codebase some confidence that they won’t break everything.

Read more...

Stop Trying to be Perfect and Make Mistakes!

Think about how you get good at anything. What do you remember spending most of your time on? Most likely you spent the majority of your time messing things up and getting it wrong. Why are kids so quick at picking up new skills, especially dangerous ones? It’s because kids are fearless experimenters. I’m currently learning how to skate and ski and my ability to learn is hindered by my concern of hurting myself; potentially preventing me from working and earning a living. I want to try and correlate the idea of failure as a healthy activity in the road to expertise in the world of operations in the software world.

Read more...

My Developer Resolutions for 2011

yearly-goals

Looking back at 2010 I can’t say I did a good job of following through with my resolutions, but I believe I have a valid excuse! For the last 12 months I’ve been working more as a build/release specialist than a software developer. Anyways, here’s a rundown of what I didn’t accomplish last year:

  • Test Driven Design - I barely coded at all so that was a total flop. I also believe that this is something that’s hard to do on your own. This discipline really needs a pair in order to stay on track.
  • Mouseless Computing - This is probably my most successful resolution. I’m still no keyboard ninja, but I’ve improved over last year and even wrote a fun negative re-inforcement application.
  • OSS Participation - I’m going to defer this to this year as I have a couple things planned for the near future.
  • Complete small project in different dev stack - Total flop. I attempted to do something in Rails and I couldn’t get going. I think I’ve been in the .Net world for too long. New frameworks completely twist the way I do things and I find I’m not good at learning the conventions of these new technologies.

Development Goals for 2011:

Learn VIM (building my lightsaber)

I’ve tried to find the perfect editor for ages. I’ve sort of come to the conclusion that I’m going to be a perpetual generalist. Sometimes I find myself working on all sorts of OS’s (Ubuntu, Win7, Mac OSX), and I don’t want to learn the best editor for each (GEdit, Notepad++, TextMate). VIM works on all of them so why not learn that? Historically VIM has been labelled as a difficult but powerful editor and with good reason. I’m writing this post in VIM and discovering how much learning I have to do to get to the level of VIM experts.

Read more...

A New Beginning (or Goodbye 20's, Hello 30's)

As many of you know, I have left CBC Radio 3 and got a position as a Software Consultant with Thoughtworks Calgary. Considering that I have lived my entire life in the lower mainland of BC this is a big change. Not only am I leaving behind many friends and family, a beautiful city, and a great job, I’m also leaving behind my golf membership gasp. At least with the Internet, it’s easy to remain in touch and this blog is one of the many ways I’ll be keeping in touch.

Read more...

Book Review - The Art of Unit Testing by Roy Osherove

book review

The Art of Unit Testing Book Cover In a recent splurge I purchased 4 books from Manning Press with one of them being The Art of Unit Testing by Roy Osherove.

I would categorize myself as relatively new to unit testing. My first hands on testing was when I took the Nothing but .Net bootcamp with JP Boodhoo but he emphasized BDD style tests. I saw the benefit of BDD but didn’t feel I had the know how to implement them properly. About 3 months ago I started writing tests in a more unit test like fashion and things started clicking.

Read more...

Riding The Lines-Of-Code Rollercoaster

Lines of code has always been a poor guide in measuring developer productivity. I’m currently reading Scott Rosenberg’s Dreaming In Code and came across and interesting quote.

“Atkinson [ed: Bill] had just completed rewriting a portion of the Quickdraw code, making it more efficient and faster. The new version was 2000 lines of code shorter than the old one. What to report? He wrote the number -2000” – Rosenberg

I couldn’t help but smile when I read that. I have felt that some of my best coding successes are when I eliminate lots of code. This probably pushes Test Driven Development (TDD) as a great practice even further. Lately I’ve been a bit stricter by doing TDD. This means that I’m writing a lot more code, but as I get my tests passing I start refactoring and remove much of the code that’s written. For every couple hundred lines of code I write, I eventually remove 50-80% of it as I glean knowledge from all the code I previously wrote.

Read more...

Unit Testing Domain Persistence With NDbUnit

Ever since I’ve begun using NHibernate the number one thing that’s caused me a lot of headaches is learning how to properly map my domain objects. Even the most basic mappings I wrote had bugs simple because I overlooked trivial items. This made me realize that I could save a lot of time and hassle if I unit tested by data access layer.

Ever since I’ve begun using NHibernate the number one thing that’s caused me a lot of headaches is learning how to properly map my domain objects. Even the most basic mappings I wrote had bugs simple because I overlooked trivial items. This made me realize that I could save a lot of time and hassle if I unit tested by data access layer.

Read more...

When 1 Does Not Equal 1

I’m starting to get comfortable with NHibernate but I’ve been cowboy coding it without any testing framework to let me know if my mappings are really doing what I think they are doing. I’m starting to get tired of manually interacting with my applications to see if things work so I’ve begun the course of starting database integration testing. For the most part, it’s all about testing my mapping files.

Because these tests are meant to be automated, I wanted to be as easy as possible to get the test framework into a consistent state. I found tool called NDbUnit and it allowed me to dump data stored in Xml straight to your database. It was looking great until I found out it didn’t support SQLite which is the database engine I want to use for the testing because of speed reasons. At least the tool is extensible and I took some time to write a SQLite portion to the codebase.

Read more...

My Developer Resolutions For 2009

yearly-goals

I’ve never made any New Years resolutions before. This year I’m going to break that trend simply to create a checklist of tasks to keep me on track. I easily get distracted, but having to check things off a list is a sure way for me to stay focused.

Not wanting to over do it, I made goals that are easily attainable. Hopefully upon completion I’ll get more ambitious the next time around.

Read more...

Handy Web Path Concatenation Code

Lot of web developement code is spent concatenating path snippets and I always hated having to deal with slashes. I wanted a function that was consistent with its return type, and very loose in its parameter requirements. I ended up with the following:

Test First:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using bddunit.core;
using CBC.Radio3.Commons.Specs;
using Observation = MbUnit.Framework.TestAttribute;
using SUT = CBC.Radio3.Commons.Web.WebPath;

namespace CBC.Radio3.Commons.Web
{
    [Concern(typeof (WebPath))]
    public class when_WebPath_Combines_a_bunch_of_strings : ContextSpecification
    {
        private string result;

        protected override void establish_context()
        {
            
        }

        protected override void because()
        {
            result = SUT.Combine("/slashesonbothsides/", "//doubleslash//", "rightslash/", "/leftslash", "file.jpg");
        }

        [Observation]
        public void should_return_an_absolute_web_path()
        {
            result.should_be_equal_to("/slashesonbothsides/doubleslash/rightslash/leftslash/file.jpg");
        }
    }
}

The BDD style of testing is inspired (and pretty much copied) from JP Boodhoo’s Nothing but .Net class.

Read more...

Top 5 Things I Cannot Compromise In Web Development

Over the past few months I’ve realized that I’m a stubborn mule when it comes to certain aspects of web development. After some internal reflection I’ve come up with my top 5 things I strongly feel that I won’t compromise on in the web development process. These items are just for the presentation layer, I’m loaded with issues deeper into the development stack.

1 - URLs must be as beautiful as possible

Read more...

It Is Good To Laugh At Your Old Code

One of the things I love about my job is the ability to see myself grow as a developer. I’m glad I can laugh at my old code because if I can’t then I’m definitely not improving my skillset.

Here’s some code from around 3 years ago:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
using System;
using System.Web;
using System.Configuration;

using System.Text;
using System.Text.RegularExpressions;
using CBC.Radio3.Core.Web;

namespace CBC.Radio3.Core
{
    public class UrlRewriteHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        // Override the ProcessRequest method.
          public void ProcessRequest(HttpContext context) 
          {
            string path = (context.Request.QueryString["url"] == null) 
                            ? string.Empty 
                            : Convert.ToString(context.Request.QueryString["url"]);
            
            string sendToUrl = path;
                        
            RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
            context.Trace.Write("ModuleRewriter", "Url Requested " + path);

            for(int i = 0; i < rules.Count; i++)
            {
                string lookFor = rules[i].LookFor;
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);

                if (re.IsMatch(path))
                {
                    sendToUrl = SiteInfo.ApplicationPath + re.Replace(path, rules[i].SendTo);
                    context.Trace.Write("ModuleRewriter", "Rewriting URL to " + sendToUrl);
                    
                    string referer               = context.Request.Headers["Referer"] ?? string.Empty;
                    string permalink             = path;
                    RewriterRuleType ruleType     = UrlRewriteHandler.GetRewriterRuleType(path); 
                    string siteDomain            = SiteInfo.Hostname;
                    
                    if ( !IsBotRequest(context) && !referer.Contains( siteDomain ))
                    {
                        PermalinkLogger.Instance().Log(permalink, ruleType, referer);
                    }
                    
                    context.Response.Redirect(sendToUrl);
                }
            }
            
            // We haven't found a match so return a 404
            context.Response.Status        = "404 Not Found";
            context.Response.StatusCode = 404;
          }
 

          private static bool IsBotRequest(HttpContext context)
          {
              return context.Request.Browser.Crawler;
          }

          public bool IsReusable { get { return true; } }
          
          
        public static RewriterRuleType GetRewriterRuleType(string permalink)
        {
            RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

            for(int i = 0; i < rules.Count; i++)
            {
                string lookFor = rules[i].LookFor;
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);

                if (re.IsMatch(permalink))
                {
                    return rules[i].RuleType;
                }
            }
            
            return RewriterRuleType.Undefined;
        } 
        
        public static string GetRuleDataXml(string permalink)
        {
            RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;

            for(int i = 0; i < rules.Count; i++)
            {
                string lookFor = rules[i].LookFor;
                Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);

                if (re.IsMatch(permalink))
                {
                    string xmlData = re.Replace(permalink, rules[i].NodeForm);
                    return xmlData;
                }
            }
            
            return string.Empty;        
        }        
   }
}

Here’s what the code I used to replace it:

Read more...

JS Builder Exceptions With Multiline JS Strings

I’m creating an automated build process and one of the items in the build is to build an external resource which is a java script library. The javascript is contained in multiple files and I want to concatenate them into one script. I found a very useful tool called JS Builder which has a command line executable which I can use to automate the construction of this javascript file.

Setup was very simple. I created a JS Build project in my build directory. Inside it I reference the .js files I want to include/minimize/concatenate. I select the folder containing the scripts and attempt to run the build.

Read more...

Desktop As My Default Download Location

So I’ve been getting into the book Getting Things Done lately and can identify with many of the ideas it discusses. The one idea I really like is the consolidation of Inboxes.

I’m of the camp that likes to have a pristine desktop. I personally think the desktop should never be seen, and if it is then you’re not managing your windows properly. When things go on my desktop I naturally try to clean them up. I don’t need any application launchers because I use Launchy for that.

Read more...

Manager Suffixes Are a Code Smell

After attending Nothing But .Net Bootcamp I noticed none of the classes that were written in the course had a Manager suffix. I’ve sort had a eureka moment and have a good idea on why this is.

JP heavily emphasized the Single Responsibility Principle throughout the course. If a class is only has a single responsibility it will be pretty difficult to attach a Manager suffix to the class name.

So often have have I grouped together methods into some sort of “Manager” class and have always felt guilty about it. Having a Manager class almost corresponds to the Broken Windows story. You start thinking that since you have the Manager class it won’t hurt to add another method to it, which is simply giving it more responsibilities.

Read more...

I Survived JP's Nothing but Dot Net Boot Camp!

After a big of pleading I got the privilege of being able to attend Jean-Paul Boodhoo’s Nothing But Dot Net Bootcamp!

JP is quite well known in the .Net circuit for his passion for development and his pragmatic approach to software design. Typical posts about his course underline that you’ll be giving up your home life for a week. Since I’m a bachelor, it wasn’t a big deal for me, but I did feel a bit bad for the guys that had wives and kids at home. Our typical day was no shorter than 14 hours, and one lasted 20 hours. This was for a grand total of 80 hours of training in a 5 day span! The crazy part was that the material was flying at you so fast you didn’t even get a chance to be tired.

Read more...

The Paradox of Choice in a Developers Life

Matt Hamilton wrote an excellent blog post about something that I’ve been thinking about for a long time. As a developer you want to keep improving, but the more you know the more choices that appear.

When first coding projects that require database access you get used to learning the SqlCommand class and have nested using statements to retrieve your readers. Next thing you learn is strong typed DataSets and then you move on to ORMs and code generators. Your code constantly evolves for the better (we hope).

Read more...

Installing Windows Home Server On Old Hardware

For the last 7 years I’ve been running a FreeBSD server at home for all my file serving needs. It’s always been solid and never caused problems. It was the gateway into Unix knowledge for me and I loved the whole experience. A fellow 8-ball competitor revealed that he’s a sales agent for Microsoft and kindly gave me an OEM copy of Windows Home Server (WHS)! I reluctantly decided to retire the ol BSD box and try out WHS.

Read more...
1 of 1