Lion and legacy AFP connections

I have just upgraded to Lion to find out that I could no longer connect to my Qnap NAS via the AFP protocol. Seems like Apple decided to disable an authentication mechanism in Lion which the Qnap device depends on. Whenever I tried to connect with my username, I received an error “There was a problem connecting to the server”.

Qnap is working on an updated firmware but my device will not receive this update, so I need another solution.

Thanks to Alexander Wilde there is a simple solution to reenable the now missing authentication schema.

Continue reading »

Recap: 4 months on the iOS App Store

App Store IconIt is now a little over 4 month ago that I have released Gigtool in the iOS app store. I was aware, that most applications in the app store don’t perform well without heavy promotion. I wrote Gigtool with a very small target audience in mind to test whether specialized applications might produce a steady revenue stream even without any promotion. The reasoning behind this is, that Gigtool will be found by its target audience using the search functionality of the app store.

I released Gigtool for a price of $1.99 in the music category of the store. As long as Gigtool was mentioned on the front page of that category under the “New & Noteworthy” section there was a steady stream of around 5 sales per day. This dwindled to next to nothing once Gigtool dropped out of the “New & Noteworthy” section. At that time I had only around 2 sales per week.

Continue reading »

Git hosting with gitolite

Git LogoNow that Xcode has native support for Git repositories, I finally decided to migrate my private Mercurial repository to Git. I have always been running my source code repository on my own server and I want to keep this practice with Git. When searching for options on how to setup a private Git repository, Gitolite seemed like a nice option.

In this small howto I will describe how I have setup Gitolite on my Ubuntu 8.04 server. Please note, that Ubuntu has included Gitolite in the 10.10 release, so that the installation is even simpler now. I will describe the manual installation procedure for Ubuntu releases prior to 10.10.

Continue reading »

Gigtool now available on the iTunes App Store

I have developed an iPhone application which contains some handy tools for live sound engineers. Nowadays the App Store is crowded with all kinds of games, utilities and applications. For a developer it is extremely hard to get the amount of visibility you need to make a small profit or even to break even. Gigtool is an experiment to find out, if addressing a niche target market helps in building up a customer base.

Today the application has been added to the App Store. In a couple of weeks I will write up about my experiences with Gigtool. More information about the app is available on the Gigtool website.

Continue reading »

Workaround for iOS 4.1 battery drain problem

It seems that Apple introduced a nasty battery drain problem with the iOS4.1 update in September. After I installed the update, my iPod Touch 2G drained the battery completely empty after about 8 hours of sleep. Resetting and reinstalling the device didn’t help. The problem was that it stayed connected to the wireless network even in sleep mode.

There exist 2 solutions which seem to work for me so far:

  • Switch the iPod into Airplane mode when network access is not needed
  • Go to Settings -> Notification settings and toggle all the settings of all applications in that screen to ON and back to OFF. It seems like some these applications have been using wrong settings even with global notification turned off. Toggling the individual settings has reset them to the desired state. You can see if this step was successful by opening the overview of connected WLAN devices in your WLAN access point and then putting your iPod to sleep. It should drop out of the list of connected devices after about 10 seconds of sleep. </ul> Let’s hope that Apple will fix this issue with iOS 4.2 due in November.


The described fix did not prove to be permanent. Every now and the setting seems to reset itself and the iPod stays connected to the WLAN in sleep mode. So back to square one: turn on airplane mode whenever Wifi is not needed. Damn!

Continue reading »

Setting up a VPN-server on Amazon EC2

Amazon has recently announced the new Micro Instances in their Elastic Cloud service. A so called Micro Instance is a virtual machine with 620 MB main memory and CPU power in the area of an 1 GHz Opteron processor. The advantage of the Micro Instance is its low cost of only $0.02 per hour of operation (be advised, there are some additional costs for traffic and storage).

The EC2 Micro Instance is an ideal way to operate your own VPN-server, when you need it only a couple of hours per month. Let’s assume, that you want to use it for about 50 hours per month with around 10 GB of traffic, this means $1.00 for computation time + $1.50 for 15 GB of storage + $1.50 for 10 GB outgoing traffic. So for $4 this is quite a good offer. Granted, you can find commercial VPN providers for $5 per month, but it is more fun to do it yourself. In this article I will describe, how to setup an EC2 instance as a VPN-server.

Continue reading »

Prevent Time Machine Backup Resizing

If you are using Time Machine to backup your Mac onto a network share, you might have noticed, that since the Snow Leopard 10.6.3 update the sparsebundle image used by Time Machine has been resized to use the whole capacity of your network share.

I use a Qnap NAS as a central network storage for backing up mulitple Macs and therefore I want to define strict limits for the maximum size of each Time Machine backup. So after noticing the new image sizes, I tried to resize them with hdiutil:

hdiutil resize -size 500g MYBUNDLENAME.sparsebundle

Unfortunately Time Machine resizes the image size every time it runs, so it is necessary to prevent it from resizing the image.

The image size of a sparsebundle is stored in the Info.plist file inside the bundle directory, so I tried to remove write permissions to that file from the terminal:

cd /Volumes/MYSHARE/
chmod a-w MYBUNDLENAME.sparsebundle/Info.*

This wasn’t working either, because OSX seems to reset the permissions to Info.plist automatically.

The solution which is finally working for me was to login to my Qnap box via SSH and change the permissions there via chmod:

chmod a-w MYBUNDLENAME.sparsebundle/Info.*

Now, when Time Machine starts, it tries to resize the image but fails, as the Qnap server is preventing any changes to the Info.plist file. You can see this behavior in the system.log:

23.05.10 22:29:13[378] Resizing backup disk image from 500.0 GB to 989.8 GB
23.05.10 22:29:13[378] Could not resize backup disk image (DIHLResizeImage returned 35)

After this logging message, the rest of the backup runs fine. For me this is a nice workaround until there is an official way to limit the backup size.

Continue reading »

Running Mercurial with FastCGI in nginx

logo-droplets-200 Mercurial is a so called DRCS (Distributed Revision Control System). I have been using Subversion for a couple of years, both at work and for my own projects. Now I thought it was about time to try something different.

But first, why do I want to switch from SVN to Mercurial? Basically the most appealing argument for me was the fact, that with Mercurial I am able to work offline with my repository. Besides that, I always had issues with the way SVN was handling tags and branches. Especially merging changes from a branch back into the trunk was always a pain. I did not need to use that functionality often but when I did, I always ended up doing it twice, because I could not remember which way to do it right.

Continue reading »

Nginx rewrite rules for SilverStripe CMS

If you are using Nginx with a configuration that is directly serving php pages via FastCGI, you need to adapt the rewrite rules to Nginx. In the case of the CMS-system SilverStripe this is not really straight forward. The original rewrite definition in the .htaccess file looks like this:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !(\.gif)|(\.jpg)|(\.png)|(\.css)|(\.js)|(\.php)$

RewriteCond %{REQUEST_URI} ^(.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* sapphire/main.php?url=%1&%{QUERY_STRING} [L]

So every file which does not end in .gif, .jpg, .png, .css, .js and .php and where the file does not exist will be rewritten.

I chose a somehow stripped down version of these rules which looks in Nginx notation like this:

if (!-f $request_filename) {
    rewrite ^/(.*?)(\?|$)(.*)$ /sapphire/main.php?url=$1&$3 last;

If a requested file is not found, the rewriting engine will parse the request string for all elements before a ‘?’. This substring will be pasted as the url parameter to main.php. Everything after ‘?’ will be added as additional parameters. This rewrite rule seems to be working and I haven’t encountered any problems so far.

Continue reading »