Archive

Posts Tagged ‘Apple’

“Things” per git und der iDisk syncen

February 24th, 2010

Things ist ein großartiges Produkt. (Punkt! Dem ist nichts hinzuzufügen!)
Nutzer von .Mac bzw. MobileMe können mit der Hilfe der iDisk und etwas git-Magie™ allerdings noch ein Stückchen mehr awesome bauen, nämlich ein Sync der Things-Datenbank über mehrere Macs.

Vorgeplänkel:

  • Wenn Du Things auf mehr als einem Mac nutzen möchtest, dann kaufe bitte eine entsprechende Anzahl von Lizenzen.
  • Ja, ich meine das ernst – die Buben aus Stuttgart haben wahnsinnig gute Arbeit geleistet, sowas muß man einfach würdigen.
  • Ich gehe davon aus, daß Du ein lauffähiges git auf Deinem Mac hast, Anleitungen hierzu gibt es genug im Netz.
  • Ich habe vor langer Zeit den symlink /Volumes/iDisk erstellt, um einen generischen Zugriffspfad zu haben. In den kompletten Zeilen weiter unten referenziere ich diesen Pfad. Der Name Deiner iDisk ist Dein Benutzername, ersetze also entsprechend iDisk mit $Du.

Let’s get dirty!
Auf dem Mac mit installiertem und genutztem Things erstellen wir ein git-Repository. Things legt seine Datenbank als XML in ~/Library/Application Support/Cultured Code/Things ab, und damit das Setup einfach bleibt, nutzen wir auch genau diesen Pfad für das Repository.
cd ~/Library/Application\ Support/Cultured\ Code/Things
git init
git add .
git commit -a -m "initial commit"

Sobald das neu erstellte Repository existiert und mit den bisherigen Daten gefüllt ist, erstellen wir erst ein neues Repository auf der iDisk (--bare weil wir in diesem Repository nicht arbeiten wollen, sondern es nur als “Server” benutzt wird) und pushen die Daten dort hin.
git clone --bare . /Volumes/iDisk/Repository/things.git
git remote add idisk /Volumes/iDisk/Repository/things.git
git push idisk master

Der Name “iDisk” für das remote-Repository ist hierbei frei gewählt.

Das folgende Shell-Script wird in Zukunft die oben angesprochene Magie™ für uns übernehmen, daher bitte einmal copy&paste, chmod +x und mit dem gewünschten Zeitpunkt in die crontab des eigenen Users eintragen.

1
2
3
4
5
6
#!/bin/bash
DATE=`date`
cd ~/Library/Application\ Support/Cultured\ Code/Things
git pull idisk master
git commit -a -m "Auto Sync - $DATE"
git push idisk master

Bis hier haben wir ein Backup-System mit Versionshistorie, aber von einem zweiten Mac war bisher noch nicht die Rede, oder? Also…

Schickt die Clone herrein!

Auf dem zweiten oder siebzenten Mac Things installieren und mit der leeren Datenbank beenden.

cd ~/Library/Application\ Support/Cultured\ Code
mv Things Things.dist
git clone /Volumes/iDisk/Repository/things.git

Und auch auf diesem Apfel lassen wir das obige Shell-Script per cron laufen. Ich empfehle hier die Zeitpunkte nicht zu nah aneinander zu legen, so daß Kollisionen bestmöglich vermieden werden.

Kollisionen:
Auch wenn git mit Kollisionen umgehen kann, dieser Weg sollte nur so weit als Sicher bezeichnet werden, als das nur ein Mensch an einem Mac parallel arbeitet. Mit etwas mehr Magie™ läßt sich sicherlich ein Weg finden, die Things Datenbank bei Änderungen aus mehreren Quellen entsprechend zu mergen, aber diese Anforderung stellte sich bei der Motivation dieser Anleitung nicht. Für Vorschläge bin ich immer offen. :-)

Egal was Du tust, sichere Deine Daten! Ich bin zwar kein Fießling, und absichtlich werden hier niemals Fehler zu finden sein, aber wer blind ein rm -rf / abtippt, dem ist nicht mehr zu helfen. Sichere Deine Daten, denke nach was Du tust, teste was man testen kann.

Inspiriert von:

,

iPhone 2G Unlock durch die Telekom

February 17th, 2010

Sobald die zwei Jahre des T-Mobile Vertrags abgelaufen sind (egal ob hierbei der Vertrag gekündigt oder verlängert wird), bietet die Telekom nach etwas Nachfragen die Möglichkeit an die iPhones zu unlocken, d.h. die Sperre die verhindert andere SIM-Karten zu nutzen zu entfernen.

Das Prozedere funktioniert in etwa so:

  • man quängelt an der Kundenhotline (per T-Mobile unter 2202 erreichbar) bis man einen freundlichen und gewillten Mitarbeiter am (R)Ohr hat
  • die IMEI des Geräts wird erfasst und von der Telekom an Apple weiter gegeben (die Nummer findet man auf der Rückseite des iPhones
  • angeblich(!) wird man per E-Mail informiert, sobald Apple das Gerät zur Freischaltung anerkannt hat – diese E-Mail wurde mir nur nie zugestellt
  • sobald die E-Mail angekommen ist, bzw. man einfach etwa drei Tage gewartet hat, kann das Gerät per iTunes freigeschaltet werden
  • die T-Mobile SIM-Karte wieder einlegen, falls schon eine SIM eines anderen Anbieters im iPhone ist
  • iPhone mit iTunes verbinden, etwas abwarten, dem Dialog folgen – fertig
  • ggf. die gewünschte SIM-Karte einlegen

Warum-auch-immer™ wird man gebeten den iPhone Terms and Conditions erneut zuzustimmen, wenn diese auch bei mir komplett leer waren. (Von anderen Unlockern habe ich bereits gehört, daß mein iTunes da wohl kein Einzelfall war – die Terms and Conditions scheinen recht oft zu fehlen und man bestätigt ein leeres Fenster)
Screen shot 2010-02-09 at 15.50.40

Das iPhone wurde freigeschaltet:
Screen shot 2010-02-09 at 15.51.08

Nach dem Unlock steht u.A. auch Tethering wieder zur Verfügung, allerdings ist bei mir der Menüpunkt magischerweise nach dem ersten reboot wieder verschwunden.

IMG_0557

Und bevor auch Du Dich über den kleinen Kringel neben dem Betreiberschriftzug wunderst: der Kringel steht im Gegensatz zum E für GPRS. Wenn Du diesen Kringel siehst, dann hat Dein Anbieter keine Edge-Abdeckung. Und da die 2G iPhones kein UMTS können, ärgert sich auch sicherlich niemand über das wieder verschwindende Tethering (scheint auch bei einigen anderen iPhone Nutzern mit Ex-T-Mobile-iPhones so zu sein).

timo-edgeo2-edgeo2-gprs

,

Netatalk on OpenSolaris (incl. Service Discovery)

February 17th, 2010

I just found an excellent article via an excellent article via another excellent article about building Netatalk on OpenSolaris.

Thanks folks, after about 15min of compile-time and a some copy&paste, my ZPool is now visible in Finder. :-)

,

rsync vs. zfs send|zfs receive

January 20th, 2010

Problemstellung:

Gedankengang #1:
Es war schon spaet abends, wirklich nachgedacht wurde nicht, klein Sebastian startet ein rsync und denkt “so lang wird das schon nicht dauern”. Problematik dabei ist bzw. war allerdings, dass auf dem Pool u.A. auch diverse OpenSource-Projekte und -Sammlungen im Quelltext vorlagen, so z.B. pkgsrc, was ohne mit der Wimper zu zucken zu mehreren Millionen kleinen Files fuehrt. Ebenfalls kam der kleine Sebastian nicht auf die Idee fuer das rsync ein LAN-Kabel anzuschliessen und schickte den kompletten Datenstrom ueber WLAN durch die Luft. (Immerhin zwar n, aber im Vergleich zu Gigabit-Ethernet immernoch langsam.) Einigen wir uns auf keine so gute Idee, auch wenn sie zum Ziel gefuehrt hat.

rsync -avzP -e "ssh -p 22" /Volumes/tank/* shl@<ziel>:/tank/transfer

Gedankengang #2: (ein paar Tage spaeter)
Die Daten sind auf dem neuen Pool angekommen – so weit so gut. Und damit es noch einen Lern-Erfolg gibt, machen wir das jetzt nochmal in richtig. Damit ich den – in diesem Falle – ueberfluessigen Layer Netzwerk los werde, schliesse ich die USB-Platten vom Mac direkt an die OpenSolaris-Box an. Hierfuer muss der Pool allerdings erst umbenannt werden, da eine Maschine nicht zwei Pools des gleichen Namens mounten kann.

sudo zpool export tank
sudo zpool import oldtank tank
sudo zpool export oldtank

Die Schritte im Detail: wir exportieren den Pool, damit wir ihn per import <neu> <alt> umbenennen koennen und exportieren ihn nochmals, damit wir ihn an die andere Kiste anschliessen koennen. Hier noch ein

pfexec zpool import oldtank

und zumindest das erste Problem ist gegessen.

ZFS bietet von Haus aus eine durchdachte Moeglichkeit an um Daten von A nach B zu schieben, naemlich zfs send | zfs receive. Durch die Pipe (|) kann man hier auch prima z.B. ssh als Transport-Medium nutzen. Allerdings kann zfs send nur Snapshots uebertragen – aber bei einem Filesystem was effektiv still steht (hier oldtank) tut das ja nun wirklich nicht weh.

Das folgende Script habe ich die letzten Monate auf meinem Mac zum snapshot’en benutzt. In groben Zuegen basiert es auf Jeff’s Snapshot-Script, allerdings erstellen wir hier keinen Timestamp sondern einen hoffentlich eindeutigen String fuer die Snapshots die wir kopieren moechten, in diesem Falle “NOWITSTHETIME“.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
 
FS=`zfs list -t filesystem | grep oldtank | awk '/^[a-z0-9]+\//{ print $1}'`
#NOW=`date +%Y-%m-%d`
NOW=NOWITSTHETIME
 
for I in $FS; do
 echo "Snapshot'ing ${I}@$NOW ..."
 zfs snapshot ${I}@$NOW
 if [ $? = 0 ]; then
  echo "success!"
 else
  echo "failed ($?)!"
 fi
done

Im naechsten Script – ich entschuldige mich im Vorfeld fuer die massive und z.T. unnoetige Nutzung von grep, aber mir gefaellt das halt so ;-) – schicken wir die eben erstellten Snapshots nach tank/transfer2 (vorher natuerlich anlegen, sonst wird das nix…):

1
2
3
4
5
6
7
#!/bin/bash
 
for i in `zfs list -rH -t snapshot | awk '{print $1}' | grep oldtank | grep -v tank/transfer2/oldtank | grep NOWITSTHETIME`
do
echo "sending Snapshot" $i "to transfer2"
pfexec zfs send $i | pfexec zfs receive tank/transfer2/$i
done

Fragt sich nun natuerlich: was haben wir gewonnen?
zfs send serialisiert den Datenstrom, was z.B. dazu fuehrt, dass es vollkommen egal ist, ob wir mit Millionen von kleinen Dateien oder drei grossen 1TB-Files arbeiten. Ebenfalls koennen wir uns den kompletten Weg der Daten sicher ueber deren Zustand sein, denn wir vertrauen durchweg auf die Integritaetschecks von ZFS. Wenn gewuenscht (ich habe nicht wirklich einen Sinn darin gesehen) kann man durch die Pipes noch z.B. gzip einbauen, oder eben Transport-Mechanismen wir ssh oder sonstwas nutzen. Konstrukte wie

zfs send tank@BRIEFTAUBE > file
Benutze file mit Brieftaube
cat file | zfs receive tank@BRIEFTAUBE

sind genauso moeglich. Und auch die Nutzung als Backup ist durchaus eine Ueberlegung wert.
Um zur urspruenglichen Problemstellung zurueck zu kommen: im Vergleich zur Methode #1 ist die Loesung mit zfs send eindeutig schneller. Und – zumindest ich – habe damit ein besseres Gefuehl.

Beide Scripte sind per git auf github verfuegbar.
(git clone git://github.com/shl/zfssnapsend.git)

, ,

IPv6 – the Apple way

December 12th, 2009

Als ich neulich meinen WRT54g in Rente geschickt habe, ist mir aufgefallen, daß die Time Capsule ziemlich gut mit IPv6 umgehen kann.

IPv6-Mode

Die Time Capsule beherrscht hierbei drei verschiedene IPv6-Modi:

  • link local only: es wird eine fe80::-Adresse gebunden, und Kommunikation per IPv6 ist nur innerhalb des LANs möglich
  • node: die Time Capsule wird zum Teilnehmer eines existierenden IPv6 Netzwerks, wird sich also ihre IP per router advertisement ziehen
  • Tunnel: die Time Capsule stellt selbstständig einen Tunnel per IPv4 her und sorgt für das Routing und das advertisement eines /64-Prefixes ins LAN

Wer beim Thema Tunnel lieber selbst Hand anlegen möchte, oder zumindest kontrollieren möchte wo sein IPv6 Upstream her kommt, auch dem sei geholfen:

manual tunnel
Wird die Konfiguration einfach auf Automatik belassen, bekommt man ein /64-Prefix frei Haus mit genau keinem Aufwand.

Die Time Capsule verfügt sogar über eine rudimentäre Firewall:
Teredo und Firewall

Sinnvoll finde ich persönlich in diesem Zusammenhang die Möglichkeit, teredo-Tunnel zu unterbinden, und damit das IPv6-Routing nicht unnötig zu verkomplifizieren, wenn durch die Time Capsule schon halbwegs nativer Upstream besteht.

,

Jugendschutz im iTunes Store

December 12th, 2009

Wie schonmal gezeigt nimmt Apple den Jugendschutz im iTunes Store wohl sehr ernst.

Teils wohl auch etwas zu ernst.
Die folgenden Hinweise habe ich in einer Applikation (scheinbar in den Augen von Apple ein “Spiel”) entdeckt, die wirklich nicht vor der Jugend geschützt werden muß.

Screen shot 2009-10-13 at 15.48.03

Natürlich wieder verbunden mit der altbekannten Meldung:
itunes-alter

Ehrlich … man kann’s auch übertreiben.
(DIeses “Spiel” ist übrigens der Client für last.fm…)

,

Google Wave mit dem iPhone

December 12th, 2009

Um Google Wave mit dem iPhone zu nutzen, muß niemand von uns auf eine App im App-Store warten; die Web-Version funktioniert bereits ausgezeichnet.

IMG_0482

Auch wenn diese Website behauptet, daß der iPhone-eigene Safari nicht unterstützt wird, bisher habe ich keine ernsthaften Probleme gehabt oder Bugs aufgedeckt.
Das iPhone der ersten Generation ist allerdings etwas schwach auf der Brust, also erwartet bitte nicht die Geschwindigkeit eines Desktop-Clients.

Und noch ein kleiner Trick nebenbei: sobald wave.google.com geöffnet ist, im Safari “Save to Homepage” ausprobieren – dann “entsteht” eine iPhone App. :-)

Update:
Waveboard gibt es bereits im iTunes Store AppStore (Danke Norbert)

, , ,