OD Completion Dictionary works with Xcode 3

written by Martin Häcker on

Hrm, das ist mir doch ganz entgangen bisher.

Aber: here it is!

Was es tut: Beliebige Textbausteine in Xcode schnell einsetzen. Das geht zwar auch ohne ODCompletionDictionary, aber, mit kann man es auch in Xcode live bearbeiten. Und das macht das Feature eigentlich erst richtig nützlich.

Code Review mal praktisch erklärt

written by Martin Häcker on

Und zwar mit grandiosen schauspielerischen Leistungen. :)

Auf der Ruby-Conference 2008.

The Ruby Code Review. A Play in Three Acts

Überhaupt finde ich Confreaks sehr cool. :)

Writing Code that doesn't suck

written by Martin Häcker on

Und noch mal von den Confreaks.

Ausgezeichneter Vortrag von Yehuda Katz darüber was er für gute Tests hält und was nicht. Sein Argument: Am Ende will man Regression-Tests haben, da nur die wirklich nützlich sind beim Refactorieren. Nur die sind nützlich, weil dass die Tests sind die man behalten kann während man den Code neu faktoriert.

Damit das geht muss der Code aber schon eine gute Faktorierung haben die man (ausschließlich?) über öffentliche Interfaces testen kann.

Wohlgemerkt in dem Talk geht es nicht darum ob TDD gut oder schlecht ist - der Zweck ist einfach ein anderer. Ihm geht es um API-Stabilität und die Frage wie man Interfaces (nicht Implementierungen) über eine lange Entwicklung stabil hält.

Spannend. Mir ist dabei eingefallen dass ich damals im ersten Buch über Test Driven Development einen Absatz gelesen habe in dem Stand dass man zuerst seine Tests schreiben soll um dann an diesen seinen Code zu schreiben und zu refaktorisieren. Und dass man danach den Code als Tests für die Tests verwenden kann um wiederum diese zu refaktorisieren.

Gaudio. Ob das schon das ist was Yehuda meint? Ich vermute noch nicht ganz - aber es hört sich für mich nach etwas an was ich direkt tun kann - ich kann meine Tests betrachten und mir anschauen ob sie tatsächlich das testen was mich interessiert (das interface) und wenn dem nicht so ist, dann kann ich mir das Interface betrachten und die Tests tatsächlich refaktorieren.

Yay, mehr Arbeit. :)

Landing on Mars (with Squeak)

written by Martin Häcker on

I just started playing around with Mars which is a bridge from Squeak to Cocoa, which allows Squeak Programms to have a Cocoa GUI.

Pretty nice - however not quite as easy to get installed if you are a SmallTalk newbie like me.

There are installation instructions on the Mars homepage however I couldn't quite follow them, so I enhanced them a little and give you the rundown here:

Instructions

  • I downloaded the basic Image from http://ftp.squeak.org/3.10/Squeak3.10.2-7179-basic.zip
  • Got the Virtual Machine from ftp://ftp.smalltalkconsulting.com/experimental//Squeak%203.8.21beta1U.app.zip
  • Installed basic developer tools by executing <HTTPSocket httpFileIn: 'installer.pbwiki.com/f/LPF.st'.> in a workspace window (select it and hit command-d)
  • Then I ran
    Installer universe 
     addPackage: 'OmniBrowser';
     addPackage: 'OmniBrowser-Morphic';
     addPackage: 'OmniBrowser-Standard';
         addPackage: 'OmniBrowser-Refactory';
     install.
    
    to get the basics and
  • installed Mars by executing ``` Installer wiresong project: 'ob'; install: 'OB-Monticello'. Installer lukas project: 'omnibrowser'; install: 'OB-Tools'.

Installer ss project: 'Mars'; install: 'Mars'; install: 'OB-Mars'.


After that `OBMarsWorld execute.` replaces the menubar of Squeak with the Cocoa stuff.

:) Have fun!

Oh, and by the way, I just tried this with the dev image available from Damien Cassou at http://damiencassou.seasidehosting.st/Smalltalk/squeak-dev

This image already has most stuff preloaded, so you can just run

Installer wiresong project: 'ob'; install: 'OB-Monticello'. Installer lukas project: 'omnibrowser'; install: 'OB-Tools'.

Installer ss project: 'Mars'; install: 'Mars'; install: 'OB-Mars'. ```

to get Mars installed and then start it by running: OBMarsWorld execute.

Scriptdir

written by Martin Häcker on

Ich habe immer wieder das Problem, dass ich in Shell-Scripten den absoluten Pfad zum eigenen Script, oder zumindest den Ordner in dem das Script liegt benötige.

Dieses Problem hat viele Lösungen - die allermeisten kommen aber entweder nicht mit Leerzeichen in diesem Pfad klar, oder versagen wenn man das Script über verschiedene Kombinationen von absoluten und relativen Pfaden aufruft.

Meine gegenwärtige Lösung ist das hier:

SCRIPTDIR="$(cd "$(dirname "$0")" && pwd)"
echo $SCRIPTDIR

Damit bin ich zwar auch überhaupt nicht glücklich, aber immerhin scheint es zu funktionieren. :/

Insbesondere ist das Quoting extra funky. Unter MacOS X scheint es aber zu gehen (d.h. die Bash frisst das korrekt)

Hat da vielleicht jemand eine bessere Idee?

Update: Florian hatte die großartige Idee doch einfach mal in gut benutzte Shell-Programme wie den Wrapper für OpenOffice zu schauen. Und siehe da:

# cat /usr/lib64/openoffice/program/swriter
#!/bin/sh

cmd=`dirname "$0"`/soffice
exec "$cmd" -writer "$@"

funktioniert großartig. Man kriegt zwar nur den relativen Pfad - aber das reicht ja in aller Regel.

Der neue Trend: Unfactoring

written by Martin Häcker on

Unfactoring is nicht einfach. Man muss es immer wieder üben.

Hier ein Schulungsvideo von der RubyConf08.

Highly advised! ;)

SVN Revision Number in der About Box verfügbar machen

written by Martin Häcker on

Das wollte ich tun, aber die bestehenden Lösungen fand ich alle nicht so toll.

Well, also noch mal.

Immerhin bietet Python ja eine menge mit seinen Batteries Included. Das heißt ich muss nicht aufwendig mit RegExen die plist dateien auseinander nehmen. Schließlich gibt es die plistlib.

Hier das Resultat:

#!/usr/bin/env python

# Usage:
# Either copy into a shell script build phase 
# (don't forget to change the interpreter to "/usr/bin/env python")
# Or just put it into a shell script and call it form there.
#
# Discussion:
# There are really two info plist keys that could be used for the source revision:
# The CFBundleShortVersionString and CFBundleVersion
# Apple recommends to use CFBundleVersion, because it is not shown in the finders info dialog,
# but is shown in the standard about dialog of a cocoa application where the CFBundleVersion
# is shown in parantheses behind the CFBundleShortVersionString.
#
# Inspired by Daniel Jalkut at http://www.red-sweater.com/blog/23/automatic-build-sub-versioning-in-xcode
# License: Creative-Commons Public Domain http://creativecommons.org/licenses/publicdomain/

import os, re, plistlib

# Test if run from xcode
is_run_from_xcode = os.environ.has_key("BUILT_PRODUCTS_DIR")
if not is_run_from_xcode:
    exit("Needs to be run from a Xcode shell scribt build phase")

# We take the one from the built products dir to keep revision numbers out of the repository
info_plist_path = os.path.join(os.environ["BUILT_PRODUCTS_DIR"], \
                               os.environ["INFOPLIST_PATH"])

# get latest svn revision
def output_of_command(*command_and_arguments):
    import subprocess
    return subprocess.Popen(command_and_arguments, stdout=subprocess.PIPE).communicate()[0]

os.chdir(os.environ["PROJECT_DIR"])
version_range = output_of_command("svnversion", "-nc")
latest_commited_version = re.search(r"\d*\w*$", version_range).group(0)

# enter into Info.plist
info = plistlib.readPlist(info_plist_path)
info["CFBundleVersion"] = latest_commited_version
plistlib.writePlist(info, info_plist_path)

Pretty neat. :)

Die aktuelle Version des Scripts liegt wie immer [source:open-source/utilities/xcode-add-subversion-version-to-built-Info.plist.py im Repository].

Wenn Apple mail auf einmal keine Passwörter mehr speichert...

written by Martin Häcker on

... im Schlüsselbund, dann möglicherweise deswegen weil man gerade Services Scrubber verwendet hat um sein Services-Menü aufzäumen.

Und das funktioniert indem es die Info.plist eines Programms manipuliert.

Doh. Wenn das nämlich eine signierte Applikation ist (wie alle Apple-Programme) dann stimmt danach natürlich die Signatur nicht mehr. Und das bedeutet dass sie nicht mehr auf den Schlüsselbund zugreifen können.

Natürlich ohne sich irgendwo in logfiles zu beschweren.

:-/

Die Ursachen der Finanzkrise erklärt

written by Martin Häcker on

Mit einer sehr schönen Analogie (youtube)

Sehr sehenswert.

Blinde und Linux

written by Martin Häcker on

Heute war ich Brunchen mit Bekannten - insbesondere war da auch ein Blinder dabei, der Linux benutzt und versucht von Windows wegzukommen.

Das war spannend. Zuerst einmal, dass Computerbenutzung für Blinde ein riesen Problem ist. Die bekommen von irgendwelchen Firmen für irrsinnig viel Geld Windows-Computer verkauft, die dann vielleicht auch funktionieren - für die sie aber 5000 € jährlich bezahlen müssen. (Ob die Zahl jetzt stimmt sei mal dahingestellt - Fakt ist, es ist teuer).

Und die Krankenkassen sind da nicht so geberfreundlich - denn wer braucht denn schon das Internet? Selbst braille-Zeilen sind wohl ein echter Kampf bis man sie kriegt. (UNGLAUBLICH wenn man sich das überlegt!)

Dabei geht es ja auch anders: Linux hat die Kommandozeile, die für Blinde schon mal ein großer Vorteil ist - und sie können freie Software selber Hacken bis Sie tut was sie brauchen.

Was wohl z.B. bei dem Gnome Screenreader Orca auch einige tun. (Yay! More power to you!)

Prinzipiell haben Blinde mit freier Software überhaupt eine Chance, denn der Markt gibt viele Hilfen die sie bräuchten einfach nicht her. Spezielle Routenführer für Blinde? Gibt es, aber dort stehen für Berlin nicht mal die U-Bahnen mit drinn. Geschweige denn wo genau der Eingang dazu ist und ob sie aus dem Zug jetzt vorne oder hinten aussteigen sollen, damit sie gleich noch eine Unterführung unter der Straße nutzen können.

Das fand ich überhaupt das Spannendste, wo denn die Probleme liegen. Also zum Beispiel:

  • Open Office funktioniert wohl ganz gut - aber sobald man eine Präsentation im Full-Screen Modus anschaut, rendert OpenOffice offenbar die Folien als Bild - tada, die Screenreader Information fehlt und alles ist still.
  • Scannen ist ein riesen Problem. Es gibt einfach keine Software mit vernünftiger Layout- und Tabellen-Erkennung die eine genügend hohe Erkennungsrate hat. Bis vor kurzem war noch nicht mal drinn dass die Orientierung des Textes erkannt wurde...
  • PDFs lesen geht nicht. Acrobt Reader soll es wohl können - aber die freie Software noch nicht.
  • Browsen mit Firefox funktioniert gut - aber wenn man eine lange Seite schnell ein paar mal scrollt (space oder pagedown) dann dauert es manchmal bis zu einer Minute bis der Screenreader auch so weit gekommen ist.

Spannend. Das sind nicht ganz die Probleme mit denen ich gerechnet hätte. Vor allem dass GUI-Anwendungen so wichtig sind. An Firefox und OpenOffice kommt kein Blinder vorbei.

Noch ein eher abschreckendes Beispiel: Er hat an der exzellenten Freien Universität Informatik Studiert. Dabei ist er aber gescheitert, weil z.B. die Aufgabenblätter zwar als PDF kamen - aber darin nur gescannte Aufgabenblätter waren...

Peinlich.