Latest Entries »

In this post, I’d like to outline what MacLemon and I worked on for the metalab Hackathon 8. The project stems from a problem with one of the most basic rules of software development:

Let software developers develop software, don’t hog them with repeated configuration/administration stuff.

This rule is violated with large-scale Cocoa development for the iPhone that also has beta testers: If you want to allow them, you need something like HockeyApp (or TestFlight, but we didn’t use that one). Further, somebody might break the build without realizing it (that’s not specific in any way to Cocoa development). Different versions of Xcode use different compilers, which might not accept the same source code.

Apple sketched a solution for some of these problems in WWDC 2012, session 404: You can integrate Xcode into Jenkins CI, a continuous integration platform written in Java. We chose to improve on this solution, to let it do much more.

What you need:

  • A build server that runs Mac OS X, accessible by all developers and itself able to access the HockeyApp website.
  • A server runnig git. This might be the same server as the above, but doesn’t have to be. Our instructions are for the case where it’s on the same server, as this is easier to do (only “localhost” as hostname).
  • Development must happen using git & Xcode (we tested version 4.3, 4.4DP4 and 4.5DP2)
  • A very solid knowledge of the command line, since just about everything will be done there.

What this solution provides:

  • On every push, the app is checked for build errors (and the test suites can be run, if you happen to have some).
  • Working versions are automatically tagged, so you can easily correlate build logs to the git history.
  • Pushing a release to HockeyApp only requires adding a tag to a revision before pushing it to the server.

Some ideas in what way this solution can be extended very easily:

  • Push working git revisions to a different git server.
  • Email a build breaker to communicate this fact.

View full article »

Mac OS X Range Selection Behavior

Sorry for the long silence, I’m really busy with work!

This is only a quick note about the list view range selection behavior (shift-click) I’m observing in Mac OS X Lion’s Finder. There’s quite more to it than you might think!

  • First off, when there’s nothing selected and you shift-click on an item, all items from the top up to the clicked one (including itself) are selected.
  • When there is an existing selection, the result depends on the previous non-range selection action:
    • Regular selection: The range between that item and the clicked one is selected (including both items).
    • Deselection (cmd-click on a previously selected item): The range between the clicked item and the next selected one below it is selected. If there is none, the range between the previous selected item and the clicked one is selected.
  • In the previous step, if the previously selected item is part of a contiguous range, all other items of that range are deselected.

Did I miss anything? Please tell me via Twitter (@anlumo) or comment below!

UPDATE: @5minpause pointed me to an article, describing the same behavior in a much more elaborate way: Legendary Selections, Dude

UPDATE 2: Alright, discovered another peculiarity in the Finder selection behavior: When clicking onto the file name or file icon without any modifiers, the selection is changed on mouseUp: (the previous selection is also not changed in mouseDown: yet). When either any modifier is held down or the row is clicked somewhere else, the selection is changed in mouseDown:. I guess this is implemented so that you can drag a file without changing the selection.

Cocoa Blocks Pitfall

Just because it bit me again for a millionth time:

int a = 0;
void(^block)(void) = ^{ printf("%d", a); };
a = 1;

outputs 0, because the value of a is copied to the block when it is declared.

View full article »

About Apple’s Bug Reporter

I posted a comment on Apple’s private developer forums about an issue that might be interesting for others to read, even the ones who don’t have read access there. Thus, read on for the (slightly rephrased for context) comment.

View full article »

Book Review: The Art of Community

So, after a brief work-related hiatus, I’d like to get started with a book review.

Generally, I like to read fiction, but every now and then I have to work through some nonfiction book to gain some knowledge. I’ve tried to read technical books about programming APIs etc, but in recent years I’ve found these to be quite boring, since they’re a bit too far on the basics side of things. Why should I buy and read a whole book about something I can learn with a few free online beginner’s tutorials just as well?

So, I’ve moved more into the “general concepts”-genre of nonfiction books. One big example of that is “The Art of Community” by Jono Bacon. The author is the manager of the Ubuntu community, and he shares some of his experience with the reader.

View full article »

AquaticPrime and python/PyCrypto

Alright, another post for the same topic: How to generate AquaticPrime licenses in python with PyCrypto (also for the Google App Engine in my case). This took me quite a long time (8h), because debugging crypto is very complicated (the wrong result is returned, so what now?). I actually had to learn how to encrypt using RSA (quite simple actually).
View full article »

AquaticPrime and Java Servlets


Maybe somebody is interested in this code. It’s relatively easy to create AquaticPrime license keys in Java once you know how. I used it last year on Google App Engine to generate my licenses for a promotion.

View full article »

This time I’d like to talk about a phenomenon we don’t learn about at school and never hear from happening in the US, but apparently being pretty common in our area: Legally Distributed Software Development. The reason is that I consider it very nice, and it deserves a highlight.

View full article »

The Software Pattern Fetishism

I’m sure this article is going to be a bit offending for some software developers, but there’s something with software design patterns that has been irking me for years, and recently I discovered the reason for that. In the hopes that there are others that think alike, I’m going to explain the reasons here. Maybe it does something good.
View full article »


Right up to my first topic: Sproutcore.

I’ve held a workshop about it in the last two weekends, where I demonstrated how to build a basic groupchat application. Unfortunately, the 8h I allocated for it weren’t enough (but it was close) due to some typical JavaScript issues, namely that it doesn’t do any name verification at all.

You can get my demo application from github.

View full article »