
Das Monatsmittel der Temperatur in Reutlingen liegt mit 3,33°C ziemlich genau ein Grad über dem Wert aus dem Jahr 2011. Der Monat
begann recht mild und die Temperaturen fielen von Woche zu Woche. Es gab eine Kältewelle rund um den 16. Januar mit einer Tiefsttemperatur von -6,2°C
am 17.01. um 6:49 Uhr morgens.


Manchmal versucht man einen String nach UTF-8 zu konventieren und es klappt nicht so, wie man denkt. Die Ursache liegt dann manchmal darin, daß der
Ursprungs-String nicht in "reinem" ISO-8859-1 vorliegt, sondern in enem Windows-Format "CP-1252". Die kodierten Sonderzeichen müssen also zunächst
vorkonvertiert werden. Mit der folgenden Funktion läßt sich dieses sehr einfach umsetzen:
function utf8_encode_with_cp1252( $str ) {
return strtr( utf8_encode( $str ), array(
"\xc2\x80" => "\xE2\x82\xAC", // EURO SIGN
"\xc2\x82" => "\xE2\x80\x9A", // SINGLE LOW-9 QUOTATION MARK
"\xc2\x83" => "\xC6\x92", // LATIN SMALL LETTER F WITH HOOK
"\xc2\x84" => "\xE2\x80\x9E", // DOUBLE LOW-9 QUOTATION MARK
"\xc2\x85" => "\xE2\x80\xA6", // HORIZONTAL ELLIPSIS
"\xc2\x86" => "\xE2\x80\xA0", // DAGGER
"\xc2\x87" => "\xE2\x80\xA1", // DOUBLE DAGGER
"\xc2\x88" => "\xCB\x86", // MODIFIER LETTER CIRCUMFLEX ACCENT
"\xc2\x89" => "\xE2\x80\xB0", // PER MILLE SIGN
"\xc2\x8A" => "\xC5\xA0", // LATIN CAPITAL LETTER S WITH CARON
"\xc2\x8B" => "\xE2\x80\xB9", // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
"\xc2\x8C" => "\xC5\x92", // LATIN CAPITAL LIGATURE OE
"\xc2\x8E" => "\xC5\xBD", // LATIN CAPITAL LETTER Z WITH CARON
"\xc2\x91" => "\xE2\x80\x98", // LEFT SINGLE QUOTATION MARK
"\xc2\x92" => "\xE2\x80\x99", // RIGHT SINGLE QUOTATION MARK
"\xc2\x93" => "\xE2\x80\x9C", // LEFT DOUBLE QUOTATION MARK
"\xc2\x94" => "\xE2\x80\x9D", // RIGHT DOUBLE QUOTATION MARK
"\xc2\x95" => "\xE2\x80\xA2", // BULLET
"\xc2\x96" => "\xE2\x80\x93", // EN DASH
"\xc2\x97" => "\xE2\x80\x94", // EM DASH
"\xc2\x98" => "\xCB\x9C", // SMALL TILDE
"\xc2\x99" => "\xE2\x84\xA2", // TRADE MARK SIGN
"\xc2\x9A" => "\xC5\xA1", // LATIN SMALL LETTER S WITH CARON
"\xc2\x9B" => "\xE2\x80\xBA", // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
"\xc2\x9C" => "\xC5\x93", // LATIN SMALL LIGATURE OE
"\xc2\x9E" => "\xC5\xBE", // LATIN SMALL LETTER Z WITH CARON
"\xc2\x9F" => "\xC5\xB8", // LATIN CAPITAL LETTER Y WITH DIAERESIS
"€" => "\xE2\x82\xAC" // EURO SIGN
) );
}

Beim Aktualisieren aller Pakete über aptitude erhielt ich folgende Meldung:
W: GPG error: ftp://mirror.hetzner.de lenny Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY BLABLABLA
Ein Blick in die /etc/apt/sources.list zeigte mir die noch per default eingetragenen Update-Server. Also habe ich mir die neusten Serverdaten von meinem Hoster Hetzner geholt:
# Packages and Security Updates from the Hetzner Debian Mirror deb ftp://mirror.hetzner.de/debian/packages lenny main contrib non-free deb ftp://mirror.hetzner.de/debian/security lenny/updates main contrib non-free
Bei einem weiteren Versuch, die Paketeliste zu aktualisieren, ergab leider wieder die Warnung.
Nach ein wenig gegoogle bin ich auf den Hinweis gestossen, zunächst das Paket
debian-archive-keyring
zu aktualisieren. Und siehe da, Problem gelöst! Damit wurden die GnuPG-Archivschlüssel des Debian-Archivs erneuert. Das Debian-Projekt signiert seine veröffentlichten Dateien digital. Dieses Paket enthält die Archivschlüssel, die dafür verwendet werden.

Installation
Aktuelle Version von node.js unter http://nodejs.org/. Notwendige Pakete zur Installation sind u.a.
python-dev und libssl-dev.
./configure --prefix=/usr/local/nodejs make make install
Für die Einbindung von Erweiterungen für node.js wird das Tool npm genutzt, welches man unter http://npmjs.org/ finden kann. Bei der Installation sollte das Verzeichnis zu node.js dem PATH zugeordnet werden.
PATH=$PATH:/usr/local/nodejs/bin/ curl http://npmjs.org/install.sh | sh
Zwei nützliche Erweiterungen für node.js sind zum einen express.js http://expressjs.com/, welches einem sehr vereinfacht HTTP-Server zu erstellen. Und zum anderen natürlich socket.io http://socket.io/ für die Socket-Kommunikation mit dem Browser / Client.
npm install express npm install socket.io
Programmierung
Es wird ein Server und ein Client benötigt. Der Server startet auf einem beliebigen Port und reagiert auf Ereignisse, wie die Verbindung eines neuen Clients oder dem Aufruf einer gewünschten Aktion. In diesem Fall soll der Server die Anzahl der verbundenen Clients zählen und bei jedem Verbinden und Trennen eines Clients diese Anzahl anpassen und in Echtzeit an alle verbundenen Clients übertragen.
var express = require( '/usr/local/nodejs/lib/node_modules/express' );
var server = express.createServer();
server.listen( 88 );
var io = require( '/usr/local/nodejs/lib/node_modules/socket.io' ).listen( server );
var browsers = 0;
io.sockets.on( 'connection', function ( socket ) {
browsers++;
io.sockets.emit( 'show', { num: browsers } );
socket.on( 'disconnect', function () {
browsers--;
io.sockets.emit( 'show', { num: browsers } );
} );
} );
Der Client meldet sich beim Server an. Öffnet die Socket-Verbindung und reagiert auf die ihm gesendeten Daten. Natürlich kann auch dieser Ereignisse an den Server übertragen.
<script type="text/javascript">
windowOnLoad( function() {
var socket = io.connect( 'http://www.kinglee.de:88' );
socket.on( 'connect', function () {
// alert( 'connected' );
} );
socket.on( 'show', function ( data ) {
$('users-online').innerHTML = data.num;
} );
} );
</script>
<div id="users-online"></div>

Jetzt habe ich mich doch glatt dabei erwischt, mal durch die alten Skripte des WebcamKönig zu gucken. Der WebcamKönig war ein Projekt von mir, welches nach IP-Cams im Internet suchte und diese nach Ländern etc. auflistete. Sehr spannend. Viele Cams (wenn nicht mehr) sind immernoch online. Vielleicht gibt es ja eine neue Krönung ;-)


Einen meiner Temperatursensoren habe ich in einer Wasserflasche versenkt, welche draußen auf dem Balkon steht. Der Verlauf der Temperatur wird durch die Masse des Wassers deutlich gedämpft. Dies erkennt man am gleichmäßigen Verlauf der Temperaturkurve.
Letzte Nacht (14. auf 15. Januar) fiel die Außentemperatur bis auf -4°C. Es ist nun spannend zu beobachten, wie sich die Temperatur im Wasser verhält. Hier der aktuelle Verlauf der Wassertemperatur:
Seit 3 Uhr nachts ist die Flasche komplett durchgefroren. Der Sensor "meldet" seit dem eine Temperatur von ca. +0,4°C. Noch ist die Flasche trotz Luft-Temperaturen von +2°C nicht wieder aufgetaut.
Update: Nach zwei richtig kalten Nächten verändert sich, wenn auch nur sehr wenig, die Temperatur des Eis in der Flasche. Der Wert von +0,4°C fällt in der Nacht bis auf ca. -0,1°C. Die Frage ist, woher kommt der Unterschied zur Außentemperatur?


Ich will schöne URLs! Ich will keine Endungen, keine Fragezeichen, keine &-Zeichen! Aus einer URL wie
www.kinglee.de/test.php?bar=foo&dings=bums
sollte soetwas wie
www.kinglee.de/test/bar-foo/dings-bums/
werden. Das ist doch vieeel schöner!
In meinem Skript test.php möchte ich aber mit den $_GET Parametern arbeiten können, wie ich es von der häßlichen URL gewohnt bin. Für diese Aufgabe habe ich eine zweiteilige Lösung entwickelt. Zum einen wird die URL in der .htaccess schon ein wenig umgewandelt, um dann im PHP Skript in die endgültige Form gebracht zu werden.
Die .htaccess hat zunächst die Aufgabe den schönen Aufruf so zu zerlegen, dass aus dem /test/ ein test.php wird. Der restliche Teil kann zunächst "so
wie er ist" an test.php übergeben werden. Weitere normale GET-Parameter, die mit einem Fragezeichen angehängt werden sollten, werden auch
übergeben.
RewriteCond %{REQUEST_URI} !(\.(html?|php|png|gif|jpg|css|js|flv|swf|zip))$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(.*)$ $1.php?_p=$2&_qs=%{QUERY_STRING} [NC,L]
Wenn nun eine Anfrage an den Server gestellt wird, eine Datei mit Dateiendung auszugeben, dann greift die Umwandlung nicht! (siehe Zeile 1) Dabei spielt es keine Rolle, ob es die Datei gibt oder nicht!
Wenn nun eine Anfrage an den Server gestellt wird, ein Verzeichnis zu öffnen, dann greift die Umwandlung nur, wenn das Verzeichnis nicht doch existiert. (siehe Zeile 2)
Die Umwandlungsregeln greift und macht aus
www.kinglee.de/test/bar-foo/dings-bums/?links=rechts
dann
www.kinglee.de/test.php?_p=/bar-foo/dings-bums/&_qs=links=rechts
array(2) {
["_p"]=>
string(20) "/bar-foo/dings-bums/"
["_qs"]=>
string(12) "links=rechts"
}
Jetzt muß der $_GET Parameter nur noch umgeschrieben werden. Dazu wird der _p Teil zunächst am / und dann jedes Teilstück nochmal am - zerlegt! (Was für ein Satz!) Entsprechendes gilt für den _qs (Query String) mit den Trenner & und =.

Ich nutze seit einigen Tagen die App SendLocation, um meine Position mittels eines einfachen HTTP-GET Aufrufes an meinen Server zu senden. Viele andere Apps waren zu kompliziert oder hatten nur die Möglichkeit, Daten per Mail oder SMS zu versenden. Die App SendLocation ist simpel und damit perfekt für diesen Zweck geeignet. Die aktuellen Daten stelle ich in einer google map dar.
Interessant ist die Funktion der App, auch im Hintergrund, wenn die App nicht geöffnet läuft, Positionen zu senden. Allerdings funktioniert dies nur eingeschränkt, da nur Wegpunkte vom iOS an die App gemeldet werden, wenn eine wesentliche Änderung vorkam.
Wenn die App aber offen ist, wird die Position kontinuierlich an die URL gesendet, die man selber definieren kann.
| Longitude | 9° 13" 20,429' |
| Latitude | 48° 29" 20,312' |








