Mittwoch Apr. 11, 2007

NSV: Wie spielt man das NSV Format unter Linux Ubuntu 6.10 Edgy Eft ab?

Also ich gugg ja gern www.demoscene.tv. Aus mir nicht ganz nachvollziehbaren Gründen benötigt man hierzu aber unter Firefox ein ActiveX-Plugin, um die Video's abspielen zu können. Wenn man jetzt nicht grad VMWare oder Wine laufen lassen will, fällt Linux also prinzipiell flach. Aber - wie so oft - mplayer comes to rescue. Freundlicherweise gibt es auf der Seite zu allen Streams einen Link, um die Videos auch mit Winamp abspielen zu können. Dieser Stream benutzt das NSV Format. Das kann mplayer abspielen. Also hole ich mir einfach den entsprechenden Link raus, der auf die Playlist verweist und gebe noch ein paar Optionen dem mplayer mit, da meine Kiste nicht mehr die Schnellste ist:

mplayer -vfm ffmpeg -lavdopts lowres=1:fast:skiploopfilter=all http://91.121.4.152:8000/listen.pls

Feini fein ;-) Und schon gugg ich demoscene.tv... Ach ja. Man braucht dazu natürlich auch die entsprechenden Codecs. Ich hab's mir da ganz einfach gemacht und den mplayer über Automatix2 installiert. Das gibt es inzwischen auch für Ubuntu 7.04 (Feisty Fawn) i386. Das installiert dann gleich alles Nötige mit. Einfacher geht's unter Linux kaum. Ansonsten muss man auf der mplayer Homepage mal guggen. Um die dTV NSV Streams abspielen zu können, benötigt man z.B. die vp6vfw.dll.

Technorati Tags: , , , , , ,

Mittwoch Apr. 04, 2007

Today's Links

Thunderbird Extension QuickReply - Schneller antworten mit Thunderbird Erweiterung QuickReply 
ExploreFS: Filesystem aus Eclipse heraus öffnen
Charming Python: Python elegance and warts, Part 1

vPostMaster Linux Email Server - Complete Postfix email server solution including spamfiltering, virus filtering, webmail, POP3, IMAP... (Postfix, Spamassassin spam filtering, ClamAV virus filtering, Squirrelmail webmail)
Download podcasts and sync music automatically with podget - Podcasts automatisch per Cron downloaden und auf den iPod synchen.
Python on Planes is an open-source web framework that's optimized for python happiness.
Linear Algebra - An Introduction to Linear Algebra for Pre-Calculus Students - Ein komplettes Buch zum Thema online

Technorati Tags: , , , , , , , , , ,

Freitag März 30, 2007

Today's Links

Running Tomcat on Nokia N800 - Was es alles gibt... Das N800 muss ich mir doch noch zulegen.
Supercars III - Ziemlich cool! Das Amiga/Atari ST Kultspiel neu aufgelegt und implementiert in Java.
Frog! Retro Remake Game for Windows - Ich weiss nicht, wie lange ich dieses Spiel damals gespielt habe ;-) Ein Klassiker!
Linux to help the Library of Congress save American history
How to be Java Guru without knowing Java (at least in meetings) - Der Mann is einfach gut ;-)
PostgreSQL Warm Standby Using Ruby - BTW: Im PostgreSQL CVS findet man für Version 8.3 ein neues Contrib-Modul pg_standby...
Windjay - Einige Songbird Erweiterungen (Extensions)
XulBooster - Ein XUL Integrated Development Environment (IDE) Plug-in für die Eclipse-Plattform
A Navigable Image Panel - Imagezooming mit Java 2D
Abmahnung wegen Amazon Shop - Hmmm... Sollte das stimmen, ist das sehr unprofessionell von Amazon. Dann sollte ich meine Anzeigen vielleicht rausnehmen.
SoDesk.com Wallpapers - Sehr schöne Hintergrundbilder für User mit zwei Bildschirmen (Dualscreen mit insgesamt 3200x1600 Pixel Auflösung)

Technorati Tags: , , , , , , , , , , , , , , , , , , , ,

Today's Links

AsciiArt Generator - Einfach Text eintippen, Font auswählen, freuen :-)

Mittwoch März 28, 2007

Today's Links

Anonymes Filesharing mit ANts P2P und Mute
SKY-MAP.ORG - Wer eine Online Sternenkarte sucht, der sollte mal hier vorbeischauen. Sehr schön gemacht!
Focal Length and Aperture Explained for the Photography Novice - Brennweite und Blendeneinstellung erklärt für den Fotoneuling
Non photorealistic rendering in Java - Eine Einführung
VLC beyond the basics
Firefox Extension Menu Editor - Damit kann man u.a. das Kontextmenü (rechte Maustaste) an seine Bedürfnisse anpassen. Praktisch!
ffmpeg2theora - Ermöglicht unter Linux relativ einfach div. Videoformate ins freie Theora-Format zu wandeln

Technorati Tags: , , , , , , , , , , , , , , , ,

Freitag März 23, 2007

Today's Links

Convert Physical Windows Systems Into Virtual Machines To Be Run On A Linux Desktop - Wie man eine bestehende Windows Installation ins Linux Zeitalter retten kann ;-)
Retro - Das Magazin für digitale Retrokultur - Ein Retromagazin vom CSW-Verlag
Cafe 80s - Musik aus den 80igern
Radio 80 FM - Ein kleines, feines Radio mit ausschließlich 80er Musik
Samsung SPH-72x - Endlich mal ein grosser Fotorahmen bis 12 Zoll.
Only Ubuntu Linux Blog
LinuxMCE - Was für Windows die Media Center Edtion ist, soll LinuxMCE eben für Linux sein. Die Screenshots sehen vielversprechend aus.
Winter auf dem Mars - Das "McMurdo Panorama" ist zusammengesetzt aus über 1400 Einzelbildern, die während des Mars Winter gemacht wurden, als die geringe Sonneneinstrahlung es dem Roboter nicht erlaubte, sich fortzubewegen.
Customize.org - Wenn auch für Windows, findet man doch recht schöne Wallpaper.
Zehn freie und legale Seiten für Bittorrent Downloads
Legaltorrents.com - Done The Impossible documentary. Diese 81 minütige Doku ist für alle Serenity Firefly Fans.

Technorati Tags: , , , , , , , , , , , , , , , , , , , bittorrent

Mittwoch März 21, 2007

Today's Links

PostgreSQL Weekly News - March 18 2007

Dienstag März 20, 2007

Today's Links

Textarea Backup - Ein nützliches Greasemonkey-Script für Firefox. Sichert eine Textarea in bestimmten Abständen auf Platte.
3D Mars Überflüge von der NASA
Java Power Tools - Die Homepage zum Buch
Google Guice (pronounced "juice") is an ultra-lightweight, next-generation dependency injection container for Java 5 and later.
Knoppix 5.2 mit Virtualisierung und 3D-Desktop
Einführung in OpenID
How to hide an entire filesystem - Wie verschlüsselt man ein komplettes Filesystem unter Linux
20 must-have Firefox extensions
WinBoard - Das Windows Portal. Eine grosse Community mit Tipps und Tricks rund um Windows
Die New Horizon Sonde hat ein paar Aufnahmen von Vulkanausbrüchen auf Io - einem Jupiter-Mond - gemacht
How To Retrieve Remote JVM Monitoring And Management Information
Myspace.com selber bauen? Dafür gibt's Elgg (OpenSource)
Zabbix: State-of-the-art network monitoring - Nase voll von Nagios? Mal hiermit probieren...
REGex TESTER - Praktisch! Online reguläre Ausdrücke testen.
Platzsparendes netzwerkweites Backup mit BoxBackup
Using truecrypt-intaller to help install Truecrypt for Debian
Open-Xchange - Die Linux Groupware Open-Xchange gibt's jetzt auch als OpenSource

Technorati Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
 

Donnerstag März 15, 2007

Today's Links

Redhat Enterprise 5 ist released
PDFedit fills hole in the desktop - OpenSource PDF-Editor für Linux
Top 10 Technology Comics on the Web
Google Image Ripper - Recht praktisch. Anstatt die kleinen Vorschaubilder kommen gleich die "großen" Bilder
Photo Contains More Than 1,000 Supermassive Black Holes
JPOX is eine freie JDO 1 und JDO 2 Implementierung


Dienstag März 13, 2007

Volltextsuche mit PostgreSQL 8.2, Tsearch2 und UTF8

So... PostgreSQL 8.2 ist jetzt doch schon eine Weile draussen. Zeit, die Tsearch2 Installationsbeschreibung zu erneuern. Wie immer ist diese Installationsanweisung wohl nicht der Weisheits letzter Schluss, aber man sollte damit eine Tsearch2 Installation hinbekommen.

Tsearch2 ist eine Erweiterung zu PostgreSQL speziell für die Volltextsuche. Zunächst mal, muss man ein bißchen was kompilieren. Gehen wir mal davon aus, das PostgreSQL schon vorher kompiliert worden ist und gehen wir weiter davon aus, das wir Version 8.2.3 verwenden. Den Sourcecode von Postgres haben wir nach /opt/source/postgres/8.2.3 gelegt. Dort wechseln wir rein. Die Postgres 8.2 kompiliere ich momentan mit folgenden Befehlen:

./configure --prefix=/server/pgsql/8.2.3 --enable-nls
make
make install

Nun wechselt man in das contrib Verzeichnis. Zunächst brauchen wir einen Patch für die Stemmer (Wortstammbibliotheken). Da gab es nach der Freigabe von Postgres 8.2 Probleme, die dieser Patch löst:

wget http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/tsearch_snowball_82.gz

Dann entpacken und patchen:

gunzip tsearch_snowball_82.gz
patch -p1 < tsearch_snowball_82

Dann wechseln wir in das Verzeichnis tsearch2. Zum Kompilieren von tsearch2 gibt man in diesem Verzeichnis nun einfach

make
make install

ein. Damit das dann auch mit der deutschen Sprache alles etwas besser funktioniert, müssen noch ein paar zusätzliche Dinge erledigt werden, die wir gleich besprechen. Zunächst sollte die (eventl. zu erstellende) DB in UTF8 bzw. Unicode codiert sein. Ist die Datenbank schon installiert und man möchte überprüfen, ob die DB mit UTF8 Encoding angelegt wurde, connected man sich auf den Datenbankcluster per psql und läßt sich mit \l alle Datenbanken anzeigen (oder psql -l). Wenn in der letzten Spalte UTF8 steht, paßt's.

Als nächstes wechselt man in das Verzeichnis gendict. gendict hilft beim Erstellen von Wörterbüchertemplates. Genauer gesagt, bietet es Unterstützung für die Snowball Wortstämme. NORMALERWEISE(!) würde man sich von der Snowball Seite erstmal zwei Dateien downloaden und umbenennen:

wget http://www.snowball.tartarus.org/algorithms/german/stem_UTF_8.c
wget http://www.snowball.tartarus.org/algorithms/german/stem_UTF_8.h
mv stem_UTF_8.c stem.c
mv stem_UTF_8.h stem.h

Das erzeugt aber bei mir dann leider folgenden Fehler, beim Kompilieren (kommt weiter unten):

stem.c: In function 'r_prelude':
stem.c:163: error: too many arguments to function 'in_grouping_U'
stem.c:168: error: too many arguments to function 'in_grouping_U'
stem.c:177: error: too many arguments to function 'in_grouping_U'
stem.c: In function 'r_mark_regions':
stem.c:212: error: too many arguments to function 'out_grouping_U'
stem.c:217: error: too many arguments to function 'in_grouping_U'
stem.c:227: error: too many arguments to function 'out_grouping_U'
stem.c:232: error: too many arguments to function 'in_grouping_U'
stem.c: In function 'r_standard_suffix':
stem.c:320: error: too many arguments to function 'in_grouping_b_U'
stem.c:347: error: too many arguments to function 'in_grouping_b_U'
make: *** [stem.o] Error 1

Also das taugt natürlich nix. Aber die stem.(c|h), die ich bei der Postgres 8.1.X verwendet habe, funktionieren noch. Falls man die noch hat, nimmt man diese. Ansonsten hab ich die Dateien hier zusammengepackt: stem.tar.gz

Wie auch immer legt man diese Dateien dann in das oben erwähnte gendict Verzeichnis. Dann führt man folgenden Befehl aus:

./config.sh -n de -s -p german_UTF_8 -i -v -c stem.c -h stem.h -C'Snowball stemmer for German'

Wenn config durchgelaufen ist, wechselt man in ein anderes Verzeichnis:

cd ../../dict_de

Dann kann man den make starten:

make
make install

Wenn das dann passiert ist, landet die dict_de.so im PostgreSQL lib Verzeichnis. Als nächstes muß man jetzt erstmal die Datenbank für tsearch2 und das Wortstammbuch vorbereiten und das funkt, in dem man zwei SQL-Skripte einspielt als PostgreSQL Superuser:

Die Datei contrib/tsearch2/tsearch2.sql sollte man sich vorher nochmal anschauen und eventl. in der ersten Zeile den search_path anpassen. Dann:

psql -d dbname -f tsearch2.sql

Die Datei contrib/dict_de/dict_de.sql sollte man sich ebenfalls vorher nochmal anschauen und eventl. in der ersten Zeile den search_path anpassen. Dann:

psql -d dbname -f dict_de.sql

Da nun vier Tabellen als Superuser angelegt worden sind, aber man i.d.R. ja eher unter einem "normalen" Account mit weniger Rechten arbeitet, muss man nun diesem User erlauben, das er diese Tabellen bearbeiten darf:

GRANT select,insert,update,delete ON [SCHEMA].pg_ts_cfg TO [USER];
GRANT select,insert,update,delete ON [SCHEMA].pg_ts_cfgmap TO [USER];
GRANT select,insert,update,delete ON [SCHEMA].pg_ts_dict TO [USER];
GRANT select,insert,update,delete ON [SCHEMA].pg_ts_parser TO [USER];

SCHEMA kann man weglassen, wenn man sowieso alles im public Schema hat. Ansonsten gibt man halt noch den Schema-Namen davor an. So... Nun kann man sich mal unter dem User einloggen, unter dem man alles installiert hat. Folgender Befehl sollte dann unter psql schon klappen:

db=> SELECT 'Our first string used today'::tsvector;

Hier sieht man dann schon, dass der übergebene String in seine Einzelteile zerlegt wird. Als Nächstes probieren wir mal Folgendes aus:

db=> SELECT * FROM ts_debug('Our first string used today');
ERROR: could not find tsearch config by locale
CONTEXT: SQL function "_get_parser_from_curcfg" statement 1
SQL function "ts_debug" during startup

Dieser Fehler (wobei es ja eigentlich kein Fehler im eigentlichen Sinne ist, sondern ein Konfigurationsfehler meinerseits) hätte mich fast zur Weißglut getrieben. Guggen wir mal in die Konfiguration:

db=> SELECT * FROM pg_ts_cfg;

ts_name prs_name locale
default default C
default_russian default ru_RU.KOI8-R
simple default  

Da sehen wir, das als Locale C als Default (Spalte ts_name, Eintrag default) verwendet wird. Geben wir unter psql dann mal folgende Befehle ein:

db=> SHOW lc_ctype;
lc_ctype
de_DE.utf8@euro
(1 Zeile)

db=> SHOW lc_collate;
lc_collate
de_DE.utf8@euro
(1 Zeile)

In meinem Fall also de_DE.utf8@euro. Und in der Konfigurationstabelle steht davon natürlich noch nicht's. Man muß also für das Server-Locale eine entsprechende Konfiguration erstellen. Wenn ich das richtig verstanden habe, dann sollte das Locale hier das sein, was man beim Initialisieren des Postgres-Clusters beim initdb als Paramter --locale mitgegeben hat. Gehen wir's also an...

Zunächst brauchen wir erstmal ein paar Dateien. Die muß man normalerweise selber generieren, aber ich hab sie mal zusammengepackt (die ich für Version 8.1.X verwendet habe, funktionieren nicht mehr! Das merkt man ganz schnell, wenn die Meldung ERROR:  Wrong affix file format beim Index anlegen später erscheint...):

utf8.tar.gz

Darin enthalten sind u.a.: german.aff (hiermit wird es möglich, zusammengesetzte Wörter sog. compound words aufzulösen, also z.B. Tischkante), german.med (das Wörterbuch an sich), german.stop und german.stop.ispell (zwei mögliche Dateien mit Stopwörtern also "der, die, das, usw.". Danach zu suchen, macht wenig Sinn...). Die Dateien reichen erstmal um weiter zu machen. Man kopiert die Dinger am Besten irgendwo hin, wo Postgres Zugriff hat. Das konvertieren an sich, ist auch nicht allzu schwer, wenn man's selber machen will. Wenn man die entsprechenden Dateien im Latin1-Encoding schon hat, konvertiert man sie einfach wie folgt:

iconv -f iso-8859-1 -t utf-8 -o german_utf8.med german.med
iconv -f iso-8859-1 -t utf-8 -o german_utf8.aff german.aff
iconv -f iso-8859-1 -t utf-8 -o german_utf8.stop german.stop
iconv -f iso-8859-1 -t utf-8 -o german_utf8.stop.ispell german.stop.ispell

Damit wir nun eine funktionsfähige Tsearch2 Konfiguration bekommen, sind noch ein paar weitere SQL-Statements notwendig. Zunächst benennen wir den default-Tsearch2-Eintrag mal um, da wir ja unseren eigenen verwenden wollen:

UPDATE pg_ts_cfg SET ts_name='default_c' WHERE prs_name='default' AND locale='C';

Dann fügen wir unsere Defaults ein:

db=> INSERT INTO pg_ts_cfg(ts_name, prs_name, locale) VALUES('default', 'default', 'de_DE.utf8@euro');

Bevor man nun weitermacht, sollte man noch das richtige Clientencoding einstellen. Das dürfte i.d.R. LATIN1 sein, wenn man auf der Shell arbeitet und ist für später wichtig, wenn wir die Testquery ausführen wollen. Das Clientencoding setzt man auf der Shell mit

export PGCLIENTENCODING=LATIN1

Wenn euch Meldungen wie

ERROR:  invalid byte sequence for encoding "UTF8": 0xe4fcf6

oder

ERROR:  Affix parse error at 644 line

um die Ohren fliegen, liegt das mit gaaaaanz hoher Wahrscheinlichkeit an einem falsch eingestellten Encoding. Bei PostgreSQL 8.1.5 sind die Meldungen etwas genauer. Bei letzterer Meldung war z.B. das Encoding der german_utf8.aff Datei kein "echtes" UTF8. Bei der ersten Meldung hab ich auf der psql-Shell gearbeitet und unten stehende Testquery ausgeführt, die Umlaute enthielt. Also immer mal auf das Encoding aufpassen!

Dann fügen wir mal die entscheidenste Konfiguration ein:

db=> INSERT INTO pg_ts_dict
     (SELECT 'de_ispell', dict_init,
     'DictFile="/data/pgsql/share/dict/utf8/german_utf8.med",'
     'AffFile="/data/pgsql/share/dict/utf8/german_utf8.aff",'
     'StopFile="/data/pgsql/share/dict/utf8/german_utf8.stop.ispell"',
     dict_lexize
     FROM pg_ts_dict
     WHERE dict_name = 'ispell_template');

Dann stellen wir ein, welches Wörterbuch wir verwenden wollen:

db=> SELECT set_curdict('de_ispell');

oder

db=> SELECT set_curdict(DIE_NUMMER_DIE_DER_VORHERGEHNDE_INSERT_AUSSPUCKT);

Ich habe festgestellt, das letzter Befehl beim Debuggen gar nicht so schlecht ist, da er wesentlich mehr Info's ausspuckt. Als nächstes müssen wir dann noch angeben, für welche Wörter wir welches Wörterbuch verwenden wollen:

db=> DELETE FROM pg_ts_cfgmap WHERE ts_name='default' AND dict_name='{en_stem}';
INSERT INTO pg_ts_cfgmap (ts_name, tok_alias, dict_name) VALUES ('default', 'lhword', '{de_ispell,simple}');
INSERT INTO pg_ts_cfgmap (ts_name, tok_alias, dict_name) VALUES ('default', 'lpart_hword', '{de_ispell,simple}');
INSERT INTO pg_ts_cfgmap (ts_name, tok_alias, dict_name) VALUES ('default', 'lword', '{de_ispell,simple}');

Bei dem Delete sollten drei Einträge rausfliegen. {de_ispell,simple} besagt, das wir zunächst das ISpell-Wörterbuch verwenden wollen und dann das Simple-Wörterbuch. Ohne das Simple-Wörterbuch würde das Suchergebnis erheblich kleiner sein und viele einfache Wörter würden aussen vor bleiben. Ein noch besseres Ergebnis dürften die OpenOffice-Wörterbücher bringen. Das muss ich bei Gelegenheit mal ausprobieren. Wenn das durchgelaufen ist, kann man mal folgende Testquery absetzen:

db=> select to_tsvector('PostgreSQL ist weitgehend konform mit dem SQL92/SQL99-Standard, d.h. alle in dem Standard geforderten Funktionen stehen zur Verfügung und verhalten sich so, wie vom Standard gefordert; dies ist bei manchen kommerziellen sowie nichtkommerziellen SQL-Datenbanken bisweilen nicht gegeben.');
 to_tsvector

* 'all':9 'bei':28 'd.h':8 'dem':6,11 'die':26 'ist':2,27 'mit':5 'sql':34 'und':18 'vom':23 'wie':22 'zur':16 'sich':20 'sowi':31 'nicht':37 'stehen':15 'gegeben':38 'konform':4 'manchen':29 'standard':12,24 'bisweilen':36 'gefordert':25 'verfügung':17 'verhalten':19 'funktionen':14 'postgresql':1 'weitgehend':3 'datenbanken':35 'geforderten':13 'kommerziellen':30 'sql-datenbanken':33 'nichtkommerziellen':32 'sql92/sql99-standard':7
(1 Zeile)

Man sieht also hier jetzt, wie Tsearch2 den String zerlegt hat. Die Nummern dahinter sind die Positionen der Wörter im Text. So... Soweit wären wir nun also schon. Aber wir wollen natürlich nicht nur in einem Satz nach bestimmten Wörtern suchen, sondern in der Datenbank bzw. eben in verschiedenen Spalten. Nehmen wir als Beispiel eine Installation von der bekannten Forumsoftware phpBB. Dort gibt es eine Tabelle phpbb_posts_text (wenn man als Prefix bei der Installation phpbb belassen hat) die wiederum eine Spalte post_text hat. Diese Spalte ist vom Typ text. Da landen die Postings der User drin und da kann  schon mal längerer Text werden. Und genau da drin wollen wir suchen können. Zunächst fügen wir dieser Tabelle eine neue Spalte hinzu:

db==> ALTER TABLE phpbb_posts_text ADD COLUMN idxfti tsvector;

Anstatt wie bei "normalen" Indizies "hängt" dieser Index soz. an der Tabelle dran. Diese Spalte kann dann durch die Tsearch2 Operatoren und Funktionen und durch einen speziellen Index zur Volltextsuche genutzt werden. Diese Spalte heißt in diesem Fall idxfti. Es gibt einen Grundsatz, denn man einhalten sollte, wenn man einen Volltextindex erzeugt:

1. Tabelle befüllen
2. VACUUM FULL ANALYZE tablename;
3. Index erzeugen
4. VACUUM FULL ANALYZE tablename;

db==> UPDATE phpbb_posts_text SET idxfti=to_tsvector('default', post_text);
db==> VACUUM FULL ANALYZE phpbb_posts_text;

Der Funktion to_tsvector sagen wir hier, das wir die default Konfiguration verwenden wollen (die haben wir oben ja auf die deutschen Wörterbücher eingestellt) und das wir die Spalte post_text indizieren wollen. Möchte man mehrere Spalten indizieren, sieht das so aus:

db==> UPDATE phpbb_posts_text SET idxfti=to_tsvector('default',coalesce(post_text,'') ||' '|| coalesce(post_subject,''));

Nun erzeugen wir den eigentlichen Index:

db==> CREATE INDEX idxfti_idx ON phpbb_posts_text USING gist(idxfti);

Nun brauchen wir noch einen Trigger, der uns den Index auf den neuesten Stand hält, sobald ein neuer Eintrag hinzukommt:

db==> CREATE TRIGGER idxftiupdate BEFORE UPDATE OR INSERT ON phpbb_posts_text
db==> FOR EACH ROW EXECUTE PROCEDURE tsearch2(idxfti, post_text);

Wenn man oben zwei Spalten für die Indizierung angegeben hat, sieht der Trigger etwas anders aus:

db==> CREATE TRIGGER idxftiupdate BEFORE UPDATE OR INSERT ON phpbb_posts_text
db==> FOR EACH ROW EXECUTE PROCEDURE tsearch2(idxfti, post_text, post_subject);

Die Funktion tsearch2 akzeptiert mehrere Argumente, so das man hier die beiden Spalten nicht verknüpfen muss. Und dann war's dann auch schon... Jetzt kann man Abfragen starten bzw. man kann sich auch die Inhalte der Tabelle selber anschauen. Die neue Spalte enthält nämlich z.B. die gefundenen Wörter.

Beispielquery's:

Einfache Suche:
SELECT post_text FROM phpbb_posts_text WHERE idxfti @@ to_tsquery('default', 'haus');

Suche mit UND:
SELECT post_text FROM phpbb_posts_text WHERE idxfti @@ to_tsquery('default', 'haus & garten');

Suche mit ODER:
SELECT post_text FROM phpbb_posts_text WHERE idxfti @@ to_tsquery('default', 'haus | garten');


Links zum Thema:

Tsearch2 Wiki
http://www.sai.msu.su/~megera/wiki/Tsearch2

Implementing Full Text Indexing with PostgreSQL
http://www.devx.com/opensource/Article/21674/0/page/3

Tsearch2 - Introduction
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intro.html

Tsearch2 and Unicode/UTF-8 - German Unicode Datebase
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch2_german_utf8.html

Gendict - generate dictionary templates for contrib/tsearch2 module
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/README.gendict

Deutsche Ispell Stop-Datei
http://hannes.imos.net/german.stop.ispell

German stemming algorithm
http://www.snowball.tartarus.org/algorithms/german/stemmer.html

Deutsche Wörterbuch und Stop-Dateien
http://www.computec.de/dload/tsearch2_german_utf8.zip

Can't find tsearch config by locale
http://blog.gmane.org/gmane.comp.db.postgresql.openfts.general/month=20040801

USING TSEARCH AND POSTGRESQL FOR A WEB BASED SEARCH ENGINE
http://www.sai.msu.su/~megera/postgres/gist/tsearch/tsearch-intro.html

Tsearch V2 Notes
http://www.sai.msu.su/~megera/oddmuse/index.cgi/Tsearch_V2_Notes

Tsearch V2 Optimization
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/oscon_tsearch2/optimization.html

Tsearch V2 compound words
http://www.sai.msu.su/~megera/oddmuse/index.cgi/Tsearch_V2_compound_words

TSearch2 / German compound words / UTF-8
http://archives.postgresql.org/pgsql-general/2005-11/msg01113.php

Technorati Tags: , , ,

Montag März 12, 2007

Today's Links

Creating a dd/dcfldd Image Using Automated Image & Restore (AIR)
Eclipse Magazine - Vom amerikanischen Ableger des deutschen Eclipse Magazins gibt es hier alle acht Ausgaben zum Downloaden.

Technorati Tags: , , ,

Donnerstag März 08, 2007

VIDEO: Hauppauge PVR 150 250 350 unter Linux (Kubuntu 6.10)

Zuerst muss mal das Universe und Multiverse Repository aktiviert sein und der Standort der Firmware hinzugefügt werden. Netterweise stellt Hauppauge inzwischen die Firmware den ivtv Treiberentwicklern zur Verfügung, so das alles in einem Rutsch installiert werden kann. Dazu fügt man in die /etc/apt/sources.list folgende Zeilen hinzu:

#
# multiverse repository
#
deb http://de.archive.ubuntu.com/ubuntu/ edgy universe multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ edgy universe multiverse

#
# ivtv firmware
#
deb http://dl.ivtvdriver.org/ubuntu edgy firmware

Dann müssen wir (K)ubuntu noch anweisen, das Repository ohne Gemecker zu akzeptieren, indem wir den entsprechenden Key hinzufügen:

wget http://dl.ivtvdriver.org/ubuntu/80DF6D58.gpg -O- | sudo apt-key add -

Danach dann noch ein

sudo apt-get update

damit der lokale Repository-Cache auf den aktuellen Stand kommt. Auf der Kommandozeile gibt man dann Folgendes ein:

DEBIAN_FRONTEND=dialog sudo apt-get install ivtv-firmware

Dann brauchen wir den Modulassistenten zum den Treiber vorzubereiten:

sudo m-a update,prepare
sudo m-a a-i ivtv
sudo depmod -a

Sollte man mal in den Kernel auf eine neue Version updaten, dann muss man diese drei Zeilen auch wieder ausführen. Dann installieren wir den Treiber:

sudo modprobe ivtv

Mit

lsmod | grep ivtv

kann man nun guggen, ob das Modul gelanden wurde. Wenn das sauber klappt, fügen wir das Modul noch in die /etc/modules hinzu, damit es auch nach dem Restart wieder geladen wird:

sudo sh -c 'echo ivtv >>/etc/modules'

Nun kann man mal den Video-Recorder oder sonst eine externe Quelle an die Karte anschließen. Damit man nun dem Treiber mitteilen kann, von welcher Schnittstelle (Composite, Tuner, S-VHS, ...) das Signal kommt, braucht man noch ein Paket:

sudo apt-get install ivtv-utils

Das Utility heißt ivtvctl. Mit

ivtvctl --help

kann man nun alle Optionen ausgeben lassen. Ich hab meinen Videorecorder entweder am Composite- oder S-VHS-Anschluss angeschlossen und der Sound liegt am Line-In der Hauppauge TV-Karte an. Für mich habe ich folgende wichtiges Kommandos identifiziert:

Abfragen, welche Input-Schnittstellen vorhanden sind:
ivtvctl --list-inputs
S-VHS Schnittstelle verwenden:
ivtvctl --set-input=1
Composite Schnittstelle verwenden:
ivtvctl --set-input=2
Sound-Input auf Mono umstellen:
ivtvctl --set-sapmode=0
Sound-Input auf Stereo umstellen:
ivtvctl --set-sapmode=1

Wenn man nun per ivtvctl die richtige Quelle ausgewählt hat, kann man mal eine Testaufzeichung starten:

cat /dev/video0 > /tmp/test_capture.mpg

Das Ganze läßt man 5-10 Sek. laufen und bricht dann mit CTRL+C ab. Nun nimmt man einen Videoplayer seiner Wahl (VLC, Totem, mplayer, ...) und überprüft das Ergebnis:

mplayer /tmp/test_capture.mpg

Zum Aufzeichnen verwende ich inzwischen VLC und zum Umwandeln, um das Ganze z.B. auf DVD zu brennen, die Skriptsammlung tovid. Dazu dann ein anderes Mal...

Update: 29.05.2007 

Wenn man mal in die Verlegenheit kommen sollte, das K/Ubuntu per automatischen Update einen neuen Kernel einspielt, macht man Folgendes:

sudo rm /usr/src/ivtv*deb
sudo m-a clean ivtv
sudo m-a update,prepare
sudo m-a a-i ivtv
sudo depmod -a

Dann kann man mit

modprobe ivtv

den Treiber wieder starten. Mehr zum Thema gibt's hier noch: Install IVTV Edgy

Technorati Tags: , , , , , , , , ,

Mittwoch März 07, 2007

Today's Links

Eclipse Foundation Announces Initiatives for Ajax Applications and Dynamic Languages - Ajax Applikationen mit Eclipse zu entwerfen, kommt einen entscheidenden Schritt voran.
sshguard: Protection for OpenSSH - Der sshguard soll Brute Force Passwortattacken verhindern.
Battlestar Galactica Videomaker Toolkit - Auf der SciFi Homepage findet man jetzt eine Auswahl an Spezialeffekten und Sounds aus der Serie, die man verwenden kann.
The Perfect Desktop - Part 3: Ubuntu 6.10 Edgy Eft - Dieser Artikel erklärt, wie man alle Applikationen für Ubuntu installiert, die man so braucht (und damit Windows abschaffen kann ;-)
PostgreSQL table audit
Musix Linux Distribution - Wie der Name schon sagt: Diese Distri ist für Multimedia-Freaks.
Learn Ubuntu Linux with freely available e-book - Über 900 Seiten Ubuntu Know-How findet man in diesem freien E-Book. (Passwort: ebookspyder.net)
Hack Attack: Back up and sync your Firefox bookmarks with your personal server

Technorati Tags: , , , , , , , , , , ,

Dienstag März 06, 2007

Today's Links

Archos 704-WiFi gets official - Nettes Teil. Endlich mit WiFi...

Suess-Stoff der Woche ;-)

Zu geil: Die Telekom wieder (linkt direkt auf MP3-Datei!) ;-)