Okt 07

Auch nett…

wer weiss wofuer man es mal gebrauchen kann.

Gegeben sei folgende Tabelle:

SQL> SELECT deptno, ename FROM emp ORDER BY deptno, ename;

DEPTNO ENAME
------ ----------
    10 CLARK
    10 KING
    10 MILLER
    20 ADAMS
    20 FORD
    20 JONES
    20 SCOTT
    20 SMITH
    30 ALLEN
    30 BLAKE
    30 JAMES
    30 MARTIN
    30 TURNER
    30 WARD

14 rows selected.

Wir moechten jetzt die Employees zu einem department aber in je einer Zeile haben. Man nehme: wm.concat aus wmsys

SELECT deptno,wmsys.wm_concat(dname) departments FROM dept group by deptno;

    DEPTNO CONCATENATED
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
...

Ist doch schick, oder ?

Jan 10

Wer soetwas in seinen Access Logs als Refrerrer sieht kann sich wundern, muss er aber nicht :-)

http://127.0.0.1:4664/preview?event...

Der Referrer kommt naemlich von der Google-Desktop Suche. Also: Wieder schlauer geworden :-)

Nov 22

Man kennt das. Gerade frisch einen Postfix aufgesetzt, eine Testmail losgelassen und Zaaack! – das Ding will nicht rausgehen. Jetzt dümpelt die Mail bis zum Timeout in der Queue herum. Abhilfe habe ich früher geschaffen in dem ich mir via mailq die Mail-ID herausgekramt habe und dann mühsam durch die spool Directories gegangen bin um ein File nach dem anderen zu löschen. Es geht eleganter:

mailq aufrufen um die Mail-ID zu bekommen

und anschliessend nur noch “postsuper -d <mail-id>” aufrufen um die Mail zu töten. Fertig….

Ja, die meisten werden es kennen. Nur so vergesse ICH das garantiert nicht mehr :-)

Sep 17

Probleme bei der Ausgabe von Texten in UTF8 unter Perl ? So für Schnittstellen, und ähnliches ?

Kein Problem:

Nach öffnen des Ausgabestreams (File, oder ähnliches) einfach ein simples binmode FILEHANDLE,":utf8"; implementieren, und schon klappt es mit dem Charset. Wieso das auf einigen Systemen (z.B. Solaris) auch ohne Binmode geht (das setzen der Environment-Variable “LANG” auf de_DE.UTF half hier), weiss ich nicht. Aber so funktioniert es in jedem Falle !

Sep 03

Ein Update des DBD::Oracle Treibers von 1.16 auf 1.21 klingt zunaechst unspektakulaer. Aber wie so oft steckt der Teufel im Detail. Benutzt man nämlich persistente Verbindungen unter mod_perl mit dem Modul Apache::DBI, ändert sich das Verhalten beim disconnecten von der DB. In der Regel cached das mod_perl die Verbindungen ja, daran hat sich auch nichts geaendert.

Bei der 1.16er Version jedoch impliziert das disconnect ein commit. Das hängt laut Modul-Doku von gutdünken des (Modul-)Entwicklers ab. Hat man seine Applikation jetzt darauf ausgerichtet, dann macht man nie ein Commit (sollte man nicht tun !). Dumm nur, dass dieses Verhalten bei der 1.21er geändert wurde. Nun impliziert das Modul beim disconnecten nämlich ein Rollback. Und das macht es selbst dann, wenn ein commit vorrausgeht.

Im ersten Ansatz ist das verschmerzbar. Wenn die DB allerdings, selbst bei Skripten die nur SELECTen, jedesmal mit einem Rollback belaestigt wird, kommt da schon einiges zusammen. Das Verhalten lässt sich mit folgendem “Workaround” aendern:

Aus einem $dbh->disconnect() wird ab sofort ein

$dbh->{AutoCommit}=1;
$dbh->disconnect();

Das AutoCommit wird also kurz vorm disconnecten gesetzt, und beeinflusst das sonstige Rollback/Commit-Verhalten im gesamten Skript ueberhaupt nicht. Sobald ein neues Connect (auch in einer persistenten mod_perl Umgebung) kommt, werden (auch bei gecachter DB-Verbindung) die Parameter AutoCommit, etc., eh neu gesetzt. Damit verhält sich alles wieder wie vorher.

Aug 28

Schon mal versucht einen Aggregations-SQL nach anderen Werten als den Format-Strings die mit to_date, to_char benutzt werden duerfen zu bauen ?

Ist garnicht so simpel. Ein

select count(*),attribut,to_char(creationdate,'DD.MM.YYYY')
 from tabelle
 group by attribut,trunc(creationdate,'DD.MM.YYYY')

ist noch fuer jedermann verstaendlich. Auch wenn man nach Stunden gruppieren will, geht das noch schmerzfrei (‘HH’). Was aber wenn man auf 15Minuten Ebene Aggregieren soll ? Ohne Kunstgriff geht es nicht. Hier der to_date String:

 to_date(to_char(sysdate,'DD.MM.YYYY') ||
         ' ' ||
         trunc(to_number(to_char(sysdate,'SSSSS'))/900)*900,
         'DD.MM.YYYY SSSSS')

Was passiert hier ?

Zunächst wird die aktuelle Zeit (im Select ist es natuerlich das zu gruppierende Feld) in Sekunden nach Mitternacht umgewandelt. Nun dividieren wir das Ergebniss durch 900 (15 Minuten = 900 Sekunden) und schnibbeln die Nachkommastellen ab. Anschliessend das ganze wieder mit 900 Multiplizieren, und wir haben jede Erdenkliche Uhrzeit auf die letzte Viertelstunde (ab-)gerundet. (Schlaue Menschen koennten jetzt sagen, Mensch Joerch, nimm doch DIV, MOD gibts unter Oracle schliesslich auch -> DIV gibts leider NICHT). So, jetzt packen wir noch das Datum wieder davor (ist ja durch die Umwandlung in Sek. nach Mitternacht verloren gegangen) und konvertieren das ganze wieder in ein Datum. Fertig ist der Viertelstundenaggregator :-) Bezogen auf das obige Beispiel lautet unserer (zugegebenermassen unlesbarerer Spruch) wie folgt:


select count(*),attribut,
 to_date(to_char(creationdate,'DD.MM.YYYY') ||
         ' ' ||
         trunc(to_number(to_char(creationdate,'SSSSS'))/900)*900,
         'DD.MM.YYYY SSSSS')
 from tabelle
 group by attribut,
 to_date(to_char(creationdate,'DD.MM.YYYY') ||
         ' ' ||
         trunc(to_number(to_char(creationdate,'SSSSS'))/900)*900,
         'DD.MM.YYYY SSSSS')
Aug 15

Folgendes Problem:
Irgendein Daemon moechte einen Listener aufbauen und grabscht sich anstelle des IPv4 Sockets ein IPv6 Socket. Dummerweise kann man das dem Daemon nicht abgewoehnen, da dieser kein config-File oder Closed-Source ist. Abhilfe schafft das disablen des kompletten ipv6 Stacks. Wie das geht ?

Einfach in der /etc/modprobe.d/aliases folgende Zeile abaendern (die obere Zeile ist das original):

#alias net-pf-10 ipv6
alias net-pf-10 off

Danach rebooten (ohne geht leider beim 2.6er Kernel nicht) und gut ist.

Jul 31

Oft gesehen, nie benutzt. Zu der Kategorie gehoert wohl das kleine aber feine Tool “at”. Quasi ein “Wegwerf”-CRON. Dabei ist das Ding totsimpel zu bedienen, und dazu noch extremst nützlich. Wie es funktioniert ? Folgendermassen:

Angenommen ich muss dringend noch ein paar Files per scp kopieren, kann das aber erst machen, wenn kein Betrieb mehr auf dem Produktionssystem herrscht. Erschwerend kommt jetzt noch hinzu dass, sagen wir, der Betrieb erst gegen 23:00 beendet ist. Ein klassischer Fall für at:

at 23:00 [CR] (danach befinden wir uns im Commandmode)
scp Datei user@system:/directory [CR]
[CTRL+D]

Nun lediglich den Rechner auf dem das Kommando abgesetzt wurde anlassen (oder noch besser: Auf einem Remotesystem ausführen und anschliessend ausloggen) und ab gehts um 23:00 :-)

Eine Besonderheit für Mac-User gibt es noch. Der Dienst der die at-jobs (Eine Liste derer gibts übrigens via “atq”) startet, ist defaultmässig nicht gestartet. Das kann man via:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

nachholen.

Viel Spass beim “at”ten …

Jul 22

Wer sich mit folgender Fehlermeldung bei der Benutzung von CGI::Ajax unter Perl herumquaelen muss, dem sei ein Downgrade auf die Version CGI-Ajax-0.697 ans Herz gelegt. Damit ist die Fehlermeldung naemlich dann Geschichte:

Undefined subroutine CGI=HASH(0xBLABLABLA)::header_type at CGI::Ajax line xxxx

Apr 16

LOBs unter Oracle sind, wie schon an einigen Stellen im Blog hier erwaehnt, wirklich eine suboptimale Storage-Loesung unter Oracle. Vor allem, wenn eine solche Tabelle auch noch alle x Monate bereinigt werden soll. Nach dem entsprechenden DELETE belegt das LOBSEGMENT naemlich immer noch gut Platz auf dem Tablespace. Was bei “normalen” Tabellen ueber ein “ALTER TABLE ENABLE ROW MOVEMENT” mit anschliessendem “ALTER TABLE SHRINK SPACE” geht, ist bei LOBSEGMENTEN nicht ganz so simpel. Und weil ich die beiden Sprueche immer wieder verwechsele, schreibe ich Sie jetzt hier auf:

Gegeben sei ein Table “DATASTORE” mit einem LOB der “FILEDATA” heisst.

Nur Shrinken (Nicht Highwatermark zuruecksetzen, also auch nicht Table “locken”):

SQL> alter table datastore modify lob (filedata) (shrink space compact);

Im Anschluss Highwatermark zuruecksetzen / Bzw. direkt vollstaendig shrinken (VORSICHT: Table wird gelockt):

SQL>alter table datastore modify lob (filedata) (shrink space);

PS: Das ganze laesst sich noch mit einem CASCADE erweitern, was dann bedeutet dass auch unterliegende Objekte mit geshrinkt werden (Indizes, etc.)

Apr 07

Fuer den Fall der Faelle, in dem man ein simples Shellscript beim Aufwecken bzw. einschlafen seines Macs ein Script abfeuern moechte (kann ja hilfreich sein, um schnell noch was zu umounten, etc.), nehme man den Sleepwatcher von Berhard Baehr.
Das Ding gibts unter http:/www.bernhard-baehr.de kostenlos herunterzuladen.

Mrz 22

So, jetzt muss ich meinen Frust ueber dieses Achsotolle RDBMS mit Namen “MSSQL” mal rauslassen.
Wie kann es sein, dass eine Verbindung via DBD::ODBC auf eine MSSQL nur 1 (In Worten: EIN) aktives Statement gleichzeitig zulässt ? Neben einigen anderen Problemchen, war das nun der Grund auf DBD::ADO zu wechseln. Mal abgesehen von dem grausigen SQL-Syntax dieses Karteikastens, kann mir mal jemand sagen wieso man bei ADO die Bind-Parameter nicht durchnummerieren kann ??? Da scheint nur ein “?” zu funktionieren.
Entweder mir fehlt noch der Durchblick bei dem MS-Gedönse, oder das Teil ist schlecht per Design…

Genug herumgefrustet. Wenn die naechsten Probleme kommen (und die kommen bestimmt), gibt es hier ein Update…

[Update 1]: rownum (aus Oracle): nicht vorhanden.
Limit (aus MYSQL): ersetzt man durch “top” direkt hinter dem SELECT

[Update 2]: MERGE (aus Oracle): nicht vorhanden, also haendisches Merging…

[Update 3]: FUNCTION Based Indizes: nicht vorhanden.

[Update 4]: Variablen mit NULL-Werten via ADO binden: geht nicht

[Update 4b]: Mehrere Statements mit ODBC gleichzeitig bearbeiten: Fehlanzeige :-(

[Update 5]: Die DB verhält sich unter Win2003 US anders als unter Win2003 GERMAN … Suspekt

[Update 6]: Ein Ordentliches Handling von Datumsfeldern a la “to_date” oder “to_char” mit relativ freien Formatierungsstrings ist nicht drin. Stattdessen kryptische Numerische Konstanten die gerade mal eine Hand voll vorformatierten Datumsformaten zulassen. Wenn das mal kein Beinbruch ist… oha!

[Update 7]: Strings mit Nullen oder anderen Chars auffuellen (unter ORA mit LPAD/RPAD): Nicht moeglich. Ein Umweg ueber selbst gestrickte Funktionen waere hier angesagt…

Mrz 08

Wem Nagios schon immer etwas zu komplex zum konfigurieren war, der versuche sich doch mal an Monit.
Das Teil muss zwar auf jedem einzelnen Rechner laufen, den es Monitoren soll, und es hat auch nicht ganz so viele Einstellungen wie Nagios, aber es kann Prozesse, TCP-Ports, ICMP-Pings uvm. monitoren und sogar bei bedarf von alleine restarten.
Zusätzlich informiert es einen per Mail was so gerade passiert. Als Extra-Bonbon gibt es ein (minimalistisches) Webinterface das einen schnell und zuverlässig über den Gesundheitszustand des zu monitorenden Rechners informiert.
Ist auf jeden Fall einen Blick wert, das Tool…

Feb 20

Das ist wirklich bitter. Habe mich gerade gewundert wieso ca. 4 GB RAM auf meinem MacPro belegt sind, obwohl lediglich Mail.App, Firefox und ein Remotedesktop liefen.
Zuerst hatte ich den Firefox im Verdacht. Ein Blick auf top brachte dann jedoch Licht ins Dunkel: Ca. 1,8 GB (Ja GB für Gigabyte) RAM waren durch den RemotedesktopClient (übrigens Version 2.0) belegt.
Mann, da kann ich 3 x Windows unter Parallels für starten ;-)

Kennt jemand einen anderen gute RDP-Client für den Mac ? Bitte nicht CoRD, der kommt leider mit Fullscreen auf einem Multiscreensystem nicht klar. Ich suche was simpeles, schnelles und was ohne Memory Leaks…

Update (13.09.2010): Durch einen Hinweis aus der Leserschaft bin ich auf einen netten Vergleichschart hingewiesen worden. Hier stehen noch ein paar andere Clients zur Auswahl (Danke, Amy!)

Feb 11

Wer schon immer mal überzeugende Argumente GEGEN php suchte, ist bei helmboldt.de richtig aufgehoben. Wusste garnicht das PHP soooo (!) gruselig ist…

gefunden bei roothausen.de

Update: Unter verplant.org gibt es einen objektiven Vergleich zwischen Perl und PHP – in jedem Falle Lesenswert

preload preload preload