On Pluralism

Fellow nerds, I am tired of fighting. I am tired of fighting for my framework, for my favorite mobile device, for my favorite framework, for my favorite twitter client.

There is no platform war, as well as there is no winner. It’s called diversity, and it’s a good thing. Stop using inappropriate terminology. War is when people suffer and die. Not when kernel architectures or UI-concepts compete.

Someone using something you don’t like? Don’t bother. Why bother? They almost always had good reason for their decision. If they need your advice, they are going to ask you anyway. If not, leave them alone.

Instead of wasting your time fighting for technologies that will be outdated in at least two years, create something that lasts a bit longer. Create something.

flattr this!

 

4 Kudos

 

ACTA-Stuttgart: Some pictures

Just some pictures I thought might be worth sharing.

flattr this!

 

2 Kudos

 

Distributed Management of personal contact Data

I just noticed, after reading the excellent blog post by Andreas Klinger about phone numbers, that I never really talked about what I did in my thesis on my blog.

My thesis had the title “Distributed Management of personal contact data” and dealt with analyzing the problem that current data management facilities ( read: address books ) are suffering from and proposed a protocol for creating a distributed contact management facility.

My motivation was the problem described by Andreas, in one form or another. While I didn’t discuss phone numbers in detail, I think they are a great example for why any of todays used management systems are inpractical.

The system I suggested and subsequently built in a team with Sven Pfleiderer was distributed, simple, HTTP based and privacy-aware – that is encrypted, so that it doesn’t need HTTPS. The focus was also to design it in a way that would make it easy to implement and suited to run on cheap non-dedicated servers.

Unfortunately, I didn’t have the time after completing my thesis to create a working platform demoing the whole idea. After the appearance of diaspora, I was convinced that the problem would solve itself, but these guys never even bothered to write a nice protocol spec altogether.

If you care about the whole piece of work, you can grab it here. There may be some typos/mistakes in it, please don’t let me know. What I’d like to know is what you think about it.

Update: Posted wrong thesis. ( … )

flattr this!

 

4 Kudos

 

Pragmatische Notebook-Kaufberatung

Da ich, wie die meisten aufmerksamen Leser dieses Blogs vielleicht schon bemerkt haben, Technik- bzw. IT-affin bin, und sich diese traurige Wahrheit auch schon in meinem Bekanntenkreis herumgesprochen hat, möchte ich an dieser Stelle alle zukünftigen Anfragen zum Thema Notebook-Kaufberatung in einem Blogpost final beantworten. Aufgrund des Entwicklungsstands moderner Geräte ist es denke ich sicher anzunehmen, dass dieser Post für die nächsten 2-3 Jahre gültig bleibt.

Die grundlegenden Anforderungen der meisten Leute, die mit der Frage ‘Welches Notebook soll ich mir kaufen’ zu mir kommen, sind sehr vergleichbar. Es werden Office-Fähigkeiten gesucht, weiterhin sollte ein Browser vernünftig laufen und kleiner Multimedia-Aktionen sind auch vorgesehen – Zum Beispiel ein Test von Photoshop für nichtkommerzielle Zwecke oder das Bearbeiten eines kleinen Videos.

Hier kommt die gute Nachricht: Mir fällt beim besten Willen kein Gerät ein, das heute, 2012, produziert und verkauft wird, dass diese Fähigkeiten nicht besitzt. Dieses Phänomen kann wirklich gut mit dem Mooreschen Gesetz belegt werden, dass 1965 von Gordon Moore formuliert wurde, und besagt, dass sich “die Komplexität integrierter Schaltkreise mit minimalen Komponentenkosten regelmäßig verdoppelt”, im Original alle 24 Monate, nach Intel all 18 Monate. Dieses Gesetz hat bis heute Gültigkeit in einer Vielzahl von Bereichen, unter anderem der Pixelzahl der Sensoren einer Digitalkamera, Festplattengrößen und natürlich auch der Komplexität und somit Geschwindigkeit von Computerprozessoren.

Was das bedeutet, ist dass ein Rechner aus dem Jahr 2012 ungefähr doppelt so schnell ist als ein preislich Vergleichbarer Rechner aus dem Jahr 2010, wobei dieser ebenfalls wieder doppelt so schnell war wie ein Rechner aus dem Jahr 2008 usw..

Die Implikationen für den normalen Benutzer sind, dass man heutzutage relativ sicher sein kann, dass die Rechner die man bekommt wirklich schnell genug für alles sind. Die Rechenleistung kann also nur marginal entscheidend für die Kaufentscheidung sein.

Gehen wir also weiter zu einem spannenden Thema, nämlich dass der internen Komponente wie z.B. Arbeitsspeicher und Festplatte. Arbeitsspeicher ist sozusagen der Schreibtisch des Prozessors, hier werden wichtige Daten direkt und schnell zugreifbar Abgelegt. Während vor 15 Jahren 16MB noch Luxus waren, sind heute 2 oder 4GB in Consumer-Rechnern Standard, was wiederum völlig ausreicht, wenn man sich in der Office,Internet,Photoshop-Ecke befindet.

Die Festplatte hingegen ist die einzige Komponente von der man sagen kann dass sich die Entwicklung im Umbruch befindet. Technisch sind heute 3 Terabyte-Platten keine Sensation mehr und gängig. Das Problem mit Festplatten ist jedoch deren mechanische Bauart und somit begrenzte Geschwindigkeit. Seit mehreren Jahren entwickelt sich zunehmende der Trend zu sogenannten Solid State Drives ( SSD ), die auf einer ähnlichen Technologie wie Arbeitsspeicher oder USB-Sticks basieren. Das macht sie zum einen Energieeffizienter, zum anderen aber auch um ein Vielfaches schneller als konventionelle Festplatten. Da die Produktion und Fertigung dieser SSDs jedoch aufwändiger ist als die von herkömmlichen Festplatten, schlägt sich das im Moment noch im Preis nieder – konventionelle Festplatten kosten ca. 8-15 Cent pro GB, während es bei SSDs bei 90 Cent pro GB anfängt. Wer Wert auf absolute Geschwindigkeit legt, investiert gut in eine SSD, für viele normale Benutzer macht es jedoch wahrscheinlich einen vernachlässigbaren Unterschied. Wichtig ist zusätzlich noch dass SSDs keine mechanischen Komponenten haben, also sehr stoßunempfindlich sind und keine Geräusche machen.

Was ist bei einem Notebook noch wichtig? Das hängt immer vom persönlichen Nutzungsschema ab, ich werde hier noch auf die Punkte Verarbeitungsqualität, Bildschirmgröße/Auflösung und Akkulaufzeit eingehen.

Der Bildschirm ist der wohl sichtbarste und wichtigste Teil eines Notebooks. Gerade bei den Displays findet man die größten Unterschiede zwischen günstigen und hochpreisigen Geräten. Teilweise befinden sich in hochpreisigen 11″-Geräten Bildschirme mit höheren Auflösungen ( also einer höheren Anzahl an Pixeln ) als in billigen 15″ Geräten. Dieser Unterschied macht sich beim Arbeiten gewaltig in ganz simpel mehr oder weniger Fläche auf dem Desktop bemerkbar und entscheidet im Zweifel darüber, ob man ständig Scrollen muss oder das meiste schon sieht. Hier ist also ganz offensichtlich genaues hinschauen beim Kauf gefragt – die einzige Lösung hier später einen Fehlkauf zu verbessern ist ein externer Monitor der an das Notebook angeschlossen wird. Grundsätzlich sollte alles über 1440×900 ( Richtwerte ) bei 13″-15″ als ausreichend angeshene werden. Werte darunter sind natürlich, je nach Geldbeutel, erhältlich, jedoch sinkt in meinen Augen mit einer zu kleinen Auflösung die Produktivität überdurchschnittlich.

Wo wir schon beim nächsten Punkt sind – Produktivität. Die wichtigsten sichtbaren Komponenten eines Notebooks sind die Tastatur und das Trackpad. Während die Tastatur heute meistens im Chiplet-Design gebaut wird ( d.h. mit kleinen Abständen zwischen den Tasten ), gibt es bei den Trackpads gravierende Unterschiede. Für beide Punkte gilt allerdings dass man hier am besten in einem Laden “Probetippt”, da sich gerade bei Tastaturen die Geister scheiden. Wichtige Metriken für das Trackpad sind vor allem die Größe und ob und wie Scrolling unterstützt wird, d.h. ob ein virtuelles “Mausrad” eingebaut ist. Auch hier finden sich zwischen den Preisniveaus große Unterschiede, und gerade billige Geräte fallen durch eine “Billige” Verarbeitung negativ auf. Wer nicht ständig anbauen will ( Externe Maus, Tastatur ) ist gut beraten gleich richtig zu kaufen.

Generell ist die Frage, wieviel Wert man auf die Verarbeitung des Notebooks legt – es liegt auf der Hand dass sich dier Hersteller gerade in diesem Punkt deutlich diversifizieren. Wer damit leben kann dass sein Notebook komplett aus Plastik kommt und nach 4 Monaten zu klappern und zu wackeln anfängt, der ist wohl mit 300 Euro im Rennen. Wer etwas mehr Wert auf langlebigkeit legt muss wahrscheinlich tiefer in die Tasche greifen.

Wer sich oft unterwegs an die Arbeit macht, interessiert sich spätestens seit Starbucks die Steckdosen abgebaut hat für die Akkulaufzeit seines mobilen Begleiters. Spätestens wenn der mobile Alleskönner nach 50 Minuten schwarz wird, weil die Batterie leer ist, wird sich noch darüber freuen, immer das in der Regel schwere Netzteil noch mitzunehmen. Gute Akkulaufzeit wird zum einen aus einer guten Abstimmung der Komponenten auf das hoffentlich aktuelle Betriebssystem, vernünftige Nutzung und die größe der eingebauten Batterie beeinflußt. Die Klassenbesten erreichen heute übrigens Laufzeiten von 5-7 Stunden, während viele Notebooks im günstigen Segment ( 300-500 Euro ) gerade mal 1-2 Stunden oder weniger schaffen. Wie immer: Sich vorher überlegen was man braucht. Nur daheim: billig kaufen, nur draußen: teuer kaufen.

Zuletzt möchte ich noch auf den bekannten Ausstoß “900 Euro für ein Notebook sind zuviel” eingehen. Ich will nicht in Frage stellen dass 900 Euro viel Geld sind, gerade für Studenten oder junge Leute mit wenig Einkommen. Man muss sich aber immer auch überlegen, wie lange man ein Notebook sinnvoll nutzen möchte – gerade MacBooks lassen sich gut 3 Jahre nutzen und danach immer noch für die Hälfte des Kaufpreises verkaufen.

Aber genug geredet, hier eine unvollständige Liste von Geräten in jeder Preiskategorie.

Preisliga Info Amazon
ca. 300€ 15″ Notebook mit allem was man braucht, nicht besonders schnell aber ausreichend. Wichtig: Kein Betriebssystem! Fujitsu Lifebook AH530
ca. 500€ Solides 15″-Notebook mit aktuellem Prozessor, Windows 7 und ziemlich viel Schnickschnack. Fujitsu Lifebook SH531
ca. 700€ Dicker Prozessor aber schlechte Auflösung für den Preis. Acer Aspire Style 5755G
alles über 1000€ MacBook Pro eben: Solide verbaut, ausreichende Leistung und hoher Wiederverkaufswert. Apple MacBook Pro 13″

Hinweis: Das ist alles total subjektiv und sehr willkürlich. Es gibt bestimmt in jeder Kategorie ein viel besseres Notebook dass ich nicht kenne.

P.S. Anne, das ist für dich!

flattr this!

 

0 Kudos

 

Hours.app Beta is out!

We are in beta. I am part of a great team, and we are building Hours. Hours is a new take on Time Tracking, and we think that we are ready to get your feedback. Head over to www.thehoursapp.com and grab your beta, we’d love to hear what you think about it. P.S.: iPhone version is in the making, will be out by the end of this year. And, if you think hours is worthy, spread the word :-)

flattr this!

 

0 Kudos

 

Howto: Install Jenkins on OS X and make it build Mac stuff

This guide is intended for Lion users. I just tried it on my machine, and it works. Let’s hope it works for you as well.

What’s covered:

  • How to install Jenkins as a standalone Service
  • How to configure a Job that builds a generic Mac-Application
  • Configuring Public Key SSH-Access ( Useful for git )
Prerequisites
  • Java must be installed
  • XCode ( any version that works on Lion will do )
  • You shouldn’t have any services running on port 8080

Installing Jenkins

Jenkins is available as a native package from the Jenkins homepage.  Just install it, as you would install any other package. After you’ve done that, you might want to check if http://localhost:8080/ is reachable. If it’s not, you may have to launch the .war-File by opening it. It’s located in /Applications/Jenkins/.

In case the server is running, you’ll most likely get a 404 ‘not found’ message from the winstone-server that is bundled. If you dig in your syslog, you’ll find a reviling stack trace that indicates that a file can’t be found..

java.io.FileNotFoundException: /Users/Shared/Jenkins/Home/war/META-INF/MANIFEST.MF (No such file or directory)

I don’t know why the package is broken, but it’s quite easy to fix this. I found some great advice on ColonelPanic.net.

First, we’ll create a dedicated jenkins user. At this point, there isn’t one, so just type this into your terminal

sudo dscl . create /Users/jenkins
sudo dscl . create /Users/jenkins PrimaryGroupID 1
sudo dscl . create /Users/jenkins UniqueID 300
sudo dscl . create /Users/jenkins UserShell /bin/bash
sudo dscl . create /Users/jenkins home /Users/Shared/Jenkins/Home/
sudo dscl . create /Users/jenkins NFSHomeDirectory /Users/Shared/Jenkins/Home/
sudo dscl . passwd /Users/jenkins

Now that you have created the user, it’s time to tell the LaunchAgent that came with the install package to use this user to run Jenkins. The file you have to change for this is located at /Library/LaunchDaemons/org.jenkins-ci.plist . Just open it in your favorite editor and change the value of UserName to jenkins.

	<key>UserName</key>
	<string>jenkins</string>

After doing that, the Home folder of jenkins, /Users/Shared/Jenkins/Home needs a new owner.

sudo chown -R jenkins /Users/Shared/Jenkins

After doing all that, saving the modified launch file and chown’ing the Home, unload and reload the service:

sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist

Now you should be greeted by Jenkins if you try again localhost:8080. If not make sure that you followed the steps above correctly. If you did that but it still doesn’t work, please leave a comment.

If you need to access your git repos using a public ssh key, you can generate one now by logging in as the jenkins user and running ssh-keygen

# su jenkins
Password:
bash-3.2$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key...

You can then upload the file to wherever you need it.

 Create a Job for a XCode Project

Before we dive right in, you need to install the git-plugin. This is done by navigating to “Manage Jenkins” from the welcome screen and then selecting plugins. There are about a million, but you just need git for the moment, as I assume that your project is using git. Once you’ve installed the plugin, set up your git username and email in the “Manage Jerkins” “Configure System” menu. If you omit that step, the source retrieval will fail.

Having setup Jenkins now, it’s time to do some real work. The welcome screen should look similar to the one below, so just go and create a new free-style-software-project. This is the simplest approach possible, but it’s always nice to get results fast… The job configuration screen should show up now, and it’s time to enter some details.

First of all, we need to setup the SCM section, so Jenkins knows where to get the sources from. Just enter your repos git-URL in the appropriate field. To test the whole thing, you can use any git-hosted project you like that homes a XCode-Project.

If you want, you can run a build now to make sure that the git-setup works correctly, but it isn’t required to do so.

As you can see in the screenshot, the next step is creating the build-phase. You can just enter xcodebuild, which will then build your project and Jenkins will notice if it doesn’t work and display it, but I think it’s more interesting to both build a project and archive the App that was built. To achieve that, I created a simple two-line-command

xcodebuild
cd build/Release; zip -r $BUILD_TAG.zip *.app/

Jenkins can archive specific artefacts that were created during the build. To save the generated zip-file just enter the **/*.zip pattern in the “Archive Artefacts” field. If you haven’t built your project yet, there may be a big red warning saying that the filter doesn’t match any files, but it’s safe to ignore it.

Of course, this is the most minimal build setup you could use, but for my purposes it’s completely sufficient. The BUILD_TAG used is a unique tag that can be used for filenames. After you’ve saved the changes to the configuration, it’s time to run a build and see if it works.

There are a lot of ways to go from here, but I hope this tutorial helped you to get Jenkins up and running!

flattr this!

 

138 Kudos

 

iPad App concept based on a fluid layout

I’m going to discuss briefly a concept idea i had recently, replacing full-screen view controllers with a .. fluid layout. Just look at the video first to get an idea of what I’m talking about. Keep in mind that this is in no way a finished/polished app ( and probably will never be one, considering trademarks and stuff ).

Important note: This app and concept is not affiliated, endorsed or sponsored by ikea. But since it’s non-commercial I hope they won’t shøøt me.

iPad fluid app layout concept from Moritz Haarmann on Vimeo.

So, what’s wrong with the classic view controllers on the iPad? Nothing, absolutely nothing. They are fine. I just wanted to try out this idea, and the video is the result. If you want to test it, leave a comment and I’ll get back to you ( or not ). I guess it is obvious that I’ve been inspired by the Twitter-iPad UI to some extent.

Maybe the most important lesson I learned programming this demo was that it’s really hard to create an interface that acts in accordance with the direct manipulation paradigm.. when there is no real counterpart. I thought about a stack of cards or some other stack model, but none of those resize their content or just “move out” if there is not enough room. I am still not fully convinced that every interaction is right, but at least it feels right most of the time now. If you are curious, there can be an arbitrary number of panels around, of course only limited by memory consumption, without affecting the UI or overall perfomance.

Since I don’t have a phone capable of recording videos right now, you have to believe me that the UI is really snappy on an iPad 2 and yes, it’s even fun to use it.

If you are interested in how I got the data you might want to read a previous post that explained how to retrieve the data from IKEA. Was fun :-)

What do you think? Too confusing? Interesting? Let me know!

Update: If you want to test it locally, please enter your UUID here. No guarantee whatsoever, first come, first serve.

flattr this!

 

9 Kudos

 

Touch based text input sucks.

I made the experience that an extra-bold title might attract readers. Let’s see. It just occurred to me today that touch based input using software-emulated keyboards with keys and stuff is more stupid than anything else I can think of. Why is that?

Keyboards were invented for typewriters. Typewriters are mechanical machines used by humans to avoid handwriting. Since the first typewriters were invented somewhere around the 18th century, they were rather clumsy, and the machinery used wasn’t really working too well, which is why something as awkward as the QWERTY-layout was invented. The QWERTY-layout, still used today, had its justification in the fact that early typewriters had problems when adjacent keys were used simultaneously, which lead to those keys blocking each other. At this point, in the year 1867, keyboard innovation stalled. No real invention has ever had an effect on any keyboard that is widely used until today. There have been some, like the Dvorak layout, a proposed alternative to the QWERTY-layout, but none of these made it’s way to the mainstream, unfortunately.

Today, we are using beautiful, ultra-turbo-high-speed computers that are still equipped with QWERTY-keyboards. And the nonsense doesn’t stop here, we even shrunk those keyboards down to create digital equivalents. This is just ridiculous. I am in no way doubting that a trained writer can actually write fast using an iPhone, iPad or Android Keyboard, but the reason is certainly not the superior design of those keyboards, but our ability to adapt to even the worst of circumstances.

Of course, numerous attempts have been made to improve the typing experience by adding suggestions, which is done on both Android and iOS, and by invisibly changing the “Hit Box” of each key, which is also done on both platforms. I have done qwerted, which did that highlighting both extremely and visually. There have been similar attempts to do this by Thickbuttons, and maybe some others. IBM recently filed a patent that deals with arranging the keys on a touch keyboard to adapt to a specific user, certainly interesting. But it just masks the fact that this approach is seriously flawed, as it still relies on the basic QWERTY-pattern, instead of something better.

Another approach that has become quite popular lately is the Swype‘s approach. When using Swype ( or SlideIT, and there are certainly a few other similar apps for all systems except stock iOS ), the user just moves over the keys the input consists of. Their homepage has some demo videos if you are curious. Again, the foundation is the old-school QWERTY-keyboard, and even though this concept is highly interesting and working reportedly very well, I consider it broken by design.

The question is: why are we wasting a huge amount of screen real estate displaying keys that won’t ever be typed ( or touched over ) ? Take for example Q and X. Those keys are so rarely used after a word has started, it’s unnecessary that they are displayed by default. But it’s getting better: We can even predict very reliably which words are likely to be typed even after a few words or letters have been typed. If you don’t trust me on this one, you should try Google Scribe. The techniques used here are based on n-grams ( at least a part of it ). N-Grams describe a set of n words, which can then be evaluated in terms of probability. Google has extracted a huge set of n-grams from their datasets which can be obtained at the LDC.

Someone must have come up with a great idea to revolutionize touch input. Like, not some fancy new feature, no, a completely new approach. Do you know Dasher? Something like that, of course massively polished.

I hope you are getting my point here, and I’m sorry I don’t have anything more to offer but a few entry points if you want to read further. This is really interesting field and, if time allows, I’d like to do some work here. What are your ideas?

flattr this!

 

1 Kudos

 

Fun with nokogiri: Screen-scraping ikea.com

I recently discovered that ikea is really scraping-friendly – they have their categories and products belonging to a category all linked very clean, and the product pages themselves include, as json, the complete product data necessary to display a product somewhere else ( say, on an iPad ). They also feature the assembly instructions linked as pdf and more fun stuff. Just open any product page and browse the source, you will discover a field named “jProductData” which is just what you want.

So i decided it’s time for me to try nokogiri, a beautiful and fast framework for processing urls and searching through the HTML. I managed to write a scraper in only very few lines that actually works. Since the json is embedded in regular JavaScript, i had to use rkelly to parse the javascript part and extract the right data.

For the datamodel, I used ohm with redis, which takes about no time to setup and works as advertised.

If you are curious, the source is available at github.

flattr this!

 

2 Kudos

 

Fun with CFHTTPMessage, Headers and the HTTP Standard

TL:DR; CFHTTPMessage combines duplicate headers to a single string value containing all headers comma seperated. Thank you.

I am currently developing a Proxy app that visualizes requests and gives you the ability to plug-and-play like filter and modify requests, which makes it a quite powerful tool for debugging web applications, mobile apps and so on.

Of course, this tool is built using Cocoa and Core Foundation. Interesting enough, Core Foundation brings a Type called “CFHTTPMessage”, which handles a lot of low-level message parsing and processing, and is really handy and quite easy to use.

There is one drawback: CFHTTPMessage is not designed to handle both the order in which the headers arrived in a message and duplicate header fields. The first point is somewhat irrelevant, as the HTTP1.1 standard points out that servers are not supposed to depend on any order in the clients – it’s really only a minor issue. The latter point is complicated. HTTP relies on duplicate headers a lot, consider this HTTP request ( Real life!! )


POST /wp-admin/admin-ajax.php HTTP/1.1
X-Requested-With: XMLHttpRequest
Accept-Charset: ISO-8859-1
Accept-Charset: utf-8;q=0.7
Accept-Charset: *;q=0.3
Accept-Encoding: gzip,deflate,sdch
Content-Type: application/x-www-form-urlencoded
Origin: http://momo.brauchtman.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
Cookie: word
Cookie: wordpress_xxxxxxxx
Cookie: wordpress_logged_in_xxxxxx; httponly; expires=Tue
Referer: http://momo.brauchtman.net/wp-admin/post-new.php
Host: momo.brauchtman.net
Accept-Language: de-DE
Accept-Language: de;q=0.8
Accept-Language: en-US;q=0.6
Accept-Language: en;q=0.4
Accept: */*
Content-Length: 1160

There are quite some duplicates here. So the clever guys at Cupertino just forgot to handle duplicate headers at all? No, not really. But they just didn’t document what they are doing with it, which isn’t that clever at all, but fortunately, the sources are available here. So after a bit of digging, I found out that duplicates are simply appended to a former header with same key, which sucks – the delimiter used is a simple comma, which is quite regularly found in header values, which makes splitting an art for itself.

flattr this!

 

1 Kudos