Skip to content

SQLite, noch einmal ...

Wie bereits angekündigt, wollte ich mal etwas zu SQLite schreiben.

Da ich das Werkzeug mal wieder im Büro gebraucht habe und fast zeitgleich eine Anfrage im ubuntuusers.de-Forum aufkam, hier also ein bisschen Text dazu:

SQLite ist eine Datenbank in einer Datei, das heisst, es muss kein Server-Dienst laufen. Das Client-Programm ist auch gleichzeitig das Datenbankverwaltungstool.

SQLite ist in allen aktuellen Mobiltelefonen (als Telefonbuch / Adressverwaltung) zu finden und wird aktiv von (beispielsweise) Adobe, Bloomberg, Mozilla und Symbian gefördert.

SQLite gibt es als Sourcecode und vorcompiliert für Linux, Mac OS X, und Windows, sowie auch als JDBC-Treiber oder Perl-Modul.

Natürlich kann SQLite nicht alles was ein Client-Server-Datenbanksystem kann, aber für 95% der Anwendungsfälle einer Privatperson reicht es aus.

Ein sehr grosser Anteil von SQL-Kommandos wird unterstützt.

Es gibt nur vier Speicherklassen Integer, Real, Text, Blob. "create table"-Statement anderer Datenbanksysteme wird in der Regel problemlos interpretiert (nur, dass im Hintergrund beispielsweise statt VARCHAR TEXT benutzt wird).

Die Aufgabe:
Zwei Dateien: Eine enthält Adressdaten in Folgender Form (telneu.txt, 1.8 GB, ~60 Millionen Zeilen): Vorname Nachname;Strasse;Ort;PLZ;Telnr; (Je Zeile ein Datensatz), die Zweite Datei enthält nur Postleitzahlen (plz.txt, ~1000 Zeilen).

Aus der ersten Datei werden alle Datensätze gesucht, deren Postleitzahlen in der zweiten Datei vorkommen.
sqlite> CREATE TABLE telneu (Vorname_Nachname text, Strasse text, Ort text, PLZ text, Telnr text);
sqlite> .separator ";"
sqlite> .import telneu.txt telneu
sqlite> CREATE INDEX idx_telneu_plz ON telneu (PLZ);
sqlite> CREATE TABLE plz (plz text);
sqlite> .import plz.txt plz
sqlite> SELECT * FROM telneu WHERE plz IN (SELECT plz FROM plz);


Vielleicht hilft es Euch auch.

Hier ein paar Links:
- Downloads - Paket "sqlite3" in Ubuntu
- Dokumentation
- Datentypen
- SQL-Syntax
- JDBC-Treiber
- Perl-Modul - Paket "libdbd-sqlite" in Ubuntu
- Firefox Extension SQLite Manager

Leyenfilter 2.0 ...

via Nopaste


#!/usr/bin/perl
#
# Leyenfilter 2.0 - (c) 2009 by Ursula
#

use Ursula::Leyenfilter;
 
# Ursulas Liste
my %URSULA_SPERRLISTE   = getSperrListe("O:/USBStick-Ursula/sperrliste.xls") or die "Uschi, du hast vergessen deinen USB-Stick einzustecken! (Das Stecker-Ding kommt in den Rechner)";
 
# Liste des BKA
my %BKA_SPERRLISTE      = getSperrListe('ftp://uschi:apfel1@ftp.bka.de/bka_sperrliste.xls');
 
# Provider die nicht unterschrieben haben
my %BADISP_SPERRLISTE   = ("www.einsundeins.de" => 'Grund: Kinderschaender!');
 
Ursula::Leyenfilter->run(\&process_packet);
 
sub process_packet {
        my($user_data, $header, $packet) = @_;
 
 
        if ($header->{'HTTP_URI'} =~ /(child|kinder).*(porn|pornografie|xxx|erotic|peepshow|nude|naked)/ or
            defined($URSULA_SPERRLISTE{$header->{'HTTP_URI'}) or
            defined($BKA_SPERRLISTE{$header->{'HTTP_URI'}) or
            defined($BADISP_SPERRLISTE{$header->{'HTTP_URI'})

        # Notiz: Gesetze noch nicht verabschiedet, kommt noch.
        # $header->{'HTTP_URI'} =~ /thepiratebay.org/ or
        # $header->{'HTTP_URI'} =~ /wikipedia.org/ or
        # $header->{'HTTP_URI'} =~ /www.amnesty.de/ or
        # $header->{'HTTP_URI'} =~ /www.wikileaks.de/ or

        # Erst kurz vor den Wahlen auskommentieren
        # $header->{'HTTP_URI'} =~ /spd.de/ or
        # $header->{'HTTP_URI'} =~ /gruene.de/ or
           )
        {
 
                $packet->redirect('http://www.bka.de/dukommsthiernichtrein.html');     
 
        }
}
 

Informationsmanagement ...

John Naisbitt
Wir ertrinken in Informationen und hungern nach Wissen.
Ich wurde neulich (wieder einmal) gefragt, wie ich es schaffe, auf breiter Basis relativ gut informiert zu sein.

Mir helfen zwei Dinge.

Das eine ist ein Arbeitsweg von einer Stunde (pro Strecke), den ich mit dem Hören von Podcasts füllen kann, um so an Informationen zu kommen.

Das andere ist, nicht aktiv nach Informationen zu suchen, sondern passiv informiert zu werden.

Dabei helfen die folgenden Techniken / Programme:

RSS-Feeds Online Feedreader (derzeit Tiny Tiny RSS)

RSS-Feeds haben sich mittlerweile zu meiner Hauptinformationsquelle gemausert. Was ist daran speziell? Nun, Webseiten - wie auch beispielsweise mein Blog - aktualisieren eine RSS-Datei, wenn sich Seiten geändert haben. Feedreader holen nun in einstellbaren Abständen diese Datei und prüfen auf Aktualisierungen. Falls ja, wird diese Änderung als ungelesene Nachricht angezeigt. Seiten, die einen RSS-Feed anbieten, brauche ich also nicht mehr zu besuchen, ich werde über Aktualisierungen automatisch informiert.

Den Online Feedreader nutze ich, um auch in Arbeitspausen mal nach Aktualisierungen zu gucken.

Firefox Plugin Update Scanner

Dann gibt es natürlich Webseiten, die keinen Feed anbieten. Da hilft mir dieses Plugin, das regelmässig Seiten auf Änderungen überprüft und - Ihr vermutet es schon - mich bei Veränderungen informiert.

Auch diese Seiten muss ich nicht mehr regelmässig ansurfen.

Es gab vor einigen Jahren einen (fremd gehosteten Dienst), der auch das angeboten und die Änderungen per E-Mail verschickt hat.

Newsletter perl -E-Mail

Leider in Verruf geraten, sind Newsletter aber häufig ein guter Weg, informiert zu werden. Da Newsletter meist redaktionell aufbereitet werden und zumeist auch viele einzelne Informationen enthalten, lohnen sie sich vor allem für Informationen, die nicht zeitnah verfügbar sein müssen.

Podcasts mit Podracer

Bei Podcasts schlage ich einen sehr "rudimentären" Weg ein. Das oben angeführte Programm ist drei Jahre alt, tut aber klaglos seinen Dienst. Damit lade ich alle aktuellen Podcasts herunter und übertrage sie per Skript auf mein mobiles Musikabspielgerät.

Auf dem Weg zur und von der Arbeit lasse ich mich dann mit Informationen zuschütten. Wenn ich Infromationen bekomme, die ich noch hinterfragen muss, mache ich mir eine Notiz.

Andere Benachrichtigungsdienste:

- Eure Vorschläge -

10 Mythen über Open Source Software ...

Gerade habe ich bei den Perl-Nachrichten einen Hinweis auf das PDF von ActiveState über 10 Mythen in Bezug auf den Einsatz von Open Source Software in Unternehmen gefunden. Das Dokument ist in Englisch, aber sehr gut lesbar.

(Ich übersetze "Open Source" mit "quelloffen").

Mythos 1: Du musst Dich entscheiden zwischen quelloffener Software und proprietärer Software

Mythos 2: Quelloffene Software ist frei!

Mythos 3: Bei dem Einsatz von quelloffener Software geht es nur darum, Geld zu sparen

Mythos 4: Wenn Du quelloffene Software wählst, stehst Du alleine da

Mythos 5: Lizensierung ist jedes Mal ein Albtraum

Mythos 6: Quelloffene Software ist gleichzusetzen mit offenen Standards

Mythos 7: Sie ist nur für non-Konformisten

Mythos 8: Quelloffene Software ist keine gute Wahl für unernehmenskritische Anwendungen

Mythos 9: Quelloffene Software hat schlechtere Qualität

Mythos 10: Dein Geschäft nutzt keine quelloffene Software

Währungsumrechnung ...

Ich "spiele" momentan wieder ein bisschen mit Perl herum.

Für eine kleine Herausforderung, die ich mir rund um Net::Amazon gestellt habe, suchte ich eine Währungsumrechnung, die mit aktuellen Kursen arbeitet. Dabei bin ich auf Finance::Currency::Convert::XE gestoßen. Eine funktionierende Internet-Verbindung vorausgesetzt, macht das Modul genau das, was ich von ihm möchte.

#!/usr/bin/env perl -w
use strict;

use lib qw( /home/lux/PerlMod/lib );

use Finance::Currency::Convert::XE;

my $chf_eur = Finance::Currency::Convert::XE->new(
        'source' => 'CHF',
        'target' => 'EUR',
        'format' => 'number'
) || die "Failed to create object\n";

my $eur = $chf_eur->convert('100.00')
        || die "Could not convert: " . $chf_eur->error . "\n";

my $eur_chf = Finance::Currency::Convert::XE->new(
        'source' => 'EUR',
        'target' => 'CHF',
        'format' => 'number'
) || die "Failed to create object\n";

my $chf = $eur_chf->convert('100.00')
        || die "Could not convert: " . $eur_chf->error . "\n";

print "100.00 CHF = $eur EUR\n";
print "100.00 EUR = $chf CHF\n";

Fragen? Ab in die Kommentare!

Rechnen mit Zeit (1) ...

Das ist eines der Themen, das einem immer wieder über den Weg läuft, das Rechnen mit Zeit.

Grundlage allen Rechnens, ist die Unixzeit. Hierbei werden die verstrichenen Sekunden seit dem 01.01.1970 00:00:00 UTC (ohne Schaltsekunden) gezählt.

Damit sind alle Daten zwischen 1970 und 2038 abdeckbar. Es gibt Module in Perl, die auch negative Werte erlauben. Damit kommt auch in die Zeit vor 1970.

Unixe haben einige Kommandos, um zwischen normalem Datum und Unixzeit hin- und herzurechnen.

lux@cecil:~$ date +%s
1207466232

Der Rückweg funktioniert so

lux@cecil:~$ date --date=@1207466232
So 6. Apr 09:17:12 CEST 2008

Date hat noch einige Besonderheiten, die kaum ein Mensch nutzt.

lux@cecil:~$ date --date="yesterday"
Sa 5. Apr 09:58:13 CEST 2008
lux@cecil:~$ date --date="last month"
Do 6. Mär 08:58:41 CET 2008
lux@cecil:~$ date --date="1 week"
So 13. Apr 09:59:30 CEST 2008
lux@cecil:~$ date --date="1 month"
Di 6. Mai 09:59:42 CEST 2008

info date verrät noch viel mehr.

In dem Zusammenhang: Ältere Versionen von Date erlauben nicht, die Unixzeit direkt anzugeben, da muss man einen Umweg über gawk machen.

lux@cecil:~$ echo 1207466232 | awk '{print strftime("%Y-%m-%d %H:%M:%S",$1)}'
2008-04-06 09:17:12

Perl vs. egrep - ...

Bevor ich das wieder vergesse, manchmal lohnt es sich Gedanken über die Wahl des Tools zu machen.

Nehmen wir den Fall, dass Du aus einer Worliste alle fünfbuchstabigen Wörter suchst, die spiegelbar sind, also am Anfang zwei Buchstaben haben, die am Ende in umgekehrter Reihenfolge stehen, wie zum Beispiel "neben" oder "stets".

Dann löst perl die Aufgabe auf meinem Testrechner in 0,425 und egrep in 2,069 Sekunden. Das ist für eine Einzelabfrage nicht wichtig, aber in Summe bei sehr großen Datenbeständen spielt so etwas natürlich eine Rolle.

Zum selber testen (am besten mehrfach laufen lassen):

u@ws:~$ time perl -ne 'print if /^(.)(.)(.)\2\1$/' < /usr/share/dict/ngerman > /dev/null
real 0m0.425s
user 0m0.412s
sys 0m0.012s

u@ws:~$ time egrep "^(.)(.)(.)\2\1$" < /usr/share/dict/ngerman > /dev/null
real 0m2.069s
user 0m2.004s
sys 0m0.012s

Munin ...

linux Per Zufall stieß ich in einem von Marcs Artikeln auf das Tool Munin.

Ich bin begeistert. Anders als bei Cacti, das auf snmp basiert, gibt es bei Munin eine Server- und eine Node-Komponente.

Auf den zu überwachenden Geräten braucht man nur den Node installieren und die IP-Adresse des zugriffsberechtigten Servers in der /etc/munin/munin-node.conf einzutragen. Nach einem Neustart des Nodes ist die Konfiguration sofort verfügbar.

Auf dem Server reichen drei Zeilen um alle Daten des Clients zu bekommen:
[Name]
    address 192.168.47.11
    use_node_name yes

fertig

Munin basiert auf Perl und gibt es nur für unixoide Betriebssysteme.

Die Plugins sind relativ einfach gestrickt und lassen sich in jeder Sprache entwickeln, die ASCII ausgeben kann.

Cacti hat den Vorteil, daß es auf snmp basiert und damit mit jedem Client, der snmp spricht (auch aktive Komponenten oder Windows-Gerätschaften) zurechtkommt.