WordPress nicht XHTML 1.1-kompatibel

Ich dachte mir gerade: “Solche XHTML- + CSS-Valid-Buttons sind ja eigentlich ganz nett. Die sollte ich hier auch mal hinzufügen.”

Eine schreckliche Idee, denn ich musste feststellen: Pustekuchen!

Die Anforderung an den übermittelten Content-type – also statt text/html den “neuen” application/xhtml+xml – hatte ich ja noch schnell hinbekommen mittels des Hinzufügens von

<?php header("Content-type: application/xhtml+xml"); ?>

in der ersten Zeile der header.php des Templates.

Aber die nachfolgenden Fehler – 19 Stück ! – im Validator waren dann nicht mehr so leicht zu beheben.

Zwei Beispiele:

  • Da geht es zum Beispiel um das Element <strike>, welches seit XHTML 1.0 strict nicht mehr erlaubt ist, da es zu den sog. “presentational elements” gehört, also nichts mit der Struktur des Dokuments zu tun hat.
    • Die Lösung wäre hier, statt <strike> ein <span> zu nehmen und dies mittels CSS zu formatieren.
  • Bei jedem Listenpunkt einer Aufzählung steht der Text des Listenpunktes (bei mir) in font-Tags, die die zu verwendenden Schriftarten angibt.
    • Statt dieser merkwürdig altbackenen Lösung müsste hier einfach das <ul> oder <li> entsprechend im CSS formatiert werden.

Beide o.g. Punkte kommen häufiger vor und sind deshalb nicht so einfach zu beheben, weil die Grundfunktionen des Editors eben diese Einträge erzeugt. In der Codeansicht könnte man in jedem Einzelfall den Beitrag “säubern”, aber dies scheint wohl nicht der Königsweg.

Eventuell gibt es ja schon einen Editor, der den Standardeditor ersetzt und die Formatierungen XHTML 1.1-valid erstellt. Allerdings müsste er dann wohl auch ein das Theme-Stylesheet ergänzende CSS-File mitbringen, um solche Probleme wie <strike> verlässlich zu lösen.

Die beste Lösung wäre es aber wohl, wenn WordPress selbst den Schritt zu 1.1 macht und die Probleme beseitigt.

EDIT: Beim Nachschauen stellte ich fest, dass die Listenpunkte in diesem Artikel keine font-tags haben. Daraus schließe ich, dass diese Tags wohl bei einem Editiervorgang erstellt wurden (aber nicht von mir gewollt!).

EDIT2: Ich habe den Header wieder zurückändern müssen, da mein Firefox sich manchmal mit dem Hinweis auf die nicht vorhandene Wohlgeformtheit des Dokument geweigert hat, die Seite überhaupt anzuzeigen. Darum kümmer ich mich also dann mal in Ruhe…

Jobtipp: Programmierer haben eine goldene Zukunft

Wer bisher noch nicht wusste was er werden will oder sich mit seiner Profession “Programmierer” Zukunftsängsten gegenüber sah, kann nun erleichtert aufatmen, denn der Staat, diesmal in Form des BKAs, hat ein grandioses Job-Programm in Aussicht gestellt:

Hier geht’s zur Job-Beschreibung bei heise…

Zum Hintergrund:
Da das BKA die Idee hat, für jede Online-Durchsuchung einen Unikat-Trojaner zu programmieren, damit dieser möglichst nicht von Virenscanner und Firewalls erkannt wird, ist eine Aufstockung des Personals um ein Vielfaches wohl nicht zu vermeiden.

Aufklärung:
Wie der Artikel bei heise aber schon andeutet, entspricht die Idee keines Falles der Realität, denn imho ist klar, dass es ein Baukastensystem geben muss und die Baukasten-Module dann in einem Wettlauf mit den Signaturen der Anit-Viren-Softwarehersteller sind, eben wie alle anderen bösen Virenproduzenten.

Es gibt natürlich 5 Sterne von mir für die super Job-Initiave, aber auch gleich wieder 4 Abzug wegen Realitätsverlust des BKAs und der Tatsache, dass die Steuerzahler diesen Wahnsinn dann auch noch hätte bezahlen müssen. (Ich schreibe hier im Konjunktiv 3, in der Hoffnung, dass die Leitung des BKAs den Fehler auch wirklich einsieht.)

Dieser Artikel unterstreicht meine Sichtweise.

Nachtrag:

Wer noch ein paar Wissenslücken in Sachen Bundestrojaner hat, dem sei diese FAQ von ARD ans Herz gelegt.

Meine liebste Frage-Antwort-Kombi:

Gibt es ein Bundestrojaner-sicheres System?
Ja, ein Computer ohne Internet-Verbindung.

🙂

Der bloggende Wurm

Wir haben alle gewusst, dass E-Mail-Spam nicht das Ende der Fahnenstange ist und wir haben ja auch schon die gleichen, wenn nicht sogar mehr, Anti-Spam-Systeme für Blogs erfunden und installiert.

Aber dass nun ein Scheiß böser Bot bloggt, um nicht nur Werbung zu machen, sondern mittels Kommentaren auch die Leute auf infizierte Websites locken möchte finde ich persönlich dann doch wieder eine Steigerung.

Nachzulesen bei heise online…

PS: Wenn ihr also Links in Euren Blogs findet, die offensichtlich zu youtube gehen sollen, dann checkt bitte vor dem Klick noch einmal das Ziel des Links.

[warning: explicit content] Deine IP-Adresse ist sooo sexy!

Ab und zu muss man seine externe IP-Adresse zu Hause oder in einem anderen LAN wissen. Das herauszubekommen ist zwar mittlerweile dank www.whatismyip.com etc. nicht schwer, aber auch sonderlich unterhaltsam.

Viel spaßiger ist es aber, sich die IP vorstöhnen zu lassen und zwar hier bei www.moanmyip.com !

(Nicht vergessen: BOXEN AUFDREHEN!)

Und da soll noch einer sagen, dass IT nicht sexy ist!

Notizblock (1)

Hier ein paar Blogeinträge, die ich nicht vergessen und mich später mal darum kümmern will…

So, das genügt erstmal… Vielleicht ist ja auch für DICH etwas interessantes dabei! (?)

Danke an alle Blogger für die Infos!

automysqlbackup: versionierte Sicherung von mysql-Datenbanken

Die Sicherung von Datenbanken ist immer wieder eine Aufgabe, die man schnell vergisst und, wenn man sich dann damit befasst, für Kopfschmerzen sorgen kann.

Die Gründe:

  • Während des Betriebs des Datenbankservers ist es meist nicht möglich einen konsistenten Abzug der Datendateien zu erhalten.
  • Ein Anhalten des Datenbank-Server hat aber Auswirkungen auf das gesamte System.
  • Selbst wenn man die Dateien kopieren kann, ist es nicht 100%ig sicher, dass man nach einem Absturz die Daten in einen neuen DB-Server mit vielleicht veränderter Versionsnummer einspielen/ einkopieren kann.

Es bietet sich daher an, statt der Datenbankdateien nur die gespeicherten Daten zu sichern. Dies ist mittels eines sog. dumps (eng. “Halde”) möglich, bei dem die Daten im Klartextformat ausgegeben und optimalerweise gleich in die Befehle eingeschlossen werden, die die Daten automatisiert wieder in einen neuen Datenbankserver einspielen können.

Auch wenn MySQL bereits von Hause aus Tools mitbringt, die diese Sicherungsmethode ermöglichen und auch Hilfstools wie phpMyAdmin eine Option zum Erzeugen von DB-dumps bieten, suchte ich eine noch simplere Methode, die ggf. noch Mehrwert bietet.

automysqlbackup

Das Projekt automysqlbackup ist unter sourceforge gelistet und derzeit in der Version 2.5 aktuell. Das Projekt scheint nicht mehr weiterentwickelt zu werden, denn der letzte Release ist vom 14.02.2006. Dies ist aber nicht weiter problematisch, da es sich im Prinzip nur um einen Wrapper für das mysql-tool mysqldump handelt und damit nicht sonderlich wartungs- oder weiterentwicklungsbedürftig ist.

Die Vorteile der Nutzung von automysqlbackup sind (von der Homepage):

  • Backup aller oder ausgewählter Datenbanken
  • gesamtes Backup in eine Datei oder einzelne Dateien pro Datenbank
  • Platzsparend durch wahlweise Komprimierung mit gzip oder bzip2
  • Sicherung auch von entfernten Servern
  • Manueller Start oder cron-job-Steuerung möglich
  • Ermöglicht die Zusendung des Logs oder der DB-Sicherung an eine bestimmte Mailadresse

Nach Befolgung der Installationsanweisungen auf der Homepage erzeugt das Tool regelmäßige Backups in dem gewählten Ordner und ermöglicht durch verschiedene Ordner ein versioniertes Backup, durch das man auch Zugriff auf ältere Versionen einer Datenbank hat.

Alles in allem ein sehr sinnvolles Tool und ich möchte es nicht mehr missen.

Fragen? Probleme? –> Schreib mir!

sqlgrey: einfaches und robustes Greylisting

Spam nervt und stiehlt jedem Nutzer täglich Zeit. Um zu vermeiden, dass wir eines Tages nur noch mit dem Löschung von dubiosen Angeboten beschäftigt sind, müssen wir uns immer wieder mit Gegenmaßnahmen befassen. Eine dieser Gegenmaßnahmen ist Greylisting.

Was ist Greylisting?

Das Wort Greylisting entstand aus den Wörtern Blacklisting (in diesem Kontext: permanentes Verbot einer E-Mailadresse) und Whitelisting (permanente Erlaubnis für eine E-Mailadresse) und bezieht sich auf die Mischung dieser beiden Verfahren. Das Verfahren funktioniert vereinfacht wie folgt:

  1. Ein dem Mailserver unbekannter Absender (freund@absender.tld) möchte gern ein Mail an person1@mailserver.tld senden.
  2. Der Mailserver (mit installiertem Greylisting) aber lehnt die Übermittlung nach Erhalt der Absender und Zieladresse unter Angabe eines temporären Fehlers ab (meist mit einer Greylisting-Erklärung für das Logfile).
  3. Der Mailserver trägt die IP des Absendermailserver ( absender.tld, 123.123.123.123 ) zusammen mit dem Absender (freund@absender.tld) und der Zieladresse (person1@mailserver.tld) in seine Datenbank ein.
  4. Ein vernüftig konfigurierter Mailserver wird innerhalb der nächsten 10 bis 60 Minuten eine erneute Zustellung versuchen. So ist es auch und so versucht der Mailserver von freund@absender.tld erneut, die Mail an person1@mailserver.tld zu übergeben.
  5. Der Zielmailserver schaut nun wiederum in seine Datenbank, ob ihm diese Kombination aus Quell-IP (wahlweise auch Quell-Subnetz), Absender und Adressat bereits bekannt ist. Da dem in diesem Fall so ist, nimmt er die Mail an und bestätigt die Annahme.

Die Idee hinter dieser “Verkomplizierung” der Mailzustellung ist, dass die Spammaschinen entweder das Handling von temporären Fehlern ausgeschaltet oder dieses in Ihren Mailprogrammen/ -servern gar nicht implementiert haben, um den Durchsatz zu erhöhen.

Wie kann ich Greylisting einsetzen?

Da Greylisting wie oben erläutert noch vor der Annahme der Mail geschehen muss, kann man dieses entweder direkt im Mailserver integrieren (z.B. Plugin) oder alternativ dem Mailserver als Proxy vorschalten.
sqlgrey: einfaches und robustes Greylisting weiterlesen

Immer den passenden Gutschein zur Hand ? (!)

Wer kennt das nicht? Man erhält jede Woche irgendwelche Aktionsmitteilungen und Gutscheine, aber wenn man dann später in dem Shop einkaufen will, vergisst man den Gutschein, er ist nicht mehr gültig oder man findet die Mail mit dem Code/Link nicht mehr.

Vielleicht ist damit jetzt Schluss: Der Gutscheinblog ist da!

Ich finde es zunächst erst einmal eine tolle Idee, denn wenn jemand anderes die ganzen Gutscheine sammelt, muss ich es nicht tun. Die Feuerprobe des Praxistests muss die Seite indes noch überstehen… aber gerade brauche ich nichts.

Wer hat schon einmal einen Gutschein des Blogs verwendet? Hat alles geklappt oder gab es Probleme? Ich wäre an Erfahrungsberichten interessiert!

htop: topper als top

Dank eines Beitrags von Matthias (ja, diese Seite ist sehr beliebt bei mir 😉 ), habe ich – genau wie er – mit dem Tool htop das altehrwürdige top ersetzen können.

Mit freier Sortierung, Baumansicht a la pstree und der Möglichkeit sämtliche Signals an einen Prozess zu senden (direkt aus der Liste) macht sich dieses Tool fast täglich bewährt – und man kann sogar Putty in den Vollbildmodus nehmen und hat auch was davon (entgegen der festen Breite bei top).

Hier gehts zum Artikel von Matthias mit Screenshots und allem drum und dran…

rootTV: wichtige Logs im Überblick behalten

Es ist ein Befehl, den ich sehr zu schätzen gelernt habe und fast täglich beim Debuggen brauche…

tail -f filename.log

Es erzeugt einen ständig aktualisierten Output für die betreffende Datei – perfekt, um das syslog nach einer Config-Änderung im Blick zu behalten.

Oder eben als rootTV: Den ganzen Tag einfach

tail -f /var/log/syslog

laufen haben und spannende Dinge sehen… zumindestens spannender als im deutschen Fernsehen. 🙂

Und mit

echo "tail -f /var/log/syslog" > ~/syslog.sh
chmod u+x ~/syslog.sh
~/syslog.sh

hat man einen noch schnelleren Weg, das syslog aufzurufen.

ftplicity: inkrementelle Backups sicher ablegen

ACHTUNG: Die in diesem Artikel besprochenen Versionen sowohl von ftplicity als auch duplicity sind bereits veraltet. Die grundsätzlichen Erklärungen sind zwar weiterhin valid, aber die Syntax oder Konfigurationsparameter könnten sich geändert haben. Bitte verwendet den Such-Tag “duplicity” bzw. den Such-Tag “ftplicity” und die Kommentare, um aktuelle Informationen zu finden.

Nachdem ich durch einen Beitrag von Matthias wieder mal erinnert wurde, dass nicht Jeder Backups macht bzw. sie aktuell hält, dachte ich, dass ich mal kurz einen Teil meiner Backuplösung vorstelle:

Vorteile

In einem (schon älterem) Artikel der c’t (13/2006) wurde ein Tool vorgestellt mit dem man eine einfache und sichere Backup-Strategie für z.B. Root-Server fahren kann. Das Tool heißt ftplicity und ist im Prinzip nur ein Wrapper für das umfangreichere duplicity. Wie der Name schon sagt, kann möchte ftplicity nur via FTP kommunizieren, denn dies ist laut c’t (und auch meiner Erfahrung nach) der häufigste und simpelste Weg einen Backupspace zu erreichen.

Nun beseitigt ftplicity bzw. das dahinterliegende duplicity gleich mehrere Probleme, die bei dem “plain old Dir-to-FTP-sync” enstehen:

  • Übertragungsqualität: FTP tendiert bei längeren durchgehenden Übertragungen (= eine große Datei) zu Fehleranfälligkeit und der ganze Upload muss noch einmal begonnen werden oder (was viel schlimmer ist) die Backupdatei ist zerstört/ fehlerhaft und lässt sich im Ernstfall nicht mehr richtig wiederherstellen.

    Lösung: kleine Dateien übertragen durch Erstellung von Volumes

  • Vertraulichkeit: Wer einen zweiten Server mit guter Anbindung hat braucht sich um diesen Punkt nicht zu sorgen, aber alle anderen, die entweder etwas Platz bei einem Bekannten in Anspruch nehmen oder von Ihrem Provider einen gewissen Platz an FTP-Space zur Verfügung gestellt bekommen (z.B. Strato, Hetzner) müssen sich schon fragen, ob denn der jeweilige Serveradmin nicht nachts mal aus Interesse sich durch das Mailbackup wühlt.

    Lösung: Verschlüsselung der Daten mittels GPG

  • Authentizität: Das oben genannte Problem wirft ebenfalls die Frage auf, wie weit man den so gesicherten Daten noch vertrauen kann, wenn “Unbekannte” auf die Daten Zugriff hatten. Nichts wäre wohl schlimmer, als dass man sich mit dem Restore auch gleich eine passwd-Datei mit neuen SSH-Usern runterzieht (nette Idee, btw).

    Lösung: Die Signatur der Daten mittels GPG, welche auch beim Restore geprüft werden.

  • Datenvolumen: Je mehr Daten man gesichert hat, desto leichter findet ein Restore statt. Allerdings nimmt damit auch das Übertragungsvolumen zu, was erstens mehr Backupzeit kostet und zweitens in den meisten Hosterverträgen auch begrenzt ist.

    Lösung: Inkrementelle Backups (nur geänderte Daten) unter Nutzung der erprobten rsync-Bibliothek

Diese Probleme werden also von der hier vorgestellten Lösung bereits vermieden. Aber – richtig eingerichtet – kann es noch mehr:

Weitere Vorteile

  • Einzelrestore: Wer kennt das nicht: Schnell mal die Config vom Mailserver bearbeitet und statt die alte Zeile auszukommentieren löscht man sie… und siehe da, rien ne va plus! Der Mailserver startet nicht mehr und man kann sich partout nicht mehr an die besagt Zeile erinnern. Wohl dem, der ein Backup von den Configdateien hat und noch wohler dem, der nicht das ganze Backup wiederherstellen muss, um die Einzeldatei zu erhalten.

    Lösung: ftplicity besitzt einen Befehl, mit dem man Einzeldateien oder -ordner an einen beliebigen Ort wiederherstellen kann

  • Versionierung: Manchmal wäre es schön, wenn man eine Datei nicht nur in dem Zustand des nächtlichen Backups erhielte, sondern sich auch mal die Config ansehen könnte, wie sie vor zwei Wochen war.

    Lösung: Ein Argument des oben erwähnten Befehls ermöglicht es, ein Datum oder einen Zeitraum für die wiederherzustellende Datei anzugeben.

So, als ich diese Punkte damals alle las, war für mich klar: Das will ich haben! Wenn es DIR jetzt auch so geht, dann lies jetzt weiter, denn ein kleines Howto folgt. ftplicity: inkrementelle Backups sicher ablegen weiterlesen

Kurztipp: mcedit – der bessere Editor

Nun bin ich vielleicht nur faul gewesen, aber weder das kryptische vi noch das schmucklose joe konnten mir als Lieblingseditor auf der console so richtig gute Dienste leisten.

Keine Tastenorgien a la vi, keine Fingerverenkungen wie bei joe – einfache Bedienung und sinnvolle Features, das will ich.

Also habe ich den Editor, der im Midnight Commander (DEM altehrwürdigen Norton Commander-Clone) mitgeliefert wird sehr zu schätzen gelernt. (Btw: Der Debian-Paketname zur Installation ist “mc”.)

Nun ist es aber nicht immer sinnvoll den mc zu starten, nur um eine Config mit der Taste F4 zu bearbeiten. Daher wollte ich den Editor direkt aufrufen können. Offensichtlich gab es damit leichte Probleme, sodass bei Debian automatisch ein Mini-Wrapper namens mcedit-debian mitgeliefert wird. Leider ist dieser Name trotz bash-completition nicht sonderlich handlich. Also fix einen Symlink erstellt…

ln -s /usr/bin/mcedit-debian /usr/bin/edi

…und schon kann man auf der Konsole von überall mittels

edi configdatei.conf

jede Textdatei editieren.

Nun störte mich auch noch, dass ich z.B. die Cronjobs mit vi bearbeiten musste. Dazu gibt es das tolle Verzeichnis /etc/alternatives, welche Links auf die “Standardprogramme” zur Verfügung stellt.

rm /etc/alternatives/editor
ln -s /usr/bin/mcedit-debian /etc/alternatives/editor

Somit ist nun mcedit der Standardeditor und wird z.B. beim Aufruf von

crontab -e

verwendet.

HTH.

EDIT: Gerade habe ich hier gesehen, dass diverse Seiten sich bereits intensiv mit dem Thema “Lieblingseditor” beschäftigt haben. Der mcedit kommt dort aber nirgends vor… bin ich SO anders?

screen: Start eines Linux-Programms als daemon

Auch wenn es vielleicht nur mich interessiert:

Das Problem: Ein Programm soll im Hintergrund laufen, also unabhängig von der aktuellen (Putty-)Sitzung, damit es auch noch dem Logout weiterläuft.

Die Lösung: Es gibt diverse Methoden für diese Problemstellung, das Programm screen ist für mich aber die schönste:
screen -dmS SITZUNGSNAME Programm.sh

Es startet das Programm in einer separaten Sitzung. Die offenen Sitzungen kann man sich mit
screen -ls
anzeigen lassen und (sofern nur eine läuft) sich mit
screen -r
mit der Sitzung verbinden um die Programmausgaben zu sehen.

Wichtig ist, sich dann mittels “Ctrl+A” danach “D” von der Sitzung zu trennen, damit man das Programm nicht aus Versehen beendet.

Die noch viel weitreichenderen Möglichkeiten findet man wie immer mit
screen --help
oder
man screen

Ich hoffe, das kann so manchen helfen, der nach einer schnellen, sauberen Lösung sucht.

PS: Es macht natürlich nur für Programme Sinn, die auch von selbst im Loop laufen (z.B. Server).

Skype down – hoch lebe die Unabhängigkeit

Seit Stunden versucht sich mein Skype-Client mit dem Netzwerk zu verbinden, aber scheitert jämmerlich. Habe die News aber nicht gecheckt, weil es in dem Moment für mich nicht so wichtig war. Nachdem mir aber jemand über ICQ schrieb, dass er auch Probleme hatte, dachte ich dann doch schon an ein größeres Problem seitens Skype. Der zugesandte Link machte das Ausmaß dann doch deutlich.

Wohl dem, der noch andere Kommunikationsmittel wie ICQ, MSN (würg) oder seit neuestem auch Steam Community (jetzt neu mit Voice-Chat, Multiuser-Chat usw.) hat. Und ich hab da auch noch von so einem Names “Telefon” gehört…

Ich finde es auf jeden Fall krass, dass soooo ein Unternehmen, wo ja auch ebay dahintersteht, solche Probleme bekommen kann. Wie kann das sein? Die müssten doch ganze Backupsysteme haben, um ihren (teilweise zahlenden) Kunden ein funktionierendes System bereitzustellen. Dort arbeiten wohl auch arme Admins, die sich mit diversen Anforderungen der Konzernspitze herumschlagen müssen.

EDIT: Seit ca. 3 Uhr (17. August 2007) ist mein Skype-Client wieder eingeloggt. Allerdings ist keiner mehr da, um es auszuprobieren… komisch. 😉

note to myself: RFCs lesen

Ich hatte heute wieder mal eine Erkenntnis: RFCs lesen hilft, dass alles so funktioniert wie es soll.

Szenario: Ein Kunde teilt mir mit, dass eine bestimmte Person ihm keine Mails senden kann. Die mir bekannte Person habe ich nach einem Fehlerbericht des Mailservers gefragt und war erstaunt zu lesen:

domain name system error:
host mail.kundendomain.tld:
mail exchanger has no ip addresses

WTF? Als wenn ich für den Mailserver keine IP eintragen würde, klar!

Eine Quick-Google-Search brachte die Erklärung:

Da ich gerade mit meinem Server umgezogen bin und bei allen Domains die IP einzeln ändern musste (btw: Danke NicDirect!), hatte ich es gleich so eingerichtet, dass ich beim nächsten Mal, so wenig wie möglich ändern muss. Daher machte ich folgende Eintragungen im DNS:

kundendomain.tld in MX 10 mail.kundendomain.tld
mail.kundendomain.tld in CNAME mail.mydomain.tld

Also steht in dem DNS-Eintrag des MX des Kunden ein CNAME für eine andere Domain. Laut RFC1912 soll man aber keine CNAMEs in den MX eintragen.

Meine schöne Erleichterung war also dahin…. naja, nicht ganz. Ich habe es dann eben wie alle großen Hoster (warning: GRÖßENWAHN) gemacht und nicht den MX-Eintrag der Domain auf die Kundendomain sondern gleich auf mail.mydomain.tld zeigen lassen. Ist zwar nicht so schick, aber RFCs sind da nun einmal eindeutig.

PS: Ach ja, der Mailserver, der das Problem gemeldet hat und die Zustellung daher verweigerte von übrigens von Schlund bzw. 1&1. Wie ich lesen konnte, war ich nicht der Einzige, der auf dieses Problem gestoßen bin.