<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog Post Archive on ilikeorangutans</title><link>https://kuelzer.ca/posts/</link><description>Recent content in Blog Post Archive on ilikeorangutans</description><generator>Hugo</generator><language>en</language><copyright>© 2026 Jakob Külzer</copyright><lastBuildDate>Sat, 18 Apr 2026 22:59:44 -0400</lastBuildDate><atom:link href="https://kuelzer.ca/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Moving My Blog</title><link>https://kuelzer.ca/posts/2026/04/08/moving-my-blog/</link><pubDate>Wed, 08 Apr 2026 22:56:07 -0400</pubDate><guid>https://kuelzer.ca/posts/2026/04/08/moving-my-blog/</guid><description>&lt;p&gt;It&amp;rsquo;s this time of the year again. I&amp;rsquo;ve recently set up this little page, and I really didn&amp;rsquo;t want it to be on Github or hosted by Github Pages.&lt;/p&gt;</description></item><item><title>Building NixOS images for aarch64 from a x86 Build Platform</title><link>https://kuelzer.ca/posts/2026/02/28/building-nixos-images-for-aarch64-from-a-x86-build-platform/</link><pubDate>Sat, 28 Feb 2026 14:28:39 -0500</pubDate><guid>https://kuelzer.ca/posts/2026/02/28/building-nixos-images-for-aarch64-from-a-x86-build-platform/</guid><description>&lt;p&gt;In my homelab I run many different single board computers, among them Odroid M1s. However, there&amp;rsquo;s various versions of Raspbian, Armbian, and Debian, each of them using some custom tweaks. And that&amp;rsquo;s a lot of time to maintain them. So I really like the idea of NixOS and read that it can be used to build bootable images for computers. I haven&amp;rsquo;t fully built intuition for all parts in this so it took me a while to get this working. Here&amp;rsquo;s my notes.&lt;/p&gt;</description></item><item><title>A Love Letter to KOReader</title><link>https://kuelzer.ca/posts/2025/12/19/a-love-letter-to-koreader/</link><pubDate>Fri, 19 Dec 2025 15:57:19 -0500</pubDate><guid>https://kuelzer.ca/posts/2025/12/19/a-love-letter-to-koreader/</guid><description>&lt;p&gt;I enjoy reading books. I very much enjoy reading printed books, but they&amp;rsquo;re heavy, you can&amp;rsquo;t read them in the dark, and unlike my phone or ereader, I don&amp;rsquo;t have them on me all the time. So, I read a lot of ebooks. And with most ereaders, reading novels is fine, at least if you read reflowable document types like epubs. But as soon as you start reading PDFs, all bets are off. At least, until I discovered &lt;a href="https://koreader.rocks/"&gt;KOReader&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Zig, Memory, and the mysterious `170`</title><link>https://kuelzer.ca/posts/2025/09/06/zig-memory-and-the-mysterious-170/</link><pubDate>Sat, 06 Sep 2025 11:06:48 -0400</pubDate><guid>https://kuelzer.ca/posts/2025/09/06/zig-memory-and-the-mysterious-170/</guid><description>&lt;p&gt;I&amp;rsquo;m hacking on a small Zig application with a GTK frontend, and part of using GTK is passing around &lt;code&gt;?*anyopaque&lt;/code&gt; pointers and you never quite know if it&amp;rsquo;s working. In my app I&amp;rsquo;m passing around a struct that holds a &lt;del&gt;string&lt;/del&gt; &lt;code&gt;[]const u8&lt;/code&gt; to various GTK callbacks. However the string was empty. This led me down a rabbit hole of trying to figure out if my pointers were correctly passed, even going as far as stepping through it with a debugger. Turns out, the pointers are all correct. Even my &lt;del&gt;string&lt;/del&gt; &lt;code&gt;[]const u8&lt;/code&gt; was there with the correct length, except every single byte was set to &lt;code&gt;170&lt;/code&gt; and I realized I was looking at undefined memory. Zig in debug mode sets undefined memory to &lt;code&gt;0xaa&lt;/code&gt; which is &lt;code&gt;170&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Hugo --cleanDestinationDir and Git Submodules</title><link>https://kuelzer.ca/posts/2025/08/04/hugo--cleandestinationdir-and-git-submodules/</link><pubDate>Mon, 04 Aug 2025 16:20:39 -0400</pubDate><guid>https://kuelzer.ca/posts/2025/08/04/hugo--cleandestinationdir-and-git-submodules/</guid><description>&lt;p&gt;Recently I&amp;rsquo;ve been working on updating my blog a bit (you might have noticed?). I keep the hugo sources in a git repository and the built site in a separate repository. That repository is added as a submodule to the sources repo and during the build, the generated HTML is written into the submodule. Except the submodule kept getting messed up; git would be unable to track the changes or they&amp;rsquo;d be added to the parent repository. It was truly maddening, but as it is so often, the problem was not git but me.&lt;/p&gt;</description></item><item><title>Zig Fetch</title><link>https://kuelzer.ca/posts/2024/07/17/zig-fetch/</link><pubDate>Wed, 17 Jul 2024 12:18:03 -0400</pubDate><guid>https://kuelzer.ca/posts/2024/07/17/zig-fetch/</guid><description>&lt;p&gt;Zig&amp;rsquo;s package manager is still a bit rough. It only supports fetching tarballs, but many github projects don&amp;rsquo;t have them unless they have a release. There&amp;rsquo;s a &lt;a href="https://www.baeldung.com/linux/github-download-tarball"&gt;trick to fetch any commit as a tarball though&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>One Billion Row Challenge in Zig</title><link>https://kuelzer.ca/posts/2024/05/05/one-billion-row-challenge-in-zig/</link><pubDate>Sun, 05 May 2024 13:54:44 -0400</pubDate><guid>https://kuelzer.ca/posts/2024/05/05/one-billion-row-challenge-in-zig/</guid><description>&lt;p&gt;I finally got around to looking into &lt;a href="https://github.com/gunnarmorling/1brc?tab=readme-ov-file"&gt;The One Billion Row Challenge&lt;/a&gt;. If you&amp;rsquo;re unfamiliar, it&amp;rsquo;s a challenge to how fast a program can read and process one billion rows. It&amp;rsquo;s fascinating because it&amp;rsquo;s all about raw performance including algorithms, CPU instructions, and profiling and benchmarking. All things I enjoy dabbling with.&lt;/p&gt;</description></item><item><title>mkdocs</title><link>https://kuelzer.ca/posts/2024/02/16/mkdocs/</link><pubDate>Fri, 16 Feb 2024 23:05:21 -0500</pubDate><guid>https://kuelzer.ca/posts/2024/02/16/mkdocs/</guid><description>&lt;p&gt;I recently realized the docker container for my toy project &lt;a href="https://sr.ht/~ilikeorangutans/books/"&gt;&lt;code&gt;books&lt;/code&gt;&lt;/a&gt; has over 2k downloads so I finally decided to write
some proper docs for it. There&amp;rsquo;s not much to document, but it deserves a nice webpage. Picked up
&lt;a href="https://www.mkdocs.org/"&gt;&lt;code&gt;mkdocs&lt;/code&gt;&lt;/a&gt; because I saw it used by some other projects and I&amp;rsquo;m positively surprised. You
initialize a project and throw some markdown files at it. Then you run &lt;code&gt;build&lt;/code&gt; and it gives you a nice webpage for your
docs, nothing more, nothing less. Great little tool, highly recommend it.&lt;/p&gt;</description></item><item><title>Zig - First Impressions</title><link>https://kuelzer.ca/posts/2023/10/23/zig-first-impressions/</link><pubDate>Mon, 23 Oct 2023 19:50:27 -0400</pubDate><guid>https://kuelzer.ca/posts/2023/10/23/zig-first-impressions/</guid><description>&lt;p&gt;I&amp;rsquo;ve been following the zig language for a while ever since I saw &lt;a href="https://corecursive.com/067-zig-with-andrew-kelley/"&gt;Andrew Kelly&amp;rsquo;s talk&lt;/a&gt; on &lt;a href="https://corecursive.com/"&gt;Corecursive&lt;/a&gt;.
The way Andrew describes the design of zig was very engrossing and who doesn&amp;rsquo;t like a language build
for speed. But I have struggled with picking it up; time is in short supply and so were docs for zig
when I first looked at it.&lt;/p&gt;
&lt;p&gt;But that has changed; I finally found some motivation and &lt;a href="https://ziglearn.org/"&gt;ziglearn.org&lt;/a&gt; which
is a good introduction to zig. I have only managed to read the first two chapters, much less understand
them but it&amp;rsquo;s enough to be dangerous (to myself?).&lt;/p&gt;</description></item><item><title>Migrating Raspberry Pi From Sd Card to Usb</title><link>https://kuelzer.ca/posts/2020/12/07/migrating-raspberry-pi-from-sd-card-to-usb/</link><pubDate>Mon, 07 Dec 2020 12:52:07 -0500</pubDate><guid>https://kuelzer.ca/posts/2020/12/07/migrating-raspberry-pi-from-sd-card-to-usb/</guid><description>&lt;p&gt;I&amp;rsquo;ve been running my Kubernetes cluster on Raspberry Pis for about a year now. Overall the cluster is stable and needs
little attention and by now many useful and important services are now running on it. With more reliance on these
services I need to ensure that the cluster doesn&amp;rsquo;t fail from preventable errors. One of the common failure modes for
Raspberry Pis are sdcards. They are not very fast, they are of limited size, and worst, they tend to fail.&lt;/p&gt;</description></item><item><title>Vim Digraph</title><link>https://kuelzer.ca/posts/2020/11/05/vim-digraph/</link><pubDate>Thu, 05 Nov 2020 13:54:51 -0500</pubDate><guid>https://kuelzer.ca/posts/2020/11/05/vim-digraph/</guid><description>&lt;p&gt;Was writing a few posts for my &lt;a href="http://food.hannah-and-jakob.ca"&gt;food blog&lt;/a&gt; and needed to type some some &amp;ldquo;special&amp;rdquo; characters like &lt;em&gt;é&lt;/em&gt;. When on a Mac that&amp;rsquo;s really simple because the keymap supports typing compound keys. But I&amp;rsquo;m on Linux and switching between keyboard layouts is annoying. So I figured vim must have a way for typing these characters, and behold, I learned about Vim&amp;rsquo;s digraph support. The &lt;a href="https://vimhelp.org/digraph.txt.html#digraph.txt"&gt;documentation&lt;/a&gt; is quite good but I&amp;rsquo;ll cherry pick some combos because otherwise I&amp;rsquo;ll forget.&lt;/p&gt;</description></item><item><title>Building Docker Containers for ARM with buildx</title><link>https://kuelzer.ca/posts/2020/01/03/building-docker-containers-for-arm-with-buildx/</link><pubDate>Fri, 03 Jan 2020 22:58:33 -0500</pubDate><guid>https://kuelzer.ca/posts/2020/01/03/building-docker-containers-for-arm-with-buildx/</guid><description>&lt;p&gt;I&amp;rsquo;ve spent some time over the holidays building a Kubernetes cluster running on raspberry pis. One issue I ran into was that not all docker images I wanted to run were available for arm/linux. Luckily there&amp;rsquo;s a useful tool called buildx that extends Docker to build containers for different platforms and architectures using quemu and binfmt. ARM has a &lt;a href="https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/getting-started-with-docker-for-arm-on-linux"&gt;blog post that details the steps&lt;/a&gt; needed to build images.&lt;/p&gt;
&lt;p&gt;The steps are:&lt;/p&gt;</description></item><item><title>zsh Autocompletion Caveat</title><link>https://kuelzer.ca/posts/2019/08/23/zsh-autocompletion-caveat/</link><pubDate>Fri, 23 Aug 2019 14:21:43 -0400</pubDate><guid>https://kuelzer.ca/posts/2019/08/23/zsh-autocompletion-caveat/</guid><description>&lt;p&gt;I spent a good hour trying to get a custom completion script working while porting my app &lt;a href="https://github.com/ilikeorangutans/harbormaster"&gt;Harbormaster&lt;/a&gt; to &lt;a href="https://github.com/spf13/cobra"&gt;Cobra&lt;/a&gt;. It would and would not work. I retried writing the file, restarting the shell and it would just not offer any completions.
Eventually I stumbled upon a innocent looking &lt;a href="https://github.com/zsh-users/zsh-completions/issues/277#issuecomment-72867242"&gt;post&lt;/a&gt; on Github that held the solution: remove the .zcompdump file which holds the cached completions. So I ran &lt;code&gt;rm ~/.zcompdump &amp;amp;&amp;amp; compinit&lt;/code&gt; and everything works as expected.&lt;/p&gt;</description></item><item><title>awk Cheat Sheet</title><link>https://kuelzer.ca/posts/2019/03/26/awk-cheat-sheet/</link><pubDate>Tue, 26 Mar 2019 11:36:48 -0400</pubDate><guid>https://kuelzer.ca/posts/2019/03/26/awk-cheat-sheet/</guid><description>&lt;p&gt;I needed to crunch some data quickly and decided awk was the right tool to do so. But every time I use awk, I have to go read the manual, so I decided it&amp;rsquo;s time for a cheat sheet.&lt;/p&gt;
&lt;h3 id="structure-of-an-awk-script"&gt;Structure of an awk script&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Comments begin with a pound sign
BEGIN {
 # Instructions run before the main loop
 FS = &amp;#34;;&amp;#34; # Set a Field Separator
}

# Each line of input is applied against all the following
# regular expressions and runs the instructions in the
# block:

/^$/ { print &amp;#34;An empty line&amp;#34; }

END {
 # Instructions run after the main loop
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Invoke awk with a script like so:&lt;/p&gt;</description></item><item><title>Book Arrival: The Ray Tracer Challenge</title><link>https://kuelzer.ca/posts/2019/03/24/book-arrival-the-ray-tracer-challenge/</link><pubDate>Sun, 24 Mar 2019 09:58:18 -0400</pubDate><guid>https://kuelzer.ca/posts/2019/03/24/book-arrival-the-ray-tracer-challenge/</guid><description>&lt;p&gt;I was browsing the Pragmatic Bookshelf and this book caught my eye: &lt;a href="https://pragprog.com/book/jbtracer/the-ray-tracer-challenge"&gt;writing a ray tracer from ground up with a test
driven approach&lt;/a&gt;? This sounds like a fantastic challenge
to me. I always was interested in ray tracers but always
thought it too complicated a topic to do it myself. However, test driven development has helped me work on some
complex and terrible code bases, so this feels reassuring to me.&lt;/p&gt;</description></item><item><title>Slow Ruby Syntax Highlighting in Vim</title><link>https://kuelzer.ca/posts/2019/03/21/slow-ruby-syntax-highlighting-in-vim/</link><pubDate>Thu, 21 Mar 2019 12:07:08 -0400</pubDate><guid>https://kuelzer.ca/posts/2019/03/21/slow-ruby-syntax-highlighting-in-vim/</guid><description>&lt;p&gt;I recently switched back from MacVim to terminal (&lt;a href="https://github.com/jwilm/alacritty"&gt;alacritty&lt;/a&gt;) Vim because I&amp;rsquo;m trying
to step up my tmux game after reading the excellent &lt;a href="https://pragprog.com/book/bhtmux2/tmux-2"&gt;tmux 2&lt;/a&gt; book from the
Pragmatic Bookshelf. But anyways, I noticed incredibly slow syntax highlighting for larger ruby files, so slow that
editing code was almost impossible. After lots of searching and debugging I found it was the regular expression engine
Vim uses by default in combination with the Ruby syntax highlighter.&lt;/p&gt;</description></item><item><title>gnuplot - My New Favorite Tool</title><link>https://kuelzer.ca/posts/2018/07/21/gnuplot-my-new-favorite-tool/</link><pubDate>Sat, 21 Jul 2018 20:50:44 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/07/21/gnuplot-my-new-favorite-tool/</guid><description>&lt;p&gt;I recently had the need to quickly visualize some data and none of the systems I usually work with had the data.
Initially I dumped the data in Google Sheets and created a chart there, but that was slow and didn&amp;rsquo;t really scale well.
The data had to be cleaned, brought into the right format, columns had to be selected and charts created. At this point
I faintly recalled reading about &lt;a href="http://www.gnuplot.info/"&gt;gnuplot&lt;/a&gt; which, despite its name, has no affiliation with the
GNU project.&lt;/p&gt;</description></item><item><title>Notes on Working Effectively With Legacy Code</title><link>https://kuelzer.ca/posts/2018/07/02/notes-on-working-effectively-with-legacy-code/</link><pubDate>Mon, 02 Jul 2018 12:02:03 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/07/02/notes-on-working-effectively-with-legacy-code/</guid><description>&lt;p&gt;I &lt;a href="https://kuelzer.ca/posts/2018/06/18/book-arrival-working-effectivly-with-legacy-code/"&gt;recently received&lt;/a&gt; my copy
of &lt;a href="https://www.goodreads.com/book/show/44919.Working_Effectively_with_Legacy_Code"&gt;Working Effectivly With Legacy Code&lt;/a&gt;
and have been busy reading it. The book, as a product of its time, has examples of not only Java, but also C++, probably
to show concepts and techniques that apply to languages that behave differently in terms of linking and building. But
regardless of its examples not really applying to what I work with, it was full of useful vocabulary and techniques to
work with not only legacy systems, but really, any kind of system.&lt;/p&gt;</description></item><item><title>First Impressions of Flutter</title><link>https://kuelzer.ca/posts/2018/06/24/first-impressions-of-flutter/</link><pubDate>Sun, 24 Jun 2018 16:23:34 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/06/24/first-impressions-of-flutter/</guid><description>&lt;p&gt;Google recently announced &lt;a href="https://medium.com/flutter-io/flutter-release-preview-1-943a9b6ee65a"&gt;availability of 1.0 preview
&lt;/a&gt; of &lt;a href="https://flutter.io/"&gt;Flutter&lt;/a&gt;, a new
framework for building mobile apps, written from scratch with performance and beautiful UIs in mind. I&amp;rsquo;ve always been
interested in building apps for mobile devices in general and Android in particular thanks to the number of Android
devices I own, but was always discouraged by the complexity of building Android apps. I have one on the Android store
that got too unwieldy to work on and I eventually had to cease development due to time constraints. Now with flutter
closing in on its first release build I got interested, not only because it is a new beginning to building mobile apps
&amp;ndash; and we all know that developers love newly built things &amp;ndash; but also because it uses
&lt;a href="https://www.dartlang.org/"&gt;Dart&lt;/a&gt;, Googles attempt to create a language to replace JavaScript that, sadly, went not far.&lt;/p&gt;</description></item><item><title>Book Arrival: Working Effectivly With Legacy Code</title><link>https://kuelzer.ca/posts/2018/06/18/book-arrival-working-effectivly-with-legacy-code/</link><pubDate>Mon, 18 Jun 2018 22:58:46 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/06/18/book-arrival-working-effectivly-with-legacy-code/</guid><description>&lt;p&gt;I had this book on my wishlist for quite a while, but never thought I needed it. But then it was warmly recommended to
me during a fantastic OOP Workshop with &lt;a href="https://www.sandimetz.com/"&gt;Sandi Metz&lt;/a&gt;. If Sandi recommends it, it must be
good. Excited to dive into this one:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description></item><item><title>Give Me Smarter Objects</title><link>https://kuelzer.ca/posts/2018/06/18/give-me-smarter-objects/</link><pubDate>Mon, 18 Jun 2018 21:20:31 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/06/18/give-me-smarter-objects/</guid><description>&lt;p&gt;A coding exercise I do once in a while is writing &lt;a href="https://en.wikipedia.org/wiki/Battleship_(game)"&gt;Battleship&lt;/a&gt;. It&amp;rsquo;s a
fun little exercise, comes with a slew of interesting decisions, and every once in a while I do this exercise with a
candidate as part of the interview process. It&amp;rsquo;s always exciting to see what other developers come up with. Today I was
doing the exercise and I contemplated on the &lt;em&gt;primitive obsession&lt;/em&gt; code smell that always seems to creep into my code
and saw a beautiful way to apply the &lt;em&gt;extract class&lt;/em&gt; refactoring that very succinctly shows how nice object oriented
programming can be.&lt;/p&gt;</description></item><item><title>null, Software Design, and Scala's Option</title><link>https://kuelzer.ca/posts/2018/05/26/null-software-design-and-scalas-option/</link><pubDate>Sat, 26 May 2018 12:13:10 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/05/26/null-software-design-and-scalas-option/</guid><description>&lt;p&gt;For the past year or so I&amp;rsquo;ve been writing a lot of Scala and fallen in love with its &lt;code&gt;Option&lt;/code&gt; type and how it allows me to avoid &lt;code&gt;null&lt;/code&gt;s. I reflected on &lt;code&gt;null&lt;/code&gt;, why they are bad, and how optional types allow you to write more expressive code.&lt;/p&gt;
&lt;h2 id="what-is-null"&gt;What is null?&lt;/h2&gt;
&lt;p&gt;Most programming languages have the concept of &lt;code&gt;null&lt;/code&gt; (or &lt;code&gt;nil&lt;/code&gt;) that represents the absence of a given value or object. At it&amp;rsquo;s surface the absence of a value probably just translates into a pointer of value &lt;code&gt;0x0&lt;/code&gt; or in languages that do not zero variables, a pointer anywhere into the memory. But aside from the implementation details the more interesting question is how &lt;code&gt;null&lt;/code&gt; fits into a language&amp;rsquo;s type system.&lt;/p&gt;</description></item><item><title>A New Theme</title><link>https://kuelzer.ca/posts/2018/05/21/a-new-theme/</link><pubDate>Mon, 21 May 2018 22:58:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/05/21/a-new-theme/</guid><description>&lt;p&gt;After toying around with the really nice &lt;a href="https://github.com/aos/temple"&gt;Temple theme&lt;/a&gt; I decided there was no better way to spend my afternoon than building my own, new theme for my blog.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t notice, I recently switched my blog from &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt;. The upgrade path from the really old version of Jekyll to the latest version wasn&amp;rsquo;t quite working as expected, and having to mess around with Gemfiles isn&amp;rsquo;t really something I enjoy. Hugo on the other hand is written in Go and comes as a single, standalone binary. That seemed really appealing and I&amp;rsquo;ve had good experiences when trying to build a little &lt;a href="https://github.com/ilikeorangutans/hugo-photo-scanner"&gt;photo gallery builder&lt;/a&gt; with it a while ago before Hugo had actual photo support. Moving the content over from the Jekyll frontmatter to the Hugo frontmatter was done easy enough, I even moved some of the good posts from my really old blog on here. I was almost perfectly happy, exception for the theme. The Temple theme is nice, but it wasn&amp;rsquo;t quite what I wanted. So this weekend I built my own (yeah, you&amp;rsquo;re looking at it).&lt;/p&gt;</description></item><item><title>Inspiration and Action</title><link>https://kuelzer.ca/posts/2018/03/30/inspiration-and-action/</link><pubDate>Fri, 30 Mar 2018 11:27:01 -0400</pubDate><guid>https://kuelzer.ca/posts/2018/03/30/inspiration-and-action/</guid><description>&lt;p&gt;I&amp;rsquo;m currently re-reading &lt;a href="https://www.amazon.com/gp/product/0321503627/ref=as_li_qf_asin_il_tl?ie=UTF8&amp;amp;tag=jakkuesblo-20&amp;amp;creative=9325&amp;amp;linkCode=as2&amp;amp;creativeASIN=0321503627&amp;amp;linkId=a9bf101a0a7973e0d0d78406aa41dc23"&gt;Growing Object-Oriented Software, Guided by Tests&lt;/a&gt;, and this quote really spoke to me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We should be taught not to wait for inspiration to start a thing. Action always generates inspiration. Inspiration seldom generates action.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ndash; Frank Tibolt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think of myself as a perfectionist, the kind of person that hates to produce anything short of flawless. And while this is great quality to have because it drives me to improve and progress, it&amp;rsquo;s also incredibly crippling and frustrating. I&amp;rsquo;ve often noticed that while I had great ideas, I would often fail to implement them because I would try to over engineer my approach so it would solve everything perfectly. Obviously, many of these ideas and projects never went anywhere. But then on the contrary, ideas where I just started hacking something together often went much further and produced something usable and new.&lt;/p&gt;</description></item><item><title>On Wasted Time</title><link>https://kuelzer.ca/posts/2017/08/23/on-wasted-time/</link><pubDate>Wed, 23 Aug 2017 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2017/08/23/on-wasted-time/</guid><description>&lt;p&gt;Recently I&amp;rsquo;ve been feeling&amp;hellip; unaccomplished. Despite all my achievements, acquired skills, and successes I&amp;rsquo;ve had a thought gnawing at the back of my mind. I realized, after looking at my extensive list of side and toy projects, that none of them are making any progress. In some of them I invested lots of time, others are just ideas, barely sketches. But they all have in common that I grew tired of working on them. Either because after a day at work my brain is tired, or because other things are taking precedence. I&amp;rsquo;ve moved into a house that requires constant upkeep. Things break or wear out and before your know it you&amp;rsquo;ve spent an afternoon fixing something. And then I&amp;rsquo;ve finally picked up a regular workout routine. Generally I&amp;rsquo;m proud of that, and because these things take time, I had no time for my side projects. Or at least that&amp;rsquo;s what I thought and told myself.&lt;/p&gt;</description></item><item><title>Google Appengine, Go, and Vendoring</title><link>https://kuelzer.ca/posts/2016/05/22/google-appengine-go-and-vendoring/</link><pubDate>Sun, 22 May 2016 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2016/05/22/google-appengine-go-and-vendoring/</guid><description>&lt;p&gt;I&amp;rsquo;m working on a small app running on Google App engine using Go and upgraded to the latest version of the GAE SDK. The latest version uses Go 1.6 instead of 1.4 like the older version I had. Upgrading was mostly straightforward, but once I started using vendoring I got strange build errors like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2016/05/22 13:26:47 go-app-builder: Failed parsing input: parser: bad import &amp;quot;syscall&amp;quot; in vendor/golang.org/x/net/ipv4/dgramopt_posix.go
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I got different variations of this, but all came down to the same problem: some code was importing packages that GAE doesn&amp;rsquo;t want you tu use. Sadly these errors don&amp;rsquo;t show up during normal &lt;code&gt;goapp build&lt;/code&gt; or &lt;code&gt;goapp test&lt;/code&gt; cycles, but only when you want to deploy or start a local devserver.&lt;/p&gt;</description></item><item><title>Writing an Operating System - Environment Setup</title><link>https://kuelzer.ca/posts/2015/10/26/writing-an-operating-system-cross-compiler-setup/</link><pubDate>Mon, 26 Oct 2015 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2015/10/26/writing-an-operating-system-cross-compiler-setup/</guid><description>&lt;p&gt;I&amp;rsquo;ve been reading &lt;a href="http://littleosbook.github.io/"&gt;The little book about OS development&lt;/a&gt; and &lt;a href="http://wiki.osdev.org/"&gt;wiki.osdev.org&lt;/a&gt; and took some notes along the line. Here&amp;rsquo;s what I wrote on environment setup.&lt;/p&gt;
&lt;h3 id="environment-setup"&gt;Environment setup&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ll need a cross compile toolchain consisting of &lt;a href="https://www.gnu.org/software/binutils/"&gt;GNU Binutils&lt;/a&gt; and &lt;a href="https://gcc.gnu.org/"&gt;gcc&lt;/a&gt;. The &lt;a href="http://wiki.osdev.org/GCC_Cross-Compiler"&gt;osdev wiki&lt;/a&gt; has a great page on setting up a cross compilation toolchain.&lt;/p&gt;
&lt;p&gt;It took me a few times because I didn&amp;rsquo;t read the instructions properly. It is important to unpack the sources for binutils and gcc and have separate build directories, &lt;code&gt;gcc-4.2&lt;/code&gt; and &lt;code&gt;gcc-build&lt;/code&gt; for example. Then, for building gcc, make sure the newly built binutils are on your path.&lt;/p&gt;</description></item><item><title>gorename and invalid expression</title><link>https://kuelzer.ca/posts/2015/10/23/gorename-and-invalid-expression/</link><pubDate>Fri, 23 Oct 2015 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2015/10/23/gorename-and-invalid-expression/</guid><description>&lt;p&gt;This took me longer to figure out than I care to admit, so here&amp;rsquo;s the solution.&lt;/p&gt;
&lt;p&gt;The issue comes up when trying to use &lt;a href="https://godoc.org/golang.org/x/tools/cmd/gorename"&gt;gorename&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; gorename -from &lt;span class="s2"&gt;&amp;#34;github.com/ilikeorangutans/foo&amp;#34;&lt;/span&gt;.MyType -to &lt;span class="s1"&gt;&amp;#39;MyBetterType&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;gorename: -from &amp;#34;github.com/ilikeorangutans/foo.MyType&amp;#34;: invalid expression
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even though the &lt;code&gt;from&lt;/code&gt; query looks normal, &lt;code&gt;gorename&lt;/code&gt; just refuses to work. However the issue is not so much with &lt;code&gt;gorename&lt;/code&gt; but rahter my shell, zsh. Turns out properly escaping your from query, fixes the issue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; gorename -from &lt;span class="s1"&gt;&amp;#39;&amp;#34;github.com/ilikeorangutans/foo&amp;#34;.MyType&amp;#39;&lt;/span&gt; -to &lt;span class="s1"&gt;&amp;#39;MyBetterType&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Renamed 15 occurrences in 5 files in 1 package.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice the single quotes around the entire &lt;code&gt;from&lt;/code&gt; parameter.&lt;/p&gt;</description></item><item><title>Using Golang and Graphviz to Visualize Complex Grails Applications</title><link>https://kuelzer.ca/posts/2014/05/03/using-golang-and-graphviz-to-visualize-complex-grails-applications/</link><pubDate>Sat, 03 May 2014 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2014/05/03/using-golang-and-graphviz-to-visualize-complex-grails-applications/</guid><description>&lt;p&gt;At work we are maintaining several large and complex grails applications. In order to improve stability and reliability, we&amp;rsquo;re trying to increase test coverage. But as with all projects, time and resources are limited. In order to get a better understanding of what parts of the application are more important than others, I decided to use &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; to help me get a better overview of our applications.&lt;/p&gt;
&lt;h3 id="meet-graphviz"&gt;Meet Graphviz&lt;/h3&gt;
&lt;p&gt;I discovered my love for the &lt;a href="http://www.graphviz.org/content/dot-language"&gt;dot language&lt;/a&gt; when I used it years ago to analyze template hierarchies in a proprietary CMS system I worked on. In a nutshell, it lets you specify a graph with nodes and edges plus some extra attributes for labels, shapes etc. It&amp;rsquo;s really a concise little language:&lt;/p&gt;</description></item><item><title>Maven Release Plugin and Git 1.9</title><link>https://kuelzer.ca/posts/2014/04/29/maven-release-plugin-and-git-19/</link><pubDate>Tue, 29 Apr 2014 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2014/04/29/maven-release-plugin-and-git-19/</guid><description>&lt;p&gt;Ran into this issue today and wasted a good hour on figuring out what happened. Seems to be an issue with Git 1.9.x.&lt;/p&gt;
&lt;h3 id="symptoms"&gt;Symptoms&lt;/h3&gt;
&lt;p&gt;Maven release plugin successfully completes the &lt;code&gt;release:prepare&lt;/code&gt; goal, creates the tag, but fails to commit the changed &lt;code&gt;pom.xml&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="solution"&gt;Solution&lt;/h3&gt;
&lt;p&gt;Git&amp;rsquo;s output format changed slightly in one of the recent versions and Maven&amp;rsquo;s SCM provider expects output in a certain way. Luckily you can force git to use the old output style:&lt;/p&gt;</description></item><item><title>Golang Reading and Notes for April 2014</title><link>https://kuelzer.ca/posts/2014/04/27/golang-reading-and-notes-for-april-2014/</link><pubDate>Sun, 27 Apr 2014 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2014/04/27/golang-reading-and-notes-for-april-2014/</guid><description>&lt;p&gt;Last week I attended the &lt;a href="http://golang.meetup.com/cities/ca/on/toronto/"&gt;Toronto Golang Usergroup Meetup&lt;/a&gt; and it was plenty of fun. If you&amp;rsquo;re in or near Toronto and like to dabble with Go, come out. Oh, and did I mention free pizza?&lt;/p&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Casting in Go is slightly different than in C related languages. Instead of a cast, you perform &lt;a href="http://golang.org/doc/effective_go.html#interface_conversions"&gt;a type conversion&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; var myVariable SomeGenericType = ...

 casted, ok := myVariable.(MoreSpecificType)
 // ok is a bool
 if ok {
 	// Type conversion successful
 } else {
 	// myVariable does not implement MoreSpecificType
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;range&lt;/code&gt; keyword when used with two return values does not return references, but rather copies. This had me struggle for a while as my code was not behaving as I thought it would. I had a slice of structs and was happily iterating over it:&lt;/p&gt;</description></item><item><title>Grails 2 Testing Guide</title><link>https://kuelzer.ca/posts/2014/02/06/grails-2-testing-guide/</link><pubDate>Thu, 06 Feb 2014 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2014/02/06/grails-2-testing-guide/</guid><description>&lt;p&gt;&lt;strong&gt;Note: I&amp;rsquo;m still working on this post, but I already use it as a reference so there&amp;rsquo;ll be more content over time.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been quite busy at work with updating a Grails 1.3 application to 2.3.4. While writing a test harness it became apparent that lots of things have changed since I&amp;rsquo;ve last worked with Grails. Many changes are for the better, especially the integration of Spock framework. However, there were some issues that took me a while to figure out. The Grails docs on &lt;a href="http://grails.org/doc/latest/guide/testing.html"&gt;testing&lt;/a&gt; are comprehensive, but long. Here&amp;rsquo;s my cheat sheet.&lt;/p&gt;</description></item><item><title>First impressions: Go</title><link>https://kuelzer.ca/posts/2013/11/12/first-impressions-go/</link><pubDate>Tue, 12 Nov 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/11/12/first-impressions-go/</guid><description>&lt;p&gt;Ever since Google release &lt;a href="http://www.golang.org/"&gt;Go&lt;/a&gt; I&amp;rsquo;ve been curious. Many good things were said and I always read bits and pieces here and there. Last week I decided to dive deeper and write some small things and get to know the language.&lt;/p&gt;
&lt;p&gt;So far I&amp;rsquo;m really impressed. This is a quick list of things I&amp;rsquo;ve noticed:&lt;/p&gt;
&lt;h3 id="language"&gt;Language&lt;/h3&gt;
&lt;p&gt;The go language is full of nice surprises. I haven&amp;rsquo;t seen everything, but just a few things that really impressed me:&lt;/p&gt;</description></item><item><title>Thoughts on Authorization Schemes</title><link>https://kuelzer.ca/posts/2013/08/15/thoughts-on-authorization-schemes/</link><pubDate>Thu, 15 Aug 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/08/15/thoughts-on-authorization-schemes/</guid><description>&lt;p&gt;Today I was experimenting with some new tools (&lt;a href="http://prose.io/"&gt;Prose&lt;/a&gt;) and was confronted with a screen that probably everybody that owns a smartphone or uses any kind of connected online service has seen before: an authorization screen where the user is expected to either approve or deny an application based on list of permissions. Here&amp;rsquo;s how Github&amp;rsquo;s screen looks like:&lt;/p&gt;
&lt;p&gt;
 &lt;img src="https://kuelzer.ca/assets/images/github-authorization.png" alt="Github Authorization Screen"&gt;&lt;/p&gt;
&lt;p&gt;Android has a similar screen when you install an app, IOS probably has one as well. Pretty much every connected system, be it Facebook, Github, Stackoverflow, pretty much everything that uses OAuth or similar technologies will have a screen like this. From a technology and development point of view it makes a lot of sense; at least initially. You break down privileges in a system into a few neat categories and if an application wants to use this service, it has to declare what it uses. Ideally the system would enforce that the application can only use the declared permissions and in theory that would make everything safer…&lt;/p&gt;</description></item><item><title>JSR-269 Annotation Processing</title><link>https://kuelzer.ca/posts/2013/08/13/jsr-269-annotation-processing/</link><pubDate>Tue, 13 Aug 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/08/13/jsr-269-annotation-processing/</guid><description>&lt;p&gt;I&amp;rsquo;ve been contemplating compile time bytecode manipulation for the &lt;a href="http://www.objectmapper.org/"&gt;Object Mapper Framework&lt;/a&gt; for a while now. Compile time instrumentation of classes seems to be a better approach and does away a whole lot of class loading issues, especially in OSGI environments. In any case, I remembered &lt;a href="http://projectlombok.org/"&gt;Project Lombok&lt;/a&gt; and reading about &lt;a href="http://jcp.org/en/jsr/detail?id=269"&gt;JSR-269&lt;/a&gt;, which was introduced with Java 1.6. It&amp;rsquo;s an API that allows you to plug custom annotation processors into javac.&lt;/p&gt;
&lt;p&gt;After experimenting and reading a bit, here is my reading list:&lt;/p&gt;</description></item><item><title>Switched from Eclipse to IntelliJ</title><link>https://kuelzer.ca/posts/2013/07/28/making-eclipses-method-stubs-better/</link><pubDate>Sun, 28 Jul 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/07/28/making-eclipses-method-stubs-better/</guid><description>&lt;p&gt;Over the years I have always been fan and user of the Eclipse platform. I liked the openness, the available plugins, and many of its features, including the CTRL-1 hotkey that does everything, and a few other things. However, over time Eclipse got slower and slower, more unstable, and after a while just a pain to use, especially when using more than one screen. I decided to give IntelliJ another try, as I&amp;rsquo;ve done a few times before. And like every time I tried it, I got really frustrated. IntelliJ and Eclipse differ in certain areas, and my inability to use the old shortcuts just made me feel like an infant on stilts. However, after more encouraging tips from Reddit and other research, I installed the &lt;a href="http://plugins.jetbrains.com/plugin/?id=1003"&gt;Key Promoter Plugin&lt;/a&gt; which shows an angry popup whenever you use the mouse to do something that has a shortcut. With that, I&amp;rsquo;m learning keyboard shortcuts quite fast&amp;hellip;&lt;/p&gt;</description></item><item><title>Making Eclipse's Method Stubs Better and other things</title><link>https://kuelzer.ca/posts/2013/06/26/making-eclipses-method-stubs-better-and-other-things/</link><pubDate>Wed, 26 Jun 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/06/26/making-eclipses-method-stubs-better-and-other-things/</guid><description>&lt;p&gt;Just downloaded &lt;a href="http://www.eclipse.org/kepler/"&gt;Eclipse Kepler&lt;/a&gt; and I&amp;rsquo;m quite happy with it. It appears fast and stable so far, but that could be just that it&amp;rsquo;s a brand new install. Anyways, I re-added some of my usual code templates and while doing so, I discovered a few useful things. And because I keep doing this on every Eclipse installation, I decided to write this down here. On a related note, an Eclipse plugin to share your Eclipse templates would be pretty rad. But I digress.&lt;/p&gt;</description></item><item><title>The Case for Continuous Integration</title><link>https://kuelzer.ca/posts/2013/06/01/the-case-for-continuous-integration/</link><pubDate>Sat, 01 Jun 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/06/01/the-case-for-continuous-integration/</guid><description>&lt;p&gt;In my career as a software developer, I&amp;rsquo;ve come to appreciate the principles of Continuous Integration (CI). It forces you to do the hard things early and often and thus helps you reduce risk during development. It forces you to write tests, and be responsible about what you check in. All in all, good qualities and something that every development team should aspire to. Or so I thought. Reality is different, and so far almost every development team I have interacted with is deadly afraid of doing CI. So much, that there&amp;rsquo;s been near-mutinies because CI and what it means for team, causes so many problems. This is something that puzzles me, and I realize it might be because the teams in question don&amp;rsquo;t fully understand what CI is or only realize a subset of what it means. This is my attempt to demystify and explain CI.&lt;/p&gt;</description></item><item><title>The Problem with LinkedIn's Skills Endorsement</title><link>https://kuelzer.ca/posts/2013/04/04/the-problem-with-linkedins-skills-endorsment/</link><pubDate>Thu, 04 Apr 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/04/04/the-problem-with-linkedins-skills-endorsment/</guid><description>&lt;p&gt;A while ago LinkedIn introduced what looked like a really cool feature, an easy way to &amp;ldquo;endorse&amp;rdquo; skills of your contacts. It&amp;rsquo;s really easy to go in and click &amp;ldquo;Endorse&amp;rdquo; on a bunch of skills. However, one thing that kept surprising me was &lt;em&gt;who&lt;/em&gt; endorsed &lt;em&gt;what&lt;/em&gt; skills. For example, just today I had a ex-coworker from over 4 years ago endorse me for Hibernate. Which by itself is a nice gesture, only thing is, he&amp;rsquo;s an art director. I don&amp;rsquo;t want to be pretentious, but I would believe that he knows as much about Hibernate as I know about Photoshop filters or fine arts. As a matter of fact, I usually get yelled at for my choices of colour. If he would have endorsed me for &amp;ldquo;Teamwork&amp;rdquo; or &amp;ldquo;Attention to Detail&amp;rdquo; or something like that, I would agree that it is an accurate representation of my skills. But getting endorsed for my Java ORM skills by a designer doesn&amp;rsquo;t constitute valuable feedback.&lt;/p&gt;</description></item><item><title>On Developer Happiness and Productivity</title><link>https://kuelzer.ca/posts/2013/04/03/on-developer-happiness-and-productivity/</link><pubDate>Wed, 03 Apr 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/04/03/on-developer-happiness-and-productivity/</guid><description>&lt;p&gt;I&amp;rsquo;ve had the idea for this blog post in my mind for a long time. It is based on all my personal experiences and observations over the past years and is in no way scientific. It is my personal opinion, and even though this is how I perceive the world, it might not be true for other people. With that said, let&amp;rsquo;s jump to the core of things.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A happy developer is a productive developer.&lt;/p&gt;</description></item><item><title>Date Arithmetics in XSLT 2</title><link>https://kuelzer.ca/posts/2013/04/02/date-arithmetics-in-xslt-2/</link><pubDate>Tue, 02 Apr 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/04/02/date-arithmetics-in-xslt-2/</guid><description>&lt;p&gt;Now here&amp;rsquo;s something I didn&amp;rsquo;t know: XSLT 2 and XPath actually support date arithmetic! Took me a while to figure it out, but here&amp;rsquo;s how it works.&lt;/p&gt;
&lt;p&gt;First, all your dates will have to be in &lt;a href="http://en.wikipedia.org/wiki/ISO_8601"&gt;ISO-8601&lt;/a&gt; format. For dates only it looks like this: &lt;code&gt;YYYY-MM-DD&lt;/code&gt; and for dates and times, like this: &lt;code&gt;YYYY-MM-DDTHH:mm:SS.sssZ&lt;/code&gt;. There&amp;rsquo;s a few other formats, but these are the ones that probably cover all use cases.&lt;/p&gt;
&lt;p&gt;In order to make use of all the functions regarding date and time, the values will have to be converted into the appropriate types. They data types are defined in the XMLSchema namespace &lt;a href="http://www.w3.org/2001/XMLSchema"&gt;http://www.w3.org/2001/XMLSchema&lt;/a&gt; and are:&lt;/p&gt;</description></item><item><title>OSGI, Guice, and Peaberry: first steps</title><link>https://kuelzer.ca/posts/2013/02/27/osgi-guice-and-peaberry-first-steps/</link><pubDate>Wed, 27 Feb 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/02/27/osgi-guice-and-peaberry-first-steps/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been trying to get &lt;a href="https://code.google.com/p/google-guice/"&gt;Google Guice&lt;/a&gt; and &lt;a href="https://code.google.com/p/peaberry/"&gt;Peaberry&lt;/a&gt; to work in my OSGI projects for a while. Google Guice is a great dependency injection framework, and Peaberry promises to bridge the gap between OSGI services and dependency injection.&lt;/p&gt;
&lt;p&gt;However, getting Peaberry to work was not trivial, mostly because there aren&amp;rsquo;t many docs and the quality of the docs is somewhat lacking. The best piece is still this pdf &lt;a href="https://code.google.com/p/peaberry/downloads/detail?name=peaberry%20-%20blending%20services%20and%20extensions.pdf"&gt;Peaberry - blending services and extensions&lt;/a&gt;, but it&amp;rsquo;s a lot of information in very little space.&lt;/p&gt;</description></item><item><title>Type Incompatibility With Maven SCR Plugin</title><link>https://kuelzer.ca/posts/2013/02/06/type-incompatibility-with-maven-scr-plugin/</link><pubDate>Wed, 06 Feb 2013 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2013/02/06/type-incompatibility-with-maven-scr-plugin/</guid><description>&lt;p&gt;Yesterday I ran into a most strange error when compiling one of my OSGI bundles:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ERROR] Failed to execute goal org.apache.felix:maven-scr-plugin:1.7.4:scr (generate-scr-scrdescriptor) on project XXX: A type incompatibility occured while executing org.apache.felix:maven-scr-plugin:1.7.4:scr: com.thoughtworks.qdox.model.Annotation cannot be cast to java.util.List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I saw several variations of that error and was initially clueless as how to fix it. However, I eventually found the problem:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ManagedService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;immediate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Properties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NissanAutoDataUrlGenerator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ManagedService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The mistake is that the &lt;code&gt;@Properties&lt;/code&gt; annotation takes an array as it&amp;rsquo;s parameter. Eclipse does not mark the above as an error, however, the Maven plugin is not happy about it. Here&amp;rsquo;s the correct code:&lt;/p&gt;</description></item><item><title>Google Guice and Scope Mixing</title><link>https://kuelzer.ca/posts/2012/12/11/google-guice-and-scope-mixing/</link><pubDate>Tue, 11 Dec 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/12/11/google-guice-and-scope-mixing/</guid><description>&lt;p&gt;I&amp;rsquo;ve been working on a small Java application I wrote a few years ago for some bug fixes and in the process of making it better, I introduced &lt;a href="https://code.google.com/p/google-guice/"&gt;Google Guice&lt;/a&gt;, my favourite dependency injection framework. On of the great features of Guice is that it supports different &lt;a href="https://code.google.com/p/google-guice/wiki/Scopes"&gt;scopes for injection&lt;/a&gt;. Per default, Guice will return a new object for every request. But sometimes you want to objects to be created a bit less liberally, for example, you want a certain object to be created only once. Guice has a &lt;code&gt;@Singleton&lt;/code&gt; scope for that. Want an object to be created once for a request? Guice and &lt;a href="https://code.google.com/p/google-guice/wiki/Servlets"&gt;guice-servlet&lt;/a&gt; offers &lt;code&gt;@RequestScoped&lt;/code&gt; and &lt;code&gt;SessionScoped&lt;/code&gt;. But there&amp;rsquo;s more, need JUnit per test scope? &lt;a href="https://code.google.com/p/guiceberry/"&gt;Guiceberry&lt;/a&gt; has exactly that: &lt;code&gt;@TestScoped&lt;/code&gt; that will make sure every test gets exactly one object.&lt;/p&gt;</description></item><item><title>Reading List: JVM Internals, Rugged Software, and 12 Factor Apps</title><link>https://kuelzer.ca/posts/2012/12/04/reading-list-jvm-internals-rugged-software-and-12-factor-apps/</link><pubDate>Tue, 04 Dec 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/12/04/reading-list-jvm-internals-rugged-software-and-12-factor-apps/</guid><description>&lt;p&gt;Recently I&amp;rsquo;ve been reading a lot about software development and philosophies on how to write better software. I really enjoyed the &lt;a href="https://www.ruggedsoftware.org/"&gt;Rugged Manifesto&lt;/a&gt; as it emphasizes how software is crucial in our world and the responsibilities that come with it.
Another great guide is &lt;a href="http://www.12factor.net/"&gt;Twelve-Factor App&lt;/a&gt;, a list of 12 principles on how to effectively implement and operate applications.
And last but not least, &lt;a href="http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals"&gt;Understanding JVM Internals&lt;/a&gt;, a really well written cross cut through the JVM, including class file format, JVM structure and stack memory layouts.&lt;/p&gt;</description></item><item><title>Apache Sling Resource Resolver Rules in a Nutshell</title><link>https://kuelzer.ca/posts/2012/11/20/apache-sling-resource-resolver-rule-priority-explained/</link><pubDate>Tue, 20 Nov 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/11/20/apache-sling-resource-resolver-rule-priority-explained/</guid><description>&lt;p&gt;If you work with Apache Sling, you have probably encountered the ResourceResolver and its configuration rules.
In short, the ResourceResolver is the part of Sling that resolves incoming requests to actual or virtual
resources. For example, if a request for &lt;code&gt;/foo/bar&lt;/code&gt; is coming in the resolver will resolve that to a
corresponding node in the JCR. However, sometimes it is not desireable to expose the internal structure of the
repository or the required external structure cannot be represented using the JCR. In that case the resolver
can be customized by installing resolver rules. Resolver rules can be modified via the OSGI configuration
editor or the OSGI ConfigurationAdmin.&lt;/p&gt;</description></item><item><title>commons-logging in OSGI Environments</title><link>https://kuelzer.ca/posts/2012/11/14/commons-logging-in-osgi-environments/</link><pubDate>Wed, 14 Nov 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/11/14/commons-logging-in-osgi-environments/</guid><description>&lt;p&gt;While working on a small toy project using Apache Felix and commons-httpclient, I kept running into the issue that there is no official OSGI bundle for Apache commons-logging out there. While most Apache commons projects either provide simple bundles or full blown OSGI implementations with Activators and Services, commons-logging is an interesting exception. If you scan the &lt;a href="http://wiki.apache.org/commons/CommonsOsgi"&gt;Commons OSGI status page&lt;/a&gt;, you will notice that there is no OSGI version for commons-logging available, and a separate section to explain why. I haven&amp;rsquo;t dug into why and how it conflicts with the OSGI classloading scheme, but I can see that being a problem. Be it as it may, there is no official OSGI bundle for commons logging.&lt;/p&gt;</description></item><item><title>OSGI Bootstrapping</title><link>https://kuelzer.ca/posts/2012/10/23/osgi-bootstrapping/</link><pubDate>Tue, 23 Oct 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/10/23/osgi-bootstrapping/</guid><description>&lt;p&gt;I&amp;rsquo;ve been working with OSGI based technology for a while now and it&amp;rsquo;s a great piece of technology. However, so far I&amp;rsquo;ve only worked with OSGI technology that runs in existing instances of the framework. A running framework is easy to deal with, but how do you get to this point? I spent some time today playing with that, and it took me a while to put it all together. So naturally, I&amp;rsquo;ll have to record my findings here.&lt;/p&gt;</description></item><item><title>OSGI Classloading Reading List</title><link>https://kuelzer.ca/posts/2012/10/12/osgi-classloading-reading-list/</link><pubDate>Fri, 12 Oct 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/10/12/osgi-classloading-reading-list/</guid><description>&lt;p&gt;I&amp;rsquo;ve been doing a lot of reading on how OSGI handles class loading. I&amp;rsquo;m starting to fully understand and leverage OSGI and I&amp;rsquo;m trying to keep my framework &lt;a href="https://github.com/ilikeorangutans/omf"&gt;Object Mapper&lt;/a&gt; as compatible with OSGI as I can.&lt;/p&gt;
&lt;p&gt;In OSGI classloading is very restricted, similar to what happens in enterprisy Java application servers, and completely unlike traditional Java applications where everything shares a single classloader. In OSGI each bundle has its own classloader and what is visible accross the bundle boundaries is subject to strict export rules. In order to use a class outside of a bundle you&amp;rsquo;ll have to explicitly declare its package as exported. There are many benefits to this strict architecture, clean architectures, reusable components and the ability to update bundles at runtime are probably the most important ones.&lt;/p&gt;</description></item><item><title>Horray for Jekyll</title><link>https://kuelzer.ca/posts/2012/06/22/horray-for-jekyll/</link><pubDate>Fri, 22 Jun 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/06/22/horray-for-jekyll/</guid><description>&lt;p&gt;So I finally got around to play with Jekyll, a static site generator for websites. I was initially sceptical whether a static site generator would be up for running a blog, but after playing with it for a bit, I&amp;rsquo;m in love with this concept. The ability to write my posts in vim (MacVim that is) and version them with Git makes me very happy. As much as I like Wordpress, it&amp;rsquo;s getting more and more sluggish (on my old server at least) and every time I&amp;rsquo;m logging in to it, I spend half an hour installing updates and patches. And with every upgrade I&amp;rsquo;m worried about the database &amp;ndash; even though, in Wordpress&amp;rsquo; defense, no upgrade ever broke the database. Also, I&amp;rsquo;m particularly impressed with support for syntax highlighting, which is absolutely essential for technical posts. I&amp;rsquo;m still digging through the documentation and learning how to use Jekyll, but I&amp;rsquo;m getting there.&lt;/p&gt;</description></item><item><title>Panoramas from Delhi, India</title><link>https://kuelzer.ca/posts/2012/06/22/panoramas-from-delhi/</link><pubDate>Fri, 22 Jun 2012 13:59:40 -0400</pubDate><guid>https://kuelzer.ca/posts/2012/06/22/panoramas-from-delhi/</guid><description>&lt;p&gt;I spent some time in India and at a few spots I took enough pictures to create panoramas. Make sure you click the links to the full version and zoom to the original size of the image. They&amp;rsquo;re huge and you can scroll around for a bit and discover nice details.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kuelzer.ca/posts/2012/06/22/panoramas-from-delhi/india-gate.jpg"&gt;
 &lt;img src="https://kuelzer.ca/posts/2012/06/22/panoramas-from-delhi/india-gate_hu_acbf5d1cc0a464b5.jpg"
 width="800"
 height="112" alt="India Gate Panorama"&gt;
 &lt;/a&gt;
Full version: &lt;a href="india-gate.jpg"&gt;India Gate Panorama&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kuelzer.ca/posts/2012/06/22/panoramas-from-delhi/delhi-panorama.jpg"&gt;
 &lt;img src="https://kuelzer.ca/posts/2012/06/22/panoramas-from-delhi/delhi-panorama_hu_cb0fc8a987e9e533.jpg"
 width="800"
 height="276" alt="Delhi Rooftop Panorama"&gt;
 &lt;/a&gt;
Full version: &lt;a href="delhi-panorama.jpg"&gt;Delhi Rooftop Panorama&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>SSH (Remote) Tunnels</title><link>https://kuelzer.ca/posts/2011/01/02/ssh-remote-tunnels/</link><pubDate>Sun, 02 Jan 2011 12:36:58 -0400</pubDate><guid>https://kuelzer.ca/posts/2011/01/02/ssh-remote-tunnels/</guid><description>&lt;p&gt;Just figured out how SSH remote tunnels work and wanted to write it down.&lt;/p&gt;
&lt;p&gt;Nomenclature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;[Local] Client&lt;/em&gt;: your local computer. In fact, if I say local, I mean the client.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;[Remote] Server&lt;/em&gt;: the server you connect to. If I say remote, I mean server.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="forward-tunnels"&gt;Forward Tunnels&lt;/h3&gt;
&lt;p&gt;Your standard tunnel, allows you to take a local port and redirect it to a remote port on the server:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ssh -L REMOTEPORT:client:CLIENTPORT user@server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, that by opening a tunnel in this way:&lt;/p&gt;</description></item><item><title>Antlr Grammars for Fun and Profit</title><link>https://kuelzer.ca/posts/2010/11/24/antlr-grammars-for-fun-and-profit/</link><pubDate>Wed, 24 Nov 2010 23:10:35 -0400</pubDate><guid>https://kuelzer.ca/posts/2010/11/24/antlr-grammars-for-fun-and-profit/</guid><description>&lt;p&gt;Recently at work I had to work on files in our legacy system. Those files, being part of a proprietary product, are unknown to any editor or pretty printer that you can find. And most of them are not formatted nicely, if at all. Being a lazy developer I really love eclipse&amp;rsquo;s code formatting features, because, hey, it takes away a lot of tedious and annoying formatting. Also, I think properly formatted files are easier to understand, maintain and fix. In fact, as I recently tweeted, I go as far as saying that I&amp;rsquo;m not particularly good in spotting problems, I just format everything which helps me to understand better.&lt;/p&gt;</description></item><item><title>Building a CMS with XML, XSLT, Ant, and ImageMagik</title><link>https://kuelzer.ca/posts/2010/01/03/building-a-cms-with-xml-xslt-ant-and-imagemagik/</link><pubDate>Sun, 03 Jan 2010 11:37:30 -0400</pubDate><guid>https://kuelzer.ca/posts/2010/01/03/building-a-cms-with-xml-xslt-ant-and-imagemagik/</guid><description>&lt;p&gt;Not so long ago a freelance client approached me with some updates for their website. The site has been growing organically since 2000 and therefore was a big mess. Several attempts to port the site to a CMS driven system failed largely because those CMS systems are usually to complex for our needs (Typo3) or not flexible enough (Joomla, WordPress). So as I was faced with updates to all the updates including image updates which in turn needed thumbnails to be generated. The same day I stumbled randomly over the &lt;a href="http://www.w3.org/TR/xslt20/"&gt;xsl:result-document&lt;/a&gt; function in XSLT 2.0 which allows you to transform a single XML file into several output files. That sparked an idea with me: why not use that to build a CMS system using XML technologies? I&amp;rsquo;ve toyed around with &lt;a href="http://cocoon.apache.org/"&gt;Cocoon&lt;/a&gt; a couple of years ago but that was not what I was looking for. So I looked for other technologies&amp;hellip;&lt;/p&gt;</description></item></channel></rss>