<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Till&#39;s blog</title>
    <link>https://till.klampaeckel.de/</link>
    <description>Recent content on Till&#39;s blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 05 Aug 2024 19:00:00 +0000</lastBuildDate>
    <atom:link href="https://till.klampaeckel.de/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Python, No usable temporary directory found</title>
      <link>https://till.klampaeckel.de/posts/214-python-fontconfig-suitable/</link>
      <pubDate>Mon, 05 Aug 2024 19:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/214-python-fontconfig-suitable/</guid>
      <description>I had to Google this today and was kind of surprised by how many odd workarounds are used for this one, and most of them seem wrong.
What is it? The error will create a traceback and it will look similar to this:
Fontconfig error: No writable cache directories time=2024-08-05T17:57:28.924000 level=ERROR location=__init__.py:75:handle_exception msg=&amp;#34;Error&amp;#34; request_id=&amp;#34;&amp;#34; exception=&amp;#34;Traceback (most recent call last): File \&amp;#34;/var/www/.cache/pypoetry/virtualenvs/pdf-maker-xS3fZVNL-py3.12/lib/python3.12/site-packages/flask/app.py\&amp;#34;, line 880, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File \&amp;#34;/var/www/.</description>
    </item>
    <item>
      <title>Rotating Github (Action) secrets</title>
      <link>https://till.klampaeckel.de/posts/212-rotating-github-secrets/</link>
      <pubDate>Sun, 11 Feb 2024 10:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/212-rotating-github-secrets/</guid>
      <description>So, here&amp;rsquo;s a fun problem I ran into at work:
We use Github Actions to deploy all our services to Kubernetes. And in order to do a deployment, we have kube configs (as secrets) setup to connect to a Kubernetes cluster when a workflow runs.
The Kubernetes config has an expiration date and will become invalid when the Kubernetes certificates are rotated (k0s takes great care of that). When they expire, the deploys fail until we update the secret on Github Actions.</description>
    </item>
    <item>
      <title>Terraform and OpenStack: Boot an instance from CD-ROM</title>
      <link>https://till.klampaeckel.de/posts/211-terraform-and-openstack-boot-an-instance-from-cd-rom/</link>
      <pubDate>Thu, 13 May 2021 16:29:35 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/211-terraform-and-openstack-boot-an-instance-from-cd-rom/</guid>
      <description>In the spirit of &amp;ldquo;this took me way too long&amp;rdquo;, here&amp;rsquo;s how to boot an instance with a CD-ROM on OpenStack, using Terraform.
Why would I need this? In a perfect world, I have templates to bootstrap instances. Means, the instances are ready to go when booted. I customise them with cloud-init and let them do all kinds of cool (or necessary) stuff like configuring the network, setting hostnames, adding user accounts and then maybe joining them to a cluster.</description>
    </item>
    <item>
      <title>Terraform: Resource not found</title>
      <link>https://till.klampaeckel.de/posts/210-terraform-resource-not-found/</link>
      <pubDate>Tue, 02 Mar 2021 10:24:15 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/210-terraform-resource-not-found/</guid>
      <description>Here&amp;rsquo;s a few things I learned and did when I encountered the very verbose &amp;ldquo;Resource not found&amp;rdquo; error from Terraform.
Debug your Infrastructure as Code More logs? This is my obvious choice or go-to. Terraform comes with different log levels though it will say itself that every level but TRACE is not to be trusted?
2021/03/02 09:21:33 [WARN] Log levels other than TRACE are currently unreliable, and are supported only for backward compatibility.</description>
    </item>
    <item>
      <title>Ansible Galaxy: Install private roles from private GitHub repositories</title>
      <link>https://till.klampaeckel.de/posts/209-ansible-galaxy-install-private-roles-from-private-github-repositories/</link>
      <pubDate>Tue, 30 Jun 2020 15:31:49 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/209-ansible-galaxy-install-private-roles-from-private-github-repositories/</guid>
      <description>When I googled how to install private roles using ansible-galaxy, I found suggestions such as, &amp;ldquo;use git+https://github.com/&amp;hellip;&amp;rdquo; or even better, &amp;ldquo;I am not sure what you&amp;rsquo;re doing, but it works for me (since Ansible 2.2)&amp;rdquo;.
So, since neither of these suggestions helped me and because I am unable to find documentation with obvious examples, here is how you achieve this.
Assuming you have your ssh key and configuration figured out, put this into requirements.</description>
    </item>
    <item>
      <title>Prometheus: relabel your scrape_config</title>
      <link>https://till.klampaeckel.de/posts/208-prometheus-relabel-your-scrape_config/</link>
      <pubDate>Wed, 22 Apr 2020 16:10:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/208-prometheus-relabel-your-scrape_config/</guid>
      <description>Prometheus labels every data point — the most well-known example of a label is (probably) instance.
Take a look at this query result (query: up{job=&amp;quot;prometheus&amp;quot;}):
up{instance=&amp;quot;127.0.0.1:9090&amp;quot;,job=&amp;quot;prometheus&amp;quot;} 1So what does this tell me?
I queried for the &amp;ldquo;up&amp;rdquo; metric and filtered it for &amp;ldquo;prometheus&amp;rdquo; — yay. The &amp;ldquo;1&amp;rdquo; says, my service is alive. So far so gut.
Readability Since we are in the process of running a few Prometheus servers (in federation), each of those metrics will report back with instance=&amp;quot;127.</description>
    </item>
    <item>
      <title>Bootstrapping molecule instances with volumes</title>
      <link>https://till.klampaeckel.de/posts/207-bootstrapping-molecule-instances-with-volumes/</link>
      <pubDate>Sat, 18 Jan 2020 15:47:39 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/207-bootstrapping-molecule-instances-with-volumes/</guid>
      <description>We use Ansible for all kinds of things. One of it being formatting and mounting a volume to be able to use it.
When I introduced the code for that, it worked (flawlessly, of course) — until I hit a bug when I provisioned another cluster. Long story short, I was able to fix the bug. But since we rely on it to work always, and I wanted to make sure I had all situations covered, I decided to extend one of our tests.</description>
    </item>
    <item>
      <title>NetworkManager (for resolv.conf and firewalld) on CentOS7</title>
      <link>https://till.klampaeckel.de/posts/206-networkmanager-for-resolv.conf-and-firewalld-on-centos7/</link>
      <pubDate>Wed, 25 Sep 2019 12:11:04 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/206-networkmanager-for-resolv.conf-and-firewalld-on-centos7/</guid>
      <description>As I am spiralling into Linux server administration, there&amp;rsquo;s certainly a lot to learn. Certainly a lot leaves me wanting BSD, but since that&amp;rsquo;s not an option, &amp;hellip; here we go.
NetworkManager The NetworkManager on Linux (or CentOS specially) manages the network. Whatever content/blog posts/knowledge base I found. It usually suggests that you uninstall it first. Common problems are that people are unable to manage /etc/resolv.conf — because changes made by them to that file get overwritten again.</description>
    </item>
    <item>
      <title>Ansible Molecule drivers</title>
      <link>https://till.klampaeckel.de/posts/205-ansible-molecule-drivers/</link>
      <pubDate>Fri, 20 Sep 2019 15:09:29 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/205-ansible-molecule-drivers/</guid>
      <description>(Hello again. I haven&amp;rsquo;t blogged in a while. But since I&amp;rsquo;m growing weary of platforms such as medium. Here we go.)
I&amp;rsquo;ve recently spent too much a lot of time with Ansible. Once I got into the rhythm of playbooks, roles and maybe modules/libraries, I desperately needed a way to test my YAML. And by testing, I didn&amp;rsquo;t mean the annoying linting that Ansible ships with, but actual (integration) tests to verify everything works.</description>
    </item>
    <item>
      <title>What&#39;s wrong with composer and your .travis.yml?</title>
      <link>https://till.klampaeckel.de/posts/204-whats-wrong-with-composer-and-your-.travis.yml/</link>
      <pubDate>Sun, 24 Aug 2014 00:02:19 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/204-whats-wrong-with-composer-and-your-.travis.yml/</guid>
      <description>I&amp;rsquo;m a huge advocate of CI and one service in particular called Travis-Ci.
Travis-CI runs a continuous integration platform for both open source and commercial products. In a nutshell: Travis-CI listens for a commit to a Github repository and runs your test suite. Simple as that, no Jenkins required.
At Imagine Easy we happily take advantage of both. :)
So what&amp;rsquo;s wrong? For some reason, every other open source project (and probably a lot of closed source projects), use Travis-CI wrong in a way, that it will eventually break your builds.</description>
    </item>
    <item>
      <title>Speeding up composer on AWS OpsWorks</title>
      <link>https://till.klampaeckel.de/posts/202-speeding-up-composer-on-aws-opsworks/</link>
      <pubDate>Tue, 08 Oct 2013 17:30:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/202-speeding-up-composer-on-aws-opsworks/</guid>
      <description>At EasyBib, we&amp;rsquo;re heavy users of composer and AWS OpsWorks. Since we recently moved a lot of our applications to a continuous deployment model, the benefits of speeding up the deployment process (~4-5 minutes) became more obvious.
Composer install Whenever we run composer install, there are a lot of rount-trips between the server, our satis and Github (or Amazon S3).
One of my first ideas was to to get around a continous reinstall by symlinking the vendor directory between releases.</description>
    </item>
    <item>
      <title>SQL MAX() and GROUP BY for CouchDB</title>
      <link>https://till.klampaeckel.de/posts/201-sql-max-and-group-by-for-couchdb/</link>
      <pubDate>Fri, 04 Oct 2013 20:39:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/201-sql-max-and-group-by-for-couchdb/</guid>
      <description>While re-writing a couple SQL statements into CouchDB we got stuck when we wanted to do a SELECT MAX(...), id ... GROUP BY id in CouchDB.
MySQL Imagine the following SQL table with data:
In order to get the latest deploy for each project, I&amp;rsquo;d issue:
Simple. But what do you do in CouchDB?
CouchDB My documents look like this:
So, after more than a couple hours trying to wrap our heads around map-reduce in CouchDB, it&amp;rsquo;s working.</description>
    </item>
    <item>
      <title>Bento and VirtualBox</title>
      <link>https://till.klampaeckel.de/posts/200-bento-and-virtualbox/</link>
      <pubDate>Tue, 23 Apr 2013 09:44:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/200-bento-and-virtualbox/</guid>
      <description>Last week I blogged some Vagrant tips and pretty much jinxed the run I had in the past months.
Here&amp;rsquo;s how:
I decided to upgrade to Vagrant 1.1, which broke bento: the current bento master is incompatible with Vagrant 1.1. But selecting the right rbenv env and installing the latest available Vagrant gem (inside the rbenv environment) fixed it.
My base box build, but for some reason, the guest addition setup broke and while it worked on Mac OSX, it broke the image completely on Ubuntu.</description>
    </item>
    <item>
      <title>Wanderlust</title>
      <link>https://till.klampaeckel.de/posts/199-wanderlust/</link>
      <pubDate>Tue, 16 Apr 2013 17:37:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/199-wanderlust/</guid>
      <description>At the last meetup of the Berlin PHP Usergroup, Christoph gave a talk about Vagrant.
Good enough of a reason to write down or re-cap some things I&amp;rsquo;ve learned with or about Vagrant over the last two years.
Base boxes There are lots of base boxes available, but don&amp;rsquo;t be tempted to rely on them (e.g. via config.vm.box_url).
Vagrantbox.es doesn&amp;rsquo;t actually mirror images and that is a huge pain. Available base boxes tend to be outdated.</description>
    </item>
    <item>
      <title>From Unfuddle (svn) to git</title>
      <link>https://till.klampaeckel.de/posts/197-from-unfuddle-svn-to-git/</link>
      <pubDate>Sat, 08 Dec 2012 18:30:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/197-from-unfuddle-svn-to-git/</guid>
      <description>I&amp;rsquo;ve blogged about converting a Subversion repository to git a couple times. While it was a tedious process at first, I&amp;rsquo;ve made my peace with it and now cannot count the code repositories I have migrated successfully anymore. The migration usually works, except for when I deal with our old provider unfuddle.
For some reason, sometimes it didn&amp;rsquo;t work right away and I had to re-run git svn clone a couple of times to get it right.</description>
    </item>
    <item>
      <title>Continuous Integration: Automated database setup with Doctrine on Travis-CI</title>
      <link>https://till.klampaeckel.de/posts/192-continuous-integration-automated-database-setup-with-doctrine-on-travis-ci/</link>
      <pubDate>Mon, 13 Aug 2012 13:47:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/192-continuous-integration-automated-database-setup-with-doctrine-on-travis-ci/</guid>
      <description>Testing is important — most people understand that by now. A lot of people write tests for their open source code already, but in-house testing is still hard. For example, many of us had an encounter with Jenkins: it runs well to a point where it becomes harder to maintain the Jenkins than it is to write tests.
Another obstacle is test setup and environments: When I write and run tests, there is sometimes only so much I can do to mock and avoid actual calls to my storage backend.</description>
    </item>
    <item>
      <title>Mind blown: svn:ignore</title>
      <link>https://till.klampaeckel.de/posts/191-mind-blown-svnignore/</link>
      <pubDate>Thu, 09 Aug 2012 14:55:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/191-mind-blown-svnignore/</guid>
      <description>As we migrate away from Subversion, I ran into this little issue today.
Since it&amp;rsquo;s something which popped up time and time again and I never got around to figuring out why this happened in the first place, I decided to put it into a blog post.
Problem? What I did was, I setup an svn:ignore in the root of my Subversion repository, in order to ignore modules which are installed in the app/modules structure:</description>
    </item>
    <item>
      <title>Too much abstraction: Doctrine and PHP</title>
      <link>https://till.klampaeckel.de/posts/190-too-much-abstraction-doctrine-and-php/</link>
      <pubDate>Fri, 06 Jul 2012 15:38:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/190-too-much-abstraction-doctrine-and-php/</guid>
      <description>Personally — I feel like I&amp;rsquo;m really, really late to get on the Doctrine train.
I&amp;rsquo;ve tried Doctrine 1 a few years back and found it mostly too complicated for my needs. For all I know, I still find PEAR::DB and PEAR::MDB2 the perfect database abstraction layers (DBAL). Though of course they may or may not be totally up to date in terms of PHP etc.. The overall concept of an ORM never stuck with me.</description>
    </item>
    <item>
      <title>Vagrant: ShellProvisioner vs. Chef</title>
      <link>https://till.klampaeckel.de/posts/189-vagrant-shellprovisioner-vs.-chef/</link>
      <pubDate>Wed, 20 Jun 2012 09:45:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/189-vagrant-shellprovisioner-vs.-chef/</guid>
      <description>In my last blog entry, I demo&amp;rsquo;d how to get started with Vagrant and the ShellProvisioner.
To further illustrate how amazingly simple it is to get started on some Ruby, I&amp;rsquo;ll convert the shell script from my last blog post to a little recipe for chef. Same objective, we install a PEAR package — but it could be anything really.
Follow me.
Shell This is the shell script from before:</description>
    </item>
    <item>
      <title>Vagrant sans Ruby</title>
      <link>https://till.klampaeckel.de/posts/188-vagrant-sans-ruby/</link>
      <pubDate>Tue, 05 Jun 2012 12:45:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/188-vagrant-sans-ruby/</guid>
      <description>Development, testing, staging and production — this is how most people devide up different environments for application development.
Maintenance and setup of these environments is often not a trivial goal to achieve. Having worked with a couple different code bases and setups over the last decade, I often noticed things like environment specific hacks (if ($env == &#39;testing&#39;) { ... }) in application code and service configurations and a lot of manual labour all around.</description>
    </item>
    <item>
      <title>Composer and chef updates</title>
      <link>https://till.klampaeckel.de/posts/187-composer-and-chef-updates/</link>
      <pubDate>Sun, 03 Jun 2012 16:20:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/187-composer-and-chef-updates/</guid>
      <description>Here are some updates on my chef resource for composer:
It started off with a PR where I was asked to include code that would download (and install) a composer.phar if none existed. Not a bad idea in general, but also not something I want to impose on anyone, so I decided to create a new action (or in chef-lingo goal) instead.
setup Up until now, my php_composer resource supported :install which runs php composer.</description>
    </item>
    <item>
      <title>Zend Framework: CRUD</title>
      <link>https://till.klampaeckel.de/posts/183-zend-framework-crud/</link>
      <pubDate>Mon, 21 May 2012 15:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/183-zend-framework-crud/</guid>
      <description>Update, 2012-05-24: Fixed some typos and added the screenshot (eyecandy!).
I think it took me (or us) a couple attempts to get this right — let me introduce you to Zf_Crud, a CRUD controller for the Zend Framework.
What&amp;rsquo;s CRUD? CRUD is an acronym and stands for:
Create Read Update Delete A general purpose for CRUD are administrative interfaces — view records, create them, update them or delete them. Think of phpMyAdmin as a very general purpose CRUD interface.</description>
    </item>
    <item>
      <title>Expose services via an ssh tunnel</title>
      <link>https://till.klampaeckel.de/posts/186-expose-services-via-an-ssh-tunnel/</link>
      <pubDate>Mon, 07 May 2012 14:52:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/186-expose-services-via-an-ssh-tunnel/</guid>
      <description>Ever since I remember, I have this inability to learn the most basic things, until I actually write down a couple notes or instructions somewhere. This is one of these notes blog posts — so in case it&amp;rsquo;s too basic, just skip over it. Or bear with me.
ssh tunnels — useful and powerful. They can help me with all kinds of trickery — e.g. usually for remoting through a tight firewall setup to access remote resources.</description>
    </item>
    <item>
      <title>Your own personal opinion</title>
      <link>https://till.klampaeckel.de/posts/more-than-140-characters/185-your-own-personal-opinion/</link>
      <pubDate>Fri, 06 Apr 2012 13:50:37 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/more-than-140-characters/185-your-own-personal-opinion/</guid>
      <description>I guess most of you have probably come across blogs which have one of these disclaimers:
This is my personal opinion, and not my employers.
Here are my thoughts on these.
Perspective I think there is always a certain point of view when you read these things.
If you have to put this on your personal blog because your opinion and your employer&amp;rsquo;s opinion differ so much, it might be time to find another job.</description>
    </item>
    <item>
      <title>Hosted MySQL: Amazon RDS (and backups)</title>
      <link>https://till.klampaeckel.de/posts/179-hosted-mysql-amazon-rds-and-backups/</link>
      <pubDate>Sat, 17 Mar 2012 16:53:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/179-hosted-mysql-amazon-rds-and-backups/</guid>
      <description>Among all the different technologies in our stack, we also use MySQL. While we still run MySQL (or Percona-Server) ourselves, we selected a managed solution to power parts of our production infrastructure: a Multi-AZ setup with Amazon&amp;rsquo;s RDS.
AZ is Amazon-speak for &amp;ldquo;availability zone&amp;rdquo;, essentially a datacenter. RDS stands for: Relational Database Service.
Judging from my experience with our own setups where EBS is in the mix, I have to say that Amazon does an outstanding job hiding these potential issues with RDS from us.</description>
    </item>
    <item>
      <title>Deploying PHP applications: PEAR and composer resources for chef</title>
      <link>https://till.klampaeckel.de/posts/180-deploying-php-applications-pear-and-composer-resources-for-chef/</link>
      <pubDate>Thu, 23 Feb 2012 16:52:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/180-deploying-php-applications-pear-and-composer-resources-for-chef/</guid>
      <description>This is something experimental I have been working on for our chef deployments. So the objective was/is to find a sane way to install PEAR packages and install dependencies with composer.
execute in chef recipes In chef recipes, almost everything is a resource. In case you&amp;rsquo;re just getting started with Chef, a list of current resources is available on the Opscode Wiki. It&amp;rsquo;s a link I put in my browser bar since I frequently work on chef recipes.</description>
    </item>
    <item>
      <title>Wordpress and disqus and post loops</title>
      <link>https://till.klampaeckel.de/posts/177-wordpress-and-disqus-and-post-loops/</link>
      <pubDate>Mon, 09 Jan 2012 01:36:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/177-wordpress-and-disqus-and-post-loops/</guid>
      <description>First off — I don&amp;rsquo;t have too much experience with disqus on Wordpress but when I looked at the code(-quality), disqus is one of the best plugins for Wordpress to date. I looked only very briefly, but I found it to be very clean, well documented and well architected. Good job, disqus!
In case you happen to dive into Wordpress plugins in 2012, you will see that this is unfortunately not a given.</description>
    </item>
    <item>
      <title>The future of CouchDB</title>
      <link>https://till.klampaeckel.de/posts/178-the-future-of-couchdb/</link>
      <pubDate>Thu, 05 Jan 2012 22:31:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/178-the-future-of-couchdb/</guid>
      <description>… is not Damien Katz.
TL;DR The blog post Damien Katz wrote earlier today, doesn&amp;rsquo;t mean much or anything for the Apache CouchDB project (or memcache project for that matter). If anything it&amp;rsquo;s a public note that Damien Katz acknowledged that he moved (on) from CouchDB to Couchbase.
Short story, long I&amp;rsquo;m not a contributor to CouchDB by means of code, (but) I blog a lot, I maintain the FreeBSD port, wrote a book and have an opinion on many things CouchDB.</description>
    </item>
    <item>
      <title>Women in Tech</title>
      <link>https://till.klampaeckel.de/posts/more-than-140-characters/176-women-in-tech/</link>
      <pubDate>Wed, 14 Dec 2011 22:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/more-than-140-characters/176-women-in-tech/</guid>
      <description>There is one thing which annoyed me a lot in 2011: the general topic is Women in Tech.
I&amp;rsquo;m not annoyed because I don&amp;rsquo;t like women or don&amp;rsquo;t want them to attend conferences. I&amp;rsquo;m annoyed because nothing happens.
Status Quo For the most part it&amp;rsquo;s guys at conference who discuss what can be done about it.
For example, I don&amp;rsquo;t remember how exactly we got into this discussion at Funconf, but at the time we even had two or three women in the room when this was brought up.</description>
    </item>
    <item>
      <title>From Subversion to GIT (and beyond!)</title>
      <link>https://till.klampaeckel.de/posts/171-from-subversion-to-git-and-beyond/</link>
      <pubDate>Fri, 09 Dec 2011 15:54:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/171-from-subversion-to-git-and-beyond/</guid>
      <description>Here&amp;rsquo;s a more or less simple way to migrate from Subversion to GIT(hub), this includes mapping commits and tags and what not!
Authors If multiple people congtributed to your project, this is probably the toughest part. If you&amp;rsquo;re not migration from let&amp;rsquo;s say Google Code but PHP&amp;rsquo;s Subversion repository, then it&amp;rsquo;s really pretty simple indeed: the username is the email address.
I found a nifty bash script to get it done (and adjusted it a little bit):</description>
    </item>
    <item>
      <title>Quo vadis, CouchDB?</title>
      <link>https://till.klampaeckel.de/posts/174-quo-vadis-couchdb/</link>
      <pubDate>Sun, 04 Dec 2011 18:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/174-quo-vadis-couchdb/</guid>
      <description>Update, 2011-12-21: Couchbase posted their review of 2011 (the other day) — TL;DR: Couchbase Single Server (their Apache CouchDB distribution) is discontinued and its documentation (and its buildtools) will be contributed to Apache CouchDB.
When Ubuntu1 dropped CouchDB two weeks ago, there were a couple things which annoy (present tense) me a lot. Add to that the general echo from various media outlets blogs which pronounced CouchDB dead and a general misconception how this situation or CouchDB in general is dealt with.</description>
    </item>
    <item>
      <title>Cooking PHPUnit (and a chef-solo example on top)</title>
      <link>https://till.klampaeckel.de/posts/175-cooking-phpunit-and-a-chef-solo-example-on-top/</link>
      <pubDate>Sun, 04 Dec 2011 02:17:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/175-cooking-phpunit-and-a-chef-solo-example-on-top/</guid>
      <description>I&amp;rsquo;m sure most of you noticed that with the recent upgrade of PHPUnit to version 3.6, a lot of breakage was introduced in various projects.
And for example Zend Framework 1.x won&amp;rsquo;t update to the latest version either. When I ranted on twitter someone send me Christer Edvartsen&amp;rsquo;s blog post on how to setup multiple versions of PHPUnit. It&amp;rsquo;s really neat since it walks you through the setup step by step and you learn about things such as --installroot on the way.</description>
    </item>
    <item>
      <title>Ubuntu: setting up redis-server (reloaded)</title>
      <link>https://till.klampaeckel.de/posts/149-ubuntu-setting-up-redis-server-reloaded/</link>
      <pubDate>Mon, 28 Nov 2011 09:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/149-ubuntu-setting-up-redis-server-reloaded/</guid>
      <description>I blogged about setting up redis before, here&amp;rsquo;s a small update to the situation:
If you&amp;rsquo;re running Ubuntu 9.10 or 10.04.x, the most recent release available through aptitude is 1.x. Version 1.x doesn&amp;rsquo;t include many things (pubsub, etc.) which are available in 2.x. So this leaves you with two options!
Compile! Compiling redis-server is simple (aka, make &amp;amp;&amp;amp; sudo make install), a few things were missing (last time I checked):</description>
    </item>
    <item>
      <title>FreeBSD &#43; softupdates &#43; no space left on device</title>
      <link>https://till.klampaeckel.de/posts/168-freebsd-softupdates-no-space-left-on-device/</link>
      <pubDate>Fri, 25 Nov 2011 15:50:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/168-freebsd-softupdates-no-space-left-on-device/</guid>
      <description>One of my older hosting servers runs into space issues constantly. And most of the time it&amp;rsquo;s a 24 GB log file (error_log) from a really old Joomla-based website.
Why it gets so huge? Well, when I tail the logfile, I see messages about functions being deprecated in PHP, warnings, notices and a whole lot more literally racing by. I&amp;rsquo;m not sure if Joomla changed in recent years, but most of the code-base is a great example of how PHP applications should not be build.</description>
    </item>
    <item>
      <title>apt-repair-sources on Ubuntu</title>
      <link>https://till.klampaeckel.de/posts/173-apt-repair-sources-on-ubuntu/</link>
      <pubDate>Wed, 23 Nov 2011 13:39:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/173-apt-repair-sources-on-ubuntu/</guid>
      <description>When I ran our setup on an instance the other day, I noticed how it failed with a &amp;ldquo;package not found&amp;rdquo; (or similar) error. After debugging this a bit, we discovered that Karmic moved from &amp;ldquo;archive.ubuntu.com&amp;rdquo; to &amp;ldquo;old-releases.ubuntu.com&amp;rdquo; (Probably diskspace or something — but who knows? :-)). And because the sources pointed to the former, it broke the bootstrap process on new and existing EC2 instances and Vagrant VMs for us.</description>
    </item>
    <item>
      <title>PHAR and FreeBSD</title>
      <link>https://till.klampaeckel.de/posts/172-phar-and-freebsd/</link>
      <pubDate>Sun, 06 Nov 2011 17:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/172-phar-and-freebsd/</guid>
      <description>I noticed that archivers/pecl-phar vanished from the ports tree on one of my FreeBSD servers.
Problem? Reasons to remove the port were:
the port is unmaintained the port was based on the outdated phar extension from pecl phar (in pecl) contains open security issues The simple solution is to create a new port which of course will use the phar which is bundled in PHP&amp;rsquo;s core. And I will get to that (but feel free to beat me at it ;-)).</description>
    </item>
    <item>
      <title>WPML: icl_object_id() and custom post types</title>
      <link>https://till.klampaeckel.de/posts/167-wpml-icl_object_id-and-custom-post-types/</link>
      <pubDate>Fri, 28 Oct 2011 14:28:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/167-wpml-icl_object_id-and-custom-post-types/</guid>
      <description>Digressing from my usual grounds, I moonlighted a bit on a Wordpress project in September. One of the project&amp;rsquo;s goals was to make the entire website bi-lingual: French and German (or the way around?). And once multi-lingual is an object, WPML is the plugin to use (as far as Wordpress is concerned).
WMPL in a nutshell WPML is a commercial plugin — and as far as I am concerned: it&amp;rsquo;s money well spend.</description>
    </item>
    <item>
      <title>Iterating over a table (with Zend_Db_Table and Zend_Paginator)</title>
      <link>https://till.klampaeckel.de/posts/166-iterating-over-a-table-with-zend_db_table-and-zend_paginator/</link>
      <pubDate>Tue, 11 Oct 2011 18:19:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/166-iterating-over-a-table-with-zend_db_table-and-zend_paginator/</guid>
      <description>So frequently, I need to run small data migrations or transformations. Especially on the way to Doctrine, there&amp;rsquo;s a lot to clean-up in a database which has been used and evolved over five years or so.
The other day, I wanted to run some transformations on the data located a history column in a pretty simple table — here&amp;rsquo;s what it looks like:
Building a class to interface the table is simple:</description>
    </item>
    <item>
      <title>Steve Jobs</title>
      <link>https://till.klampaeckel.de/posts/more-than-140-characters/165-steve-jobs/</link>
      <pubDate>Thu, 06 Oct 2011 22:14:58 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/more-than-140-characters/165-steve-jobs/</guid>
      <description>I found myself pondering today when I tried to figure out what I want to say or write about Steve Jobs passing away. Because whatever I wanted to share seemed not appropriate and just not good enough.
I watched his Standford speech (again) and while I think this speech did not have the edge and finesse his usual Apple-related appearances did, it contains so much wisdom and enlightenment. Fundamentals which do not just apply to young people but everyone else as well.</description>
    </item>
    <item>
      <title>Twitter bootstrap &#43; Zend_Form = ♥</title>
      <link>https://till.klampaeckel.de/posts/164-twitter-bootstrap-zend_form-/</link>
      <pubDate>Sun, 02 Oct 2011 16:09:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/164-twitter-bootstrap-zend_form-/</guid>
      <description>I dig Twitter&amp;rsquo;s bootstrap library because as a developer, it helps me produce good looking forms without a lot of effort. Especially when administration interfaces are concerned, you I can only go so far — my first constraint is not being a great designer (to confirm, check out this blog) and two: I don&amp;rsquo;t like working with ugly interfaces.
To cut to the chase&amp;hellip;
Easybib_Form_Decorator It&amp;rsquo;s a decorator library for Zend_Form.</description>
    </item>
    <item>
      <title>Sound problems reloaded (Linux Ubuntu 10.04 and 10.10)</title>
      <link>https://till.klampaeckel.de/posts/162-sound-problems-reloaded-linux-ubuntu-10.04-and-10.10/</link>
      <pubDate>Wed, 10 Aug 2011 23:53:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/162-sound-problems-reloaded-linux-ubuntu-10.04-and-10.10/</guid>
      <description>So after updating 10.04 to 10.10 sound didn&amp;rsquo;t work — again.
I&amp;rsquo;ve bitched and moaned about sound and Ubuntu countless times on Twitter and after literally wasting away countless hours on sound and Ubuntu in the recent months, here are some pointers so hopefully others won&amp;rsquo;t waste as much time as I did.
Pulseaudio There are countless of threads and blog posts online about how people despise pulseaudio and I have no idea if there&amp;rsquo;s anything better, but I&amp;rsquo;m running Ubuntu because I don&amp;rsquo;t care.</description>
    </item>
    <item>
      <title>vpnc (for Cisco VPNs with 2-factor authentication) on Ubuntu</title>
      <link>https://till.klampaeckel.de/posts/161-vpnc-for-cisco-vpns-with-2-factor-authentication-on-ubuntu/</link>
      <pubDate>Tue, 19 Jul 2011 21:44:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/161-vpnc-for-cisco-vpns-with-2-factor-authentication-on-ubuntu/</guid>
      <description>In order to connect to firewall and DRACs of our new Rackspace cluster, I had to setup a VPN connection. Rackspace gave us a Cisco ASA device which is firewall and vpn in one. In order to connect to the VPN the client needs to do 2-factor authentication.
At first I tried to install the necessary add-ons for Ubuntu&amp;rsquo;s network-manager, but after I spent an hour or so trying to make it work, I took an alternate route.</description>
    </item>
    <item>
      <title>Legacy code</title>
      <link>https://till.klampaeckel.de/posts/160-legacy-code/</link>
      <pubDate>Sun, 17 Jul 2011 17:41:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/160-legacy-code/</guid>
      <description>Some people have this misconception that there is a plot to kill of the original mysql extension (aka ext/mysql) in PHP.
So first off, I know that bloggers are not journalist. So apprently fact-checking is not required for a rant blog post. ;-) But if a blog post is a rant, it should be labeled as such.
Improved ext/mysqli (hint: &amp;ldquo;i&amp;rdquo; as in improved) has been the goto extension for years.</description>
    </item>
    <item>
      <title>RFC: Mocking protected methods</title>
      <link>https://till.klampaeckel.de/posts/158-rfc-mocking-protected-methods/</link>
      <pubDate>Wed, 15 Jun 2011 20:40:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/158-rfc-mocking-protected-methods/</guid>
      <description>Update, 2011-06-16, 12:15 AM Thanks for the comments.
(I swear I had something like that before and it didn&amp;rsquo;t work!) Here&amp;rsquo;s the solution:
&amp;mdash; Original blog entry &amp;mdash;
I wrote a couple tests for a small CouchDB access wrapper today. But when I wrote the implementation itself, I realized that my class setup depends on an actual CouchDB server being available and here my journey began.
Example code Consider the following example:</description>
    </item>
    <item>
      <title>SF and the haters</title>
      <link>https://till.klampaeckel.de/posts/more-than-140-characters/157-sf-and-the-haters/</link>
      <pubDate>Mon, 13 Jun 2011 20:02:28 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/more-than-140-characters/157-sf-and-the-haters/</guid>
      <description>So Sourceforge is complaining about people hating on Twitter. First off: haters gonna hate!. Sourceforge should know better and not feed the trolls.
Then, people complain for a reason. For years your website has been complicated and actual development (not distribution) has stagnated on Sourceforge. To me it seemed like the primary objective was maximizing income from advertisement. Yes, you guys relaunched a few times, but unfortunately never got it quite right.</description>
    </item>
    <item>
      <title>Dependency Injection Containers</title>
      <link>https://till.klampaeckel.de/posts/154-dependency-injection-containers/</link>
      <pubDate>Mon, 30 May 2011 13:49:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/154-dependency-injection-containers/</guid>
      <description>I got into a discussion on Twitter the other day where I mentioned that I don&amp;rsquo;t like DI. Call it lack of sleep or language barrier (on my part), but I said DI — dependency injection — when I meant the dependency injection container. Having said this, let me explain why I don&amp;rsquo;t like it.
POV Despite not working for any of the larger PHP joints out there, I get to spend my time with pretty interesting stuff.</description>
    </item>
    <item>
      <title>VirtualBox Guest Additions and vagrant</title>
      <link>https://till.klampaeckel.de/posts/155-virtualbox-guest-additions-and-vagrant/</link>
      <pubDate>Tue, 24 May 2011 23:40:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/155-virtualbox-guest-additions-and-vagrant/</guid>
      <description>If you followed my blog, you probably know about chef and vagrant.
So the other day I managed to upgrade to VirtualBox 4.0. The upgrade just happened by accident, so to speak. I noticed that Virtualbox 4.0 had moved from nonfree to contrib on Oracle&amp;rsquo;s repository which is why I had previously missed it. With 4.0, I am now able to run the latest and greatest Vagrant — and with Vagrant being pre-1.</description>
    </item>
    <item>
      <title>Yahoo: oauth_problem=consumer_key_rejected</title>
      <link>https://till.klampaeckel.de/posts/153-yahoo-oauth_problemconsumer_key_rejected/</link>
      <pubDate>Sun, 22 May 2011 00:16:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/153-yahoo-oauth_problemconsumer_key_rejected/</guid>
      <description>Here&amp;rsquo;s how I literally wasted eight hours of my life. :-)
We signed up for Yahoo! Search Boss last week. The process itself was pretty straight:
Sign into your Yahoo! account at https://developer.apps.yahoo.com/ Click &amp;ldquo;New Project&amp;rdquo;, fill out the form. Then click on the project name, activate &amp;ldquo;Yahoo! Search Boss&amp;rdquo; by suppling some billing info. Consumer key rejected? The above process doesn&amp;rsquo;t even take five minutes, but then I spent eight hours figuring out what oauth_problem=consumer_key_rejected means.</description>
    </item>
    <item>
      <title>Some thoughts on outtages</title>
      <link>https://till.klampaeckel.de/posts/151-some-thoughts-on-outtages/</link>
      <pubDate>Sat, 23 Apr 2011 19:46:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/151-some-thoughts-on-outtages/</guid>
      <description>Cloud, everybody wants it, some actually use it. So what&amp;rsquo;s my take away from AWS&amp;rsquo; recent outtage?
Background So first off, we had two pieces of our infrastructure failing (three if we include our Multi-AV RDS) — both of which involve EBS.
Numero uno One of those pieces in my immediate reach was a MySQL server, which we use to keep sessions. And to say the least about AWS and in their defense, the instance had run for almost 550 days and had never given us much or any reason to let us down.</description>
    </item>
    <item>
      <title>A roundhouse kick, or the state of PHP</title>
      <link>https://till.klampaeckel.de/posts/150-a-roundhouse-kick-or-the-state-of-php/</link>
      <pubDate>Tue, 12 Apr 2011 15:01:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/150-a-roundhouse-kick-or-the-state-of-php/</guid>
      <description>Last week the usual round of PEAR-bashing on Twitter took place, then this morning Marco Tabini asked if PHP (core) was running out of scratches to itch. He also suggests he got this idea from Cal Evan&amp;rsquo;s blog post about Drupal forking PHP.
http://blog.tabini.ca/2011/04/is-php-running-out-of-itches-to-scratch/ http://blog.calevans.com/2011/04/07/four-reasons-why-drupal-should-fork-php/ [Not submitting to your linkbait.]
Pecl and PHP So first off — moving libraries from the core to an external repository was done for various reasons.</description>
    </item>
    <item>
      <title>Yelling</title>
      <link>https://till.klampaeckel.de/posts/147-yelling/</link>
      <pubDate>Fri, 08 Apr 2011 21:47:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/147-yelling/</guid>
      <description>Yelling, sometimes also referred to as shouting, is an old school management technique. Yelling has been around for literally as long as mankind walked on planet earth. And despite a great history of success, yelling is still often unappreciated and a misunderstood art.
key points Let me summarize the key points — what yelling is all about!
Yelling emphasizes one&amp;rsquo;s opinion. Yelling helps to bring across your point. Yelling helps to avoid mis-communication.</description>
    </item>
    <item>
      <title>nginx configuration gotchas</title>
      <link>https://till.klampaeckel.de/posts/148-nginx-configuration-gotchas/</link>
      <pubDate>Tue, 05 Apr 2011 16:19:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/148-nginx-configuration-gotchas/</guid>
      <description>After running away screaming from Zend_XmlRpc we migrated of our internal webservices are RESTful nowadays — which implies that we make heavy use of HTTP status codes and so on.
On the PHP side of things we implemented almost all of those webservices using the Zend Framework where some parts are replaced by in-house replacements (mostly stripped-down and optimized versions equivalents of Zend_Foo) and a couple nifty PEAR packages.
RESTful — how does it work?</description>
    </item>
    <item>
      <title>Trying out BigCouch with Chef-Solo and Vagrant</title>
      <link>https://till.klampaeckel.de/posts/145-trying-out-bigcouch-with-chef-solo-and-vagrant/</link>
      <pubDate>Mon, 04 Apr 2011 15:41:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/145-trying-out-bigcouch-with-chef-solo-and-vagrant/</guid>
      <description>So the other day, I wanted to quickly check something in BigCouch and thanks to Vagrant, chef(-solo) and a couple cookbooks — courtesy of Cloudant — this was exceptionally easy.
As a matter of fact, I had BigCouch running and setup within literally minutes.
Here&amp;rsquo;s how.
Requirements You&amp;rsquo;ll need git, Ruby, gems and Vagrant (along with Virtualbox) installed. If you need help with those items, I suggest you check out my previous blog post called Getting the most out of Chef with Scalarium and vagrant.</description>
    </item>
    <item>
      <title>Getting the most out of Chef with Scalarium and vagrant</title>
      <link>https://till.klampaeckel.de/posts/142-getting-the-most-out-of-chef-with-scalarium-and-vagrant/</link>
      <pubDate>Wed, 09 Mar 2011 22:12:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/142-getting-the-most-out-of-chef-with-scalarium-and-vagrant/</guid>
      <description>Ever since I started playing around with Unix ~13 years ago, I&amp;rsquo;ve been a fan of automating things. What started out as writing little (maybe pointless) shell scripts slowly but surely morphed into infrastructure automation today.
As for my, or maybe anyone&amp;rsquo;s, motivation to do these things, I see three main factors:
I&amp;rsquo;m easily bored — because repeating things is dull. I&amp;rsquo;m easily distracted (when I&amp;rsquo;m bored). I&amp;rsquo;m German: Of course we strive for perfection and excellence.</description>
    </item>
    <item>
      <title>Giganews VPN on Ubuntu</title>
      <link>https://till.klampaeckel.de/posts/140-giganews-vpn-on-ubuntu/</link>
      <pubDate>Sun, 20 Feb 2011 19:33:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/140-giganews-vpn-on-ubuntu/</guid>
      <description>This article briefly describes how you can setup the Giganews VPN (PPTP) on Ubuntu. I&amp;rsquo;m gonna assume 10.04 (that&amp;rsquo;s what I tested with) and the gnome desktop.
Does this sound familiar: The VPN connection &amp;lsquo;xxxxx&amp;rsquo; failed because there were no valid VPN secrets.
If so then I&amp;rsquo;m hoping this article will help you.
What is a VPN for? The use-case for a VPN — and this is for basically any VPN (not just Giganews&amp;rsquo; service) — is security.</description>
    </item>
    <item>
      <title>Contributing to PEAR: Taking over packages</title>
      <link>https://till.klampaeckel.de/posts/139-contributing-to-pear-taking-over-packages/</link>
      <pubDate>Fri, 18 Feb 2011 14:50:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/139-contributing-to-pear-taking-over-packages/</guid>
      <description>One of the more frequent questions I see on the mailing lists and IRC is, &amp;ldquo;How do I take over a package?&amp;rdquo;.
Very often people start to use a PEAR package and then at some point encounter either a bug or they miss a certain feature. The package&amp;rsquo;s state however is inactive or flat unmaintained.
Offer help The first step is to offer your help. And the easiest way to help is to report bugs or open feature requests.</description>
    </item>
    <item>
      <title>Socket.io &amp; nodejs: at a medium pace</title>
      <link>https://till.klampaeckel.de/posts/137-socket.io-nodejs-at-a-medium-pace/</link>
      <pubDate>Tue, 15 Feb 2011 17:41:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/137-socket.io-nodejs-at-a-medium-pace/</guid>
      <description>In my last blog entry, I shared some nodejs-code to read CouchDB&amp;rsquo;s _changes feed and publish the data to a website. In order to update the page in a continous fashion, I used socket.io which provides a nifty abstraction across server- to client-side transports — for example, websockets and ajax longpoll.
Full-throttle When we tested the code for a few days over the weekend, the largest issue we ran into was that the stream moved too fast.</description>
    </item>
    <item>
      <title>node.js &amp; socket.io fun</title>
      <link>https://till.klampaeckel.de/posts/133-node.js-socket.io-fun/</link>
      <pubDate>Wed, 02 Feb 2011 14:27:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/133-node.js-socket.io-fun/</guid>
      <description>I recently had the extreme pleasure to use node.js and socket.io on a project. Here are some insights.
Objective So the objective of the project was to read data from the _changes feed of our CouchDB cluster (hosted by Cloudant) and publish the data to a widget which we can use to display a constant stream of &amp;ldquo;what are people doing right now&amp;rdquo;.
The core of the problem we faced was not just taking this stream of data and feeding it on to a page, but since we&amp;rsquo;ll deploy this widget to our homepage we needed to make sure that no matter how many clients see it, the impact on the database cluster is minimal; for example, it would be a single client (or down the road up to three for failover) who actually read data from the cluster.</description>
    </item>
    <item>
      <title>Automating with Chef(-Solo)</title>
      <link>https://till.klampaeckel.de/posts/130-automating-with-chef-solo/</link>
      <pubDate>Thu, 06 Jan 2011 17:21:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/130-automating-with-chef-solo/</guid>
      <description>In 2010, operations became an even more central part of my life. As I write this blog post (in early January, 2011), we have been running on Amazon AWS — and EC2 in particular — for over a year.
Previously we had used a service called RightScale but in Q3 of 2010, we moved on/away from RightScale and started using chef and a service called Scalarium.
Because Opscode&amp;rsquo;s chef became such a big part of my work life, I gave a talk about chef, and chef-solo in particular, at last December&amp;rsquo;s PHP Usergroup meeting in Berlin.</description>
    </item>
    <item>
      <title>Zend Framework: Writing an IN-Clause with Zend_Db</title>
      <link>https://till.klampaeckel.de/posts/129-zend-framework-writing-an-in-clause-with-zend_db/</link>
      <pubDate>Sun, 19 Dec 2010 17:27:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/129-zend-framework-writing-an-in-clause-with-zend_db/</guid>
      <description>I&amp;rsquo;m currently running a little database analysis to see how many of our users might be affected by Gawker&amp;rsquo;s breach of security the other week. Since we use Zend Framework, Zend_Db is our weapon of choice.
Running the queries I noticed, that Zend_Db doesn&amp;rsquo;t seem to support an IN-clause with a straight fetchAll().
The IN-clause is only supported when I wrap my statement with Zend_Db_Select, which is something I rarely do.</description>
    </item>
    <item>
      <title>Operating CouchDB II</title>
      <link>https://till.klampaeckel.de/posts/123-operating-couchdb-ii/</link>
      <pubDate>Tue, 30 Nov 2010 16:06:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/123-operating-couchdb-ii/</guid>
      <description>A couple months ago, I wrote an article titled Operation CouchDB. I noticed that a lot of people still visit my blog for this particular post, so this is an update to the situation.
And no, you may not copy and paste this or any other of my blog posts unless you ask me. ;-)
Caching revisited A while back I wrote about how caching is trivial with CouchDB — well sort of.</description>
    </item>
    <item>
      <title>Tracking PHP errors</title>
      <link>https://till.klampaeckel.de/posts/120-tracking-php-errors/</link>
      <pubDate>Sat, 27 Nov 2010 17:17:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/120-tracking-php-errors/</guid>
      <description>track_errors provides the means to catch an error message emitted from PHP. It&amp;rsquo;s something I like to use during the development of various applications, or to get a handle on legacy code. Here are a few examples why!
For example Imagine the following remote HTTP call:
So whenever this call fails, it will return false and also emit an error message:
Some people use @ to suppress this error message — an absolute no-go for reasons such as:</description>
    </item>
    <item>
      <title>The demand web</title>
      <link>https://till.klampaeckel.de/posts/127-the-demand-web/</link>
      <pubDate>Sat, 27 Nov 2010 13:57:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/127-the-demand-web/</guid>
      <description>I read a blog entry this morning entitled &amp;ldquo;The unbearable lameness of web 2.0&amp;rdquo; (scroll down for the English version).
In his blog entry Kris Köhntopp states how he&amp;rsquo;s not satisfied with the status quo, and of course that he said it all before — in a nutshell, he wants a social networking standard which is adhered to across all platforms, e.g. Twitter, Facebook and whatever else there is in between.</description>
    </item>
    <item>
      <title>Magento: Loading the product from a template</title>
      <link>https://till.klampaeckel.de/posts/126-magento-loading-the-product-from-a-template/</link>
      <pubDate>Wed, 24 Nov 2010 09:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/126-magento-loading-the-product-from-a-template/</guid>
      <description>When I wrangle with Magento Commerce and customize anything, every other bit is of course tied to a product&amp;rsquo;s ID, or sometimes entity ID.
The challenging part is that whenever you&amp;rsquo;re in a template in Magento, the scope is very different from the previous one. This is sometimes frustrating, but when you think of it — it makes sense. That is, in Magento! ;-)
Magento works in blocks and each block is basically a class file, of course $this is never the same.</description>
    </item>
    <item>
      <title>APC: get a key&#39;s expiration time</title>
      <link>https://till.klampaeckel.de/posts/124-apc-get-a-keys-expiration-time/</link>
      <pubDate>Mon, 08 Nov 2010 14:57:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/124-apc-get-a-keys-expiration-time/</guid>
      <description>It&amp;rsquo;s always surprising to me, but APC is still the best kept secret.
APC offers a bunch of very useful features — foremost a realpath cache and an opcode cache. However, my favorite is neither: it&amp;rsquo;s being able to cache data in shared memory. How so? Simple: use apc_store() and apc_fetch() to persist data between requests.
The other day, I wanted use a key&amp;rsquo;s expiration date to send the appropriate headers (Expires and Last-Modified) to the client, but it didn&amp;rsquo;t seem like APC supports this out of the box yet.</description>
    </item>
    <item>
      <title>PHP SDK for Amazon Web Services</title>
      <link>https://till.klampaeckel.de/posts/119-php-sdk-for-amazon-web-services/</link>
      <pubDate>Wed, 29 Sep 2010 12:09:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/119-php-sdk-for-amazon-web-services/</guid>
      <description>Yesterday, Jeff Barr announced Amazon&amp;rsquo;s own PHP SDK for their web services — own, because AWS hired CloudFusion&amp;rsquo;s lead developer earlier this year (in March) and I guess after a while they decided it was time to incorporate his open source efforts into the company. The full story is on getcloudfusion.com.
So what? What&amp;rsquo;s more than just pretty interesting about all of this, is that not only is the AWS PHP SDK hosted on Github (bonus points for sure), but since it implements almost the entire API of all infrastructural services and is backed by the API provider, this library currently presents the most feasible way for PHP developers to work with AWS.</description>
    </item>
    <item>
      <title>Google Chrome: useful extensions for developers</title>
      <link>https://till.klampaeckel.de/posts/112-google-chrome-useful-extensions-for-developers/</link>
      <pubDate>Wed, 22 Sep 2010 13:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/112-google-chrome-useful-extensions-for-developers/</guid>
      <description>While Chrome likes to emphasize how speedy it is, it is also sometimes a pretty bare-metal browser. But all the speed comes at an expensive — Chrome is doing less out of the box, which some people will say means, &amp;ldquo;Chrome is focusing on the essentials&amp;rdquo;.
So because I&amp;rsquo;m thankful for said speedyness and overall painlessness, I also realize how I little extra bells and whistles I really need for a great browsing experience.</description>
    </item>
    <item>
      <title>Debugging Zend_Test</title>
      <link>https://till.klampaeckel.de/posts/116-debugging-zend_test/</link>
      <pubDate>Mon, 20 Sep 2010 02:12:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/116-debugging-zend_test/</guid>
      <description>Sometimes, I have to debug unit tests and usually this is a situation I&amp;rsquo;m trying to avoid.
If I have to spend too much time debugging a test it&amp;rsquo;s usually a bad test. Which usually means that it&amp;rsquo;s too complex. However, with Zend_Test_PHPUnit_ControllerTestCase, it&amp;rsquo;s often not the actual test, but the framework. This is not just tedious for myself, it&amp;rsquo;s also not the most supportive fact when I ask my developers to write tests.</description>
    </item>
    <item>
      <title>Find space hogs and prettify output using AWK</title>
      <link>https://till.klampaeckel.de/posts/114-find-space-hogs-and-prettify-output-using-awk/</link>
      <pubDate>Sat, 18 Sep 2010 16:31:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/114-find-space-hogs-and-prettify-output-using-awk/</guid>
      <description>I really love awk.
You might disagree and call me crazy, but while awk might be a royal brainfuck at first, here&amp;rsquo;s a very simple example of its power which should explain my endorsement.
Figuring out space hogs Every once in a while I run out of diskspace on /home. Even though I am the only user on this laptop I&amp;rsquo;m always puzzled as of why and I start running du trying to figure out which install or program stole my diskspace.</description>
    </item>
    <item>
      <title>Installing Varnish on Ubuntu Hardy</title>
      <link>https://till.klampaeckel.de/posts/113-installing-varnish-on-ubuntu-hardy/</link>
      <pubDate>Tue, 14 Sep 2010 01:47:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/113-installing-varnish-on-ubuntu-hardy/</guid>
      <description>This is a quick and dirty rundown on how to install Varnish 2.1.x on Ubuntu Hardy (8.04 LTS).
Get sources setup Add the repository to /etc/apt/sources.list:
Import the key for the new repository:
Installation Update sources list and install varnish:
Files of importance:
Double-check:
Further reading I recommend a mix of the following websites/links:
Varnish 2.1 documentation Wiki with lots of tutorials and examples Team Soundcloud&amp;rsquo;s varnishtop (code on Github) Fin That&amp;rsquo;s all!</description>
    </item>
    <item>
      <title>Selenium &amp; Saucelenium: installation and dbus-xorg-woes</title>
      <link>https://till.klampaeckel.de/posts/111-selenium-saucelenium-installation-and-dbus-xorg-woes/</link>
      <pubDate>Tue, 07 Sep 2010 16:09:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/111-selenium-saucelenium-installation-and-dbus-xorg-woes/</guid>
      <description>We&amp;rsquo;re about to launch a new product, and this time it&amp;rsquo;s pretty client-side-intense. The application is powered by a lot of JavaScript(-mvc) and jQuery, which do xhr calls to a ZF/CouchDB powered backend. While js-mvc has unit-testing sort of covetred, I was also looking for some integration testing, multiple browsers and all that.
Selenium vs. Saucelenium I can&amp;rsquo;t really say if you want one or the other. Revisiting Selenium in general, it&amp;rsquo;s IMHO the only viable and suitable thing for a PHP shop.</description>
    </item>
    <item>
      <title>Tumblr: Display a list of entries in the sidebar</title>
      <link>https://till.klampaeckel.de/posts/109-tumblr-display-a-list-of-entries-in-the-sidebar/</link>
      <pubDate>Thu, 02 Sep 2010 14:22:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/109-tumblr-display-a-list-of-entries-in-the-sidebar/</guid>
      <description>Update 2010-09-06: I turned my JavaScript code into a handy plugin for jQuery — let me introduce: jquery-simplerss.
So for whatever reason, on a lot of blogs (but not mine ;-)), the sidebar also contains the list of latest entries on said blog.
I recently edited a template for a client and he requested the same feature — which put me through three hours of nightmare.
Tumblr Tumblr is a hosted blog service.</description>
    </item>
    <item>
      <title>Looking for Two PHP Developers in NYC</title>
      <link>https://till.klampaeckel.de/posts/108-looking-for-two-php-developers-in-nyc/</link>
      <pubDate>Thu, 12 Aug 2010 18:47:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/108-looking-for-two-php-developers-in-nyc/</guid>
      <description>Hey everyone,
it&amp;rsquo;s my sincere pleasure to announce that we&amp;rsquo;re looking to fill two positions for PHP developers (entry/junior) in NYC.
Expectations This is what we look for from candidates:
A strong and firm knowledge of PHP5 First hand experience with the Zend Framework You&amp;rsquo;ve heard of PHPUnit and TDD An idea of what a HTTP request is and the different applications that take part in one You heard of CouchDB, MongoDB or Redis (generally &amp;ldquo;NoSQL&amp;rdquo;) before Last but absolutely not least:</description>
    </item>
    <item>
      <title>Monkey patching in PHP</title>
      <link>https://till.klampaeckel.de/posts/105-monkey-patching-in-php/</link>
      <pubDate>Tue, 22 Jun 2010 13:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/105-monkey-patching-in-php/</guid>
      <description>I haven&amp;rsquo;t really had the chance or time to play with PHP 5.3 until recently when Ubuntu 10.04 upgraded my local installations and kind of forced me to dive into it a little. And I&amp;rsquo;m also probably the last person on the planet to notice, but namespaces in PHP 5.3 allow you to monkey-patch core PHP code.
What&amp;rsquo;s monkey patching? So monkey patching is a technique to replace functions at runtime.</description>
    </item>
    <item>
      <title>My Berlin Buzzwords 2010 recap</title>
      <link>https://till.klampaeckel.de/posts/104-my-berlin-buzzwords-2010-recap/</link>
      <pubDate>Wed, 09 Jun 2010 11:33:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/104-my-berlin-buzzwords-2010-recap/</guid>
      <description>I attended Berlin Buzzwords 2010 for the last two days and aside from meeting a bunch of great people during talks, here are some take away notes from this conference:
I got introduced to new stuff — such as HyperTable (c++ bigtable implementation), which I had never heard of before. I actually know a lot more about hadoop, HDFS and tika now than I did before — though I won&amp;rsquo;t be able to use any a lot of it soon.</description>
    </item>
    <item>
      <title>Shopping for a CDN</title>
      <link>https://till.klampaeckel.de/posts/100-shopping-for-a-cdn/</link>
      <pubDate>Sat, 05 Jun 2010 16:50:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/100-shopping-for-a-cdn/</guid>
      <description>In this blog post I&amp;rsquo;ll compare different CDNs with each other, on the list are:
Akamai (through MySpace) CacheFly CloudFront EdgeCast (twice, through Speedyrails) LimeLight Networks (through mydeo) … and Amazon S3 — the pseudo CDN Thanks to SpeedyRails, EasyBib (CacheFly, Cloudfront, S3) and mydeo for helping with these tests.
What&amp;rsquo;s a CDN? A CDN (Content Delivery Network) is a service usually offered by Tier1&amp;rsquo;s or at least companies that have a so-called global network footprint.</description>
    </item>
    <item>
      <title>PHP, APC and sessions</title>
      <link>https://till.klampaeckel.de/posts/101-php-apc-and-sessions/</link>
      <pubDate>Wed, 26 May 2010 15:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/101-php-apc-and-sessions/</guid>
      <description>Playing with redis/Rediska and sessions, I wanted to get more numbers to compare this solution to a traditional MySQL-based approach which also made me revisit the idea of a CouchDB-based session handler for Zend_Session.
Implementing this handler, I ran into a weird issue:
Fatal error: Undefined class constant &#39;ALLOW_ALL&#39; in /usr/home/till/foo/trunk/library/Zend/Uri/Http.php on line 447Call Stack#	Time	Memory	Function	Location1	0.7357	3914816	Foo_Session_SaveHandler_Couchdb-&amp;gt;write( )	../Couchdb.php:02	0.7358	3916600	Foo_Couchdb-&amp;gt;query( )	.</description>
    </item>
    <item>
      <title>Foursquare: How private is private?</title>
      <link>https://till.klampaeckel.de/posts/98-foursquare-how-private-is-private/</link>
      <pubDate>Tue, 25 May 2010 14:40:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/98-foursquare-how-private-is-private/</guid>
      <description>Location is one of my hobbies. Even though I don&amp;rsquo;t map items for openstreetmap and the like, I still try out at least every location-related startup there is.
Foursquare, as you probably know is a location-based game — get points and badges to check into locations. The points are aggregated into weekly leaderboard (of penis envy) and everyone gets a fresh start every Monday morning.
Check-in Foursquare has different check-in modes.</description>
    </item>
    <item>
      <title>jQuery post requests with a json response, sans eval()</title>
      <link>https://till.klampaeckel.de/posts/99-jquery-post-requests-with-a-json-response-sans-eval/</link>
      <pubDate>Tue, 18 May 2010 14:10:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/99-jquery-post-requests-with-a-json-response-sans-eval/</guid>
      <description>I know some of you out there are probably tired of jQuery and people raving about it&amp;rsquo;s goodness, but bare with me! Because jQuery never ceases to amaze me — especially when I haven&amp;rsquo;t looked at it — or client-side JavaScript code in general — in a good year or so.
Refactoring I&amp;rsquo;ve been refactoring some of my old JavaScript libs on a project and I noticed that I had used evil eval() all over the place to parse the JSON from our API.</description>
    </item>
    <item>
      <title>PHP: So you&#39;d like to migrate from MySQL to CouchDB? - Part III</title>
      <link>https://till.klampaeckel.de/posts/78-php-so-youd-like-to-migrate-from-mysql-to-couchdb--part-iii/</link>
      <pubDate>Mon, 17 May 2010 00:55:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/78-php-so-youd-like-to-migrate-from-mysql-to-couchdb--part-iii/</guid>
      <description>This is part three of a beginner series for people with a MySQL/PHP background. Apologies for the delay, this blog entry has been in draft since the 13th December of last year (2009).
Follow these links for the previous parts:
part I part II Recap Part I introduced the CouchDB basics which included basic requests using PHP and cURL. Part II focused on create, read, update and delete operations in CouchDB.</description>
    </item>
    <item>
      <title>EC2 security group owner ID</title>
      <link>https://till.klampaeckel.de/posts/97-ec2-security-group-owner-id/</link>
      <pubDate>Sun, 09 May 2010 17:30:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/97-ec2-security-group-owner-id/</guid>
      <description>I recently had the pleasure to setup an RDS instance and it took me a while to figure out what the --ec2-security-group-owner-id parameter needs to be populated with when you want to allow access to your RDS instance from instances with a certain security group.
To cut to the chase, you need to log into AWS and then click the following link — done.</description>
    </item>
    <item>
      <title>Operating CouchDB</title>
      <link>https://till.klampaeckel.de/posts/95-operating-couchdb/</link>
      <pubDate>Sat, 08 May 2010 14:09:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/95-operating-couchdb/</guid>
      <description>These are some random operational things I learned about CouchDB. While I realize that my primary use-case (a CouchDB install with currently 230+ million documents) may be oversized for many, these are still things important things to know and to consider. And I would have loved to know of some of these before we grew that large.
I hope these findings are useful for others.
Compaction CouchDB doesn&amp;rsquo;t take great care of diskspace — the assumption is that disk is cheap.</description>
    </item>
    <item>
      <title>The Slicehost-Cogent-Outage, or How to setup a relay with Postfix</title>
      <link>https://till.klampaeckel.de/posts/96-the-slicehost-cogent-outage-or-how-to-setup-a-relay-with-postfix/</link>
      <pubDate>Wed, 05 May 2010 15:36:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/96-the-slicehost-cogent-outage-or-how-to-setup-a-relay-with-postfix/</guid>
      <description>Our problem is that an application hosted on Slicehost uses an external mailserver, which is located in Europe. Since neither Slicehost/Rackspace or Cogent seem to be able to fix the situation after almost two days, here&amp;rsquo;s a quick workaround.
The idea is that our relay will collect emails and send them whenever the connection permits.
Postfix install This is a pretty simple:
Configuration main.cf Edit /etc/postfix/main.cf (this is my entire main.</description>
    </item>
    <item>
      <title>start-stop-daemon, Gearman and a little PHP</title>
      <link>https://till.klampaeckel.de/posts/94-start-stop-daemon-gearman-and-a-little-php/</link>
      <pubDate>Thu, 22 Apr 2010 15:44:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/94-start-stop-daemon-gearman-and-a-little-php/</guid>
      <description>The scope of this blog entry is to give you a quick and dirty demo for start-stop-daemon together with a short use case on Gearman (all on Ubuntu). In this example, I&amp;rsquo;m using the start-stop-daemon to handle my Gearman workers through an init.d script.
Gearman Gearman is a queue! But unlike for example most of the backends to Zend_Queue, Gearman provides a little more than just a message queue to send — well — messages from sender to receiver.</description>
    </item>
    <item>
      <title>Caching for dummies</title>
      <link>https://till.klampaeckel.de/posts/93-caching-for-dummies/</link>
      <pubDate>Tue, 06 Apr 2010 15:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/93-caching-for-dummies/</guid>
      <description>Caching is one of the things recommended whenever something is slow — &amp;ldquo;Your [database, website, server]? Well, duh! You need a cache!&amp;rdquo;.
All things aside, it&amp;rsquo;s not always easy to cache stuff. I find myself often in situations where I can&amp;rsquo;t cache at all or where a caching solution is complex as hell to implement. All of the sudden you need to dissect your page and lazy load half of it with Ajax — bah.</description>
    </item>
    <item>
      <title>Zend Framework: Slow automatic view rendering</title>
      <link>https://till.klampaeckel.de/posts/92-zend-framework-slow-automatic-view-rendering/</link>
      <pubDate>Mon, 29 Mar 2010 16:27:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/92-zend-framework-slow-automatic-view-rendering/</guid>
      <description>So I posted something on Twitter today, which wasn&amp;rsquo;t exactly news to me. I was more or less pointing out the obvious.
From a couple follow-up tweets, I guess, I need to explain more.
The idea My thesis is that there&amp;rsquo;s a gain in page rendering time when I disable automatic view rendering and use explicit render calls ($this-&amp;gt;render(&#39;foo&#39;);) inside my controllers. And to cut to the chase, there is. On our app, I measured a 12% improvement using Xdebug&amp;rsquo;s profiler — simple before-after-style.</description>
    </item>
    <item>
      <title>Redis on Ubuntu (9.04)</title>
      <link>https://till.klampaeckel.de/posts/91-redis-on-ubuntu-9.04/</link>
      <pubDate>Fri, 19 Mar 2010 18:40:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/91-redis-on-ubuntu-9.04/</guid>
      <description>A small howto to get the latest redis-server and a webinterface on Ubuntu.
Installation &amp;hellip; redis should listen on localhost:6379.
You may need to get i386 instead of amd64 if you run 32bit.
Tweaks You may need to add the following to /etc/sysctl.conf:
&amp;hellip; that is, especially if you run in a VE (e.g. inside xen).
All other configs are in /etc/redis/redis.conf.
Web Because web interfaces are so simple, I decided to get redweb.</description>
    </item>
    <item>
      <title>PHP parse errors with cgi and nginx</title>
      <link>https://till.klampaeckel.de/posts/88-php-parse-errors-with-cgi-and-nginx/</link>
      <pubDate>Mon, 15 Mar 2010 18:26:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/88-php-parse-errors-with-cgi-and-nginx/</guid>
      <description>So for whatever reason, it took me a while to figure this out earlier today:
2010/03/15 15:44:16 [info] 22274#0: *148224 client closed prematurely connection, so upstream connection is closed too while sending request to upstream, client: a.a.a.a, server: localhost, request: &amp;quot;GET / HTTP/1.1&amp;quot;, upstream: &amp;quot;fastcgi://unix:/tmp/.fastcgi.till/socket:&amp;quot;, host: &amp;quot;localhost&amp;quot;2010/03/15 15:44:16 [info] 22274#0: *148207 client closed prematurely connection, so upstream connection is closed too while sending request to upstream, client: a.a.a.a, server: localhost, request: &amp;quot;GET / HTTP/1.</description>
    </item>
    <item>
      <title>DB_CouchDB_Replicator</title>
      <link>https://till.klampaeckel.de/posts/86-db_couchdb_replicator/</link>
      <pubDate>Wed, 03 Mar 2010 19:44:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/86-db_couchdb_replicator/</guid>
      <description>Update, 2010-03-04: I just rolled a 0.0.2 release. In case you had 0.0.1 installed, just use pear upgrade-all to get it automatically. This release is trying to fix a random hang while reading documents from the source server.
I also opened a repository on Github.
---
As some may have guessed from a previous blog post we are currently running a test setup with CouchDB lounge. My current objective is to migrate our 200 million documents to it, and this is where I am essentially stuck this week.</description>
    </item>
    <item>
      <title>A toolchain for CouchDB Lounge</title>
      <link>https://till.klampaeckel.de/posts/84-a-toolchain-for-couchdb-lounge/</link>
      <pubDate>Fri, 26 Feb 2010 14:15:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/84-a-toolchain-for-couchdb-lounge/</guid>
      <description>One of our biggest issues with CouchDB is currently the lack of compaction of our database, and by lack of, I don&amp;rsquo;t mean that CouchDB doesn&amp;rsquo;t support it, I mean that we are unable to actually run it.
Compaction in a nutshell Compaction in a nutshell is pretty cool.
As you know, CouchDB is not very space-efficient. For once, CouchDB saves revisions of all documents. Which means, whenever you update a document a new revision is saved.</description>
    </item>
    <item>
      <title>Das Kleingedruckte</title>
      <link>https://till.klampaeckel.de/posts/83-das-kleingedruckte/</link>
      <pubDate>Fri, 05 Feb 2010 00:40:18 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/83-das-kleingedruckte/</guid>
      <description>Zum Thema, &amp;ldquo;Was bedeutet eigentlich Flatrate&amp;rdquo;, hier die Vorstellung meines Anbieters.
Ich wollte es zuerst unter &amp;ldquo;Abzocke&amp;rdquo; verbloggen, aber eigentlich ist das schon wieder so komisch, dass ich dann davon abgesehen habe. Hier die Fußnote bzw. das Kleingedruckte meines Mobilanbieter (mobilcom-debitel), zum Thema Datenflatrate &amp;ldquo;T@ke-away Flat&amp;rdquo;. Die interessanten Passagen hab ich hervorgehoben.
… und das macht richtig Lust und Laune diese Zusatzoption abzuschliessen. Und Kunde bin ich bei diesem Laden seit 10.</description>
    </item>
    <item>
      <title>Quo vadis PEAR?</title>
      <link>https://till.klampaeckel.de/posts/82-quo-vadis-pear/</link>
      <pubDate>Wed, 27 Jan 2010 16:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/82-quo-vadis-pear/</guid>
      <description>To PEAR or not to PEAR — PEAR2 is taking a while and I sometimes think that everyone associated with PEAR is busy elsewhere. Since a little competition never hurt, I&amp;rsquo;m especially excited about these recent developments.
With the release of Pirum, I&amp;rsquo;m really excited to see two public PEAR channels that aim to make PEAR a standard to deploy and manage your applications and libraries. One is PEARhub and the other is PEAR Farm.</description>
    </item>
    <item>
      <title>Wieso zum Teufel benutzt DU keine Versionskontrolle?</title>
      <link>https://till.klampaeckel.de/posts/80-wieso-zum-teufel-benutzt-du-keine-versionskontrolle/</link>
      <pubDate>Tue, 05 Jan 2010 14:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/80-wieso-zum-teufel-benutzt-du-keine-versionskontrolle/</guid>
      <description>(This post is entirely in German, I&amp;rsquo;ll see if I can translate this rant later.) Also, Prost und frohes Neujahr — ich starte das neue Jahr damit etwas emotionalen Ballast aus dem alten Jahr loszuwerden!
Ab und an treffe ich wieder auf Kunden und Kollegen mit denen ich vor relativ langer Zeit — fünf oder sechs Jahren oder länger — zusammengearbeitet habe.
Die Zeitspanne ist deshalb wichtig weil ich generell daran Interesse habe immer wieder oder zumindest des öfteren mit jemandem zusammenzuarbeiten, wenn die Zusammenarbeit erfolgreich war.</description>
    </item>
    <item>
      <title>JSConf.eu 2009: My takeaway</title>
      <link>https://till.klampaeckel.de/posts/77-jsconf.eu-2009-my-takeaway/</link>
      <pubDate>Thu, 10 Dec 2009 12:20:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/77-jsconf.eu-2009-my-takeaway/</guid>
      <description>Sorry, I&amp;rsquo;m late for a post-conference praise — but anyway!
JSConf(.eu) was one awesome conference. But you may ask why?
So for starters, and full-disclosure, I know a couple of the people who were involved organizing the conference, but that&amp;rsquo;s not all.
Here is what they did to make it an awesome conference The organizer managed to cram a ton of interesting sessions into only two days. For those sessions they invited very interesting speakers and also managed to attract not less interesting attendees.</description>
    </item>
    <item>
      <title>PHP: So you&#39;d like to migrate from MySQL to CouchDB? - Part II</title>
      <link>https://till.klampaeckel.de/posts/75-php-so-youd-like-to-migrate-from-mysql-to-couchdb--part-ii/</link>
      <pubDate>Thu, 12 Nov 2009 19:13:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/75-php-so-youd-like-to-migrate-from-mysql-to-couchdb--part-ii/</guid>
      <description>This is part II of my introductory series to move from MySQL a relational database (management) system to CouchDB. I will be using MySQL as an example. Part I of this series is available here.
Recap In part I, I introduced CouchDB by explaining its basics. I continued by showing a simple request to create a document using curl (on the shell) and expanded how the same request could be written in PHP (using ext/curl) — or in HTTP_Request2 or with phpillow.</description>
    </item>
    <item>
      <title>CouchDB: checkpointing on view building</title>
      <link>https://till.klampaeckel.de/posts/76-couchdb-checkpointing-on-view-building/</link>
      <pubDate>Wed, 04 Nov 2009 18:50:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/76-couchdb-checkpointing-on-view-building/</guid>
      <description>I&amp;rsquo;m posting about this tidbit because Google seemed to know nothing about it.
Anyway, during the view building process, we may see the following in the couchdb.log (level = info, at least, in local.ini):
[...] [info] [...] checkpointing view update at seq 78163851 for citations _design/erlang[...] [debug] [...] New task status for citations _design/erlang: Processed 17844590 of 107444308 changes (16%)[...] [debug] [...] New task status for citations _design/erlang: Processed 17848060 of 107444308 changes (16%)[.</description>
    </item>
    <item>
      <title>PHP: So you&#39;d like to migrate from MySQL to CouchDB? - Part I</title>
      <link>https://till.klampaeckel.de/posts/74-php-so-youd-like-to-migrate-from-mysql-to-couchdb--part-i/</link>
      <pubDate>Sat, 31 Oct 2009 10:59:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/74-php-so-youd-like-to-migrate-from-mysql-to-couchdb--part-i/</guid>
      <description>Update (2009-10-13): I posted part II!
This is the first part of a series. I&amp;rsquo;ll start off by introducing CouchDB — from a PHP side, then I&amp;rsquo;ll demo a couple basic use cases and I later on, I&amp;rsquo;ll dive into migrations from MySQL.
My idea is to introduce CouchDB to a world where database-driven development generally refers to MySQL. By no means, this is meant to be disrespectful to MySQL, or SQL-databases in general.</description>
    </item>
    <item>
      <title>Dear Wordpress&#39;rs, or, What is GPL?</title>
      <link>https://till.klampaeckel.de/posts/73-dear-wordpressrs-or-what-is-gpl/</link>
      <pubDate>Thu, 29 Oct 2009 19:07:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/73-dear-wordpressrs-or-what-is-gpl/</guid>
      <description>Not sure if anyone has watched this yet, but Matt&amp;rsquo;s latest video contains important misconceptions about the GPL.
Matt says (5:22):
* So a common misconception about the GPL is that, like let&amp;rsquo;s say, I&amp;rsquo;m hired to make a theme for a client. Does that theme fall under the GPL? And the answer is, no! Because it&amp;rsquo;s not being distributed. Uhm, when something is distributed it&amp;rsquo;s available for download to the public, you&amp;rsquo;re selling it in a store, you know, it&amp;rsquo;s sort of mass-distribution.</description>
    </item>
    <item>
      <title>Introducing TillStore</title>
      <link>https://till.klampaeckel.de/posts/72-introducing-tillstore/</link>
      <pubDate>Sat, 24 Oct 2009 02:35:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/72-introducing-tillstore/</guid>
      <description>Update, 2009-10-24: Fixed a bug, and committed a couple other improvements — TillStore 0.2.0 is released!
I went to nosqlberlin last week and I got inspired. I listened to a lot of interesting talks — most notably about Redis, CouchDB, Riak and MongoDB (I&amp;rsquo;m omitting two talks, which of course were not less awesome than the rest!) Due to an unfortunate circumstance I had six hours to hack on stuff from Thursday to Friday.</description>
    </item>
    <item>
      <title>Small notes on CouchDB&#39;s views</title>
      <link>https://till.klampaeckel.de/posts/61-small-notes-on-couchdbs-views/</link>
      <pubDate>Wed, 21 Oct 2009 19:05:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/61-small-notes-on-couchdbs-views/</guid>
      <description>I&amp;rsquo;ve been wrestling with a couple views in CouchDB currently. This blog post serves as mental note to myself, and hopefully to others. As I write this, i&amp;rsquo;m using 0.9.1 and 0.10.0 in a production setup.
Here&amp;rsquo;s the environment:
Amazon AWS L Instance (ami-eef61587) Ubuntu 9.04 (Jaunty) CouchDB 0.9.1 and 0.10.0 database size: 199.8 GB documents: 157408793 On to the tips These are some small pointers which I gathered by reading different sources (wiki, mailing list, IRC, blog posts, Jan &amp;hellip;).</description>
    </item>
    <item>
      <title>Thoughts on RightScale</title>
      <link>https://till.klampaeckel.de/posts/64-thoughts-on-rightscale/</link>
      <pubDate>Tue, 20 Oct 2009 01:40:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/64-thoughts-on-rightscale/</guid>
      <description>RightScale provides all kinds of things — from a pre-configured MySQL master-slave setup (with automatic EBS/s3 backups), to a full LAMP stack, Rails app servers, virtually all kinds of other pre-configured server templates to a nifty auto-scaling feature.
We decided to leverage RightScale when we planned our move to AWS a couple months ago in order to not have to build everything ourselves. I&amp;rsquo;ve been writing this blog entry for the past five weeks and here are some observations, thoughts and tips.</description>
    </item>
    <item>
      <title>Fan Error</title>
      <link>https://till.klampaeckel.de/posts/70-fan-error/</link>
      <pubDate>Sun, 18 Oct 2009 22:05:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/70-fan-error/</guid>
      <description>A Fan Error in this case is not when your Facebook fan page is down. I received this message after my Lenovo X61s notebook decided to quit and I restarted it. The screen said &amp;ldquo;Fan Error&amp;rdquo;, and the notebook refused to continue to the boot process.
A rescue party Of course this is the last thing you want on a Sunday evening, but in true GTD fashion, I wanted to fix it right away.</description>
    </item>
    <item>
      <title>AddressLimitExceeded: Too many addresses allocated</title>
      <link>https://till.klampaeckel.de/posts/68-addresslimitexceeded-too-many-addresses-allocated/</link>
      <pubDate>Tue, 13 Oct 2009 18:10:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/68-addresslimitexceeded-too-many-addresses-allocated/</guid>
      <description>I got this error message tonight when I tried to allocate another EIP from within RightScale&amp;rsquo;s dashboard. So it turns out there is a maximum of 5 (E)IPs on all AWS accounts, but there&amp;rsquo;s a contact form to request more. Meh.
I wish AWS would make this part slightly easier, e.g. by announcing a customer&amp;rsquo;s own IP space.</description>
    </item>
    <item>
      <title>DevHouseBerlin aftermath!</title>
      <link>https://till.klampaeckel.de/posts/67-devhouseberlin-aftermath/</link>
      <pubDate>Sun, 04 Oct 2009 16:02:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/67-devhouseberlin-aftermath/</guid>
      <description>This year&amp;rsquo;s DevHouseBerlin is almost over, and this is what I managed to do.
Planet-PHP Planet-PHP&amp;rsquo;s code has been opensourced for a while and when I started setting up a planet for PEAR I wasn&amp;rsquo;t exactly happy with what it did. Aside from the obvious PHP4 vs. PHP5 issues, the unfortunate lack of documentation, I don&amp;rsquo;t understand why anyone wants to transform an XSL with PHP, to generate PHP. And the bottom line, it didn&amp;rsquo;t work always and I didn&amp;rsquo;t want to debug it any longer.</description>
    </item>
    <item>
      <title>Mobilcom-Debitel-Spass</title>
      <link>https://till.klampaeckel.de/posts/65-mobilcom-debitel-spass/</link>
      <pubDate>Fri, 02 Oct 2009 20:48:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/65-mobilcom-debitel-spass/</guid>
      <description>[English: German content ahead. ;-)]
Habe eben bemerkt, dass der Mobilfunkanbieter meines Vertrauens (die Mobilcom) jetzt zu Debitel gehört, oder anders herum. Auf jeden Fall hat sich im Zuge dieser großartigen Fusion der Kundenbereich der Login grundlegend geändert — anscheinend habe ich jetzt einen Benutzernameich muss mich mit meinem Benutzername einloggen.
Auf zum Benutzernamen Der theoretische Weg zum Benutzernamen (und neuem Passwort) ist wie folgt:
Ich gebe meine Telefonnummer in ein Formular ein und bekomme dafür die Kundennummer per Email zugeschickt.</description>
    </item>
    <item>
      <title>Snow Leopard and WIFI</title>
      <link>https://till.klampaeckel.de/posts/62-snow-leopard-and-wifi/</link>
      <pubDate>Sun, 27 Sep 2009 13:22:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/62-snow-leopard-and-wifi/</guid>
      <description>I updated my mother&amp;rsquo;s Mac Mini from Tiger to Snow Leopard last night and I did not enounter many issues during the one-hour-long installation (or update) process.
In advance — in order to be save than sorry — we had bought an external hard drive and did a backup of her home folder (6 GB — I wish my own backup was that size ;-)).
The one thing I ran into was that after the installation finished, I tried to reconnect to our wifi — but if failed.</description>
    </item>
    <item>
      <title>A case for PEAR and PHP4 (Or, why BC is important!)</title>
      <link>https://till.klampaeckel.de/posts/60-a-case-for-pear-and-php4-or-why-bc-is-important/</link>
      <pubDate>Tue, 22 Sep 2009 18:48:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/60-a-case-for-pear-and-php4-or-why-bc-is-important/</guid>
      <description>Every once in someone likes to argue that PEAR is all fugly PHP4 code and why you should not use it, and instead go and use another framework or component library. Most of those people also say that they looked at or used PEAR x years ago and then act all surprised when someone else disagrees.
In related (BC) news, most people probably read my blog because of Zend Framework, and I remember that one of the reasons I sold my clients on Zend Framework was a supposedly backward compatibility and clean API.</description>
    </item>
    <item>
      <title>My first PHP Unconfernce</title>
      <link>https://till.klampaeckel.de/posts/59-my-first-php-unconfernce/</link>
      <pubDate>Fri, 18 Sep 2009 14:55:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/59-my-first-php-unconfernce/</guid>
      <description>I went to Hamburg last weekend to visit the PHP Unconference, which was probably my first conference ever. I&amp;rsquo;ve been to a couple barcamps and other smaller events, but anyway, this felt more like a real conference to me. That is, if I exclude ALA and the various ad:tech&amp;rsquo;s I had to go to.
The reasons why I usually avoid tech conferences include foremost the price tag (working for myself, I can technically label it as an expense, but I still have to pay for it), doubts that it&amp;rsquo;ll be worth it in terms of knowledge gained and probably time.</description>
    </item>
    <item>
      <title>Managing software deployments of your PHP applications II</title>
      <link>https://till.klampaeckel.de/posts/53-managing-software-deployments-of-your-php-applications-ii/</link>
      <pubDate>Wed, 09 Sep 2009 15:20:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/53-managing-software-deployments-of-your-php-applications-ii/</guid>
      <description>This is not (really a part) two of my series, but an Intermezzo (1) between Part I and Part III — because I have no time to finish Part III.
In Part I, I talked about my approach to deploying a website and I offered pear and subversion as solutions to the problem. To briefly elaborate on my subversion part, I want to share the following Capistrano recipe with you.</description>
    </item>
    <item>
      <title>Forced contribution</title>
      <link>https://till.klampaeckel.de/posts/50-forced-contribution/</link>
      <pubDate>Mon, 07 Sep 2009 14:45:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/50-forced-contribution/</guid>
      <description>I&amp;rsquo;m not exactly neutral when it comes to anything remotely related to the GPL license. Personally, there&amp;rsquo;s a bit of a GPL scare when I see code that&amp;rsquo;s released under that license and I usually try to avoid it.
But (primarily) due to RoundCube being licensed under the GPL, I think I do know what it entails to release code using this license. In addition to that I have read a lot about the license, I even wasted spent three hours one night to listen to RMS.</description>
    </item>
    <item>
      <title>Mail_Queue: 1.2.3</title>
      <link>https://till.klampaeckel.de/posts/58-mail_queue-1.2.3/</link>
      <pubDate>Fri, 04 Sep 2009 17:05:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/58-mail_queue-1.2.3/</guid>
      <description>Despite Mail_Queue being a PHP4-compatible package, I still like to use it on current projects because it is so easy to implement and because it gets the job done. So, over the last weeks (and especially since PHP moved from CVS to SVN :-)), I put in a little time, and especially with the help of Ken, we managed to push out the 1.2.3 release today.
What&amp;rsquo;s new? changed license from PHP to the (New) BSD license This is good news for two reasons.</description>
    </item>
    <item>
      <title>PHP in schnell</title>
      <link>https://till.klampaeckel.de/posts/57-php-in-schnell/</link>
      <pubDate>Thu, 03 Sep 2009 18:50:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/57-php-in-schnell/</guid>
      <description>Sorry, this is all in German. Or at least Germenglish. ;-) The slides are not rocket science and show a basic introduction to &amp;ldquo;faster PHP&amp;rdquo;. Things to do, things to avoid, some autoloading and a little on &amp;ldquo;shared nothing&amp;rdquo; in the end. There are some speaker-notes included (link) to make the slides more valuable for those who couldn&amp;rsquo;t make it.
Hier die Folien zu meinem Vortrag &amp;ldquo;PHP in schnell&amp;rdquo; bei der PHP Usergroup in Berlin im September 2009.</description>
    </item>
    <item>
      <title>BEPHPUG: PHP in schnell</title>
      <link>https://till.klampaeckel.de/posts/56-bephpug-php-in-schnell/</link>
      <pubDate>Mon, 31 Aug 2009 13:00:47 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/56-bephpug-php-in-schnell/</guid>
      <description>German content ahead!
Neu, neu, neu: Die Berliner PHP Usergroup trifft sich im September bereits am Dienstag, 1. September (morgen!), 19 Uhr im NewThinking Store Berlin. Der NewThinking Store ist in der Tucholskystrasse 48 (Berlin-Mitte).
Aktuelles Thema: PHP in schnell (Optimierung, Fallstricke, etc.)
In English: For this month&amp;rsquo;s user group meeting, we meet on the 1st September, 2009, 7 PM at NewThinking Store in Berlin-Mitte. The topic is &amp;ldquo;Faster PHP&amp;rdquo; (Do&amp;rsquo;s and Do not&amp;rsquo;s in optimization.</description>
    </item>
    <item>
      <title>CouchDB on Ubuntu on AWS</title>
      <link>https://till.klampaeckel.de/posts/55-couchdb-on-ubuntu-on-aws/</link>
      <pubDate>Fri, 28 Aug 2009 16:30:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/55-couchdb-on-ubuntu-on-aws/</guid>
      <description>Here&amp;rsquo;s a little HowTo on how to setup CouchDB on an AWS EC2 instance. But outside of AWS (and EC2), this setup works on any other Ubuntu server, and I suppose Debian as well.
Getting started The following steps are a rough draft, or a sketch on how to get started. I suggest that you familiarize yourself with what all of these things do. If you want to skip on the reading and just get started, this should work anyway.</description>
    </item>
    <item>
      <title>Ubuntu: nginx&#43;php-cgi on a socket</title>
      <link>https://till.klampaeckel.de/posts/51-ubuntu-nginxphp-cgi-on-a-socket/</link>
      <pubDate>Fri, 31 Jul 2009 15:20:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/51-ubuntu-nginxphp-cgi-on-a-socket/</guid>
      <description>Moving our PHP application into the cloud, means for us that we are leaving FreeBSD for Linux. Not the best move (IMHO), but I shall elaborate on this in a future blog post.
Once we decided on Ubuntu as the Linux of our choice, I started by moving our development server to an instance on Slicehost. Point taken, Slicehost is not the cloud (as in Amazon EC2, Rackspace, Flexiscale or GoGrid) yet, but Linux on Slicehost and Linux on Amazon EC2 will be alike (or so I hope :-)) and a getting a small slice versus getting a small EC2 instance is an economical decision in the end.</description>
    </item>
    <item>
      <title>BEPHPUG: Debugging mit Eclipse und Xdebug</title>
      <link>https://till.klampaeckel.de/posts/49-bephpug-debugging-mit-eclipse-und-xdebug/</link>
      <pubDate>Wed, 29 Jul 2009 13:45:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/49-bephpug-debugging-mit-eclipse-und-xdebug/</guid>
      <description>Mostly German content ahead!
Die Berliner PHP Usergroup trifft sich am 5. August, ab 20:30 Uhr, in der Z-Bar.
Thema: Debugging mit Eclipse und Xdebug (Vortragender: Marthin Rothenberger)
Adresse:
Teilnahme: kostenlos
( In English: The next meetup of the Berlin PHP Usergroup will take place on the 5th August, 2009. We&amp;rsquo;ll meet at Z-Bar, at around 8:30 PM. This meetup&amp;rsquo;s topic is Debugging with Eclipse and Xdebug. Feel free to join.</description>
    </item>
    <item>
      <title>Subversion dumps</title>
      <link>https://till.klampaeckel.de/posts/46-subversion-dumps/</link>
      <pubDate>Sat, 18 Jul 2009 06:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/46-subversion-dumps/</guid>
      <description>This week, we just had it. The current provider we pay to host our subversion repositories is just unbearable, and so we decided to move (on) to [Unfuddle][3]. Our reason to move to Unfuddle is that they offer everything we need (and more, e.g. Git), at a pretty good price. I also heard Unfuddle a 100 times when I shopped for a recommendation.
And on top of all the features, they also kick butt at support and for example offered to import our repositories right away.</description>
    </item>
    <item>
      <title>Great expectations</title>
      <link>https://till.klampaeckel.de/posts/45-great-expectations/</link>
      <pubDate>Sat, 11 Jul 2009 18:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/45-great-expectations/</guid>
      <description>If you ever contributed your spare time to any project which gives away something at the price of zero, you may be familiar with a large variety of feedback.
It&amp;rsquo;s always reassuring for those who spend their time to get feedback from happy users. But of course there&amp;rsquo;s no way to please everyone at the same time. And aside from the usual &amp;ldquo;This doesn&amp;rsquo;t work!!!11 WTF?!!&amp;rdquo;, some people seem to be particularly ungrateful, or just way out of bounds when they email in.</description>
    </item>
    <item>
      <title>Nginx&#43;PHP&#43;FastCGI: Testing your web application with bleeding edge PHP</title>
      <link>https://till.klampaeckel.de/posts/44-nginxphpfastcgi-testing-your-web-application-with-bleeding-edge-php/</link>
      <pubDate>Sun, 05 Jul 2009 13:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/44-nginxphpfastcgi-testing-your-web-application-with-bleeding-edge-php/</guid>
      <description>So, every once in a while I find myself in need of trying out newer, maybe, not-yet-released features in PHP. For example, recently, I wanted to test RoundCube PHP6 — this is how I did it.
On a side note, the same setup would also work for testing code with previous versions of PHP.
Toolbox I used nginx and the PHP source with a little bit of ./configure and make — for kicks!</description>
    </item>
    <item>
      <title>A webistrano port for FreeBSD</title>
      <link>https://till.klampaeckel.de/posts/43-a-webistrano-port-for-freebsd/</link>
      <pubDate>Sat, 27 Jun 2009 20:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/43-a-webistrano-port-for-freebsd/</guid>
      <description>I&amp;rsquo;m a big fan of capistrano for my deployment and generally also prefer the command line (vs. nifty web interfaces).
Recently, I realized that it would be better to give up some responsibility to others on a project and it seems the easiest in terms of capistrano is webistrano — by the Berlin-based Peritor.
Gimme a port! Because FreeBSD is and always will be my favorite operating system, I created a small port for webistrano on FreeBSD.</description>
    </item>
    <item>
      <title>Magento: moving a store to another server</title>
      <link>https://till.klampaeckel.de/posts/37-magento-moving-a-store-to-another-server/</link>
      <pubDate>Mon, 15 Jun 2009 22:25:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/37-magento-moving-a-store-to-another-server/</guid>
      <description>Frequently, you do client work and if you are fortunate enough, you can setup a development environment on your own server or your laptop (or whatever), tinker with the files, and templates, and so on — until it&amp;rsquo;s all done.
And whenever you are done, it&amp;rsquo;s time to move files.
Sounds easy? It sort of is!
Checklist Here&amp;rsquo;s a small check list of things to keep in mind when you move an installation.</description>
    </item>
    <item>
      <title>So you want some work for free?</title>
      <link>https://till.klampaeckel.de/posts/39-so-you-want-some-work-for-free/</link>
      <pubDate>Wed, 03 Jun 2009 22:42:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/39-so-you-want-some-work-for-free/</guid>
      <description>So last night, we had one of those Berlin PHP usergroup meetings without a speaker/talk and some of us decided to meet anyway for a drink and chat. So at first, there were three of us and then we met two people from a new startup who asked if they could join in. And so it began.
Enter spiel These two people (from the startup) told us right away (I think before taking a seat), that they are looking for people who are interested in working for a startup.</description>
    </item>
    <item>
      <title>PHP performance III -- Running nginx</title>
      <link>https://till.klampaeckel.de/posts/30-php-performance-iii--running-nginx/</link>
      <pubDate>Sun, 31 May 2009 02:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/30-php-performance-iii--running-nginx/</guid>
      <description>Since part one and two were uber-successful, here&amp;rsquo;s an update on my Zend Framework PHP performance situation. I&amp;rsquo;ve also had this post sitting around since beginning of May and I figured if I don&amp;rsquo;t post it now, I never will.
Disclaimer: All numbers (aka pseudo benchmarks) were not taken on a full moon and are (of course) very relative to our server hardware (e.g. DELL 1950, 8 GB RAM) and environment.</description>
    </item>
    <item>
      <title>OMG! It&#39;s the PHP &lt;strike&gt;Meat&lt;/strike&gt; BBQ Tour!</title>
      <link>https://till.klampaeckel.de/posts/38-omg-its-the-php-strikemeatstrike-bbq-tour/</link>
      <pubDate>Tue, 26 May 2009 12:43:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/38-omg-its-the-php-strikemeatstrike-bbq-tour/</guid>
      <description>Mmmhhhh!!! Just kidding of course. ;-)
I&amp;rsquo;m sure you&amp;rsquo;ve already read Ulf Wendel&amp;rsquo;s blog post about the PHP BBQ Tour. And as you noticed, he&amp;rsquo;ll be in town Berlin on the 18th June. What better opportunity is there to come out and share a Bratwurst (or a veggie-dog) with a couple people from the local PHP usergroup, and MySQL Sun (Oracle?) and other known PHP folks such as PHPUnit&amp;rsquo;s Sebastian Bergmann and Mayflower&amp;rsquo;s Bjoern Schotte.</description>
    </item>
    <item>
      <title>RFC: CouchDB on FreeBSD</title>
      <link>https://till.klampaeckel.de/posts/36-rfc-couchdb-on-freebsd/</link>
      <pubDate>Fri, 15 May 2009 14:19:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/36-rfc-couchdb-on-freebsd/</guid>
      <description>Thanks to Wesley, we recently managed to update CouchDB&amp;rsquo;s FreeBSD port to the official 0.9.0 release.
My current TODO for the port includes:
a super-cool rc-script (currently, there is none) automatic user setup/creation (couchdb) patching of the install/source to use BSD-style directories for the database (e.g. /var/db/couchdb). In regard to the the rc-script, I continued on a work in progress and committed an idea on Github. This work in process (couchdb) works out of the box.</description>
    </item>
    <item>
      <title>Great success!</title>
      <link>https://till.klampaeckel.de/posts/34-great-success/</link>
      <pubDate>Mon, 11 May 2009 19:06:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/34-great-success/</guid>
      <description>Even though I didn&amp;rsquo;t like the Borat movie very much, I still like to use his line, Great success!. But on to more important things! ;-)
Last weekend, we — the Berlin PHP UserGroup (and Christian Weiske from Leipzig) — took part in what some people labeled the European PHP TestFest 2009. In a nutshell, we were writing tests to cover different PHP extensions.
Here&amp;rsquo;s the outcome (numbers courtesy of Falko Menge):</description>
    </item>
    <item>
      <title>Slides: Testing (with) PHP</title>
      <link>https://till.klampaeckel.de/posts/talks/33-slides-testing-with-php/</link>
      <pubDate>Thu, 07 May 2009 12:16:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/talks/33-slides-testing-with-php/</guid>
      <description>German content: These are my slides from the BEPHPUG user group meeting (2009/05/06). I hope these help others to get an overview on testing with PHP and PHP itself. I certainly hope it&amp;rsquo;s all correct too! :-)</description>
    </item>
    <item>
      <title>BEPHPUG: Testen mit PHP -- Eine Einfuehrung in phpt</title>
      <link>https://till.klampaeckel.de/posts/32-bephpug-testen-mit-php--eine-einfuehrung-in-phpt/</link>
      <pubDate>Tue, 05 May 2009 22:05:20 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/32-bephpug-testen-mit-php--eine-einfuehrung-in-phpt/</guid>
      <description>German content ahead: An invite to the local PHP usergroup meeting, today/tomorrow 6th May, 2009. It&amp;rsquo;s all free and the venue is located at Z-Bar on Bergstr. 2, Berlin-Mitte!
Wir laden heute (6. Mai, 2009) zu einem kleinen Vortrag in der BEPHPUG ein.
Was: Testen mit PHP, eine Einfuehrung in phpt Wann: 20:30 Uhr, 6. Mai, 2009 Wo: Z-Bar, Bergstr. 2, Berlin-Mitte Eintritt: frei &amp;hellip; und weiter geht&amp;rsquo;s am Samstag (9.</description>
    </item>
    <item>
      <title>MySQL: Using indices correctly</title>
      <link>https://till.klampaeckel.de/posts/31-mysql-using-indices-correctly/</link>
      <pubDate>Tue, 05 May 2009 16:45:17 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/31-mysql-using-indices-correctly/</guid>
      <description>The objective was to select sessions from a table, that are older than two days.
Table setup This is the definition:
CREATE TABLE `session` (`id` varchar(32) NOT NULL DEFAULT &#39;&#39;,`data` text NOT NULL,`user` int(11) DEFAULT NULL,`created` datetime NOT NULL DEFAULT &#39;0000-00-00 00:00:00&#39;,`updated` datetime NOT NULL DEFAULT &#39;0000-00-00 00:00:00&#39;,PRIMARY KEY (`id`),KEY `user_id` (`user`),KEY `rec_datemod` (`updated`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;Right and wrong Wrong query:</description>
    </item>
    <item>
      <title>Magento: Error: Please check for sufficient write file permissions</title>
      <link>https://till.klampaeckel.de/posts/29-magento-error-please-check-for-sufficient-write-file-permissions/</link>
      <pubDate>Thu, 30 Apr 2009 16:29:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/29-magento-error-please-check-for-sufficient-write-file-permissions/</guid>
      <description>Moving a store from one server to another server, you&amp;rsquo;re bound to have small issues. While 99% of the configuration is stored in app/etc/local, there are other bits and pieces that are more spread out. For example, I noticed that there&amp;rsquo;s no central &amp;lsquo;Are all file permissions OK?&amp;rsquo; screen in Magento Commerce and at times the system is pretty secretive when it comes to error messages.
For example, after moving a store from a linux to a BSD (essentially a different WWW user id), Magento Connect just died with &amp;ldquo;Error: Please check for sufficient write file permissions&amp;rdquo;.</description>
    </item>
    <item>
      <title>How to setup multiple stores on different domains with Magento</title>
      <link>https://till.klampaeckel.de/posts/27-how-to-setup-multiple-stores-on-different-domains-with-magento/</link>
      <pubDate>Wed, 22 Apr 2009 14:05:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/27-how-to-setup-multiple-stores-on-different-domains-with-magento/</guid>
      <description>Multiple stores is probably the killer feature of the Magento Commerce store. It enables the needy to manage multiple stores through a single interface. Your very own mall in a box.
It&amp;rsquo;s also a management/deployment nightmaredream come true. A single piece of software powering multiple websites.
This small HowTo requires a working installation of Magento (tested with Magento Commerce v1.3), multiple stores setup already, an understanding of your (web)server, some shell-fu and probably root access.</description>
    </item>
    <item>
      <title>Cannot send headers; headers already sent in , line 0</title>
      <link>https://till.klampaeckel.de/posts/26-cannot-send-headers-headers-already-sent-in-line-0/</link>
      <pubDate>Thu, 09 Apr 2009 13:29:39 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/26-cannot-send-headers-headers-already-sent-in-line-0/</guid>
      <description>Yesterday, I started upgrading a test server to Apache 2.2 and PHP 5.2.9 and ran into this is a problem, which then bugged me for a good day. So here&amp;rsquo;s the run down:
My test.php:
&amp;lt;?phpob_start();system(&#39;file -i -b /path/file.txt&#39;);$contents = ob_get_contents();ob_end_clean();var_dump(headers_sent($file, $line), $file, $line);My test2.php:
&amp;lt;?php$contents = shell_exec(&#39;file -i -b /path/file.txt&#39;);$contents = trim($contents);var_dump(headers_sent($file, $line), $file, $line);test.php claims that headers were send, while test2.</description>
    </item>
    <item>
      <title>Just add blame</title>
      <link>https://till.klampaeckel.de/posts/24-just-add-blame/</link>
      <pubDate>Sun, 05 Apr 2009 19:17:58 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/24-just-add-blame/</guid>
      <description>I swore myself to only post meaningful stuff to this blog, so basically, no rants, ever. But!
The discussion revolving around Twitter and Rails (versus Scala) did remind me of something: If you&amp;rsquo;ve doing PHP for a while and know people who are programming not in PHP, you probably heard it all before. PHP guys (and girls) are being look down on and mocked by people of other programming and scripting languages.</description>
    </item>
    <item>
      <title>Avoiding common pitfalls with Zend_Test</title>
      <link>https://till.klampaeckel.de/posts/21-avoiding-common-pitfalls-with-zend_test/</link>
      <pubDate>Sat, 28 Mar 2009 19:30:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/21-avoiding-common-pitfalls-with-zend_test/</guid>
      <description>Sometimes I think I&amp;rsquo;m particularly stupid when it comes to learning new things. Well, that, or maybe I&amp;rsquo;m just the only one complaining enough. ;-)
I feel like I&amp;rsquo;ve wasted a great deal of time last week with basics that were nowhere to be found or required debugging to no end. The following is the outcome, a rather random list of things to watch out for when you&amp;rsquo;re starting on Zend_Test.</description>
    </item>
    <item>
      <title>Drobo: USB device not recognized</title>
      <link>https://till.klampaeckel.de/posts/20-drobo-usb-device-not-recognized/</link>
      <pubDate>Wed, 25 Mar 2009 21:20:01 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/20-drobo-usb-device-not-recognized/</guid>
      <description>I swear to god. Last year, I loved Drobos — but right now? Not so sure any more.
I recently had to return a 2nd generation Drobo unit. The 2nd generation Drobos have Firewire ports, while the 1st generation Drobos are sporting USB-only.
The issues with this 2nd generation unit started about 2 month ago when it stopped responding via USB. Because the EEEPC Box it is hooked up to doesn&amp;rsquo;t have Firewire we couldn&amp;rsquo;t verify if it was broken entirely.</description>
    </item>
    <item>
      <title>We are TestFest&#39;ing!</title>
      <link>https://till.klampaeckel.de/posts/19-we-are-testfesting/</link>
      <pubDate>Wed, 25 Mar 2009 20:57:58 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/19-we-are-testfesting/</guid>
      <description>English: Berlin&amp;rsquo;s PHP usergroup is taking part in PHP&amp;rsquo;s TestFest 2009, on the 9th and 10th May, 2009! The location will be Boxhagener Str. 119, Berlin (Friedrichshain), if you want to attend, please RSVP on our wiki!
Starting it off, I&amp;rsquo;ll give an intro to PHPT-style testing at the monthly meeting of the usergroup in May!
Deutsch: Die PHP Usergroup Berlin nimmt am PHP TestFest 2009 teil. Wir treffen uns dazu am 9.</description>
    </item>
    <item>
      <title>PHP Berlin in March</title>
      <link>https://till.klampaeckel.de/posts/18-php-berlin-in-march/</link>
      <pubDate>Thu, 26 Feb 2009 17:35:32 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/18-php-berlin-in-march/</guid>
      <description>March is a pretty exciting month for PHP people in Berlin, and around — so here is what we got.
Berlin PHP user group Topic: Magento Commerce (webservices, integration, skinning, &amp;hellip;), and a little bit of Zend-MVC When: 8:30 PM, 4th March, 2009 Where: Z-Bar, Bergstr. 9, Berlin-Mitte &amp;hellip; presented by Manuel Blechschmidt, and of course for the price of nothing. :-)
Berlin Flex user group The Berlin Flex user group invited Adobe Platform Evangelist Mihai Corlan to speak about Flex development with a PHP backend, using Zend_Amf and probably Zend Studio.</description>
    </item>
    <item>
      <title>Some observations on CouchDB&#39;s compact</title>
      <link>https://till.klampaeckel.de/posts/17-some-observations-on-couchdbs-compact/</link>
      <pubDate>Wed, 25 Feb 2009 18:02:05 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/17-some-observations-on-couchdbs-compact/</guid>
      <description>Over the last two weeks, I had been working on an import from a raw text file of JSON data (~20 GB) into CouchDB.
Due to the fuzzyness of the data, I decided to not use _bulk_docs to import it because if a single document inside a bulk request would fail (e.g. duplicate _id), I would have to go through the request one by one to figure out what went wrong.</description>
    </item>
    <item>
      <title>Measuring CouchDB performance</title>
      <link>https://till.klampaeckel.de/posts/16-measuring-couchdb-performance/</link>
      <pubDate>Mon, 23 Feb 2009 11:50:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/16-measuring-couchdb-performance/</guid>
      <description>The overall document-oriented approach of CouchDB and the free-form way of saving data are probably the things that appeal to most of us when we first read about this new database.
Most of the people that were introduced to CouchDB so far quickly made the decision to use it in production despite the early beta&amp;rsquo;ish state of the project. We all hate normalization, we all want a faster and responsive database, and some of us want multiple nodes and inter-node replication.</description>
    </item>
    <item>
      <title>Managing software deployments of your PHP applications I</title>
      <link>https://till.klampaeckel.de/posts/11-managing-software-deployments-of-your-php-applications-i/</link>
      <pubDate>Sat, 31 Jan 2009 20:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/11-managing-software-deployments-of-your-php-applications-i/</guid>
      <description>Disclaimer: I&amp;rsquo;ve been doing mostly PHP and Zend Framework based projects in the past two years, but the information from this article is general and should be applicable to most setups — even to non PHP-based projects (to a certain extent).
Inspired by Padraic&amp;rsquo;s posting spree the other week, here&amp;rsquo;s another attempt to provide you with some hands-on usefulness. I&amp;rsquo;m all open for all feedback, and sorry for the length!</description>
    </item>
    <item>
      <title>PHP FastCGI woes!</title>
      <link>https://till.klampaeckel.de/posts/13-php-fastcgi-woes/</link>
      <pubDate>Mon, 26 Jan 2009 17:30:50 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/13-php-fastcgi-woes/</guid>
      <description>Those of you who run high traffic websites, have probably tried php-cgi/fcgi down the road. And most of us, have gone back to Apache.
But now — actually since the middle of 2007 — there&amp;rsquo;s light at the end of the tunnel. I read a blog post by Evert Pot&amp;rsquo;s last night (Apache speed and reverse proxies). Evert noted that he tried to use Lighttpd and php-fcgi, all the infamouse tricks with spawn-fcgi.</description>
    </item>
    <item>
      <title>Fixing up anti-spam plugins in Wordpress (and other apps) for Mosso</title>
      <link>https://till.klampaeckel.de/posts/10-fixing-up-anti-spam-plugins-in-wordpress-and-other-apps-for-mosso/</link>
      <pubDate>Sun, 18 Jan 2009 23:05:55 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/10-fixing-up-anti-spam-plugins-in-wordpress-and-other-apps-for-mosso/</guid>
      <description>A lot of companies moved their web applications, or parts of them, to the cloud in 2008. Some people have had issues, for others (and AWS in particular), it&amp;rsquo;s been one success story.
Because some of us like to focus on the business side and not run servers ourselves, providers like Mosso (a division of Rackspace) and MediaTemple offer scalable webhosting environments available to everyone.
Some of them call their offering cloud, others call it grid.</description>
    </item>
    <item>
      <title>Drobo with DroboShare on XP, Vista, MacOSX, Ubuntu</title>
      <link>https://till.klampaeckel.de/posts/9-drobo-with-droboshare-on-xp-vista-macosx-ubuntu/</link>
      <pubDate>Sat, 17 Jan 2009 17:14:51 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/9-drobo-with-droboshare-on-xp-vista-macosx-ubuntu/</guid>
      <description>I bought a Drobo for myself about seven months ago and I couldn&amp;rsquo;t be any happier. My files are backed up on a RAID system, I still got plenty of space to waste. My world is OK.
Some friends of mine recently bought one of the new Drobo units with a DroboShare. The DroboShare costs $200 (USD) and is a glorified Linux server which exports your Drobo using Samba to all clients on the network.</description>
    </item>
    <item>
      <title>Seven Things -- Tagged by Chuck Burgess</title>
      <link>https://till.klampaeckel.de/posts/8-seven-things--tagged-by-chuck-burgess/</link>
      <pubDate>Sun, 04 Jan 2009 11:01:18 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/8-seven-things--tagged-by-chuck-burgess/</guid>
      <description>Thanks to Chuck, I&amp;rsquo;ve been tagged — rejoice. (Edit: I&amp;rsquo;ve also been tagged by Greg.) Now because I&amp;rsquo;m a web2 slut, it&amp;rsquo;ll be hard to tell anyone seven things which they don&amp;rsquo;t know already, but here we go anyway!
Seven things Little did you know, but my middle name is Felix. I&amp;rsquo;m deadly afraid of rodents. =( By birth, I&amp;rsquo;m a real commie. I was born in Karl-Marx-City, East-Germany, before the wall came down.</description>
    </item>
    <item>
      <title>A little pain^H^H^H^H^Java never hurt anybody</title>
      <link>https://till.klampaeckel.de/posts/5-a-little-painhhhhjava-never-hurt-anybody/</link>
      <pubDate>Mon, 22 Dec 2008 12:52:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/5-a-little-painhhhhjava-never-hurt-anybody/</guid>
      <description>While I personally agree with some of what Luke Welling wrote in his article &amp;ldquo;PHP is not Java&amp;rdquo; for PHP Advent 2008, I also disagree with the general tone of the article and the examples he provides. The example Luke provides might be true in some respects (that it looks like Java code), but the solution offered is the best example why PHP and PHP developers are looked down on most time.</description>
    </item>
    <item>
      <title>PEAR &amp; Plesk</title>
      <link>https://till.klampaeckel.de/posts/1-pear-plesk/</link>
      <pubDate>Tue, 09 Dec 2008 15:11:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/1-pear-plesk/</guid>
      <description>We frequently get users on #pear (@efnet) who happen to run Plesk and need help setting up PEAR. Now running any config interface is a blog entry by itself and when I say Plesk, I should also mention confixx and cpanel. And while I have a strong dislike for all them, let me focus on Plesk for now.
This is not a copy&amp;rsquo;n&amp;rsquo;paste howto, so make sure you double-check all steps involved.</description>
    </item>
    <item>
      <title>ZendFramework version requirements</title>
      <link>https://till.klampaeckel.de/posts/3-zendframework-version-requirements/</link>
      <pubDate>Mon, 08 Dec 2008 23:17:55 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/3-zendframework-version-requirements/</guid>
      <description>As some people noticed, with the release of ZendFramework 1.7, the version requirement was bumped up from 5.1.6 to 5.2.4.
If you really care which ancient version of PHP you should install (vs. 5.2.6, 5.2.7 or 5.2.8 next week ;-)) &amp;ndash; here is a breakdown per component:
Zend_Acl: 5.0.0 Zend_Amf: 5.0.0 Zend_Auth: 5.0.0 Zend_Cache: 5.0.0 Zend_Captcha: 5.1.0 Zend_Config: 5.0.0 Zend_Console: 5.0.0 Zend_Controller: 5.0.0 Zend_Currency: 5.0.0 Zend_Date: 5.1.0 Zend_Db: 5.1.0 Zend_Debug: 5.</description>
    </item>
    <item>
      <title>Hello world!</title>
      <link>https://till.klampaeckel.de/posts/2-hello-world/</link>
      <pubDate>Fri, 05 Dec 2008 17:48:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/posts/2-hello-world/</guid>
      <description>This is my new blog &amp;ndash; at least I hope. :-)</description>
    </item>
    <item>
      <title>Till Klampaeckel</title>
      <link>https://till.klampaeckel.de/cv/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://till.klampaeckel.de/cv/</guid>
      <description>Curriculum vitae</description>
    </item>
  </channel>
</rss>
