As with most things, the amount of work we as developers see when starting an iOS application is just the tip of the iceberg. There’s artwork, “About” screens, tutorial pages, icons, the app’s website, and all the marketing the app needs to get it out there. Even writing the app’s description or taking screenshots for the App Store is a time-consuming process. So anything I can do to cut down on the time needed to release my app, the better I am. Therefore when I decided to have myDrumPad translated to other languages to widen my user-base, I wanted to do make it as painless as possible.
I tried tried to have friends and family who understood foreign languages help with translations, and while they were very well intentioned it really didn’t work out in the end. What I discovered was that there really is no substitute for hiring a trained professional. But luckily it doesn’t have to be outrageously expensive. Read on for more.
While developing myDrumPad, I came across an interesting problem for my in-app purchase support. The app allows users to download additional packs of sounds (referred to as “sound packs” in the app) that they can use to tap out songs and rhythms. The sound packs themselves were a collection of CAF-encoded uncompressed PCM audio files, with a single configuration file describing the labels and arrangement of the sound files on the drum pad’s grid of buttons.
I wanted to be able to add additional sound packs without issuing a new release of the app, but since the information describing the sound packs is largely static, I didn’t want to have to worry about maintaining a dynamic server for the app to continue functioning. I wanted it to largely be “fire and forget”.
What I came up with is, I think, a best of both worlds. The app functions without needing me to maintain a server, but I can still dynamically add additional resources to the app instantly. Read on to find out more.
I’ve been working recently on getting more exposure to my existing apps, especially myDrumPad. It’s a fun app, and I have a few more updates that are in the works when I get a couple of free weekends, but frankly I’d like to see its sales figures climb a bit higher than they are now. Of course, if you’re an iOS developer, you’ll know the biggest thing that can improve your sales rankings is to be featured on the AppStore. A large part of getting featured is left up to lucky chance, but to improve your odds, one of the things you can do is to target Apple employees with Facebook ads of your application. Read on to see the results I’ve had so far.
One of the iPhone applications I’ve written, Parking Mobility, is primarily a map-based application. Since the iPhone’s screen is so small, we want to maximize the screen real-estate while still providing navigation bars for users to interact with. To that end, the app uses a black-translucent navbar and toolbar at the top and bottom of the screen. In the past this has never been a problem, and most mapping applications do the same thing. I recently submitted a huge update to the app which is a complete re-write as a 100% native Objective-C based application (all vestiges of PhoneGap having been removed). With this latest submission though, we’ve run into problems.
Read on for more, and what I’ve done to (hopefully) get around this.
Recently I was working on a refactor of one of my CPAN modules which, among other things, involved changing its name from
Test::A8N to the specific
Test::Story. Doing so made me think about the process I usually go through when I consider releasing a CPAN module.
First, let me explain something about myself: I don’t like tedious or repetitive tasks. I hate having to do the same thing over and over again, partly because I don’t want to waste my time, but mostly because inevitably one of the following will happen:
- I’ll forget a crucial step, and will screw something up;
- I’ll forget how to do it, and in my efforts to re-learn it I’ll screw something up;
- I won’t care enough to go through the effort, so something will get screwed up.
I expect you’re noticing a trend here. Really the only reason programmers come into this profession in the first place I suspect is because we’re just so bad at doing things the normal way, we have to automate everything we’ll either do poorly, lazily, or forget to do all together.
For those of us who are programmers, many times we’re so lazy that we won’t want to do the same thing within our programs more than once, so we abstract functionality into reusable modules. By that token the Perl community must be some of the most inventively lazy group of people, because CPAN is full of useful tidbits like that. Getting modules to CPAN requires a contributor to actually, you know, submit their project. And this is, in itself, a somewhat manual process.
I do all of my development in a version control repository, and I write a decent amount of unit tests to prove my functionality works. So once I come to the decision that a set of new features is worthy of a new release, this is the process I go through:
- Run “
perl Makefile.PL && make && make test” to verify everything runs okay;
- Run “
make dist” to create the distribution tarball;
- Noticing the version number is wrong, I go in and change it in the main Perl module;
- After running “
make dist” again, I realize I forgot to change the README;
- Potentially after another “
make dist“, I’ll remember I’m supposed to update the Changes file to indicate what I’ve added;
- It’s at this point I realize that I forgot to add new documentation to cover this new feature;
- I run “
make test” again, this time with TEST_POD=1 set to ensure my documentation checks are run;
- I’ll then try to remember what the command is for uploading a new CPAN module, which involves searching on CPAN for something related to “Upload”;
- Finding “
cpan-upload“, I’ll have to look at its documentation to figure out how to use it;
- I run “
cpan-upload“, only to realize I forgot to set my PAUSE credentials in ~/.pause.
At this point, if I’m lucky, the upload will succeed. This process isn’t meant to be a negative reflection on CPAN, but rather on my own forgetfulness and need to automate.
Read on to find out how I managed to automate this part of my life as well.