aptitude update Warnung (gelöst!)

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.

Echtzeit Besucherzähler mit node.js und socket.io

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>
Der König ist tot, es lebe der WebcamKönig!

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 ;-)


Das Wasserflaschenexperiment

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?


mod_rewrite in der Praxis

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 =.

iPhone Position ins Internet übertragen

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.

Apache Log direkt in MySQL speichern

Siehe Mod Log SQL

Das LogFormat habe ich explizit in der vhost Conf des Apache angegeben. Ich habe die default Spalten um ein großes V am Ende geändert, nun werden die virtuals hosts Aufrufe angezeigt. Somit kann ich sehen, über welche der vielen Domains die Aufrufer auf kinglee.de kamen.

LogSQLTransferLogTable access_www_kinglee_de
LogSQLTransferLogFormat AbHhmRSsTUuV
Most Wanted JavaScript Functions I

Bestandteile meiner mini.js mit den wichtigsten, weil am meisten benötigten JavaScript Funktionen / Methoden / Objekten etc.

/*
* Der Klassiker:
* Ermöglicht das Ansprechen eines Elementes über die Kurzform
* $('foo').innerHTML = 'bar';
*/
function $(x) {
  return document.getElementById(x);
} 
Jahresmitteltemperatur 2011
Die Jahresmitteltemperatur eines Ortes, auch als Jahresdurchschnittstemperatur bezeichnet, wird aus dem Durchschnitt der zwölf Monatsmitteltemperaturen errechnet. Die Monatsmitteltemperatur, auch als Monatsdurchschnittstemperatur bezeichnet, wird aus dem Durchschnitt der Tagesmitteltemperaturen des jeweiligen Monats errechnet. Die Tagesmitteltemperatur wird ermittelt aus den zu jeder vollen Stunde gemessenen, addierten und durch 24 geteilten Temperaturwerten des Tages.
KingLee Position
27. Januar 2012 20:02 Uhr
Longitude 7° 33" 44,341'
Latitude 51° 30" 8,556'
Impressum