
  <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
      <title>kvz.io</title>
      <link>https://kvz.io/blog</link>
      <description>A blog on building: software, infra, and a company</description>
      <language>en-us</language>
      <managingEditor>kevin@vanzonneveld.net (Kevin van Zonneveld)</managingEditor>
      <webMaster>kevin@vanzonneveld.net (Kevin van Zonneveld)</webMaster>
      <lastBuildDate>Wed, 21 Jan 2026 00:00:00 GMT</lastBuildDate>
      <atom:link href="https://kvz.io/feed.xml" rel="self" type="application/rss+xml"/>
      
  <item>
    <guid>https://kvz.io/blog/2026-01-21-ai-grief</guid>
    <title>Stages of grief in AI development</title>
    <link>https://kvz.io/blog/2026-01-21-ai-grief</link>
    <description>A personal reflection on accepting AI&#39;s disruption to software engineering, and the new puzzles that emerge once you get past the grief.</description>
    <pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>ai</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2024-10-24-cursor</guid>
    <title>Cursor: an AI dev starter guide</title>
    <link>https://kvz.io/blog/2024-10-24-cursor</link>
    <description>After three months of daily use, here&#39;s what I learned about getting the most out of Cursor for AI-assisted development.</description>
    <pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cursor</category><category>ai</category><category>javascript</category><category>typescript</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2022-07-26-macos-install</guid>
    <title>Setting up macOS for JS development</title>
    <link>https://kvz.io/blog/2022-07-26-macos-install</link>
    <description>Three years ago MacBooks were in a pretty bad spot for me and I switched to Ubuntu, later Pop!_OS. It was a fun ride. While coding I felt very productive because the OS is so low in distractions and just feels incredibly responsive. Installing the world via apt beats brew 10x, and native Docker on Linux is so much faster it isn&#39;t even funny. We had to abandon Docker because we had folks with macOS on the team. But, other tasks (email, conference calling, scanning, word, upgrading without breakage) came with more friction, and those tend to fill up ever larger shares of my day.</description>
    <pubDate>Tue, 26 Jul 2022 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>macos</category><category>osx</category><category>apple</category><category>javascript</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2021-11-25-js-to-ts</guid>
    <title>Steps to Convert JavaScript to TypeScript</title>
    <link>https://kvz.io/blog/2021-11-25-js-to-ts</link>
    <description>I&#39;ve been slowly falling in love with TypeScript. I have a thousand little JS projects. Small prototypes with minimal tests and documentation. Often just to help me get a thing done. Typically when I revisited those after some months,
I would be a complete stranger with no mental map of all the components or constraints or decisions that led to things being as they are.</description>
    <pubDate>Thu, 25 Nov 2021 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>javascript</category><category>typescript</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2019-12-11-something-completely-different</guid>
    <title>And Now for Something Completely Different (NL)</title>
    <link>https://kvz.io/blog/2019-12-11-something-completely-different</link>
    <description>So far I have not used my writing for advertisement. Even (or especially) when I&#39;m reviewing products, I&#39;ve never taken free equipment, cash, guest/sponsored content, or anything of that nature. I may link to my own company but that&#39;s about it.</description>
    <pubDate>Wed, 11 Dec 2019 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>different</category><category>think</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2019-10-30-tobuntu</guid>
    <title>Going from macOS to Ubuntu</title>
    <link>https://kvz.io/blog/2019-10-30-tobuntu</link>
    <description>It&#39;s not the first time I&#39;m switching to Ubuntu. I&#39;ve been, as they say, around the block when it comes to operating systems. I started out on MS, from DOS to XP, then Ubuntu from 5.10 Breezy to 9.10 Karmic, then on Apple from OSX 10.5 Leopard to macOS 10.14 Mojave. Both in terms of productivity and delight I had my best years on Apple and I didn&#39;t think I&#39;d ever look back. But here we are.</description>
    <pubDate>Wed, 30 Oct 2019 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>macos</category><category>osx</category><category>apple</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2017-09-05-freewrite</guid>
    <title>Freewrite</title>
    <link>https://kvz.io/blog/2017-09-05-freewrite</link>
    <description>Today I&#39;ve unwrapped an Austrohaus Freewrite. Half a year ago I was feeling a bit overworked. I&#39;m privileged in that I love my work a lot - so much that if I don&#39;t restrain myself it can eclipse the private life. As a result I was looking for new hobbies. Hobbies that wouldn&#39;t involve computers so much. At the same time, I enjoy myself the most when I&#39;m doing something useful-ish.

I thought I&#39;d really enjoy writing more. However, sitting behind a laptop it&#39;s easy to fall into the trap of checking email, Slack, or doing research. Before I know it I&#39;m lost on Wikipedia, or Facebook. Those activities have their time and place but I didn&#39;t want them leaking into my hobby. I wanted to enjoy some quiet time with just my brain.

You&#39;re thinking: &quot;So, use pen and paper&quot;. They too, have their moments, but I&#39;m so spoiled by tech that I can&#39;t stand the inefficiency of my deplorable handwriting, nor the thought of having to transfer that writing to my blog somehow. I wanted to remove barriers to encourage writing - not add new ones.</description>
    <pubDate>Tue, 05 Sep 2017 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>review</category><category>writing</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2017-09-03-how-not-to-become-a-programmer</guid>
    <title>How (not) to become a programmer</title>
    <link>https://kvz.io/blog/2017-09-03-how-not-to-become-a-programmer</link>
    <description>I recently answered a [question on Quora](https://www.quora.com/Is-it-true-that-programming-is-not-for-everyone/answer/Kevin-van-Zonneveld):

&gt; Is it true that programming is not for everyone?

And thought I&#39;d elaborate my take on this here..</description>
    <pubDate>Sun, 03 Sep 2017 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>programming</category><category>questions</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2017-01-04-introducing-lanyon</guid>
    <title>Introducing Lanyon</title>
    <link>https://kvz.io/blog/2017-01-04-introducing-lanyon</link>
    <description>&gt; This project also has its own homepage at [lanyon.io](https://lanyon.io).</description>
    <pubDate>Wed, 04 Jan 2017 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>browsersync</category><category>jekyll</category><category>nodejs</category><category>staticsites</category><category>webdev</category><category>webpack</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2016-02-18-a-universal-makefile-for-javascript</guid>
    <title>The Universal Makefile for JavaScript</title>
    <link>https://kvz.io/blog/2016-02-18-a-universal-makefile-for-javascript</link>
    <description>&gt; TL;DR The world is moving from Gulp and Grunt towards npm scripts. This seems like a place we could stay for a long time. But there&#39;s one shortcoming with npm scripts, especially when compared to Makefile: it&#39;s a sub-optimal command-line experience. So I wrote Fakefile: a universal Makefile that you can save into any Node project to offer your npm scripts as Makefile targets. This makes operating npm scripts ten times faster, and offers a polite language agnostic way into your project to people coming from non-js backgrounds. Just type npm install fakefile and profit instantly.</description>
    <pubDate>Thu, 18 Feb 2016 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>buildtools</category><category>nodejs</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2015-09-21-introducing-airbud</guid>
    <title>Introducing Airbud</title>
    <link>https://kvz.io/blog/2015-09-21-introducing-airbud</link>
    <description>Retrieving stuff from the web is unreliable. Airbud adds retries for production, and fixture support for test.</description>
    <pubDate>Mon, 21 Sep 2015 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>nodejs</category><category>reliability</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2015-09-16-watch-your-language</guid>
    <title>Watch Your Language (Automatically)</title>
    <link>https://kvz.io/blog/2015-09-16-watch-your-language</link>
    <description>I was writing internal documentation on how I set up automated language checking at Transloadit. Halfway through, I thought this could be useful to the rest of the world :earth_americas: as well, so I rewrote it in a more generic fashion. I&#39;ll attempt to first give a high-level overview of the problem, then I will drive all the way down to the low-level nuts &amp; bolts of solving it. I hope you&#39;ll enjoy, here goes!</description>
    <pubDate>Wed, 16 Sep 2015 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>ci</category><category>english</category><category>language</category><category>testing</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2015-02-10-tus-1.0-prerelease</guid>
    <title>tus 1.0-prerelease</title>
    <link>https://kvz.io/blog/2015-02-10-tus-1.0-prerelease</link>
    <description>It&#39;s been a while since I&#39;ve mentioned tus, but there have been some cool developments so we&#39;d like to refresh your memory.</description>
    <pubDate>Tue, 10 Feb 2015 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>reliability</category><category>tus</category><category>uploading</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2014-12-21-introducing-ratestate</guid>
    <title>Introducing Ratestate</title>
    <link>https://kvz.io/blog/2014-12-21-introducing-ratestate</link>
    <description>Ratestate is a ratelimiter in the form of a [Node.js module](https://npmjs.org/package/ratestate) that can transmit states of different entities while avoiding transmitting the same state twice, and adhering to a global speed limit.</description>
    <pubDate>Sun, 21 Dec 2014 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>backpressure</category><category>circuitbreaker</category><category>flowcontrol</category><category>nodejs</category><category>performance</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2014-05-17-introducing-environmental</guid>
    <title>Introducing Environmental</title>
    <link>https://kvz.io/blog/2014-05-17-introducing-environmental</link>
    <description>Some people feel that shipping .json / .yml / .xml config files is an upgrade over using archaic environment variables.</description>
    <pubDate>Sat, 17 May 2014 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>nodejs</category><category>tooling</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2014-05-01-git-hour-tracking</guid>
    <title>Git Hour Tracking</title>
    <link>https://kvz.io/blog/2014-05-01-git-hour-tracking</link>
    <description>Recently I was asked to estimate how many hours I worked on a project. Since I hadn&#39;t really tracked them I decided to use the Git history to get an indication.</description>
    <pubDate>Thu, 01 May 2014 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>git</category><category>hours</category><category>timelog</category><category>timetracking</category><category>track</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2014-04-11-fixing-heartbleed</guid>
    <title>Fixing Heartbleed</title>
    <link>https://kvz.io/blog/2014-04-11-fixing-heartbleed</link>
    <description>Four days ago the news about the Heartbleed got every sysadmin&#39;s attention. Renowned security expert Bruce Schneier writes:

&gt; This means that anything in memory -- SSL private keys, user keys, anything -- is vulnerable. And you have to assume that it is all compromised. All of it.
&gt;
&gt; &quot;Catastrophic&quot; is the right word. On the scale of 1 to 10, this is an 11.</description>
    <pubDate>Fri, 11 Apr 2014 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>heartbleed</category><category>openssl</category><category>security</category><category>ssl</category><category>stunnel</category><category>transloadit</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2014-02-21-how-to-deprecate-projects-on-github</guid>
    <title>GitHub Spring Cleaning - the Deprecation Hack</title>
    <link>https://kvz.io/blog/2014-02-21-how-to-deprecate-projects-on-github</link>
    <description>Almost spring here! Birds are chirping and we start cleaning out our kitchens and backyards and closets and GitHub accounts. Let&#39;s trash some legacy!

Why? Because

- We&#39;re ashamed of old code
- We want to save money by having a lower (private) repo count
- We want to improve the signal-to-noise on our profiles before a job interview
- Spring

But wait, what if your co-worker wants to access some of those commits again? You probably don&#39;t feel like peeling archives from crashed backup drives in the basement of your previous building.

Renan and I faced this at true.nl and we started looking for simple solutions.</description>
    <pubDate>Fri, 21 Feb 2014 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>git</category><category>github</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-12-21-one-git-commit-hook-to-rule-them-all</guid>
    <title>It&#39;s Almost 2014 and We Are Still Committing Broken Code</title>
    <link>https://kvz.io/blog/2013-12-21-one-git-commit-hook-to-rule-them-all</link>
    <description>Despite testcases, syntax errors still find their way into our commits.

- Maybe it was a change in that bash script that wasn&#39;t covered by tests. Too bad our deploys relied on it.
- Maybe it was just a textual change and we didn&#39;t think it was necessary to run the associated code before pushing this upstream. Too bad we missed that quote.

Whatever the reason, it&#39;s almost 2014 and we are still committing broken code. This needs to change because in the

- Best case: Travis or Jenkins prevent those errors from hitting production and it&#39;s frustrating to go back and revert/redo that stuff. A waste of your time and state of mind, as you already moved onto other things.
- Worst case: your error goes unnoticed and hits production.

Git offers commit hooks to prevent bad code from entering the repository, but you have to install them on a local per-project basis.

Chances are you have been too busy/lazy and never took the time/effort to whip up a commit hook that could deal with all your projects and programming languages.

That holds true for me, however I recently had some free time and decided to invest it in cooking up ochtra. One Commit Hook To Rule All.</description>
    <pubDate>Sat, 21 Dec 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>ci</category><category>git</category><category>go</category><category>golang</category><category>javascript</category><category>jenkins</category><category>php</category><category>python</category><category>ruby</category><category>travis</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-12-02-make-your-mysql-table-strict</guid>
    <title>Make Your MySQL Tables Strict</title>
    <link>https://kvz.io/blog/2013-12-02-make-your-mysql-table-strict</link>
    <description>When you&#39;re upgrading to MySQL 5.6 you may notice strict mode is turned
on by default. You can disable it, but now might be a good time to
get your schemas strict, to ensure smooth upgrade paths in the future.</description>
    <pubDate>Mon, 02 Dec 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>mysql</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-11-21-bash-best-practices</guid>
    <title>Best Practices for Writing Bash Scripts</title>
    <link>https://kvz.io/blog/2013-11-21-bash-best-practices</link>
    <description>&gt; This project now has its own homepage at bash3boilerplate.sh.</description>
    <pubDate>Thu, 21 Nov 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-09-03-file-uploading-without-serverside-code</guid>
    <title>File Uploading Without a Server</title>
    <link>https://kvz.io/blog/2013-09-03-file-uploading-without-serverside-code</link>
    <description>More and more sites are written in flat HTML. Hosted on GitHub pages,
S3, etc. The advantages are clear: ridiculously low to no hosting costs, it can
hardly ever break, and with things like Jekyll and Octopress
it can still be fun to maintain. And with JavaScript frameworks such as Angular you
could build entire apps clientside. The downsides are clear too: no central point of knowledge makes
interaction between users hard.

However with services like Disqus, and (my own startup) Transloadit, it gets more
and more feasible to just run a flat site and have external services cover for not
running serverside code and a database yourself.

In this post I&#39;m going to show you how easy it is to make file uploading possible
even if your site is just a single page of HTML.</description>
    <pubDate>Tue, 03 Sep 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>amazon</category><category>aws</category><category>encoding</category><category>html</category><category>transloadit</category><category>uploading</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-08-12-yesterday-i-wrote-my-first-firefox-os-app</guid>
    <title>Yesterday I Wrote My First Firefox OS App</title>
    <link>https://kvz.io/blog/2013-08-12-yesterday-i-wrote-my-first-firefox-os-app</link>
    <description>Yesterday I wrote my first Firefox OS App.</description>
    <pubDate>Mon, 12 Aug 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apps</category><category>arduino</category><category>automation</category><category>fxos</category><category>javascript</category><category>mobile</category><category>raspberrypi</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-07-25-fix-vagrant-box-hanging-at-boot</guid>
    <title>Fix Vagrant Box Hanging at Boot</title>
    <link>https://kvz.io/blog/2013-07-25-fix-vagrant-box-hanging-at-boot</link>
    <description>Sometimes it happens that vagrant hangs during boot of your virtual image. Right after typing:

``bash
$ vagrant up
`

It hangs for a long time and then finally throws:

`bash
[default] Failed to connect to VM!
Failed to connect to VM via SSH. Please verify the VM successfully booted
by looking at the VirtualBox GUI.
``

If you open VirtualBox you&#39;ll see that the virtual machine preview shows a black
screen with kernels to choose from. This is GRUB requiring user input to boot further.

Here&#39;s how to fix that.</description>
    <pubDate>Thu, 25 Jul 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>boot</category><category>grub</category><category>kernel</category><category>linux</category><category>vagrant</category><category>virtualbox</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-07-15-deploy-to-variable-targets-with-capistrano</guid>
    <title>Deploy to a Dynamic Serverlist With Capistrano</title>
    <link>https://kvz.io/blog/2013-07-15-deploy-to-variable-targets-with-capistrano</link>
    <description>At our company we use Capistrano for deploys. It reads Ruby instructions
from a ./Capfile in the project&#39;s root directory, then deploys
accordingly via SSH. It has support for releases, shared log dirs, rollbacks,
rsync vs remote cached git deploys, etc. It can be run from any machine
that has access to your production servers. Be it your workstation, or a
Continuous Integration server.

So all in all pretty convenient but typically it assumes you know what servers you
want to deploy to at the time of writing your Capfile.

What if the composition of your platform changes often? Will you keep changing
the Capfile right before every deploy? Seems like effort ; )</description>
    <pubDate>Mon, 15 Jul 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>capistrano</category><category>deploy</category><category>ruby</category><category>ssh</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-07-12-prefix-streaming-stdout-and-stderr-in-golang</guid>
    <title>Prefix Streaming stdout &amp; stderr in Go</title>
    <link>https://kvz.io/blog/2013-07-12-prefix-streaming-stdout-and-stderr-in-golang</link>
    <description>If you are writing code in Go and are executing a lot of (remote) commands,
you may want to indent all of their
output, prefix the loglines with hostnames, or mark anything that was thrown to stderr
red, so you can spot errors more easily.

For this purpose I wrote Logstreamer.</description>
    <pubDate>Fri, 12 Jul 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>go</category><category>golang</category><category>shell</category><category>ssh</category><category>streams</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-04-23-change-your-codebase-to-use-triple-equality</guid>
    <title>Loosely Typed Code Deserves Triple Equality</title>
    <link>https://kvz.io/blog/2013-04-23-change-your-codebase-to-use-triple-equality</link>
    <description>In loosely typed languages such as JavaScript or PHP, using `==`
to compare values is bad practice because it doesn&#39;t
account for type, hence `false == 0 == &#39;&#39; == null == undefined`, etc.
And you may accidentally match more than you bargained for.

If you want you can limit unintended effects &amp; bugs this may lead to,
it&#39;s often wise to use `===`.

In the process of converting legacy
codebases to use these triple equality operators, I find that as a rule
of thumb you can almost **always force triple equality** in case of
comparing variables against **non-numerical strings**.

There&#39;s just never a case where you want the text `&#39;Kevin&#39;`
to pass for the boolean `true`, or the number `3`.
And if that can still happen in your legacy codebase,
you&#39;ll want to limit those risks rather sooner than later. Even if that
breaks things that now accidentally, work.</description>
    <pubDate>Tue, 23 Apr 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>coding style</category><category>javascript</category><category>operators</category><category>php</category><category>regex</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-04-19-obtain-all-text-from-your-website</guid>
    <title>Scrape All Text From a Domain</title>
    <link>https://kvz.io/blog/2013-04-19-obtain-all-text-from-your-website</link>
    <description>Here are some commands to download the most important pages of your
site as plain text (determined by `MAX_DEPTH`), and save it into one
big `DOMAIN.txt` file.

This could come in handy when you want to have everything checked for
grammar &amp; spelling errors.

After the spellcheck you&#39;d still have to search through your
codebase / database to find &amp; fix the culprits, but this should already save
you some time in discovery.</description>
    <pubDate>Fri, 19 Apr 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>grammar</category><category>markdown</category><category>spelling</category><category>wget</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-04-16-migrate-redis-data-without-filesystem-access</guid>
    <title>Migrate Redis Keys Without RDB Files</title>
    <link>https://kvz.io/blog/2013-04-16-migrate-redis-data-without-filesystem-access</link>
    <description>Recently we moved the Transloadit status page
from an unmanaged EC2 instance to the Nodejitsu platform.
We kept status uptime history in redis, and obviously I wanted to preserve that
data.

For the new setup I did not have access to the filesystem, I only had a redis
port to talk to. So instead of rsyncing the .rdb file I used Redis replication
to migrate the data between instances.</description>
    <pubDate>Tue, 16 Apr 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>database</category><category>migration</category><category>redis</category><category>replication</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-03-24-poormans-way-to-decent-dns-failover</guid>
    <title>Let&#39;s Make DNS Outage Suck Less</title>
    <link>https://kvz.io/blog/2013-03-24-poormans-way-to-decent-dns-failover</link>
    <description>Unfortunately the Linux DNS resolver has no direct support for detecting and doing failovers for DNS servers. It keeps feeding requests to your primary resolving nameserver, waits for a configured timeout, attempts again, and only then tries the second nameserver.

This typically means nearly 30s delay for all request as long as your primary nameserver is unreachable. It doesn&#39;t learn to directly target your secondary nameserver so long as there is trouble.

Even with the most optimal configuration, the delay will still be measured in seconds per request. For many requests, that&#39;s many more seconds.

I wanted to solve this.</description>
    <pubDate>Sun, 24 Mar 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>campfire</category><category>crontab</category><category>dns</category><category>linux</category><category>nameserver</category><category>papertrail</category><category>redundancy</category><category>spof</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-03-04-find-duplicate-input-with-mysql</guid>
    <title>Find Duplicate Input With MySQL</title>
    <link>https://kvz.io/blog/2013-03-04-find-duplicate-input-with-mysql</link>
    <description>Back to basic, let&#39;s brush up on some `SQL` :)

At my company we have employees creating customer accounts every day.
Sometimes we make mistakes, for instance, we forget to check if the
company already was a customer (maybe 10y ago they may have had a product).

Duplicate accounts can cause all sorts of problems, so I wanted
way to detect them with `SQL`.

The problem was, the company names may have been entered with
different punctuation, whitespace,
etc. So I needed similar names to surface from the depths of our database,
not just exact matches (that would have been too easy :)</description>
    <pubDate>Mon, 04 Mar 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>mysql</category><category>soundex</category><category>sql</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-02-26-introducing-bash3boilerplate</guid>
    <title>Introducing BASH3 Boilerplate</title>
    <link>https://kvz.io/blog/2013-02-26-introducing-bash3boilerplate</link>
    <description>&gt; This project now has its own homepage at bash3boilerplate.sh.</description>
    <pubDate>Tue, 26 Feb 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-02-18-osx-productivity-dropbox-your-screenshots</guid>
    <title>OSX Productivity: Dropbox Your Screenshots</title>
    <link>https://kvz.io/blog/2013-02-18-osx-productivity-dropbox-your-screenshots</link>
    <description>I often share screens with co-workers by Campfire, Github, or mail.
Visualizing something can save you a lot of typing. Show people
what button shade doesn&#39;t look quite right, instead of explaining in 1000+ characters.
Share a load graph without saving &amp; attaching images, or handing out basic auth credentials.
The list goes on &amp; on. Once you make it a joy to share, you&#39;ll find use-cases on
a daily basis, and it is my believe you&#39;ll lose less time on typing and miscommunication.</description>
    <pubDate>Mon, 18 Feb 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>campfire</category><category>dropbox</category><category>osx</category><category>productivity</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-02-13-too-many-authentication-failures-for-root</guid>
    <title>Too Many Authentication Failures for Root</title>
    <link>https://kvz.io/blog/2013-02-13-too-many-authentication-failures-for-root</link>
    <description>I recently had an annoying encounter with the error message:
`Too many authentication failures for root`.
I found out this can be caused because you&#39;ve hoarded too many SSH keys :)

So serves me right, but let&#39;s see what happens exactly.</description>
    <pubDate>Wed, 13 Feb 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>linux</category><category>security</category><category>ssh</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-02-11-macosx-persistent-mounted-network-drives</guid>
    <title>Keep Mounted Network Drives Alive on OSX</title>
    <link>https://kvz.io/blog/2013-02-11-macosx-persistent-mounted-network-drives</link>
    <description>I love my NAS but because I tried to save a little money it does not [run SABnzbd](/blog/2011/02/28/optimize-your-synology-for-downloading/) very well.

I&#39;ve tried different approaches but find myself ending up downloading on OSX as it writes to a network share on my NAS. Too bad, but I&#39;m archiving this one under the section first world problems.

The challenge I have now though, is when my Mac goes to sleep, my mounts disappear, and SABnzbd writes to the local filesystem instead. Cause as far as my downloading program could tell, it was already writing to a local filesystem, so it will just keep on doing that until my Mac&#39;s disk is at 100%.

I wrote a little script to prevent that.

You may not be running SABnzbd, but there are obviously many other
use cases where you want a network mount to persist.
Especially if you are automating something outside of the GUI.

With some small adjustments this could work for Linux/NFS/SMB as well.</description>
    <pubDate>Mon, 11 Feb 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>crontab</category><category>mount</category><category>nas</category><category>network</category><category>sabnzbd</category><category>solo</category><category>synology</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2013-01-16-vagrant-tip-keep-virtualbox-guest-additions-in-sync</guid>
    <title>Vagrant Tip: Sync VirtualBox Guest Additions</title>
    <link>https://kvz.io/blog/2013-01-16-vagrant-tip-keep-virtualbox-guest-additions-in-sync</link>
    <description>Quick tip. If you lose your Vagrant
mounts after kernel upgrades in your virtualbox,
you&#39;ll need to reinstall your VirtualBox Guest Additions.
Same is true when you upgrade Vagrant, etc.

It&#39;s just a real pain and people usually avoid it by never upgrading.
Or delve in once they accidentally do.
But there&#39;s actually a nice &amp; automated way of keeping your VM&#39;s guest additions in sync with
virtualbox.</description>
    <pubDate>Wed, 16 Jan 2013 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>ubuntu</category><category>vagrant</category><category>virtualbox</category><category>virtualization</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2012-12-31-lock-your-cronjobs</guid>
    <title>Lock Your Cronjobs, Enjoy Your Sleep</title>
    <link>https://kvz.io/blog/2012-12-31-lock-your-cronjobs</link>
    <description>If you use EC2 you may have heard of Tim Kay&#39;s aws commandline tool.
It provides access to most of Amazon&#39;s API and is less cumbersome
than Amazon&#39;s own CLI utilities in day to day use.

A lesser known tool by Tim Kay is solo. It&#39;s basically one line of Perl,
but it&#39;s incredibly useful to defeat a common problem with cronjobs: overlap.</description>
    <pubDate>Mon, 31 Dec 2012 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>cronlock</category><category>crontab</category><category>solo</category><category>timkay</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2012-11-20-installing-hubot-on-ubuntu</guid>
    <title>Installing Hubot on Ubuntu</title>
    <link>https://kvz.io/blog/2012-11-20-installing-hubot-on-ubuntu</link>
    <description>&lt;img src=&quot;/static/images/posts/2012-11-20-installing-hubot-on-ubuntu-0.png&quot; title=&quot;Hubot&quot; alt=&quot;Hubot&quot;/&gt;

We used to run
Hubot on Heroko until
it crashed, not sure what happened exactly but we didn&#39;t bother to bring it back due to more pressing issues
within our company.

Then I saw one of the most gorgeous presentations ever,
Intergalactic Javascript Robots from Outer Space,
and it got me excited to run a Hubot again.</description>
    <pubDate>Tue, 20 Nov 2012 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>campfire</category><category>ci</category><category>coffeescript</category><category>hubot</category><category>nodejs</category><category>npm</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2012-11-03-highlevel-testing-with-casperjs</guid>
    <title>Highlevel Testing With CasperJS</title>
    <link>https://kvz.io/blog/2012-11-03-highlevel-testing-with-casperjs</link>
    <description>If you&#39;ve written a webapp and you want to ensure that critical parts such as the signup process stay working, the best would be to have an actual user go through that process every time you change your codebase. But since that&#39;s both tedious &amp; expensive, the second best thing is to automate a chrome browser (webkit engine anyway) to do this for you, and upload screenshots if anything unexpected happens.

Welcome to CasperJS!</description>
    <pubDate>Sat, 03 Nov 2012 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>campfire</category><category>casperjs</category><category>ci</category><category>coffeescript</category><category>homebrew</category><category>javascript</category><category>nodejs</category><category>npm</category><category>osx</category><category>testing</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2012-10-09-reverse-a-multibyte-string-in-php</guid>
    <title>Reverse a Multibyte String in PHP</title>
    <link>https://kvz.io/blog/2012-10-09-reverse-a-multibyte-string-in-php</link>
    <description>PHP&#39;s strrev
is not safe to use on utf-8 strings because it reverses a string
one byte at a time. So if a character consists of multiple bytes it cannot be preserved
as an entity in the reversed result.

There is no Multibyte String alternative
to strrev either.</description>
    <pubDate>Tue, 09 Oct 2012 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>multibyte</category><category>performance</category><category>php</category><category>utf8</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2012-10-03-quick-server-debugging-with-wtf</guid>
    <title>Quick Server Debugging With WTF</title>
    <link>https://kvz.io/blog/2012-10-03-quick-server-debugging-with-wtf</link>
    <description>If something weird is happening, you want to know everything that&#39;s going on
on a server, as fast as possible.

At these times, you will be very happy to have a simple alias `wtf` installed
that you can type immediately after logging into a server, and see
all that it&#39;s busy with.</description>
    <pubDate>Wed, 03 Oct 2012 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>debugging</category><category>linux</category><category>server</category><category>tail</category><category>wtf</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2011-04-29-faster-php-sessions</guid>
    <title>Revisiting Faster PHP Sessions</title>
    <link>https://kvz.io/blog/2011-04-29-faster-php-sessions</link>
    <description>&gt; &quot;Simplicity is prerequisite for reliability.&quot;

[Edsger W. Dijkstra](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD498.html)

As our experience grows, we learn from past mistakes and discover what&#39;s truly important in reliable systems.
When designing systems, simplicity is an often heard mantra, but it isn&#39;t getting applied nearly as much as spoken of. I&#39;m guilty of this too. I think it&#39;s mainly because engineers love to, well, engineer :) and will naturally try to [outsmart problems by throwing more tech at it](https://teddziuba.com/2010/12/the-3-basic-tools-of-systems-engineering.html).</description>
    <pubDate>Fri, 29 Apr 2011 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>devshm</category><category>io</category><category>linux</category><category>memcache</category><category>pecl</category><category>performance</category><category>php</category><category>ram</category><category>tmpfs</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2011-03-31-spaces-vs-tabs</guid>
    <title>Revisiting Spaces and Tabs</title>
    <link>https://kvz.io/blog/2011-03-31-spaces-vs-tabs</link>
    <description>This article in 50 words: I used to prefer spaces vs tabs, now I don&#39;t care so much, think it&#39;s
more important that you can easily switch on a per-project basis. Have some thoughts on how conventions
should be established, and I&#39;ll demonstrate bash code that can convert your codebase to a new standard.</description>
    <pubDate>Thu, 31 Mar 2011 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>cakephp</category><category>cs</category><category>ide</category><category>indentation</category><category>javascript</category><category>nodejs</category><category>php</category><category>spaces</category><category>tabs</category><category>vim</category><category>whitespace</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2011-02-28-optimize-your-synology-for-downloading</guid>
    <title>Optimize Your Synology NAS for Downloading</title>
    <link>https://kvz.io/blog/2011-02-28-optimize-your-synology-for-downloading</link>
    <description>I recently bought a NAS so my data is safe &amp; available, with the benefit of being low
power / noise / heat.
I&#39;ve considered Netgear, QNAP, but decided to go for a Synology
as it was affordable, still had a big community, decent reviews &amp; Time Machine support.</description>
    <pubDate>Mon, 28 Feb 2011 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>crontab</category><category>nas</category><category>performance</category><category>sabnzbd</category><category>screen</category><category>synology</category><category>tmux</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2011-01-28-install-sabnzbd-on-your-synology</guid>
    <title>Install SABnzbd, Sickbeard, Couchpotato on Your Synology DSM 3 NAS</title>
    <link>https://kvz.io/blog/2011-01-28-install-sabnzbd-on-your-synology</link>
    <description>The Synology ships with a Download Station but it&#39;s not remotely as
advanced as [SABnzbd](https://sabnzbd.org/). What I mostly miss is automatic
par &amp; unpacking of its downloads. Here&#39;s how to fix that.</description>
    <pubDate>Fri, 28 Jan 2011 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>nas</category><category>sabnzbd</category><category>synology</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-12-03-sync-vim-accross-workplaces</guid>
    <title>Sync Vim Config Across Workspaces</title>
    <link>https://kvz.io/blog/2010-12-03-sync-vim-accross-workplaces</link>
    <description>As a Vim newbie, I&#39;d like my Vim plugins &amp; configuration
to stay in sync between machines at home, office, my servers &amp; a laptop.

I found that a (free)
Dropbox
account works like a charm.</description>
    <pubDate>Fri, 03 Dec 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>dropbox</category><category>ide</category><category>programming</category><category>vim</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-11-30-learning-vim</guid>
    <title>Learning Vim</title>
    <link>https://kvz.io/blog/2010-11-30-learning-vim</link>
    <description>In an attempt to familiarize myself with the unfamiliar, I decided to build
a fun side-project in Ruby and Vim.
Effectively learning a new language, framework, and editor.

Coming from Nano, Quanta,
Eclipse PDT,
TextMate,
Netbeans; I found (Mac/g)Vim is big a step, and
first two weeks you should not expect to be productive.</description>
    <pubDate>Tue, 30 Nov 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>eclipse</category><category>ide</category><category>netbeans</category><category>programming</category><category>vim</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-10-15-5000000-visitors-free-beer-for-switzerland</guid>
    <title>5,000,000 Visitors = Free Beer for Switzerland!</title>
    <link>https://kvz.io/blog/2010-10-15-5000000-visitors-free-beer-for-switzerland</link>
    <description>When I started this techblog in 2007 and got my first 500 real visitors, I was in
the clouds. If you told me then I&#39;d hit the 5,000,000 visitor milestone 3 years later,
I would have probably slapped some sense into you.

Not in my wildest dreams did I imagine my little side-project would take off like this.</description>
    <pubDate>Fri, 15 Oct 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>php</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-09-21-ruby-with-nginx-on-ubuntu-lucid</guid>
    <title>Running Ruby on Rails on Nginx</title>
    <link>https://kvz.io/blog/2010-09-21-ruby-with-nginx-on-ubuntu-lucid</link>
    <description>If you want to set up Ruby on Rails on Ubuntu Lucid from scratch, there are
quite
some
articles online to choose from. I found most of them involve compiling,
only highlight 1 aspect, or are a bit outdated.

On top of that, getting it right can be hard as there are a number of
issues related to
Ruby and Debian/Ubuntu.

This is an attempt to put all the sweet info in 1 place.</description>
    <pubDate>Tue, 21 Sep 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>gems</category><category>mongrel</category><category>mysql</category><category>nginx</category><category>programming</category><category>ror</category><category>ruby</category><category>sqlite</category><category>thin</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-08-11-haproxy-logging</guid>
    <title>HAProxy Logging in Ubuntu Lucid</title>
    <link>https://kvz.io/blog/2010-08-11-haproxy-logging</link>
    <description>At Transloadit we use
HAProxy &quot;The Reliable, High Performance TCP/HTTP Load Balancer&quot; so that we can offer different services on 1 port.

For instance, depending on the hostname, a requests to port 80 can be routed to either nodejs (in case of api.transloadit.com), or nginx (in case of www.transloadit.com).

HAProxy has been good to us and setting it up was a breeze. But getting HAProxy to log on Ubuntu Lucid was harder than I thought.
All of the tutorials I found either didn&#39;t cover logging, or had deprecated information on it.

Google suddenly stopped being my friend.</description>
    <pubDate>Wed, 11 Aug 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>haproxy</category><category>logging</category><category>nginx</category><category>nodejs</category><category>rsyslogd</category><category>syslog</category><category>transloadit</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-07-13-announcing-transloadit</guid>
    <title>Announcing transloadit.com</title>
    <link>https://kvz.io/blog/2010-07-13-announcing-transloadit</link>
    <description>Today we are very happy to announce the commercial availability of
[transloadit.com](https://transloadit.com).</description>
    <pubDate>Tue, 13 Jul 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>nodejs</category><category>startup</category><category>transloadit</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-06-20-notes-on-dpc10</guid>
    <title>Notes on Dutch PHP Conference 2010</title>
    <link>https://kvz.io/blog/2010-06-20-notes-on-dpc10</link>
    <description>Here the notes I took during the Dutch PHP conference 2010 (#dpc10). They&#39;re not a representative
summary of the event&#39;s highlights cause I could only attend 1 of 4 talks at any given time.

I also filtered out things that didn&#39;t interest me personally.</description>
    <pubDate>Sun, 20 Jun 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>conference</category><category>dpc</category><category>dpc</category><category>dpc10</category><category>php</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-05-15-analyze-http-requests-with-tshark</guid>
    <title>Analyze HTTP Requests With TShark</title>
    <link>https://kvz.io/blog/2010-05-15-analyze-http-requests-with-tshark</link>
    <description>When you&#39;re debugging a tough problem you sometimes need to analyze the
HTTP traffic flowing between your machine and a webserver or proxy.
Sometimes you can use firebug or chrome inspector for that. But here&#39;s a
lowlevel alternative that I&#39;m pretty excited about. Meet Tshark.</description>
    <pubDate>Sat, 15 May 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>analyze</category><category>bash</category><category>firebug</category><category>http</category><category>network</category><category>shell</category><category>squid</category><category>tools</category><category>tshark</category><category>wireshark</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-04-27-convert-all-tables-to-innodb-in-one-go</guid>
    <title>Convert All Tables to InnoDB</title>
    <link>https://kvz.io/blog/2010-04-27-convert-all-tables-to-innodb-in-one-go</link>
    <description>Some time ago I was in the situation where I was looking at 200 MyISAM tables
screaming to get converted to InnoDB for performance reasons.
You probably know that MyISAM is better at full-text searches and such,
but what I needed was this database stop locking entire tables when I was
just doing row-level interactions. Here&#39;s how I did **in one go**.</description>
    <pubDate>Tue, 27 Apr 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>database</category><category>innodb</category><category>mysql</category><category>performance</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-03-25-redis-in-php</guid>
    <title>Redis PHP Introduction</title>
    <link>https://kvz.io/blog/2010-03-25-redis-in-php</link>
    <description>Don&#39;t know Redis? Think Memcache, with support for
for lists, and disk-based storage.
You can use Redis as a database, queue, cache server or all of those combined.
Let&#39;s see how you can use this power in your PHP apps.</description>
    <pubDate>Thu, 25 Mar 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>database</category><category>memcache</category><category>performance</category><category>php</category><category>redis</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-03-21-access-mysql-without-password</guid>
    <title>Access MySQL Without Password</title>
    <link>https://kvz.io/blog/2010-03-21-access-mysql-without-password</link>
    <description>If you want to do command-line MySQL administration like restoring databases
or dumping statistics, you need the root account and its password. Or do you?</description>
    <pubDate>Sun, 21 Mar 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>database</category><category>mysql</category><category>password</category><category>security</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-02-24-cakephp-and-nginx</guid>
    <title>CakePHP and Nginx</title>
    <link>https://kvz.io/blog/2010-02-24-cakephp-and-nginx</link>
    <description>I still got sites running Apache, but all new projects are launched with
Nginx. I don&#39;t need many of the features that Apache offers, and the speed
gain of Nginx is just tremendous. Once you&#39;ve experienced it, I doubt you&#39;ll
want to go back.</description>
    <pubDate>Wed, 24 Feb 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>cakephp</category><category>nginx</category><category>performance</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2010-01-13-cakephp-rest-plugin-presentation</guid>
    <title>CakePHP REST Plugin Presentation</title>
    <link>https://kvz.io/blog/2010-01-13-cakephp-rest-plugin-presentation</link>
    <description>At our company we have a lot of uses for a solid API. We can use it to
distribute config files, have servers report in, let customers edit DNS
records using their own interface, etc.</description>
    <pubDate>Wed, 13 Jan 2010 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>api</category><category>cakephp</category><category>php</category><category>programming</category><category>rest</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-12-15-run-nodejs-as-a-service-on-ubuntu-karmic</guid>
    <title>Run Node.js as a Service on Ubuntu</title>
    <link>https://kvz.io/blog/2009-12-15-run-nodejs-as-a-service-on-ubuntu-karmic</link>
    <description>The core of our new project runs on Node.js. With Node you can write
very fast JavaScript programs serverside. It&#39;s pretty easy to install Node,
code your program, and run it. But how do you make it run nicely in the
background like a true server?</description>
    <pubDate>Tue, 15 Dec 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>daemon</category><category>karmic</category><category>nodejs</category><category>php</category><category>transloadit</category><category>ubuntu</category><category>upstart</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-11-08-git-migration-remove-passwords-from-history</guid>
    <title>Git Migration - Remove Passwords From History</title>
    <link>https://kvz.io/blog/2009-11-08-git-migration-remove-passwords-from-history</link>
    <description>When migrating projects over to GitHub, I found there were still some
passwords inside my SVN repositories. Obviously it&#39;s not good practice to
store your passwords in a code repository - let alone at a remote location, so
I wanted to replace all passwords. Not only in the current version, but in all
commits that have been made over the past 3 years. Luckily with Git - you can.</description>
    <pubDate>Sun, 08 Nov 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>git</category><category>github</category><category>svn</category><category>versioncontrol</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-10-11-generate-html-with-php</guid>
    <title>Generate HTML With PHP</title>
    <link>https://kvz.io/blog/2009-10-11-generate-html-with-php</link>
    <description>Hi. Have you met KvzHTML? It&#39;s a standalone PHP Class for generating HTML.

It&#39;s been hiding deep inside the caverns of my secret GitHub repo: kvzlib

- a collection of code snippets too small or unfinished to deserve their own
  repository. But I find working with this class so pleasant, I thought I&#39;d
  share the fun.</description>
    <pubDate>Sun, 11 Oct 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>generators</category><category>github</category><category>html</category><category>kvzhtml</category><category>kvzlib</category><category>php</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-09-03-svn-to-git</guid>
    <title>Svn to Git</title>
    <link>https://kvz.io/blog/2009-09-03-svn-to-git</link>
    <description>Today I&#39;ve moved all of my SVN repositories over to GitHub. 5 private reps and
4 public ones. Two of which you may know: PHP.JS and System_Daemon.</description>
    <pubDate>Thu, 03 Sep 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>git</category><category>github</category><category>pear</category><category>phpjs</category><category>programming</category><category>svn</category><category>system_daemon</category><category>trac</category><category>versioncontrol</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-08-19-flush-memcached-using-bash</guid>
    <title>Flush Memcached Using Bash</title>
    <link>https://kvz.io/blog/2009-08-19-flush-memcached-using-bash</link>
    <description>If you store application data in memcache, you may want to invalidate it once
you deploy a new version to avoid corruption or weird results. There are
several ways to do this but I recently tried one using nothing but Bash, and I
like it.</description>
    <pubDate>Wed, 19 Aug 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>cakephp</category><category>flush</category><category>memcached</category><category>netcat</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-07-29-prepare-for-php-53</guid>
    <title>Prepare for PHP 5.3</title>
    <link>https://kvz.io/blog/2009-07-29-prepare-for-php-53</link>
    <description>PHP 5.3 is a big leap forward for PHP and brings of a lot of neat features.
However, big leaps can also mean big changes and potentially big breakage when
it comes to backwards compatibility.</description>
    <pubDate>Wed, 29 Jul 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cakephp</category><category>mysql</category><category>php</category><category>php53</category><category>programming</category><category>virtualization</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-07-15-notes-on-cakefest-3</guid>
    <title>Notes on CakeFest 3</title>
    <link>https://kvz.io/blog/2009-07-15-notes-on-cakefest-3</link>
    <description>Looking back at a great CakeFest in Berlin, I learned a lot about CakePHP and
met many nice and inspiring people. Here are some conference notes I took that
were particularly useful or new to me.</description>
    <pubDate>Wed, 15 Jul 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>berlin</category><category>cakephp</category><category>conference</category><category>event</category><category>notes</category><category>php</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-06-10-create-short-ids-with-php-like-youtube-or-tinyurl</guid>
    <title>Create Youtube-Like IDs With PHP/Python/Javascript/Java/SQL</title>
    <link>https://kvz.io/blog/2009-06-10-create-short-ids-with-php-like-youtube-or-tinyurl</link>
    <description>IDs are often numbers. Unfortunately there are only 10 digits to work with,
so if you have a lot of records, IDs tend to get very lengthy. For
computers that&#39;s OK. But human beings like their IDs as short as possible.
So how can we **make IDs shorter**? Well, we could borrow characters from
the alphabet as have them pose as additional numbers....
Alphabet to the rescue!</description>
    <pubDate>Wed, 10 Jun 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>database</category><category>java</category><category>javascript</category><category>mysql</category><category>php</category><category>programming</category><category>python</category><category>sql</category><category>tinyurl</category><category>youtube</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-05-25-install-the-best-coding-font</guid>
    <title>Install the Best Coding Font</title>
    <link>https://kvz.io/blog/2009-05-25-install-the-best-coding-font</link>
    <description>If you are in IT professionally (coding or sysadmin) you will be staring at
monospaced fonts for many many hours a day. So it&#39;s probably justified to
spend 2 minutes picking a very good one. It can make your work (typing ; )
just a little bit more pleasing.</description>
    <pubDate>Mon, 25 May 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>desktop</category><category>font</category><category>ide</category><category>incolsolata</category><category>monospaced</category><category>programming</category><category>sysadmin</category><category>terminal</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-05-17-fix-flash-problems-on-ubuntu</guid>
    <title>Fix Flash Problems on Ubuntu</title>
    <link>https://kvz.io/blog/2009-05-17-fix-flash-problems-on-ubuntu</link>
    <description>I had some difficulties playing Flash videos lately. Problems ranged from
lagging sound, to ugliness, to idling black screens, to strange gray Play
buttons that didn&#39;t do anything. The following solved my Flash issues on
Ubuntu.</description>
    <pubDate>Sun, 17 May 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>flash</category><category>flv</category><category>ubuntu</category><category>video</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-04-01-have-fun-with-google-chart</guid>
    <title>Have Fun With Google Chart</title>
    <link>https://kvz.io/blog/2009-04-01-have-fun-with-google-chart</link>
    <description>Pictures say more than a thousand words. This is true for your data as well.
With Google Chart you can now easily generate charts of your data. No
expertise required. Just make sure you format your data correctly, add it to
the Google Chart URL, and it will return a nice graph.</description>
    <pubDate>Wed, 01 Apr 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>api</category><category>benchmark</category><category>chart</category><category>google</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-03-31-boost-mysql-performance-by-1200</guid>
    <title>Boost MySQL Performance by 1200%</title>
    <link>https://kvz.io/blog/2009-03-31-boost-mysql-performance-by-1200</link>
    <description>Sorry folks, this article was based on flawed benchmark results, I will soon
post [an update](/blog/2009/03/31/improve-mysql-insert-performance/)!</description>
    <pubDate>Tue, 31 Mar 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>benchmark</category><category>bulk</category><category>database</category><category>innodb</category><category>mysql</category><category>performance</category><category>php</category><category>transactions</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-03-31-improve-mysql-insert-performance</guid>
    <title>Improve MySQL Insert Performance</title>
    <link>https://kvz.io/blog/2009-03-31-improve-mysql-insert-performance</link>
    <description>Sometimes MySQL needs to work hard. I&#39;ve been working on an import script that
fires a lot of INSERTs. Normally our database server handles 1,000 inserts /
sec. That wasn&#39;t enough. So I went looking for methods to improve the speed of
MySQL inserts and was finally able to increase this number to 28,000 inserts
per second. Checkout my late night benchmarking adventures.</description>
    <pubDate>Tue, 31 Mar 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>benchmark</category><category>bulk</category><category>database</category><category>innodb</category><category>mysql</category><category>performance</category><category>php</category><category>transactions</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-03-04-sql-formatting</guid>
    <title>The Pragmatic SQL Style Guide</title>
    <link>https://kvz.io/blog/2009-03-04-sql-formatting</link>
    <description>Code spends more time being [read than being written](https://www.codinghorror.com/blog/archives/000684.html). I think naturally this is true for queries as well. So it might help if we teach ourselves some
guidelines as how to nicely format them.

I&#39;ve searched but at the time of writing, could not find a public Style Guide for SQL formatting. I&#39;ll try to keep this guide short and pragmatic, so that it has a chance of actually being read &amp; stuck to : )</description>
    <pubDate>Wed, 04 Mar 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cs</category><category>database</category><category>mysql</category><category>sql</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-02-22-7-steps-to-better-pear-documentation</guid>
    <title>7 Steps to Better PEAR Documentation</title>
    <link>https://kvz.io/blog/2009-02-22-7-steps-to-better-pear-documentation</link>
    <description>If you&#39;ve written a PEAR package, it&#39;s probably a good idea to submit
some end user documentation. Here&#39;s how to do it.</description>
    <pubDate>Sun, 22 Feb 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cvs</category><category>documentation</category><category>pear</category><category>phd</category><category>php</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-02-03-post-flood</guid>
    <title>Post Flood</title>
    <link>https://kvz.io/blog/2009-02-03-post-flood</link>
    <description>Hello everyone. Two days ago Feedburner offered me to merge my account with
Google. I thought: why not. But apparently now the URL of my feeds changed.
This messed up my stats, and your RSS reader has marked all of my posts as
unread. I&#39;m very sorry for the inconvenience.</description>
    <pubDate>Tue, 03 Feb 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>feedburner</category><category>rss</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-01-30-a-dry-piece-of-cake</guid>
    <title>A DRY Piece of Cake</title>
    <link>https://kvz.io/blog/2009-01-30-a-dry-piece-of-cake</link>
    <description>So I&#39;ve been learning CakePHP the last few days. Bit by bit I&#39;ve been
trying to port a legacy administration app to Cake. &#39;Secretly&#39; linking
menuitems to finished Cake parts as we go. And I must say: I&#39;m pretty excited.
I did run into a disturbing conclusion though. I estimated the legacy app will
have over 300 Models &amp; Controllers once finished. That could easily add up to
(300 x 4 =) 1200 views. And here I am, creating a maintenance hell while
trying to solve one!</description>
    <pubDate>Fri, 30 Jan 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cakephp</category><category>dry</category><category>mvc</category><category>php</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2009-01-09-create-daemons-in-php</guid>
    <title>Create Daemons in PHP</title>
    <link>https://kvz.io/blog/2009-01-09-create-daemons-in-php</link>
    <description>Everyone knows PHP can be used to create websites. But it can also be used
to create desktop applications and commandline tools. And now with a class
called System_Daemon, you can even create daemons using nothing but PHP.
And did I mention it was easy?</description>
    <pubDate>Fri, 09 Jan 2009 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>daemon</category><category>pear</category><category>php</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-12-02-my-new-ide-netbeans</guid>
    <title>My New IDE: NetBeans</title>
    <link>https://kvz.io/blog/2008-12-02-my-new-ide-netbeans</link>
    <description>Writing code requires two important things: _creativity_ &amp; _discipline_. The
**creativity** to create the unknown, unexplored, exciting parts of software.
And the **discipline** to create the dull &amp; all-too-well-known parts of
software / documentation.</description>
    <pubDate>Tue, 02 Dec 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>eclipse</category><category>ide</category><category>netbeans</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-11-08-search-for-a-package-with-aptfile</guid>
    <title>Search for a Package With apt-file</title>
    <link>https://kvz.io/blog/2008-11-08-search-for-a-package-with-aptfile</link>
    <description>Recently I needed `ogg123` on an Ubuntu server to convert some media.
Naturally, I wanted to use `aptitude` to install it, but I didn&#39;t know what
package it was in. Now, you can always google of course, but you can also use
system commands to find the package you need.</description>
    <pubDate>Sat, 08 Nov 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apt</category><category>aptfile</category><category>dpkg</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-10-16-orgeclipseemfecoreutilecoreemap</guid>
    <title>org.eclipse.emf.ecore.util.EcoreEMap</title>
    <link>https://kvz.io/blog/2008-10-16-orgeclipseemfecoreutilecoreemap</link>
    <description>One error that has bugged my Eclipse PDT for a long time, was
\_org.eclipse.emf.ecore.util.EcoreEMap $DelegateEObjectContainmentEList. \_A
vague error, not much to go on, not many hits on google either. Turned out it
had to do with the version of my Java Runtime Environment I was using.</description>
    <pubDate>Thu, 16 Oct 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>eclipse</category><category>ide</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-10-14-rescuing-my-messed-up-eclipse</guid>
    <title>Rescuing my Messed Up Eclipse</title>
    <link>https://kvz.io/blog/2008-10-14-rescuing-my-messed-up-eclipse</link>
    <description>Hi folks. As you may or may not know, I have a
[love/hate relationship with my IDE: Eclipse PDT](/blog/2008/04/11/my-new-ide-eclipse-pdt/).
For times and times we get along well. But once every
while it gets messed up, and it&#39;s a pain to straighten it out again. Or at
least, it was.</description>
    <pubDate>Tue, 14 Oct 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>eclipse</category><category>ide</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-10-06-how-virtualization-will-improve-your-code</guid>
    <title>How Virtualization Will Improve Your Code</title>
    <link>https://kvz.io/blog/2008-10-06-how-virtualization-will-improve-your-code</link>
    <description>Good testing will result in better code. If you have to wait endlessly for on
SVN commits, uploads or compile steps, you will simply produce less inventive
code. This has to do with: patience, creativity flow, will, and of course
time. Constantly being interrupted breaks concentration. If there&#39;s one thing
I&#39;ve really learned, it&#39;s **invest in a good testing environment**. Rapid
review of code results will pay off (I promise).</description>
    <pubDate>Mon, 06 Oct 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>database</category><category>ide</category><category>lamp</category><category>mysql</category><category>programming</category><category>ubuntu</category><category>virtualbox</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-09-24-pear-coding-standards-changed</guid>
    <title>PEAR Coding Standards Changed!</title>
    <link>https://kvz.io/blog/2008-09-24-pear-coding-standards-changed</link>
    <description>In another article I&#39;ve told you about how I would like to see one rule
removed from the PEAR Coding Standards. This rule would allow developers
a bit more flexibility, while staying true to the convention.</description>
    <pubDate>Wed, 24 Sep 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cs</category><category>ide</category><category>pear</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-09-13-virtualization-compared</guid>
    <title>Virtualization Compared</title>
    <link>https://kvz.io/blog/2008-09-13-virtualization-compared</link>
    <description>Recently I&#39;ve been experimenting with Virtual machines for my development
environment. The goal was to create a Virtual Machine that resembles our main
production server, and have that Virtual Machine mount my workspace project
directory as its DocumentRoot. This way, my code could be served &amp; tested
after every save in my IDE. So no more building / committing delays. And all I
could mess up was a Virtual Machine.</description>
    <pubDate>Sat, 13 Sep 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>ide</category><category>programming</category><category>virtualbox</category><category>virtualization</category><category>vmware</category><category>xen</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-09-05-php-recursive-ksort-ksorttree</guid>
    <title>PHP Recursive ksort: ksortTree</title>
    <link>https://kvz.io/blog/2008-09-05-php-recursive-ksort-ksorttree</link>
    <description>## Working With Trees

When working with tree data structures you often need to craft them in
different ways. PHP offers a lot of functions to change the shape of arrays,
but often they only go 1 level deep. Trees can count an almost infinite number
of levels. Hence we need recursive replacements for our beloved array
functions.</description>
    <pubDate>Fri, 05 Sep 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>array</category><category>hierarchy</category><category>php</category><category>programming</category><category>recursion</category><category>tree</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-09-05-php-recursive-str-replace-replacetree</guid>
    <title>PHP Recursive str_replace: replaceTree</title>
    <link>https://kvz.io/blog/2008-09-05-php-recursive-str-replace-replacetree</link>
    <description>## Working with trees

When working with tree data structures you often need to craft them in
different ways. PHP offers a lot of functions to change the shape of arrays,
but often they only go 1 level deep. Trees can count an almost infinite number
of levels. Hence we need recursive replacements for our beloved array &amp; string
functions.</description>
    <pubDate>Fri, 05 Sep 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>array</category><category>hierarchy</category><category>parsing</category><category>php</category><category>programming</category><category>recursion</category><category>tree</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-08-22-pear-coding-standards-change</guid>
    <title>PEAR Coding Standards Change?</title>
    <link>https://kvz.io/blog/2008-08-22-pear-coding-standards-change</link>
    <description>Since a couple of months now, I&#39;ve been involved with PEAR as a
contributor. Contributing to PEAR means adhering to the
PEAR Coding Standards. Their standards have actually been thought over, and using them
for projects (also outside of PEAR), leads to consistency, and makes it easier
for many developers to understand each other&#39;s code.</description>
    <pubDate>Fri, 22 Aug 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cs</category><category>ide</category><category>pear</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-06-22-enhance-php-session-management</guid>
    <title>Enhance PHP Session Management</title>
    <link>https://kvz.io/blog/2008-06-22-enhance-php-session-management</link>
    <description>In PHP, sessions can keep track of authenticated in users. They are an
essential building block in today&#39;s websites with big communities and a lot of
user activity. Without sessions, everyone would be an anonymous visitor.</description>
    <pubDate>Sun, 22 Jun 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>io</category><category>memcache</category><category>mysql</category><category>pecl</category><category>performance</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-04-11-my-new-ide-eclipse-pdt</guid>
    <title>My New IDE: Eclipse PDT</title>
    <link>https://kvz.io/blog/2008-04-11-my-new-ide-eclipse-pdt</link>
    <description>I&#39;ve been programming a lot with Quanta which is a lightweight kdevelop based
IDE. It did the trick for quite some time, but recent developments in my
coding life like SVN brought me on a Quest for my new ultimate PHP
IDE.</description>
    <pubDate>Fri, 11 Apr 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>eclipse</category><category>ide</category><category>programming</category><category>svn</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-03-29-better-performance-with-mod-deflate</guid>
    <title>Better Performance With mod_deflate</title>
    <link>https://kvz.io/blog/2008-03-29-better-performance-with-mod-deflate</link>
    <description>I used to use Dean Edwards Javascript Packer a lot to compress my Javascript
sources. Libraries of 100kB could easily shrink to 30kB and that saves load
times &amp; bandwidth. A good [writeup by Julien Lecompte](https://www.julienlecomte.net/blog/2007/08/13/) made me realize that
there were better ways.</description>
    <pubDate>Sat, 29 Mar 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>htaccess</category><category>io</category><category>javascript</category><category>performance</category><category>programming</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-03-26-allow-windows-users-to-restart-service</guid>
    <title>Allow Windows Users to Restart Service</title>
    <link>https://kvz.io/blog/2008-03-26-allow-windows-users-to-restart-service</link>
    <description>Let&#39;s say you want your local restricted users to be able to restart specific
services. On linux you&#39;d probably type visudo. In Windows I found, you
have to dig a little deeper into the system and really do your research. I
needed several sites, programs and articles. So I thought it might be useful
to others if I&#39;d bundle all the required information in one place. Here it is.</description>
    <pubDate>Wed, 26 Mar 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>sddl</category><category>security</category><category>sid</category><category>windows</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-03-26-determine-sid-of-windows-user</guid>
    <title>Determine SID of Windows User</title>
    <link>https://kvz.io/blog/2008-03-26-determine-sid-of-windows-user</link>
    <description>Sometimes when digging real deep into Windows like I recently had to, you need to have the Windows SID (Security Identifier) of a local user. I wasn&#39;t able to find any standard way of obtaining this info, so I wrote this little VBScript. Might help some people, might not. Putting this online anyway ; )</description>
    <pubDate>Wed, 26 Mar 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>security</category><category>sid</category><category>vbscript</category><category>windows</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2008-02-27-class-imagick-not-found</guid>
    <title>Class &#39;Imagick&#39; Not Found</title>
    <link>https://kvz.io/blog/2008-02-27-class-imagick-not-found</link>
    <description>I tried to do some Image Magick with PHP recently on an Ubuntu
Feisty machine, and even though I had the required package: &#39;php5-imagick&#39;
installed, and I updated my php.ini with imagick.so, I kept getting the
error Class &#39;Imagick&#39; not found. This is how I eventually fixed it.</description>
    <pubDate>Wed, 27 Feb 2008 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>imagemagick</category><category>imagick</category><category>pecl</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-11-28-php-tiff2pdf</guid>
    <title>PHP: tiff2pdf</title>
    <link>https://kvz.io/blog/2007-11-28-php-tiff2pdf</link>
    <description>Or: **How to convert multipage TIFF to PDF in PHP.**</description>
    <pubDate>Wed, 28 Nov 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>ghostscript</category><category>imagemagick</category><category>imagick</category><category>pdf</category><category>pecl</category><category>php</category><category>postscript</category><category>programming</category><category>tiff</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-10-18-disable-snapping-windows-in-compizfusion</guid>
    <title>Disable Snapping Windows in Compiz-Fusion</title>
    <link>https://kvz.io/blog/2007-10-18-disable-snapping-windows-in-compizfusion</link>
    <description>Running compiz-fusion for some time, one thing started to annoy me. Snapping
windows. The first thing I obviously looked for was the Snapping Windows
Plugin. But that was already disabled.</description>
    <pubDate>Thu, 18 Oct 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>compiz</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-10-03-convert-anything-to-tree-structures-in-php</guid>
    <title>Convert Anything to Tree Structures in PHP</title>
    <link>https://kvz.io/blog/2007-10-03-convert-anything-to-tree-structures-in-php</link>
    <description>I recently faced a programming challenge that almost broke my brain. I
needed to create a function that could explode any single-dimensional
array into a full blown tree structure, based on the delimiters
found in its keys. Tricky part was size of the tree could be infinite. I
called the function: explodeTree. And maybe it&#39;s best to first look at an
example.</description>
    <pubDate>Wed, 03 Oct 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>array</category><category>delimiter</category><category>hierarchy</category><category>php</category><category>programming</category><category>recursion</category><category>tree</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-29-fit-more-on-one-screen-using-dpi</guid>
    <title>Fit More on One Screen Using DPI</title>
    <link>https://kvz.io/blog/2007-08-29-fit-more-on-one-screen-using-dpi</link>
    <description>A couple of years ago when everyone still had giant CRT monitors, resolutions
of 1600x1200 were pretty common. Nowadays however 19&quot; TFT monitors often
cannot scale higher than 1280x1024. So how can we still fit more on one
screen? DPI can help!</description>
    <pubDate>Wed, 29 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>display</category><category>dpi</category><category>font</category><category>gnome</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-19-login-automatically-with-ssh-keys</guid>
    <title>Login Automatically With SSH Keys</title>
    <link>https://kvz.io/blog/2007-08-19-login-automatically-with-ssh-keys</link>
    <description>With SSH you can securely login to any Linux server and execute commands
remotely. You can even use SSH to transfer and
[synchronize files from one server to another](/blog/2007/08/16/synchronize-files-with-rsync/). Automating these tasks can make your life easier, but
normally SSH prevents that because it requires you to login every time. Well,
not anymore, in this article I will show you how to connect to SSH without a
password.</description>
    <pubDate>Sun, 19 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>linux</category><category>ssh</category><category>ssh</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-16-synchronize-files-with-rsync</guid>
    <title>Synchronize Files With rsync</title>
    <link>https://kvz.io/blog/2007-08-16-synchronize-files-with-rsync</link>
    <description>Synchronizing files from one server to another is quite awesome. You can
use it for backups, for keeping web servers in sync, and much more. It&#39;s fast and it doesn&#39;t take up as much bandwidth as normal copying would. And the
best thing is, it can be done with only 1 command. Welcome to the wonderful
world of rsync.</description>
    <pubDate>Thu, 16 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>backup</category><category>crontab</category><category>linux</category><category>rsync</category><category>ssh</category><category>ssh</category><category>synchronization</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-04-delete-files-securely-with-shred</guid>
    <title>Delete Files Securely With Shred</title>
    <link>https://kvz.io/blog/2007-08-04-delete-files-securely-with-shred</link>
    <description>Deleting a file or reformatting a disk does not destroy your sensitive data.
The data can easily be undeleted. That&#39;s a good thing if you accidentally
throw something away, but what if you&#39;re trying to destroy financial data, bank
account passwords, or classified company information. What if you want to
clean your computer before selling it for instance?</description>
    <pubDate>Sat, 04 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>linux</category><category>security</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-03-restore-packages-using-dselectupgrade</guid>
    <title>Restore Packages Using dselect-upgrade</title>
    <link>https://kvz.io/blog/2007-08-03-restore-packages-using-dselectupgrade</link>
    <description>It&#39;s always a good idea to backup important data. Your files and settings can
easily be archived. But how can you backup &amp; restore all applications
that you&#39;ve installed over the last couple of years? Here&#39;s an easy trick that
works for both desktops &amp; servers, and that can also be used to synchronize
installed packages in a web cluster, making all the servers run the same
software.</description>
    <pubDate>Fri, 03 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>backup</category><category>pear</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-01-make-iso-images-on-linux</guid>
    <title>Make ISO Images on Linux</title>
    <link>https://kvz.io/blog/2007-08-01-make-iso-images-on-linux</link>
    <description>CDs and DVDs don&#39;t have the eternal life, so you might want to back them up as
ISO images. All the files and properties of the original disc, stored in
a single file. You can also create ISO images and store them on your network
for easy distribution of software installations. Here&#39;s how to create and
mount ISO images on Linux.</description>
    <pubDate>Wed, 01 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>dd</category><category>iso</category><category>linux</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-01-speedup-your-website-with-cache-lite</guid>
    <title>Speedup Your Website With Cache_Lite</title>
    <link>https://kvz.io/blog/2007-08-01-speedup-your-website-with-cache-lite</link>
    <description>Every time a request hits your server, PHP has to do a lot of processing,
all of your code has to be compiled &amp; executed for every single visit. Even
though the outcome of all this processing is often identical for both visitor
21600 and 21601. So why not save the flat HTML generated for visitor 21600,
and serve that to 21601 as well? This will relieve resources of your web
server and database server because less PHP often means less queries.</description>
    <pubDate>Wed, 01 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>caching</category><category>pear</category><category>performance</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-08-01-survive-heavy-traffic-with-your-webserver</guid>
    <title>Survive Heavy Traffic With Your Webserver</title>
    <link>https://kvz.io/blog/2007-08-01-survive-heavy-traffic-with-your-webserver</link>
    <description>Recently two of my articles reached the Digg frontpage at the same day. My web
server isn&#39;t state of the art and it had to handle gigantic amounts of
traffic. But still it served pages to visitors swiftly thanks to a lot of
optimizations. This is how you can prevent heavy traffic from killing your
server.</description>
    <pubDate>Wed, 01 Aug 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>caching</category><category>io</category><category>linux</category><category>mysql</category><category>pear</category><category>performance</category><category>php</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-29-schedule-automatic-updates-on-ubuntu</guid>
    <title>Schedule Automatic Updates on Ubuntu</title>
    <link>https://kvz.io/blog/2007-07-29-schedule-automatic-updates-on-ubuntu</link>
    <description>Making sure your system is up to date is a key attribute to its security.
Furthermore Ubuntu releases updates pretty often and you probably don&#39;t want
to miss out on added stability and features. You could run updates manually,
but why not schedule the updates in the background to make sure you are always
running the latest stable versions, without ever having to worry about it.</description>
    <pubDate>Sun, 29 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>crontab</category><category>security</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-29-schedule-tasks-on-linux-using-crontab</guid>
    <title>Schedule Tasks on Linux Using Crontab</title>
    <link>https://kvz.io/blog/2007-07-29-schedule-tasks-on-linux-using-crontab</link>
    <description>If you&#39;ve got a website that&#39;s heavy on your web server, you might want to run
some processes like generating thumbnails or enriching data in the background.
This way it can not interfere with the user interface. Linux has a great
program for this called cron. It allows tasks to be automatically run in the
background at regular intervals. You could also use it to automatically create
backups, synchronize files, schedule updates, and much more. Welcome to
the wonderful world of crontab.</description>
    <pubDate>Sun, 29 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>crontab</category><category>linux</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-28-block-brute-force-attacks-with-iptables</guid>
    <title>Block Brute Force Attacks With Iptables</title>
    <link>https://kvz.io/blog/2007-07-28-block-brute-force-attacks-with-iptables</link>
    <description>Since 2005 there has been an immense increase in brute force SSH attacks
and though Linux is pretty secure by default, it does not stop evil
programs from indefinitely trying to login with different passwords. Without
proper protection your server is a sitting duck waiting for a bot to guess the
right combination and hit the jackpot. But with just 2 commands we can stop
that.</description>
    <pubDate>Sat, 28 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>firewall</category><category>iptables</category><category>linux</category><category>security</category><category>ssh</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-24-make-ssh-connections-with-php</guid>
    <title>Make SSH Connections With PHP</title>
    <link>https://kvz.io/blog/2007-07-24-make-ssh-connections-with-php</link>
    <description>!ssh phpNot everyone knows about PHP&#39;s capabilities of making SSH connections and executing remote commands, but it can be very useful. I&#39;ve been using it a lot in PHP CLI applications that I run from cronjobs, but initially it was a pain to get it to work. The PHP manual on Secure Shell2 Functions is not very practical or thorough for that matter, so I would like to share my knowledge in this how to, to make it a little less time consuming setting this up.</description>
    <pubDate>Tue, 24 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>cli</category><category>libssh2</category><category>pear</category><category>pecl</category><category>php</category><category>router</category><category>ssh</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-18-create-turbocharged-storage-using-tmpfs</guid>
    <title>Create Turbocharged Storage Using tmpfs</title>
    <link>https://kvz.io/blog/2007-07-18-create-turbocharged-storage-using-tmpfs</link>
    <description>Everyone knows that RAM is so much faster than a hard disk. To
illustrate, while a current SATA disk has peak transfer rates of 375
MB/s, current RAM can do a mind blowing 12,500 MB/s! Normally only the system
itself makes use of this ultra fast storage, but we can also access this space
directly. And that opens a great window of opportunity.</description>
    <pubDate>Wed, 18 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>devshm</category><category>io</category><category>linux</category><category>performance</category><category>pxe</category><category>ram</category><category>sata</category><category>tmpfs</category><category>ubuntu</category><category>umask</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-16-control-cache-expire-dates-using-htaccess</guid>
    <title>Control Cache Expire Dates Using Htaccess</title>
    <link>https://kvz.io/blog/2007-07-16-control-cache-expire-dates-using-htaccess</link>
    <description>If you&#39;re running Squid to cache your website, you can use an
htaccess file to control what kind of files should be cached, and for how
long.</description>
    <pubDate>Mon, 16 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>htaccess</category><category>mod_expires</category><category>squid</category><category>vhost</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-15-install-squid-apache-on-1-server</guid>
    <title>Install Squid &amp; Apache on 1 Server</title>
    <link>https://kvz.io/blog/2007-07-15-install-squid-apache-on-1-server</link>
    <description>Let&#39;s say your site is becoming a big success and as a result it&#39;s becoming
slower and slower. There are several things you can do without buying additional
hardware:</description>
    <pubDate>Sun, 15 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>caching</category><category>io</category><category>memcached</category><category>performance</category><category>squid</category><category>ubuntu</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-12-use-pear-with-open-basedir-and-safe-mode-restricti</guid>
    <title>Use PEAR With open_basedir and safe_mode Restrictions</title>
    <link>https://kvz.io/blog/2007-07-12-use-pear-with-open-basedir-and-safe-mode-restricti</link>
    <description>You want your website to be as safe as possible. So you&#39;ll typically want
Open Basedir and Safe Mode to be on. When you&#39;re in a shared hosting
environment, you&#39;ll find that any server administrator with a good sense of
security will also have these restrictions in place. However security pretty
much always limits functionality and this case is no different. Because what
if you are caged in a restricted environment, and you would still like to use
shared libraries like the ones provided by PEAR?</description>
    <pubDate>Thu, 12 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>open_basedir</category><category>pear</category><category>php</category><category>safemode</category><category>vhost</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-11-beautify-urls</guid>
    <title>Beautify URLs</title>
    <link>https://kvz.io/blog/2007-07-11-beautify-urls</link>
    <description>Readable URLs are nice. A well made website will have a logical layout, with
intelligent folder and file names, and as few technical details as possible.
In the most well designed sites, readers can guess at filenames with a high
level of success. Clean URLs are great because they:</description>
    <pubDate>Wed, 11 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>htaccess</category><category>mod_rewrite</category><category>regex</category><category>seo</category><category>url</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-11-cat-a-file-without-the-comments</guid>
    <title>Cat a File, Without the Comments</title>
    <link>https://kvz.io/blog/2007-07-11-cat-a-file-without-the-comments</link>
    <description>I recently had to install a couple of squid servers to act as reverse proxies
for a webcluster. You can teach the squid server to stand in between in the
end users and the webservers, and to store all the static content ( .jpg .flv
.css .htm for example ) in the RAM. This saves a lot of I/O and bandwidth on
the webservers, and it can really speed up a site. At the end of the road
the webservers&#39; load dropped by 92%. But before all this worked, I had to
run through a massive config file and since the squid config file is their
manual at the same time, it&#39;s about 5000 lines long. So I had to find out a
way to filter only the important settings from the config file.</description>
    <pubDate>Wed, 11 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>cat</category><category>comments</category><category>config</category><category>linux</category><category>squid</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-11-change-the-default-editor</guid>
    <title>Change the Default Editor</title>
    <link>https://kvz.io/blog/2007-07-11-change-the-default-editor</link>
    <description>Ever wanted to change the crontab of a server, but got an editor on
screen that you&#39;re totally unfamiliar with? There are a lot of causes for this
annoyance, but one is that somebody recently installed or used midnight commander (mc) which for whatever reason seems to override your session&#39;s default editor.</description>
    <pubDate>Wed, 11 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>bash</category><category>editor</category><category>linux</category><category>mc</category><category>pico</category><category>vim</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-11-whats-the-deal-with-php-value-php-admin-flag-etc</guid>
    <title>What&#39;s the Deal With php_value, php_admin_flag, Etc</title>
    <link>https://kvz.io/blog/2007-07-11-whats-the-deal-with-php-value-php-admin-flag-etc</link>
    <description>I ran across php value, php flag, php admin value and php admin flag in a
couple of .htaccess files, and I&#39;ve used them sometimes as well by just
pasting an example, but I&#39;ve never really understood why there was such a
great diversity. Couldn&#39;t php_setting X Y just handle it, and if not, what do
the admin, value and flag attributes mean?</description>
    <pubDate>Wed, 11 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    <category>apache</category><category>htaccess</category><category>php</category><category>vhost</category>
  </item>

  <item>
    <guid>https://kvz.io/blog/2007-07-10-hello-world</guid>
    <title>Hello, World!</title>
    <link>https://kvz.io/blog/2007-07-10-hello-world</link>
    <description>Hello World! In my day to day I do a lot of development &amp; sysadmin research,
often taking quick notes so I don&#39;t forget.</description>
    <pubDate>Tue, 10 Jul 2007 00:00:00 GMT</pubDate>
    <author>kevin@vanzonneveld.net (Kevin van Zonneveld)</author>
    undefined
  </item>

    </channel>
  </rss>
