A Modern Approach to the Transcription of Vintage Literature using Mobile Technology and Cloud Services

For my master thesis with the title named above I developed a prototype iOS application called “Transcribe”. The application should help students and researchers to transcribe vintage literature by creating TEI (Text Encoding Initiative) files. I will write more to the thesis itself another time, this article is more about the experience of developing the first app and the first steps with iOS programming.

The Start

I never thought Objective-C would be that hard. There are a couple of websites which offer help to start Objective-C development, but they certainly don’t have enough information for a project bigger than “Hello World”. They focus on the step-by-step programming part for beginners and not on theoretical basics and “best practices” for experienced programmers. For example finding `po’ and learning how to use it would have helped me in the beginning a lot. Just making these connections between outlets and the corresponding code can drive somebody into debugging craziness, especially as there are no error messages saying ‘Hey, you forgot a connection there, that’s why the whole thing doesn’t work’. More than once I was wondering why I made this decision instead of developing a web-app. But I completed the project, and it works good.

The Couch

On iOS, the Couch(DB) was not relaxing at all. Luckily, this changed within the last 4 weeks as CouchBase made some great improvements to their mobile framework. As I started at a very early stage, I had to struggle with a lot of issues with CouchDB and iOS, starting with the basic data synchronization to database views and lists. But the CouchDB was crucial to my development as I needed to store document-oriented data. It was pretty clear at this point, that XML was no option any more, so instead of importing XML to a data field in JSON, I transferred the TEI attributes to JSON and into CouchDB, which is a great improvement for search and semantics. All the data is now in one place and not spread over thousands of XML files.

The Interface

iOS made something clear for me once and for all: I’m no designer. I am used to HTML and CSS and am able to get things together that look OK, but with Xcode this was just a pain. I tried making screenshots of my app and edit them later in Photoshop, but I didn’t want to design buttons, labels and everything else by hand, so I just left it with a new background image, which doesn’t look very good either. But fortunately, this was a scientific prototype. So it was more important that the app works and is easy to use, than that it looks stunning. For the user experience, there were no guidelines or any experience-based data on how to create the perfect interface for literature transcription. I created several paper drawings and non-functional interface prototypes which I tested with the target group. Only with this process I found the easiest and fastest way for users to transcribe literature.


Honestly, there were many many hours of debugging were I cursed Apple for using this programming language. But after getting used to it, the next app will definitely be easier and faster to program.

Some time ago I started using CouchBase for the development of Transcribe.app, an iPad application to help users transcribe vintage literature into machine readable text, which is part of my Media Technology MSc. graduation. CouchBase is, as far as I know, the only document oriented database on iOS at the moment and they’re putting a lot of effort in the product to make it enterprise ready. In the early versions it was quite complex to set up an app in xcode and since it took me several tries to get a fresh app running, I wrote down the process on how it worked. To this little documentation, Chris thanked me and sent me this cool shirt over from the States. As I never bought a computer- or computer related-shirt before and never got anything from other projects where I put in similar or more effort, this is quite a surprise and very much appreciated.


I promised to release my responsive Wordpress theme soon. But I realised since I’m writing my thesis, I have no time to finalise the theme. So feel free to use it as a starting point for your own developments, credit to this domain is appreciated.

Responsive Web Design

You can read more about responsive design at A List Apart. To make it short, you don’t need separate sites for mobile devices any more. So instead of having a site structure like http://m.yourdomain.com + http://www.yourdomain.com + http://pad.yourdomain.com + … you have one site and use the CSS @media selector to distinguish between screen sizes and devices and give the user a design which is optimised for their device, from the iPod, iPhone and iPad (or similar devices, of course).

iCareLess Download

As already mentioned, iCareLess is based on the semantic HTML5 theme Toolbox and the CSS framework Less Framework. Feel free to download and use and fork the theme on GitHub. Credit to this site is appreciated if you use it. Contact me on Twitter if there are any problems.

Download iCareLess

visual collaboration - that was my theme for the final 'New Media & New Technology' course within the 'Media Technology' programme.

Final Result

With 8 participants after 5 hours exhibition time.


<p>I took the underlaying idea from eggDaProf: controlling a virtual instance with an iOS device and be part of something big. Instead of a game I wanted to do something more permanent and stable, so I decided to do a visualisation. The “big picture” is a collection of peoples own preferences and attitudes. Everybody can contribute a personal touch without artistic skills, as the visualisation does not rely on dexterity, but pure fun and movement of the device.</p>


Instead of HTML and JavaScript I created my own iPhone App “GyroTransmitter” which sends accelerometer- and gyroscope-data with some additional custom values like colour and line size/number to the network as UDP broadcast.</p>

On the other end I used Quartz Composer again, as it has very powerful visualisation engines. However, I did not have the skills in OpenGL and OpenCL for personalised visuals, so I had to rely on the ready-made patches from Apple. Some things couldn't be handled without a little bit of scripting, for example the device queue, which holds all actual values for all devices without any duplicates. This was rather a challenge, as it is quite confusing to work with so many structures:

function (__structure device, __structure outputQueue, __string debug) main (__structure inputStructure, __structure inputQueue)
  var result = new Object();
  var device = new Object();
  var qObj = new Object();
  var queue = new Array();
  device.attributes = new Object();
  if(inputStructure != undefined) {
    device.id = inputStructure[0];
    device.attributes["ax"] = inputStructure[1];
    device.attributes["ay"] = inputStructure[2];
    device.attributes["az"] = inputStructure[3];
    if (!_testMode) {
      if(inputQueue != undefined) {
        var found = false;
        for(i=0; i < inputQueue.length; i++) {
          qObj = inputQueue[i];
          if(String(qObj["id"]) == String(device.id)) {
            queue[i] = device;
            found = true;
          } else {
            active = qObj["active"];
            queue[i] = qObj;
            newObj = queue[i];
        if(!found) {
  result.device = device;
  result.outputQueue = queue;
  return result;

<p>The base patch is pretty simple: get the values from the network, split them into the right attributes, queue them and display them. As mentioned above, there is some JavaScript processing required to create the queue and an iterator to display one “Line Family” for each device.</p>

Problems with Quartz Composer

Quartz Composer can be tricky sometimes and it took me dozens of hours to debug and get the patch running. Some information which is worth sharing about Quartz Composer:

No Integration or Random in Iterations

By integration I'm talking about the mathematical term. Adding values up/down, which is a pretty simple task. However, once you're in an iterator-patch, the output of the Integrator-patch is always the same for all instances, so even if one device sends to command to go down and the other one the command to go up, they're both doing the same. Random is also the same value for all instances, no matter how many random generators you use. This is also valid for any kind of trickiness you might get into your mind. I tried JavaScript, Math, Mathematical Expression, Integrator and a complex Sample & Hold combination, nothing worked.

No JavaScript Debugging

This is actually the worst thing in Quartz Composer: there is no debugging. If there is a logical mistake (which is not recognised by the syntax-check), the output of the patch is simply 'virtual', there is no clue on where the mistake actually is. And as JavaScript is an untyped language, you can just write attrbute instead of attribute and search for the error for a while.


Overall I'm quite happy with the results, even if I will probably not use Quartz Composer again and try to use the Quartz Engine with Objective-C next time. To figure things like the iteration problem out just costs too much time and usually works in every other language. The output of the patch and the collaboration on a visualisation is fun, even if the network broadcasting is still not perfect and there could be more options in the graphical device interface instead of random values, but I wanted to avoid too much focus on the interface, but controlling the visualisation with gyro and accelerometer data. For future work I would display the visualisation also on the device and get rid of interface input completely, but use simpler visualisations. These 'private' visualisations could then be added up in a crowd-visualisation, without users seeing the end result while they're adding their part.


[vimeo http://www.vimeo.com/24476236 w=480&h=270]


GyroTransmitter iOS App and visualaborate Quartz Composer Patch


Creative Commons License
visualaborate and GyroTransmitter by Patrick Heneise are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

(click here for the english version)

Bereits im letzten Jahr habe ich mich beschlossen, einen Marathon zu laufen. Der Leiden Marathon hat sich dafür gut angeboten, also habe ich mich am 30.01.2011 angemeldet:

Leiden, 30 Jan 2011.
Naam/Name: Patrick  Heneise.
Startnummer/Startnumber: 1653.
Afstand/Distance: 42 km.
Klasse/Category: m42.

<h3>Start</h3><p>Bei Laufszene.de gab es den passenden Trainingsplan für den Marathon in 4:00 Stunden in 20 Wochen Training. Etwas schöner formatiert lag der Trainingsplan auf dem virtuellen Schreibtisch und größtenteils habe ich mich sogar daran gehalten (2 Tage Training nacheinander ging nicht, alles andere aber schon). Wichtig war vor allem die Selbstverpflichtung. Auf Facebook und Twitter am selben Tag die Anmeldung verkündet, sowie allen Freunden und Bekannten davon erzählt: “Public commitments are powerful commitments: there is no going back […] and no excuses. Letting myself down is not great; letting everyone else down is far worse.” [1].</p>

<h3>Die Ausrede</h3><p>Das Training verlief gut, bis zum 23.02.2011. An dem Abend haben nach dem Leiden Science Karriere Event starke Bauchschmerzen angefangen. Am Freitag den 25.02. bin ich dann ins Krankenhaus. Diagnose: Blinddarmentzündung. Morgens um 10 im Krankenhaus, 12 Uhr waren die Ergebnisse da, 14 Uhr lag ich unterm Messer, am nächsten Tag um 10 wieder raus. 6 Wochen kein Training!</p>

<h3>(Un)Sportlichkeit und Geiz (ohne Ehre)</h3><p>Am 06.03. habe ich dann die Marathon-Vereinigung angeschrieben und meine Teilnahme zurück gezogen, denn abzüglich der 6 Wochen Erholung wären dann nur noch 6 Wochen Training übrig geblieben. Unrealistisch. Mir wurde mitgeteilt, dass es für die 19,- Anmeldegebühr keine Rückzahlung gibt, dass aber der Betrag noch nicht vom Konto abgebucht wurde. Da meine Freundin sich für den Halbmarathon angemeldet hatte und ebenfalls krankheitsbedingt nicht Teilnehmen konnte, waren das zusammen 35,- im Klo. Ich bestätigte, dass der Bertrag noch nicht verbucht wurde und habe darauf gehofft, dass der Prozess angehalten wird, weil Sportler sind ja nette Menschen, heißt ja nicht umsonst sportlich und fair. Leider wurde ich eines Besseren belehrt. Am darauf folgenden Tag wurde der Betrag von 35,- von meinem Konto abgebucht. Auf eine Beschwerde meinerseits kam keine weitere Antwort. Das war schon eine große Frechheit.</p>

<h3>Die Fortsetzung</h3><p>Bei der Nachuntersuchung 3 Wochen später meinte der Arzt, ich könne in einer Woche wieder Sport machen - Laufen, kein Kampfsport - da alles so gut verheilt war. Ok, also 8 Wochen Training zum Marathon. Da ich entsprechend gereizt bzgl. meiner Anmeldegebühr war und gegenüber Freunden und Bekannten die Verpflichtung hatte, habe ich direkt das Training begonnen. Allerdings dann auch mit etwas Hilfe: Whey Proteine zum oder direkt nach dem Training und BCAA (verzweigtkettige Aminosäuren) über den Tag verteilt haben mir den Muskelkater durch schnelle Regeneration erspart und ich konnte am nächsten Tag wieder Trainieren. Also waren 8 Wochen lang alternierend fast jeden Tag Laufen oder Fitness-Studio angesagt. Manche mögen sagen, sie glauben nicht an Protein-Pulver etc. und ich muss sagen, es ist auch kein Wundermittel. Aber bei dem Trainingspensum von 5-6 Tagen die Woche ist die normale Proteinzufuhr von 0.8 Gramm pro Kilo Körpergewicht einfach zu wenig. Und es hat tatsächlich einen Unterschied gemacht, wie man sieht.</p>

<h3>Finish</h3><p>Alles in Allem bin ich sehr zufrieden. Dank der keine-Rückzahlungs-Politik und der Unterstützung von bzw. der Verpflichtung gegenüber Freunden bin ich tatsächlich den Marathon gelaufen habe nach 4 Stunden und 12 Minuten als 246er von 417 die Ziellinie übertreten. Meine Zeiten:</p>

over de startlijn passing startline	 00:03:10	00:00:00
10,5 km 10,5 km		 00:59:46
18,9 km 18,9 km		 01:47:30
21,1 km 21,1 km		 01:59:22
30,5 km 30,5 km		 03:02:35
40,0 km 40,0 km		 03:59:53
over de finishlijn passing finishline	 04:15:32	 04:12:23

Danke an alle, die mich Unterstützt haben und an das Team vom Leiden Marathon!

Die Playlist

Für alle, die es Interessiert:

[1] Owen, J. (2009). How to Influence, 1 edn, Prentice Hall.
Artist Song Album Genre
Eminem Deja Vu Relapse Rap
Eminem Forever I Am Marshall Rap
Eminem W.T.P. Recovery Rap
Seeed Schwinger Next! Reggae
Papa Roach No Matter What Time For Annihilation Rock
Linkin Park When They Come For Me A Thousand Suns Rock
Papa Roach Lifeline (Live) Time For Annihilation Rock
The Baseballs Hello Strings 'n' Stripes Rock 'n' Roll
Pimsleur Lesson 19 Spanish I Language
Seeed ft. Cee-Lo Green Aufstehn! Next! Reggae
Marilyn Manson Heart-Shaped Glasses (When the Heart Guides the Hand) Eat Me, Drink Me Gothic Rock
Eisbrecher Vergissmeinnicht Antikörper Industrial
Die Ärzte Der Graf 13 Punk
Seeed Riddim No 1 New Dubby Conquerors Dancehall
Eminem Airplanes Pt. 2 I Am Marshall Rap
Unheilig Halt Mich Grosse Freiheit Rock
Geoff Zanelli Best Laid Plans Hitman Soundtrack
Seeed Tight Pants Next! Reggae
Eminem Square Dance The Eminem Show Rap
Die Ärzte Junge Jazz Ist anders Rock
Die Ärzte Männer Sinid Schweine 13 Punk
Eminem Hailie's Song The Eminem Show Rap
Unheilig Fernweh Grosse Freiheit Rock
Fort Minor Remember The Name (Featuring Styles of Beyond) The Rising Tied Hip-Hop
Eminem Talkin' 2 Myself (Feat. Kobe) Recovery Rap
Unheilig Das Meer Grosse Freiheit Rock
Unheilig Für Immer Grosse Freiheit Rock
Jan Delay &amp; Disko No. 1 Türlich, türlich Mercedes-Dance-Live Hip Hop
Psyclon Nine As You Sleep Divine Infekt Electronic
Unheilig Seenot Grosse Freiheit Rock
Linkin Park Empty Spaces A Thousand Suns Rock
Rammstein Engel Engel Rock
Agonoize I Against Me Sieben Industrial
Van Canto Battery A Storm To Come Metal
Deathstars Modern Death Synthetic Generation Gothic Rock
Fort Minor In Stereo The Rising Tied Hip-Hop
AC/DC Hell's Bells The Unofficial Supernatural Soundtrack Rock
Unheilig Sternbild Grosse Freiheit Rock
Geoff Zanelli Trust Unto God (Udre's Funeral) Hitman Soundtrack
Tinie Tempah Pass Out 101 Barbecue Songs Pop
Unheilig Ich Gehöre Mir Grosse Freiheit Rock
Suicide Commando The Dying Breed Implements of Hell Industrial
Agonoize A Crippled Mind Sieben Industrial
Rammstein Benzin Rosenrot Rock
Grendel Soilbleed (V.3) Soilbleed EP Electronic
Unheilig Unter Deiner Flagge Grosse Freiheit Rock