2010
08.31

Endlich ist es soweit, ich kann den Palm Pre SMS Counter Vorstellen! :) Lange hat es gedauert, aber jetzt ist er doch online.

Das ganze ist mehr oder weniger noch in der Testphase, und sollte in den nächsten Tagen und Wochen wohl noch mehrere Updates bekommen, weil es bestimmt noch einige Bugs gibt.

Daher wäre es nett, wenn ihr in den Kommentaren Bugs melden würdet, damit ich diese beheben kann.

Nun aber zum SMS Counter selbst.

Das ganze funktioniert über einen Daemon, welcher in einem Extra Paket installiert werden muss, keine Angst, Preware erkennt das Automatisch und installiert direkt beides.

Nachdem der Daemon installiert ist, liest dieser die PalmDatabase.db3 alle 5 Minuten aus und schreibt das Ergebnis in eine JSON Datei, woraus das Interface mit Daten versorgt wird.

In dieser JSON Datei stehen zur Zeit die Daten über Gesendete SMS Heute, im Aktuellen Monat und die Gesamtanzahl, alles beruhend auf den Daten aus der PalmDatabase.db3, daher gibt es hier keinen Anspruch auf Richtigkeit! Außerdem wird in der Datei noch die Zeit der Erstellung gespeichert, damit man im Programm sehen kann, von wann dieser Counterstand ist.

Fürs erste sollte das reichen, hoffe ich. Weitere Vorschläge nehme ich natürlich gerne an.

Hier mal eine kleine Liste mit den Sachen die ich geplant habe:

  • Monatsanfang selbst bestimmen. Zur Zeit ist Monatsanfang immer der 1.
  • Timestamp nicht mehr von Webseite holen, sondern im Gerät selbst erzeugen. (Jemand nen Tipp?)
  • Refresh Button, im Prinzip Manuelles ausführen des Daemon
  • Speichern der Daten in einer “richtigen” Datenbank

So genug um den heißen Brei geredet!

Zum installieren benötigt ihr Preware oder WebOSQuickInstall, damit lässt sich der Daemon installieren.

Wenn ihr Preware benutzt, dann muss ein neues Feed erstellt werden (wird sich später wohl ändern).

Die Adresse ist: http://daslampe.lano-crew.org/webOs

Solltet ihr einfach nur die Dateien benötigen, dann gibts diese hier zum Download:

[Update]:

Ab sofort ist Version 0.0.3 Verfügbar! Mehr dazu hier …

App – http://daslampe.lano-crew.org/webOs/org.daslampe.smscounter_0.0.1_all.ipk

Daemon – http://daslampe.lano-crew.org/webOs/org.daslampe.smscounterd_0.0.1_all.ipk

Bei Problemen, auch bei Problemen mit der Installation, kann man mich natürlich gerne anschreiben!

Viel Spaß mit dem SMS Counter!

Ihr könnt mir natürlich auch ein kleinen Betrag für meine Arbeit spenden.


2010
08.30

Für mich hat heute mal wieder ein neuen Schuljahr begonnen, jedoch hat sich die Jahrgangsstufe für mich nicht geändert. Ich hänge also immer noch in der 12.

Letztes Jahr habe ich einfach zu viel scheiße gebaut, zum Beispiel sehr viele Fehlstunden, wodruch ich den Anschluss verloren habe.

Das wird mir dieses Jahr nicht passieren!

Allerdings wird das Jahr nicht besser, der Stundenplan ist sogar noch etwas schlimmer als letztes Jahr!

3x die Woche habe ich bis in die 10. Stunde, heißt ich bin erst gegen 17 Uhr zu Hause, womit der Tag für mich gelaufen ist.

Donnerstags, wo ich die Juffis Leite, habe ich dazu noch bis in die 9. Stunde, wodurch ich mal wieder ein Problem mit den Hausaufgaben bekomme. Naja irgendwie muss ich das geregelt bekommen.

Der einzige Lichtblick ist der Dienstag, wo ich nur  bis um halb 1 in der Schule sitzen muss und auch nicht ganz so früh da sein muss.

Ein weiteres Problem ergibt sich durch die kurze Zeit bis zu den Herbstferien, grade mal 6 Wochen, wo von unser Jahrgang auch noch eine Woche auf Studienfahrt in der Toscana ist. In die verbleibenden Wochen eine Klausurenphase zu packen wird ein Kunststück.

Was ich auch dieses Jahr wieder nicht verstehe, warum haben wir bis spät in den Nachmittag Unterricht und andere Schulen bekommen ihre Kurse so gelegt, das die Schüler fast immer gegen 14:30 Schulschluss haben?!

2010
08.29

Die nächsten Artikel drehen sich mal wieder um das Palm Pre, da es hier einiges zu Berichten gibt. :)

Los geht’s mit einem Hardware Problem. Der Powerknopf zum ausschalten des Displays und des Palms selbst, hat mir heute Probleme bereitet. Normalerweise hört man ein kleines klicken, wenn man diesen betätigt.
Nachdem ich den Palm aus meiner Tasche genommen hatte, kam dieses Geräusch allerdings nicht mehr und der Palm reagierte auch nicht mehr auf diese Taste.
Das entwickelt sich dann natürlich zu einem großen Problem, da ich keine Lust habe, den Palm immer aufzuschieben bevor ich was sehen kann und zu warten bis sich die Touchscreensperre eingeschaltet hat, bevor ich den Pre wieder in die Tasche stecken kann.
Ab morgen, werde ich dafür wohl auch kaum die Zeit finden, wenn ich erstmal wieder in der Schule sitze.

Also was macht man? Das Ding einschicken und eine Zeit lang ohne Handy auskommen, kommt für mich nicht wirklich in frage, da ich kein zweites Handy habe, welches ich als Alternative verwenden kann, damit ich trotzdem erreichbar bin. Und extra eins kaufen, naja dafür bin ich dann etwas zu geizig. :P

Also habe ich mich schnell mal vor den Mac von @Pfirsichwolke gesetzt und gegoogelt, wie man das Problem den beheben kann, bzw. erstmal ob dieses Problem öfter auftritt.
Tatsächlich, das ganze ist wohl eine Abnutzungserscheinung vom Pre, was ich bei dem Preis schon echt krass finde, besonders da mein Palm Pre noch nicht alt ist, knapp 4 Monate.

Lange rede kurzer Sinn, ich wollte euch hier mal schnell die Lösung präsentieren, die ich verwendet habe, damit der Powerknopf wieder funktioniert.

Einfach, ganz Vorsichtig, von der Bildschirmseite, mit einem dünnen Gegenstand, bei mir war es eine Nagelfeile, den Powerknopf aushebeln. Dort wo der Powerknopf war, kommt nun eine Platte zum vorschein. Auf diese Platte habe ich ein kleines (2 mal gefalltenes) Stück Kassenbon gelegt und den Knopf wieder drauf gepackt.

Jetzt läuft das ganze wieder ohne Probleme. :)
Vielleicht kann dem ein oder anderen das ja helfen.

Achja den Tipp habe ich übrigens hier her: http://www.preforum.de/palm-pre-forum/1318-power-knopf-funktioniert-nicht.html#post17353

Bald gehts weiter, mit neuen Infos, bzw. der Installationsanleitung zum SMS Counter.

2010
08.03

Hier kommt mal wieder ein Artikel der etwas länger, aber vielleicht auch etwas informativer, als die letzten wird. :)

Dieses mal geht es um eine Möglichkeit via fsockopen in PHP ein IMAP-Postfach auszulesen. Normaler weise gibt es dafür in PHP schon eine Extension, jedoch ist diese nicht überall aktiviert, daher kann man diese Technik nicht sehr gut nutzen, wenn man ein Programm/Skript, schreiben möchte, welches auf möglichst vielen Server läuft.

fsockopen ist zwar auch bei vielen Free Webhostern ausgeschaltet, da mit dieser Funktion viel “Schaden” angerichtet werden kann, jedoch hat man bei Pytal.de zum Beispiel die Möglichkeit, durch eine Bestätigte Mitgliedschaft fsockopen nutzen zu können.

Naja lange genug um den heißen Brei geredet, was habe ich also gemacht?

Ganz einfach, ich habe es mir einige Stunden vorm PC gemütlich gemacht, während sich @Pfirsichwolke immer mehr langweilte.

Nach ziemlich viel gegoogle, ausprobieren und fragen im Pytalchat, habe ich jetzt endlich eine naja zugegeben schlechte, aber trotzdem Funktionierenden IMAP-Klasse geschrieben. :)

Der Code dazu kommt hier:

// +———————————————————————-+
// | Copyright (c) 2010 DasLampe |
// | Encoding: UTF-8 |
// +———————————————————————-+
class IMAP
{
var $sock;
var $host;
var $port;
var $sid;
var $tag;
var $_lastTag;
var $currentMailbox;

function __construct()
{
$this->sock = null;
$this->host = “localhost”;
$this->port = “143″;
$this->sid = “”;
$this->tag = 0;
$this->_lastTag = $this->tag;
$this->currentMailbox = “”;
}

function __destruct()
{
fwrite($this->sock, “A000″.$this->getTag().” LOGOUT\r\n”);
}

function connect($host=”", $port=”", $ssl=false)
{
$this->host = $host;
$this->port = $port;

if($ssl == true)
{
$this->host = “ssl://”.$host;
}

$this->sock = fsockopen($this->host, $this->port, $errno, $errstr);

if(!$this->_assumedNextLine(‘* OK’))
{
echo ‘FAIL CONNECT’;
}
}

function getTag()
{
$this->tag = $this->tag +1;
$this->_lastTag = “A000″.$this->tag;

return $this->tag;
}

function login($username, $pass)
{
fwrite($this->sock, “A000″.$this->getTag().” LOGIN “.$username.” “.$pass.”\r\n”);
if(!$this->_assumedNextLine($this->_lastTag))
{

}
}

function selectMailBox($mailbox)
{
fwrite($this->sock, “A000″.$this->getTag().” SELECT “.$mailbox.”\r\n”);
$this->currentMailbox = $mailbox;

$this->readResponse($this->_lastTag);
}

function countMessages()
{
fwrite($this->sock, “A000″.$this->getTag().” SEARCH ALL\r\n”);
$response = $this->readResponse($this->_lastTag);

foreach($response as $id)
{
if($id[0] == “S”)
{
$count = count_chars($id, 1);
}
}
return $count[32];
}

public function getSubject($msgId)
{
if(empty($msgId))
{
return false;
}

$this->fetch($msgId.” BODY[HEADER.FIELDS (subject)]“);

$array = array();
while(!$this->readLine($tokens, $this->_lastTag))
{
if(!empty($tokens) && preg_match(“/FETCH/”, $tokens))
{
$msgId = preg_split(“/ /”, $tokens, 2);
$msgId = $msgId[0];
}
if(!empty($tokens) && !preg_match(“/FETCH/”, $tokens))
{
$array[] = array(“id” => $msgId,
“subject” => $tokens);
}
}
return mb_decode_mimeheader($array[0]['subject']);

}

public function getMsgText($msgId=”")
{
if(empty($msgId))
{
return false;
}

$this->fetch($msgId.” BODY[TEXT]“);

$array = array();
$array[] = “=?ISO-8859-1?Q?”;
while(!$this->readLine($tokens, $this->_lastTag, $tag))
{
$array[] .= $tag.’ ‘.$tokens;
}
//Löschen der 1. und letzten Response
unset($array[1]); //FETCH
unset($array[count($array)]); //Klammer

$array = array_values($array);

//Array2String
$array = implode(”, $array);

//Decodieren und Zeilenumbrüche setzten
return nl2br(mb_decode_mimeheader($array));
}

public function getFromOrTo($msgId=”", $fromOrTo=”")
{
if(empty($msgId) || empty($fromOrTo))
{
return false;
}

$this->fetch($msgId.” BODY[HEADER.FIElDS (".$fromOrTo.")]“);

while(!$this->readLine($tokens, $this->_lastTag))
{
if(!isset($return) && !preg_match(‘/FETCH/’, $tokens))
{
$return = htmlspecialchars($tokens);
}
}
return mb_decode_mimeheader($return);
}

private function fetch($command, $param=false)
{
if(!$param)
{
fwrite($this->sock, “A000″.$this->getTag().” FETCH “.$command.”\r\n”);
}
else
{
fwrite($this->sock, “A000″.$this->getTag().” FETCH “.$command.” “.$param.”\r\n”);
}
}

function _nextLine()
{
$line = @fgets($this->sock);
if ($line === false)
{
echo ‘FAIL!!’;
return false;
}
return $line;
}

protected function _assumedNextLine($start)
{
$line = $this->_nextLine();
return strpos($line, $start) === 0;
}

public function readLine(&$tokens = array(), $wantedTag = ‘*’, &$tag=”")
{
$line = $this->_nextTaggedLine($tag);
$tokens = $line;
$tag = $tag;

if(($tag == “A000″.$this->tag) || ($tag == $wantedTag))
{
return $tag;
}
}

public function readResponse($tag=”*”)
{
if($tag == “lastTag”)
{
$tag = $this->_lastTag;
}
$lines = array();
while (!$this->readLine($tokens, $tag)) {
$lines[] = $tokens;
}

return $lines;
}

protected function _nextTaggedLine(&$tag)
{
$line = $this->_nextLine();

// seperate tag from line
@list($tag, $line) = explode(‘ ‘, $line, 2);

return $line;
}
}

Vielleicht kann diese Klasse ja jemanden Helfen, der ein ähnliches Problem hat, ich würde mich dann auf jeden Fall über ein Kommentar freuen.

Ich muss dazu sagen, das ich bei meiner Suche natürlich auch auf andere Klassen gestoßen bin, welche bei mir jedoch alle nicht Problemlos liefen. Dazu kommt, das ich natürlich gerne weiß, was mein Programm macht und ich in den Ferien auch Zeit dafür habe, so etwas selbst zu schreiben.

Kleiner Tipp noch am Rande, wer plant auch einige eigene Klasse zu schreiben, dem kann Wireshark echt gut helfen!
Ich hatte zum Beispiel das Problem, das schon die 2. Anfrage gesendet wurde, bevor die 1. Anfrage zurück kam, trotz eines sleep(2), solche Fehler kann man eher schlecht aus einer Protokolldokumentation entnehmen. ;)

Achja, hier noch die Klassen, die ich so ausprobiert habe und von welchen Einflüsse in meinem Code sind:

Zend Mail aus dem Zend Framework + diese Anleitung von PHP Gangsta

Net_IMAP aus der PEAR Bibliothek.