PrayerZ – organize your prayer requests!

PrayerZ hilft dir deine Gebetsanliegen zu organisieren! Gebe deine Gebetsanliegen ein und PrayerZ wird sie für dich sortieren & zusammenfassen (basierend auf Schlagworten). Du kannst zusätzlich Notizen zu einzelnen Gebeten hinzufügen.

Features:

  • Ordne deine Gebetsanliegen basierend auf Schlagworten
  • Gebete mit dem gleichen Titel werden automatisch zusammengefasst
  • Gib für jeden Wochentag Schlagworte ein, für die du beten willst

Seit heute ist diese webOS-App im AppCatalog verfügbar und erscheint in Kürze auch für das HP Touchpad. PrayerZ ist unter der GPL lizenziert (PrayerZ auf GitHub).

[Update] Losungen 2012

Da HP das Update für Losungen 2012 noch nicht freigeschalten hat, biete ich die aktuellen Versionen für webOS Telefone und das HP Touchpad zum Download an. Hier die Download-Links:

Die heruntergeladene IPK kann mit Preware oder WebOSQuickInstall installiert werden.

Update: Die aktualisierte Losungen App ist nun auch im AppCatalog verfügbar!

Sublime Text 2 – erste Erfahrungen

In der letzten Folge von mobileMacs bin ich auf Sublime Text 2 aufmerksam geworden, einen wirklich schönen (den Ruf haben crossplatform Programme ja meist nicht…) und sehr konfigurierbaren Texteditor. Bisher hatte ich für die Entwicklung meiner webOS-Apps immer Komodo Edit im Einsatz, doch es war an der Zeit, mal einen neuen Editor auszuprobieren. Bisher habe ich den Wechsel nicht bereut, im Gegenteil: die Arbeit macht mit diesem schicken Editor viel Freude!

Installiert habe ich Sublime Text 2 über folgendes PPA:

sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text-2

Sublime Text bringt von Haus aus keine Code-Validation für Javascript mit, allerdings gibt es ein Plugin, womit sich dieses Feature nachrüsten lässt. Dazu muss man allerdings zuerst noch eine Erweiterung installieren: Sublime Package Control. Ist dieser Schritt getan, kann man nun das Plugin bequem über die Sublime Paketverwaltung installieren. Dazu öffnet man die Command Palette (STRG+SHIFT+P) und wählt den Eintrag: ”Package Control: Install Package”. Im nächsten Schritt kann man nun SublimeLinter (“sublimelint”) installieren.

Achtung: Damit Sublime Linter auch funktioniert, muss node.js installiert sein!

Für mein derzeitiges webOS-Projekt (BibleZ HD) habe ich ein kleines Script geschrieben, welches das Plugin compiliert (BibleZ HD is eine Hybrid-App) und anschließend “palm-run” aufruft, womit die App auf das Gerät/Emulator gepackt wird und automatisch die Logs ausgegeben werden. Sublime Text 2 besitzt sogenannte Build-Systems, d.h. man kann für bestimmte Dateitypen oder Projekte kleine Scripte angeben, welche dann das Projekt compilieren oder einzelne Dateien übersetzen (Coffee-Script o.ä.).

Über Tools → Build System → New Build System… kann man nun sein Script angeben. Hier ein Beispiel, wie ich mein Shell-Script eingebunden habe (das Skript habe ich vorher ausführbar gemacht):

{ "cmd": ["/path/to/my/File.sh"], "path": "/usr/bin:/usr/local/bin:/bin" }

Nun kann man bequem mit STRG+B bzw. F7 das Skript starten und den Logs in einer kleinen Console am Bildschirmrand folgen!

Ich finde Sublime Text 2 sehr gelungen und werde es definitiv noch weiter einsetzen!

Zwischenbericht: der Sommer

Die Sommerferien neigen sich dem Ende zu und damit (erst einmal) meine Zeit zum Programmieren. In den letzten Wochen habe ich BibleZ für das neue webOS Framework “enyo” neu geschrieben und in diesem Zug ein neues Backend mit eingebaut. BibleZ basiert nun auf dem bekannten SWORD Projekt, sodass jetzt einige Module (v.a. Kommentare, Maps, …) mehr zur Verfügung stehen (derzeit werden nur Bibelmodule unterstützt).

Folgende Features sind bisher in BibleZ HD enthalten:

  • Notizen
  • Lesezeichen
  • Vershervorhebungen
  • Suchfunktion
  • viele Bibelmodule in vielen Sprachen
Weitere Features werden in einer Pro-Version folgen, allerdings wird meine freie Zeit in den nächsten Monaten eher begrenzt sein.
BibleZ HD ist im App Catalog verfügbar.

5x BibleZ Pro zu verschenken

UPDATE: Aktion ist vorbei. Die Gewinner wurden benachrichtigt!

Da heute Himmelfahrt ist, verschenke ich 5 Kopien von BibleZ Pro. Voraussetzung ist, dass ihr webOS 2.x auf eurem HP/Palm – Gerät installiert habt und die aktuelle Version des AppCatalog nutzt (Promotion-Codes gelten nur für Deutschland).

Und so könnt ihr einen Promotion-Code bekommen:

  • folgt @biblez auf Twitter und schickt einen Tweet an @biblez
  • hinterlasst hier einen Kommentar, indem ihr kurz beschreibt, warum euch BibleZ gefällt

Wer sowohl tweetet als auch einen Kommentar hinterlässt, erhöht damit auch seine Chance auf einen Promo-Code. Die Aktion geht bis Sonntag (05.06.2011), 18 Uhr. Aus allen Teilnehmern werden 5 per Zufall ausgewählt!

webOS Entwickler-Tipps: Logging

Seit etwas mehr als einem Jahr entwickle ich nun mehr oder weniger regelmäßig für webOS. Im Folgenden möchte ich ein paar Tipps weiter geben, welche mir im Laufe der Zeit immer wieder geholfen haben. Heute also: Logging!

Logging von Javascript-Objekten oder JSON-Objekten:

Immer wieder kommt es vor, dass man sich den Inhalt eines Objektes ansehen will oder einfach nur schauen möchte, ob eine Variable den Wert null oder undefined hat. Dazu nutzt man am besten die Logging-Funktion von Mojo:

Mojo.Log.info("My Object: %j", myObject);

Logging auf Info-Level auf einem webOS Gerät:

Während der Emulator Logging Informationen auf dem Info-Level ausgibt, gibt ein webOS Gerät standardmäßig nur Meldungen auf dem Error-Level aus, d.h. alle Mojo.Log.info bzw. Mojo.Log.warning erscheinen nicht, wenn man die Logs auf dem Gerät verfolgt. Mit dem Befehl palm-log lässt sich jedoch das Logging auf Info-Ebene auf einem Gerät aktivieren:

palm-log --system-log-level info

Logs von einem Benutzer bekommen

Oft hat man als Entwickler das Problem, dass ein Benutzer einen Bug in der App feststellt und man gern ein paar Logging-Informationen hätte. Dies lässt sich relativ einfach in einer webOS-App implementieren. Dazu legt man einfach in der stage-assistent.js oder app-assistent.js eine globale Variable an:

logging ="----" + Mojo.appInfo.title + " " + Mojo.appInfo.version + " Log-----";

Nun kann in jedem Scene-Assistent auf diese Variable zugreifen und Logging-Informationen ergänzen, z.B.:

logging += "ERROR: Meine Fehlermeldung"  + " \n";

Damit der Benutzer diese Infos auch schicken kann, fügt man am besten im AppMenu einen Menüpunkt ein (“Send Logs”), welcher daraufhin eine neue eMail öffnet mit den Logging-Infos als Nachrichtentext:

this.controller.serviceRequest('palm://com.palm.applicationManager', {
					method: 'open',
					parameters: {
						id: 'com.palm.app.email',
						params: {
							summary: "My App Logs",
							text: logging,
							recipients: [{
								type:"email",
								role:1,
								value:"foo@example.com",
								contactDisplay:"Foo"
							}]
						}
					}
				});

Wer noch weitere Tipps hat, die das Logging erleichtern, einfach einen Kommentar hinterlassen.

[Update] Scanner an der Fritzbox: Direkt auf ein Netzlaufwerk scannen

Vor ein paar Tagen hatte ich schon geschrieben, wie man mit Hilfe von Freetz einen Scanner an der Fritzbox als Netzwerkscanner nutzen kann. Der Nachteil dieser Lösung ist, dass man immer zum Scanner laufen muss, um ein neues Dokument einzulegen – besser wäre es, wenn man einfach eine Taste am Scanner drückt und das Dokument automatisch auf einem Netzlaufwerk gespeichert wird. Nach einigem Suchen und durchschauen der Paketliste für Freetz habe ich nun eine Lösung am laufen, welche vielleicht nicht die optimale ist, aber durchaus gut funktioniert =)

Hier mal die Kurzfassung:

  1. neues Freetz Image erstellen mit den SANE-, Druckertreiber- und Callmonitorpaketen
  2. kleines Shellscript erstellen, welches ein Dokument scannt und an einer bestimmten Stelle speichert
  3. Callmonitor einrichten und bei einem bestimmten Anrufszenario das Shellscript ausführen

Und nun das Ganze etwas ausführlicher:

Freetz Image erstellen

Wichtig ist wieder, dass man die Entwicklerversion verwendet, weil nur in dieser das SANE Paket enthalten ist. Folgende Pakete sollten ausgewählt werden:

  • SANE (inkl. scanimage)
  • Callmonitor
  • evntl. noch nano (wenn man nicht vi als Texteditor benutzen möchte)

Danach das Image mit make bauen und auf der Fritzbox einspielen.

Shellscript erstellen

Mit dem Befehl scanimage kann man den Scanner anweisen ein Dokument zu drucken. Der Befehl bietet einige Parameter, die es sich lohnt mal anzusehen. Um z.B. ein Dokument in Gray und einer Auflösung von 100dpi zu scannen gibt man gibt man folgenden Befehl ein:

scanimage --mode Gray --resolution 100 > doc.pnm

In meinem Setup habe ich neben dem Scanner noch einen USB Stick an der Fritzbox angeschlossen, auf welchem die Dokumente gespeichert werden sollen. Im Webinterface von AVM sollte man kontrollieren, ob der USB Speicher auch eingebunden wurde:

Speicher NAS
Nachdem man sich via telnet fritz.box mit der Fritzbox verbunden hat, findet man den USB Stick unter /var/media/ftp/NAME_DES_USB_STICKS. Nun brauchen wir nur noch ein kleines Script, welches automatisch ein Dokument scannt und auf dem USB Stick mit einem eindeutigen Namen ablegt. Ich verwende dazu dieses:

#!/bin/sh
datum=`date +%Y-%m-%d_%H-%M-%S`
scanimage --mode Gray --resolution 100 > /var/media/ftp/NAME_DES_USB_STICKS/scan-$datum.pnm

Jeder Scan bekommt also noch Datum und Uhrzeit mit in den Dateinamen. Dieses kleine Shellscript kann man z.B. unter /var/flash/scanDoc speichern. Mit

sh /var/flash/scanDoc

kann man noch testen, ob das Script auch so funktioniert, wie man es möchte.

Callmonitor konfigurieren

Mit dem Callmonitor kann man auf eingehende und ausgehende Anrufe reagieren (z.B. ein Email verschicken, wenn man einen Anruf verpasst hat). Das wollen wir für unseren Zweck “Missbrauchen” und bei einem bestimmten Anruf an eine bestimmte Nummer den Scanvorgang auslösen. Dazu öffnet man das Freetz-Webinterface (http://fritz.box:81) und wählt Callmonitor→Listeners im Menu rechts aus. Damit man in das Textfeld auch was schreiben kann, muss zuerst die Sicherheitsstufe der Freetzinstallation geändert werden. Dazu verbindet man sich wieder vie TELNET mit der Box und gibt folgendes ein:

echo 1 > /tmp/flash/mod/security

Nun kann man die Listeners bearbeiten. Wie man diese genau konfigurieren kann, steht im Wiki von Freetz. In meinem Fall reagiere ich auf das Ereignis, wenn ich von meiner 1und1 VOIP Nummer auf meine Telekom-Festnetznummer anrufe. Der Eintrag sieht dann folgendermaßen aus:

in:cancel  012345678$  ^987654321$  sh /var/flash/scanDoc

Wenn ich nun “mich selbst” anrufe, kommt natürlich ein Besetztzeichen und der Anruf wird abgebrochen, was dazu führt, dass das Shellscript ausgeführt wird und der Scan auf dem USB Stick gespeichert wird. Auf die gescannten Dokumente kann man nun via FTP oder Windows-Freigabe der Fritzbox zugreifen. Die Dateien liegen alle im *.pnm Format vor, welches man später noch in PDF oder ähnliches umwandeln kann.

Fazit

Auch wenn diese Lösung ein wenig Bastelarbeit erfordert, ist es doch eine gute Möglichkeit, um ohne eingeschalteten PC mal schnell einen Brief oder ein anderes Dokument zu scannen. Ich würde mich freuen, wenn jemand noch einen Tipp hat, wie man den Listener noch einfacher gestalten könnte, sodass es z.B. ausreicht nur die 4444 zu wählen, um ein Dokument zu scannen. Update: Folgender Listener führt zum Erfolg:

out:request  ^  ^4444$  sh /var/flash/scanDoc

Scanner an der Fritzbox im Netzwerk nutzen

Mein Multifunktionsdrucker (Photosmart c4340) steht nun schon einige Zeit neben der Fritzbox (7270), da auf meinem Schreibtisch kein Platz dafür ist. Drucken über das Netzwerk ist kein Problem, da HP Drucker oft sehr gut unter Ubuntu unterstützt werden. Nun hat der Drucker aber auch einen Scanner. Jedesmal, wenn man etwas einscannen möchte, dann muss man erst einmal seinen Laptop zum Drucker tragen und dann mit dem USB Port verbinden – insgesamt sehr umständlich.

Nun existiert für die Fritzbox ein Projekt, welches sich Freetz nennt. Hier die Selbstbeschreibung des Projekts:

Freetz ist eine Firmware-Erweiterung (Modifikation) für die AVM Fritz!Box und baulich ähnliche Geräte: Die Original-Firmware des Herstellers wird um zusätzliche Funktionen erweitert und mit einer individuellen Zusammenstellung von Programmen ergänzt.

Freetz bietet einem sozusagen die Möglichkeit, seine Fritzbox zu modifizieren und somit um weitere Features zu erweitern. Eine Liste aller Erweiterungen findet man hier. In dieser Liste gibt es auch ein Paket namens “SANE“, welches die Fritzbox um einen Scann-Server erweitert, sodass im Netzwerk auf diesen Scanner zurückgegriffen werden kann.

Installation

Da SANE noch als unstable gekennzeichnet ist, findet man es nur in der aktuellen Entwicklerversion von Freetz, d.h. zuerst muss diese ausgecheckt werden:

svn co http://svn.freetz.org/trunk freetz-trunk

Man beachte den Hinweis: Die Entwicklerversion ist ausschließlich für Profis gedacht, die sich u.U. selbst zu helfen wissen! Sie ist ständigen Änderungen unterworfen und funktioniert möglicherweise nicht oder nur eingeschränkt. und Die Installation einer modifizierten Firmware führt zum Verlust der Gewährleistung des Herstellers!

Bevor man jetzt weiter macht, sollten die Allgemeinen Hinweise und Voraussetzungen zur Installation gelesen werden (benötigte Abhängigkeiten, …)!!!

Mit

make menuconfig

werden nun die benötigten Pakete ausgewählt (Ich kopiere hier der Einfachheit halber die Schritte aus dem Freetz Wiki):

  • Sicherstellen, daß im Hauptmenü Show advanced options und unter Package selection Unstable ausgewählt sind
  • Im Hauptmenü zu Package selectionUnstableSANE wechseln und SANE auswählen
  • Empfehlung: sane-find-scanner und scanimage auswählen. (Diese sind nicht notwendig für den Betrieb, aber hilfreich, falls das Scannen im nächsten Schritt nicht funktioniert. Wenn einmal alles klappt, kann man die beiden Punkte wieder abwählen um Speicherplatz zu sparen (~150kB) und ein neues Image erstellen)
  • Backend auswählen:
    • Geräte von Hewlett-Packard (HP): Eine Ebene höher wechseln, HPLIP auswählen (HPLIP ist momentan nur im Trunk verfügbar) und dann Printer Class und Printer Type entsprechend auswählen (Hilfefunktion steht zur Verfügung)
    • Für alle anderen Geräte (und sehr alte HPs): Über die Liste unterstützter Geräte den Namen des Backends feststellen und auswählen.
  • Unter Package selectionStandard packages Inetd auswählen (wird in kommenden Versionen automatisch ausgewählt)
  • Image erstellen, flashen, neu starten

Hat man diese Schritte hinter sich gebracht, kann man nun bequem von jedem Rechner im Netzwerk aus scannen.Dazu startet man Xsane mit folgendem Parameter:

xsane net:fritz.box

Alternativ kann man auch die Datei /etc/sane.d/net.conf um den Eintrag fritz.box erweitern, dann kann Xsane auch normal aus dem Anwendungsmenu gestartet werden.

Fazit

SANE auf der Fritzbox bietet die Möglichkeit, dass man nun seinen Scanner auch im Netzwerk nutzen kann. Allerdings muss man immer noch zum Scanner laufen und das entsprechende Dokument einlegen. Optimal wäre eine Lösung, wo man nur das Dokument in den Scanner legen bräuchte und der Scanner das Dokument automatisch auf einem Netzlaufwerk speichert (z.B. auf eine an der Fritzbox angeschlossene Festplatte). Leider gibt es scanbuttond noch nicht als Paket für Freetz.

Auktionsvorlagen für SaleZ erstellen

Heute möchte ich eine kurze Einführung geben, wie man Auktionsvorlagen (Templates) für SaleZ erstellen kann. Eine Auktionsvorlage für SaleZ ist nichts weiter als eine HTML Seite ohne <html>, <head> und <body> Tag. Dementsprechend einfach ist es auch eine solche Vorlage zu erstellen – entsprechende HTML/CSS Kenntnisse vorausgesetzt.

SaleZ nutzt die Tag IDs um z.B. den Titel oder den Untertitel in eine Vorlage einzufügen, deshalb müssen in jedem Template folgende IDs vergeben sein:

  • title – Für den Titel
  • subtitle – für den Untertitel
  • content – für die Beschreibung
  • image_1 bis image_10 – für die Bilder

Zu den Bildern sei noch folgendes gesagt: Die image_1 bis image_10 dürfen nicht einem <img> Tag vergeben werden, da SaleZ den <img> Tag selbst einfügt (in dieser Form: <img src=’imageURL’ style=’width: 100%’ />), d.h. am besten gibt man einem <div> die image ID und legt im <div> die Höhe/Breite des Bildes fest.

Die Standardvorlage in SaleZ ist folgendermaßen aufgebaut:

<div id="page" style="width: 90%; margin: auto auto; -webkit-border-radius: 10px; -webkit-box-shadow: 0 1px 5px grey; -moz-border-radius: 10px; -moz-box-shadow: 0 1px 5px grey; border: 2px solid grey; background-image: -webkit-gradient(linear, 0 0, 0 100, from(lightgrey), to(white)); background: -moz-linear-gradient(-90deg,lightgrey, white); -moz-background-size:100% 100px; background-position:top; background-repeat:no-repeat;">
 <h3 id="title" style="text-align: center;">Title</h3>
 <h4 id="subtitle" style="text-align: center;">Subtitle</h4>
 <div id="image_1" style='max-width: 500px; padding: 10px; margin: auto auto;'></div>
 <div id="content" style="padding: 10px;">Enter your description here</div>
 <div id="image_2" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_3" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_4" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_5" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_6" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_7" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_8" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_9" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div id="image_10" style='max-width: 300px; padding: 10px; float: left;'></div>
 <div style="clear: both; display: block;"> </div>
</div>

Der einzige Nachteil an jeder Vorlage für eBay Auktion ist, dass der CSS Code direkt in die Elemente eingefügt werden muss. Eine weitere Einschränkung ist, dass Grafiken, die man für sein Template verwenden will, über eine URL eingefunden werden sollten (d.h. die benötigten Grafiken irgendwo bei einem ImageHoster hochladen oder anderweitig verfügbar machen).

Hat man einmal den HTML/CSS Teil erledigt (index.html speichern), fehlt noch ein kleiner Schritt, damit SaleZ auch die Auktionsvorlage findet. Zu jedem Template gehört eine template.info Datei, welche im gleichen Verzeichnis, wie die Auktionsvorlage (index.html) liegen muss. Diese Datei enthält nur eine Zeile:

name=Meine Auktionsvorlage

Danach kopiert man diese beiden Dateien in .$HOME/.salez/templates/MyTemplate/. SaleZ sollte nun beim nächsten Start die Auktionsvorlage erkennen (ab Version 0.1-public4).

Ich freue mich über weitere Auktionsvorlagen für SaleZ :)

Zugriff auf das DOM mit Python in webkitgtk

Während der Entwicklung von SaleZ stand ich vor dem Problem, dass ich Werte aus dem Document Object Model (DOM) auslesen wollte. In Webkit gibt es zwar die Funktion get_dom_document, allerdings ist sie noch nicht in der Version von Webkit enthalten, welche mit Ubuntu 10.04 mitgeliefert wird. Nach einiger Suche im Netz habe ich dann eine Lösung für das Problem gefunden.

Mit Hilfe des folgenden Codes kann man sich den Inhalt eines bestimmten Elements ausgeben:

import jswebkit

ctx = jswebkit.JSContext(webView.get_main_frame().get_global_context())
text = ctx.EvaluateScript("document.getElementById("fooBar").innerHTML")

Möchte man hingegen das DOM manipulieren, kann man die  execute_script Funktion eines WebViews nutzen:

webView.execute_script('document.getElementById("foobar").innerHTML = "foo bar"')