In den letzten Tagen hat jemand zwei ziemlich umfangreiche Kommentare an einen Beitrag gehängt in dem ich mich letzten Oktober über den Vim gewundert habe. Vielleicht hat jemand mehr Zeit sich das anzusehen, deshalb antworte ich ihm mal nicht im Kommentar sondern in einem separaten Artikel.

Hallo, Peter…

Keine Ahnung warum Du mir das hier rein schreibst, ich bin kein vim-Entwickler. Ich habe im Moment auch nicht die Zeit allem nachzugehen was Du schriebst, aber nach Deinem letzten Absatz („…eines der am liederlichsten programmierten Programme… Software-Verhau… eines der am blödesten zu bedienendsten Programme…“) habe ich doch mal einen Blick auf einige Deiner Beispiele geworfen.

Meine Testdatei:

Bahnfahrer
bahnfahrer
Autofahrer
Autobusfahrer
Autobahnfahrer

Zunächst: Eine Suche mit /Auto(bahn)[0}fahrer ergibt tatsächlich nichts. Wie auch? Das ist syntaktischer Humbug. Nehmen wir an dass Du /Auto(bahn){0}fahrer meintest. Das findet bei mir (vim 7.1.267) genau den Autofahrer, und das ist meiner Meinung nach absolut richtig. Ich suche nach etwas das mit ‚Auto‘ anfängt, danach soll null mal ‚bahn‘ stehen, danach ‚fahrer‘. Das kommt genau ein mal vor. Autobusfahrer wird natürlich nicht gefunden weil in dem Ausdruck kein ‚bus‘ erlaubt wurde.

Nächster Versuch: Ich suche nach /(Bahn){0}fahrer. Nein, ich suche lieber nach /(Bahn){0}fahrer. Damit kriege ich fünf Fundstellen, nämlich jeweils das ‚fahrer‘ am Ende der Zeile. Klar, ich suche ja nicht nach kompletten Worten, sondern nur nach Stellen an denen ‚fahrer‘ steht. Meinetwegen nach Stellen an denen null mal ‚Bahn‘ steht, gefolgt von ‚fahrer‘. Ob vor dem Nicht-Auftreten von ‚Bahn‘ nicht noch ein ‚Bahn‘ stehen darf ist nicht gesagt. Ich hoffe ich konnte mich klar ausdrücken?

Von weiteren Versuchen sehe ich einfach mal ab, vielleicht hat ja jemand anderes Lust sich da durchzuquälen. Du solltest Dich vielleicht tatsächlich einfach mit Deinem Windows 98 SE und dem mitgelieferten Notepad zufrieden geben. Dazu hätte ich dann auch nochmal einen lustigen Beitrag für Dich…

Noch ein Tip am Rande: wenn Du mit einer Software rumspielst von der Du keine Ahnung hast, die aber gerade von Profis sehr gerne benutzt wird, und Du stößt dabei auf Ungereimtheiten die Du Dir nicht erklären kannst… Erst RTFM beherzigen, dann nochmal probieren. Dann im Netz nach Lösungen suchen, oder nach Leuten die die gleichen Probleme haben. Wenn das nix bringt in entsprechende Foren und Mail-Archive sehen. Ist auch das ohne Erfolg, frage an geeigneter Stelle nach. Wenn Du mit dem Problem absolut nicht leben kannst, und sich rausstellt dass das wirklich ein Bug ist der in den aktuellen Versionen noch nicht behoben ist… DANN reichst Du einen Bug-Report bei dem Projekt ein. Und zwar wirklich bei dem Projekt, nicht als Kommentar auf einen Blog-Eintrag von vor einem halben Jahr…

Ach, noch was: Danke für den Link auf Deine Homepage. Sehr aufschlussreich. :-D

Ein Kollege hat mir gerade eine Freigabe auf seinem Vista eingerichtet, damit ich da was hin schieben kann. Freigeben beziehungsweise verbinden geht so, zum Schreiben brauche ich aber Rechte. Unter Vista vergibt man aber scheinbar keine Rechte sondern Rollen (keine Ahnung, hab mich nicht weiter damit befasst). Das passendste habe ich dann bekommen, und jetzt darf ich mich voll des Stolzes ‚Mitwirkender‘ nennen. :-)

Zumindest scheint irgendjemand der Ansicht zu sein:

IWSS Security Event
Access to this URL is currently restricted because of its classification.
URL: http://www.fabrik-kellerkinder.de/
Content classification: Pornography

Die Kellerkinder-Seite ist eine Community von Leuten die die gleiche Party besuchen wie ich. Im Moment ist die Seite wegen einer größeren Umbau-Aktion geschlossen, aber wenn man mal bei archive.org oder Google danach sucht kann man sich ein Bild von dem angeblichen Schmuddelkram machen: Da ist einfach keiner.

Ich habe mir da nie Gedanken drüber gemacht, aber jetzt wo ich das sehe fällt mir doch ziemlich deutlich ins Auge wie gefährlich Content Classification sein kann. Ich brauche nicht viel Phantasie um mir ein Szenario auszumalen in dem ich mich beispielsweise irgendwo bewerbe, irgendjemand tippt meinen Namen in eine Suchmaschine, kommt auf die Seite und klassifiziert mich als Ferkel. Ohne auch nur gesehen zu haben was auf der Seite tatsächlich angeboten wird, denn das zeigt der Filter natürlich nicht. Oder da ich im Moment nicht vor habe mich irgendwo zu bewerben: letzte Tage habe ich auf einen ‚Request for Qualifications‘ geantwortet. Ein Kunde meines Arbeitgebers sucht Leute für einen Job, ich soll da angeboten werden. Wenn der Kunde mich hinterleuchten will wirft das womöglich ein falsches Bild auf die Firma für die ich arbeite.

Das ist beides nicht abwegig, oder?

Ich habe danach gesucht, aber keine Möglichkeit gefunden um festzustellen ob ich da von einem lokalen Admin klassifiziert wurde, oder ob das global von Trend Micro so eingestellt wurde (von denen stammt der Filter). Mein Hinweisgeber tippt aber auf die globale Variante, da das Produkt bei ihm gerade erst installiert wurde. Also habe ich eine Mail mit der Bitte um Aufklärung an Trend Micro geschrieben, ich bin gespannt ob ich da eine Antwort bekomme…

Wenn jemand einen Tip hat wie ich rausfinden kann ob das eine globale Einstellung ist, oder was ich sonst noch tun könnte: immer her damit…

buntes remindIch weiß auch nicht was mich da überkommen hat, aber so steht es am Ende meiner .zshrc:

ESC=$(echo -e \e)
remind ~/.reminders | sed -e "s/^/| /;s/| (Reminders for.*):/,---- [ ${ESC}[37;1m1${ESC}[0m ]/;s/Sunrise in.*/${ESC}[0;37m$(ddate | sed -e :a -e "/$/N; s/n/ - ${ESC}[31;1m/; ta")${ESC}[0mn| ${ESC}[0;37m&${ESC}[0m/;s/(today|tomorrow)(| at ..:..)$/${ESC}[31;1m&${ESC}[0m/;s/on [A-Z][a-z]*(| at ..:..)$/${ESC}[0;31m&${ESC}[0m/;$s/.*/&n`----/g"

Wenn jemand eine noch elegantere Lösung hat: immer her damit. :-)

Insbesondere gefällt mir das mit der Variable $ESC nicht, aber ich wollte nicht so viele echos in die Zeile einbauen, und sed scheint auf e, 33 und Konsorten nicht anzusprechen. Das Ergebnis von [Strg-V-Esc] wäre gegangen (also das Zeichen das im Editor aussieht wie „^[„), aber das hätte zur Folge dass das Skript nicht mehr vernünftig druckbar wäre. Und dass bei Ausgabe mit cat bunte Stellen auf dem Bildschirm erscheinen.

Ach ja, die Ausgabe der Zeile sieht übrigens so aus wie in dem Screenshot. Die bunte Einfärbung der einzelnen Termine kommt schon aus der .reminders (kann ich bei Gelegenheit auch nochmal zeigen). Die Zeile hier sorgt für den Rahmen, das diskordische Datum und alle anderen Farben.

Eigentlich bin ich der Ansicht, dass einem auf einem Server nicht viel besseres passieren kann als ein Debian. Heute wurde dieser Eindruck böse getrübt, allerdings glaube ich weiterhin dass andere Systeme nicht besser sind. Höchstens ‚anders Scheiße‘. :-)

Was passiert ist? Ich habe endlich mal den angestaubten Apache einspunktirgendwas durch einen hypermodernen Apache 2 ersetzt. Das hat im Wesentlichen gut funktioniert, mit einem kleinen Dämpfer: ich benutze SysCP um den Server zu verwalten. Das Ding hat eine MySQL-Datenbank, und darin stehen unter anderem meine Mitbenutzer. Also Namen und (verschlüsselte) Passwörter der Leute die auf dem Server was zu sagen haben. Ich habe an einer Stelle verschiedene administrative Tools installiert, auf die eben diese Benutzer zugreifen können sollen. Sowas wie phpMyAdmin, aber auch die Oberfläche von SysCP selbst. Diese Seite war bis dato über libapache-mod-auth-mysql geschützt. Naheliegend, da die Namen und die Passwörter eh in einer Tabelle liegen. Dummerweise gibt es kein libapache2-mod-auth-mysql für Etch, und damit fingen die Probleme an…

Klar, ich hätte mir da eben selbst was stricken können. Wollte ich aber nicht, unter anderem weil absehbar ist dass das keine Dauerlösung werden würde. Und genau das ist es, was mich aufregt: Das Modul gab es für Sarge, das gibt es für Sid und das wird es für Lenny auch wieder geben. Nur eben für Etch nicht. Grund ist, dass der Maintainer die Klamotten hin geschmissen hat und zur Zeit der Veröffentlichung von Etch niemand den Job haben wollte. :-(

Naja, viele Versuche und einiges an Nerven später habe ich es dann doch geschafft, wieder gegen die SysCP-Datenbank zu autorisieren. Geholfen hat eine Kurzanleitung die ich hier zu meiner persönlichen Referenz noch mal wieder gebe. Ist zwar eigentlich für Ubuntu, hat aber auch auf Etch geklappt:

To get mysql authentication working in Gutsy, you have to manually compile mod_auth_mysql:

1. wget http://heanet.dl.sourceforge.net/sourceforge/modauthmysql/mod_auth_mysql-3.0.0.tar.gz
2. wget http://www.bleb.org/software/mod_auth_mysql-3.0.0-apache-2.2.3.patch
3. tar zxf mod_auth_mysql-3.0.0.tar.gz
4. apt-get install apache2-prefork-dev libmysqlclient15-dev; apt-get --purge remove libapache2-mod-auth-mysql
5. cd mod_auth_mysql-3.0.0
6. patch < ../mod_auth_mysql-3.0.0-apache-2.2.3.patch
7. sed -i 's|#include <mysql.h>|#include <mysql /mysql.h>|' mod_auth_mysql.c
8. apxs2 -c -lmysqlclient -lm -lz mod_auth_mysql.c
9. apxs2 -i mod_auth_mysql.la
10. echo 'LoadModule mysql_auth_module /usr/lib/apache2/modules/mod_auth_mysql.so' > /etc/apache2/mods-available/auth_mysql.load
11. a2enmod auth_mysql

Configure it as follows (adapt to your environment):

<location /mysqlauth>
  AuthName "test"
  AuthType Basic
  AuthUserFile /dev/null
  AuthBasicAuthoritative Off

  AuthMySQLEnable On
  AuthMySQLAuthoritative On
  AuthMySQLDB apache_auth_test
  AuthMySQLUser authtestuser
  AuthMySQLPassword something
  AuthMySQLUserTable auth
  AuthMySQLNameField username
  AuthMySQLPasswordField passwd
  require valid-user
</location>

Hope this helps someone.

Also mir hat es definitiv geholfen, Dank an mrts. Ich musste nur noch mittels AuthMySQLPwEncryption md5 angeben wie die Passwörter verschlüsselt sind.

Damit ich mir nicht schon wieder das komplette Kommando zusammensuchen muss: Nach einem fröhlichen Aufruf von

remind -lmp12b1 ~/.reminders | rem2ps -i -e -m A4 | lp

fällt ein Kalender für das nächste Jahr aus dem Drucker. Samt aller jetzt bekannten wichtigen Termine natürlich.

Vor einem halben Jahr habe ich mal festgestellt dass ich zwar einer Pokersendung im Fernsehen folgen kann, es aber nicht auf die Reihe kriege selbst zu spielen. Wer darf wann was machen, wer muss wann was machen…? Kann daran liegen dass es mir niemand erklärt hat… ;-)

Um das mal in Ruhe nachvollziehen zu können wollte ich eine passende Software haben, und da bin ich ziemlich schnell bei PokerTH gelandet. Dummerweise gibt es das für mich nicht als Paket, und an der Compilierung bin ich aus irgendwelchen nicht innerhalb einer halben Stunde lösbaren Problemen gescheitert. Mehr Aufwand habe ich da dann auch nicht mehr rein fließen lassen, und seitdem ruhen die Karten.

Ein Blogeintrag von Frank hat die schlafende Idee wieder geweckt, und siehe da: neue Version, neues Glück. Letzteres hatte ich jetzt nämlich immerhin schon beim Compilieren. Beim Spiel hapert es noch: in meiner ersten Runde gegen sieben Computergegner konnte ich nur aus einer Hand was machen… :-)

PokerTHEdit: Ich nehme alles zurück und behaupte das Gegenteil. Nein, compilieren konnte ich wie gesagt. Aber schon die zweite Runde hat deutlich besser geklappt. :-) So, jetzt aber nix wie auf zur Arbeit…

Ist das mein Fehler oder der vom W3C?

Nach meiner Auffassung sollte es legitim sein, wenn ich im HTML-Quelltext eine Art Optischen Trenner der folgenden Form unterbringe:

<!-- ------- -->

Der Validator beim W3C — den ich eigentlich für maßgeblich halten würde — sieht das anders. :-(

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>invalid</title></head>
<!-- ---- -->
<body><p>invalid</p></body>
</html>

Das gleiche passiert wenn ich den Kommentar in die p-Tags verschiebe. Ich halte das aber in beiden Varianten für valides HTML.

Falls tatsächlich der Wurm im W3C-Validator steckt: wem kann man dann noch trauen, heutzutage? Was HTML-Validierung angeht, meine ich. ;-)

Natuerlich kann man davon ausgehen dass jede halbwegs komplexe Software irgendwelche grösseren oder kleineren Fehler enthält. Dass ich aber innerhalb einer Woche gleich über zwei — ich nenne sie mal Ungereimtheiten — stolpere hätte ich nicht erwartet. Zumindest nicht in altehrwürdigen Programmen wie dem allseits beliebten ;-) Editor Vim und dem Mail-Client Mutt.

Der Reihe nach, erstmal der Vim: Mir hat die Tagline sehr gut gefallen, die Frank Terbeck sich gebaut hat. Bis vor einer Woche habe ich mich noch nicht um Tabs im Vim bemüht, mit der FTTablineSet() von Frank wird das alles aber schön übersichtlich. Klappt auch prächtig… im Vim7. Ich habe aber auch noch Rechner mit Debian Woody im Einsatz, da ist noch ein Vim6 drauf. Der kannte noch keine Tabs, da kann das also nichts bringen. Also wie einige andere Funktionen nach der Versionsnummer ausklammern, aber das klappt in diesem Fall nicht.

Ich habe das Problem mal etwas eingedampft. Sobald ich eine Funktion mit einer For-Schleife in der Konfiguration habe kriege ich einen Fehler. Minimal sieht das so aus:

if version >= 700
  function FunctionTest()
    for tabnum in 1
    endfor
    return 1
  endfunction
endif

Das führt im Vim6 beim Start des Editors zu folgender Ausgabe:

E133: :return außerhalb einer Funktion
Drücken Sie die EINGABETASTE oder geben Sie einen Befehl ein

Täusche ich mich, oder sollte der Vim6 den Teil überhaupt nicht ’sehen‘? Naja, ich denke nicht dass es dafür noch einen Patch gibt der mir auf Woody weiterhelfen wird. Erstmal habe ich mir so beholfen, das funktioniert:

" Zusaetzliche Funktionen fuer Vim ab 7.0.0
if version >= 700
  source ~/.vim/features700.vim
endif

Und als ich Gestern nochmal eine Mail ansehen wollte die ich zu dem Thema geschrieben habe ist mir was merkwürdiges im Mutt aufgefallen. Ich persönlich bin nicht abgeneigt, das einen Fehler zu nennen, aber die FAQ sagt dass das so gewollt ist. Ich frage mich nur ob und wenn ja wie ich das elegant lösen kann.

Ich möchte Kopien meiner ausgehenden Mails monatlich sortiert in Ordnern ablegen. Das macht Sinn, und die Ordnerstruktur passt dann auch schön wenn ich mal mit Squirrelmail darauf zugreife. Also steht in der Konfiguration folgendes:

set record="=INBOX.Sent.date +%Y.%m"

Mein Mutt läuft dauerhaft in einem Screen, wird also in der Regel nur neu gestartet wenn der Rechner neu gestartet wird, was in diesem Fall nur alle paar Monate mal vorkommt — in der Regel nach Stromausfällen. Und die Backticks werden offenbar nur beim Start evaluiert, so dass ausgehende Mails immer im Ordner des Monats landen in dem das Programm gestartet wurde. In der FAQ bei Fefe steht auf die Frage ob das irgendwie mit Bordmitteln geht „No. And that’s on purpose.“ Ich frage mich ob das so immer noch aktuell ist, ich finde das etwas… befremdlich in einem Programm das ansonsten so fein einstellbar ist.

Und eine Cron-Loesung wäre zwar denkbar, aber nicht schön. Wie würde das aussehen? Die Mail-Ordner direkt auf dem Server umverschieben? Geht. Aber auch nur weil ich da Root bin. Ist also nicht allgemein möglich. Und wenn Mutt immer nur nach „Sent“ schreibt, ein Skript sich am Monatsersten per IMAP mit dem Server verbindet und die Ordner umbenennt? Ginge auch, das wäre dann aber nicht mehr kompatibel zur Squirrel-Ordnerstruktur…