My name is Kenneth and I write cool Mac and iPhone software. This is my personal weblog where I post about stuff I find interesting. I usually write about Mac development, the business of shareware and the Mac community in general.
read more →One of the most popular articles on this blog has always been my tutorial on how to hack an War3 autorefresh bot for Mac.
However, it’s still quite a clunky hack, and many commenters have been unable to get it work smoothly. Even I gave up on it when I upgraded to Leopard.
Introducing Warmonger
Warmonger is a Mac-like autorefresh bot for Warcraft III. It does that and only that, but it does it well, reliably and most importantly, natively.
Warmonger is completely free, too.
Using Warmonger is easy: Create a game on Battle.net, switch to Warmonger and hit Refresh, get back to War3 and enjoy your autorefreshing game.
Warmonger knows to stop automatically when your game starts. Once it’s launched, you don’t even have to worry about it anymore. It really is that simple.
Apple’s Increasingly Ridiculous Rejections
Three months ago, I submitted an update to iLaugh and iLaugh Lite, numbered 1.1.1 that fixed many bugs but didn’t change anything to the functionality of the app.
Today, after three whole months in review (seriously, I’m not making this up!), they decided to finally tackle the issue and issue me a rejection for no other reason other than “because we said so.”
See for yourself.
Please note, this is for iLaugh 1.1.1. iLaugh 2.0 is still in review, as a new application, and there’s no reason it should be rejected. In fact, the premium edition has already been approved and is already live on the App Store.
Speaking of iLaugh 2.0 – the first public screenshot ever:
On The App Store Hype
A while back, TechCrunch covered yet another article complaining about the App Store being more of a Lotto than a marketplace. Setting aside the App Store’s numerous other issues, coverage of iPhone app developers has been divided into two extremes: reassuring yet unlikely success stories, or depressing yet much more likely failure stories.
The general question in all of these articles is: “Can an average guy become a successful iPhone developer?”. The answer depends on how you define success, and on that topic I can speak from my own experience.
If, to you, success means making a million bucks overnight you will most likely be unsuccessful. To me, success is defined as the return on my investment (both in time and money) on the project. In my previous article, I mentioned making somewhere around a hundred dollars a day on iLaugh. However, I didn’t mention how much I invested in the project.
The first version of iLaugh and its subsequent revisions took me very little time to create. I estimate that I invested between ten to twenty hours of my time to create iLaugh 1.0. At my asking rate of $100 per hour, that represents a $1,000 to $2,000 investment. The server running the first iteration of the iLaugh API cost me about $100 per month to maintain.
If you look at the numbers for iLaugh from previous months, I make over $3,000 monthly (for a total of over $8,000 so far). Thus, I consider it a success.
Many people, in response to my previous article, said that I too, was one of the lucky ones, albeit on a smaller scale. And while that may be true, considering the low quality of that first iteration of iLaugh, a more carefully crafted app would likely have done better.
I believe the potential for success is relative to the investment put into anything.
If you look at the familiar success stories, many of them involve reinvestment and good marketing. For instance, Tapulous hit the jackpot with their Tap Tap games. Being good friends with one of their employees, I know exactly how much work goes into their production.
Perhaps one of the most talked-about success stories is Trism. Its developer, Steve Demeter, made an insane $250,000 in just two months. What I believe is the key to Steve’s long-term success, is that instead of buying a fancy sports car, he reinvested his money into founding a sustainable business.
Part of reinvesting, and a facet of development often ignored, are things that a typical developer can’t do. Most importantly: design, copywriting and marketing. These are things that will most likely have to be outsourced. Developers are reluctant to do that, because it’s very costly, but in the end, ignoring it is going to cost them the popularity of their application.
I view iLaugh 1.x as a catalyst towards bigger and, hopefully, even more successful endeavors.
In fact, I have already put a big part of my (in comparison to the numbers above, quite mediocre) earnings into the second iteration of iLaugh. I’ve hired a bunch of people much more talented than I am in their respective fields, and iLaugh 2.0 is coming along really nicely. It will be entirely different and nearly incomparable to the first iteration. There are some very cool things coming.
So, responding to my initial question: “Can an average guy become a successful iPhone developer?”. Yes! An average developer can be successful in the App Store. But it takes hard work, a lot of time, money, and perseverance.
Dynamic mass vhost with Apache and mod_rewrite
In the process of setting up a new web-server with Mosso’s CloudServer, I came up across an interesting problem that took be the better part of the day to figure out.
The new server is completely unmanaged, which means that I have no web control panel to manage things. But worry not, that’s actually a good thing, because it means I have no web control panel to complicate and fuck up things either.
But it meant I had to setup Apache manually, including the vhosts so that my domain get mapped to the correct content. The problem is I have north of ten domains, each with their own subdomains. I could do it the standard and documented way of adding a VirtualHost for each domain, or I can be clever and have it do the work for me.
My first idea was to go with mod_vhost_alias:
UseCanonicalName Off
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon
VirtualDocumentRoot /home/kenneth/www/%0/public
VirtualScriptAlias /home/kenneth/www/%0/cgi-bin
This worked like magic, automatically translating the domain requested to the path. http://domain.com/* would translate to /home/kenneth/www/domain.com/public/*. But, www.domain.com would translate to a folder named www.domain.com. This meant one of two things: either I had to create dirty symlinks in my www folder, or anybody accessing my domain from the www. subdomain would get a 404 error, both of which are unacceptable.
Another option would be to change that code like such:
VirtualDocumentRoot /home/kenneth/www/%-2.0.%-1.0/public
VirtualScriptAlias /home/kenneth/www/%-2.0.%-1.0/cgi-bin
This works by taking the last two parts of a domain, but it has two big flaws. Firstly, it completely ignores any subdomains. Secondly, it doesn’t work with multiple-tld domains, such as .co.uk domains.
After a whole afternoon of trying different things, I came to the optimal solution, through URL rewriting.
With this solution, domains, whether they have www. or not, map to the same domain.tld folder, and subdomains also map to folders in the same root folder (www, in my case).
UseCanonicalName Off
RewriteEngine On
RewriteCond %{REQUEST_URI} !/home/kenneth/www
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*)$ [NC]
RewriteRule ^/(.*)$ /home/kenneth/www/%1/public/$1
RewriteCond %{REQUEST_URI} !/home/kenneth/www
RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*)$ [NC]
RewriteRule ^/(.*)$ /home/kenneth/www/%1/cgi-bin/$1 [T=application/x-httpd-cgi]
Personal Hub, Business Cards, Art Potfolio
I’ve recently won a prize of a thousand free business cards in a contest, which gave me the perfect excuse to stop procrastinating and start designing pretty business cards. Below are a few images of these beauties.
To match these nifty-looking business cards, I today designed and launched a new personal “hub” site to overcome the usability and the not-so-friendly look of the old one.
Going from this:
To this:
My blog shrinks the image, go visit the site, it look much better in reality.
The last thing I wanted to show off is something I should’ve shown off a long time: my formal art portfolio.
Click on the (very modest) title page to view the rest.