Mathematikreform

Diese Late-Night Quizshows werden langsam so lästig wie Klingeltonwerbung und Talkshows am Nachmittag. Viel interessanter ist jedoch die Zielgruppe, die dort wirklich anruft. Nehmen wir mal als Beispiel „4+4÷2−3×3+1“. Das ist eine tatsächliche Aufgabe aus der Sendung. Und zwei Anrufer bekommen es doch tatsächlich hin, als Ergebnis „4“ herauszubekommen. Ich bin ja vielleicht nicht gerade ein Mathegenie, aber hatten wir jetzt nach der Rechtschreibreform auch eine Mathereform? Haben wir die Punkt-vor-Strichrechnungsregel abgeschafft? Oder konnten diese Leute nur ihren 2€-Taschenrechner nicht bedienen? Hallo? Das sind erwachsene Menschen, die auch wählen dürfen! Die Pisastudie kam wohl um Jahre zu spät. Äußerst traurig.

Tungsten T5 kurz vor Release?

Es geisterte durch sehr viele Blogs (z.B. bei vowe dot net), daß der Tungsten T5 auf der palmOne-Website zum ersten Mal erwähnt wurde. Viele schlossen daraus, daß der Tungsten T5 kurz vor Veröffentlichung stehe. Offenbar war das von palmOne so nicht ganz geplant, denn als ich heute auf die besagte Seite besuchte, war dort nichts mehr vom Tungsten T5 zu entdecken. Zu früh gefreut?

Sendmail für den Hausgebrauch

Ich habe bei mir Zuhause einen eigenen kleinen Mailserver stehen, der sich um die Abwicklung der Mails aus meinem ganzen Netzwerk kümmert. Als der alte Server erste Anzeichen seines baldigen ablebens von sich gab, beschloß ich einen neuen Server aufzusetzten. Als Basis habe ich diesmal FreeBSD 5.3(BETA4) genommen. (Der alte Server lief noch mit FreeBSD 4.5-STABLE)

Vorarbeit

Das bei FreeBSD mitgelieferte Sendmail hat einen kleinen Schönheitsfehler. Es ist ohne SASL kompiliert. Es gibt zwei Wege, diesen Umstand zu beheben. Man installiert aus den Ports Sendmail mit SASL oder linkt das mitgelieferte Sendmail gegen SASL. Ich habe mich für letzteres entschieden. Dafür habe ich zuerst Cyrus-SASL2 installiert. Danach habe ich diese drei Zeilen zur /etc/make.conf hinzugefügt:

SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2

Nach einem (langwierigen) make buildworld war nun das Sendmail gegen SASL gelinkt. Dies habe ich einfach mit sendmail -d0.1 < /dev/null überprüft. Die Ausgabe von Sendmail sollte dann so aussehen:

Version 8.13.1
 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7
                NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SASLv2
                SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG

Damit wäre alles vorbereitet. Ich versende meine Mails in der Regel über GMX. Sendmail wird also die Mails über den SMTP-Server von GMX versenden. Der Server von GMX läßt mich Emails nur dann abliefern, wenn er sich sicher ist, daß ich es auch wirklich bin. Hierzu bietet GMX zwei Alternativen. SMTP-after-POP und SMTP-AUTH. Ich habe mich für letzteres entschieden. SMTP-AUTH funktioniert nur mit SASL, deshalb war die kleine Vorarbeit nötig.

Konfiguration mit m4

Nun muß man Sendmail noch zu verstehen geben, was es tun soll. Dies ist der Inhalt meiner /etc/mail/anubis.shadowrun.not.mc (Das Makefile benutzt als Dateinamen automatisch $(hostname).mc):

divert(0)
VERSIONID(`$Id: anubis.shadowrun.not.mc,v 1.2 2004/09/19 22:47:42 fastjack Exp fastjack $‘)
OSTYPE(freebsd5)
DOMAIN(generic)
FEATURE(access_db, `hash -o -T /etc/mail/access’)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable’)
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable’)
define(`confCW_FILE’, `-o /etc/mail/local-host-names’)
define(`SMART_HOST’, `mail.gmx.net’)
MASQUERADE_AS(`gmx.net’)
FEATURE(`local_no_masquerade’)
MASQUERADE_DOMAIN(`shadowrun.not’)
FEATURE(`masquerade_entire_domain’)
FEATURE(`masquerade_envelope’)
dnl Process login names through the genericstable
FEATURE(`genericstable’)
GENERICS_DOMAIN(`shadowrun.not’)
FEATURE(`generics_entire_domain’)
FEATURE(`authinfo’)
FEATURE(`relay_hosts_only’)
dnl The group needs to be mail in order to read the sasldb2 file
define(`confRUN_AS_USER’,`root:mail’)
define(`confDONT_BLAME_SENDMAIL’,`GroupReadableSASLDBFile’)
dnl Enable for both IPv4 and IPv6 (optional)
DAEMON_OPTIONS(`Name=IPv4, Family=inet’)
DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O’)
define(`confBIND_OPTS’, `WorkAroundBrokenAAAA’)
define(`confNO_RCPT_ACTION’, `add-to-undisclosed’)
define(`confPRIVACY_FLAGS’, `authwarnings,noexpn,novrfy’)
MAILER(local)
MAILER(smtp)

Zusätzliche Konfigurationsdateien

Während mein Login auf allen meinen Rechnern „fastjack“ ist, habe ich bei GMX einen anderen Namen. Das Umschreiben des Benutzernamens übernimmt die genericstable. Der Hostname wird vom Masquerading geändert. In der /etc/mail/genericstable steht bei mir folgendes:

fastjack        mmaciaszek

Nun muß sich Sendmail beim Abliefern der Mails bei GMX noch authentifizieren. Hierzu steht in meiner /etc/mail/authinfo diese Zeile:

AuthInfo:mail.gmx.net “U:123456” “P:sehrgeheim” “M:CRAM-MD5”

Die „123456“ steht für meine GMX-Kundennummer und „sehrgeheim“ ist stellvertretend für mein Paßwort bei GMX. (Beides habe ich natürlich hier geändert)

Fehlen jetzt noch die Hosts, für die Sendmail Emails relayen soll. Ich habe hier bewußt auf SMTP-AUTH innerhalb des Netzwerkes verzichtet, da einige Hosts (z.B.: die NeXTSTEP-Maschine) ein altes Sendmail ohne SASL und SMTP-AUTH fahren. Diese Hosts stehen in der /etc/mail/relay-domains. Pro Zeile sollte ein Host stehen. Meine /etc/mail/relay-domains sieht so aus:

renraku.shadowrun.not
nexus.shadowrun.not
fuchi.shadowrun.not
sprawl.shadowrun.not

Dies wären alle Einstellungen, die nötig sind. Die genericstable und authinfo habe ich dann mit makemap(8) in eine entsprechende Map umgewandelt. Dies geht mit makemap hash genericstable < genericstable (für die authinfo muß man entsprechend die Namen ändern). Da sich in der /etc/mail/authinfo das Paßwort für den SMTP-Server befindet, sollte es nach Möglichkeit nur für root lesbar sein.

Die sendmail.cf habe erzeugt man dann mit make cf und make install in /etc/mail/. Ein beherztes make restart startet Sendmail mit der neuen Konfiguration neu. Nun liefert Sendmail nicht-lokale Mails über GMX aus.

Troubleshooting

Falls etwas schiefgegangen ist und es nicht wie gewünscht klappt, sind hier ein paar Tips zum „Debugging“. Falls das Masquerading/Generics nicht wie erwartet funktioniert, kann man Sendmail anweisen eine Email-Adresse durch seine Regeln zu schicken. Dazu muß man Sendmail mit sendmail -bt im sogenannten „Rule-testing mode“ starten. Da das Umschreiben der Absenderadresse getestet werden soll, muß man dies Sendmail mitteilen. Dies geschieht mit /tryflags HS. Nun können beliebige Absender-Adressen getestet werden. z.B: /try smtp fastjack. Sendmail wird nun genau beschreiben, wie es den Absender umschreiben würde, wenn die Mail über SMTP verschickt würde.

Falls der Fehler weniger genau einzugrenzen ist, kann man Sendmail beim SMTP-Dialog über die Schulter schauen. Dazu muß man Sendmail mit sendmail -Am -v -t starten. Danach erwartet Sendmail, daß man ihm eine Mail incl. Headern zu futtern gibt und mit Strg-D abschließt. Vorausgesetzt der Empfänger der Mail ist über SMTP erreichbar (also nicht lokal), wird Sendmail nun versuchen, diese Mail zuzustellen und gibt dabei die gesamte SMTP-Konversation auf dem Bildschirm aus. Damit sollte man den kniffeligeren Fehlern auf die Spur kommen können.

Eine ähnliche Anleitung für NetBSD hat tecneeq auf Newbie-Net geschrieben.

Shell-Skripting Tricks

In Shell-Skripten sieht man oft Klimmzüge mit sed oder basename, um von einem String den Anfang oder das Ende zu beschneiden. Beispiele für sowas wären: (Ich verwendet ganz bewußt $() statt Backticks, da diese je nach Font nicht von normalen Quotes zu unterscheiden sind)

foo=“/home/fastjack/screenshot.png”
bar=$( echo $i | sed “s#$(echo $HOME)/##g” )

Auch oft verwendet wird sowas:

bar=“screenshot.png”
baz=$( basename $bar .png )

Beide Beispiele lassen sich in der Bash und Zsh (und vermutlich auch in einigen anderen Shells außer der Bourne Shell) vereinfachen.

Das erste Beispiel könnte dann so aussehen:

foo=“/home/fastjack/screenshot.png”
bar=${foo#$HOME/}

Und das zweite Beispiel sähe dann so aus:

bar=“screenshot.png”
baz=${bar%.png}

Natürlich kann man beides auch ineinander schachteln:

bar=${${foo#$HOME/}%.png}

Der Vorteil ist, daß die Shell nicht einen zusätzlichen Prozess forken muß, um die Strings zu bearbeiten.

Johnny Mnemonic von Pro7 grauenhaft verstümmelt

Da freut man sich auf die Wiederholung von Johnny Mnemonic im „FreeTV“ und dann schnippselt Pro7 den Film zusammen. Zugegeben, die entfallenen Szenen sind nicht gerade Kindergeeignet, aber dann strahlt man den Film halt später aus, anstatt so metzgermäßig vorzugehen. Will man Spielfilme vollständig sehen, so muß man wohl doch zu PayTV oder DVDs greifen. Und ganz nebenbei wird der Filmgenuß nicht von nerviger Werbung für Kligeltöne oder Handylogos mit tanzenden Tieren unterbrochen.

Unix auf dem Gameboy

Das nenne ich mal eine wirklich coole Idee. 5th Edition Unix auf einem Gameboy Advance. Das wäre fast ein Grund für mich, mir mal einen GBA zuzulegen.