Donnerstag, August 14, 2008

Debian-Pakete downgraden

Seit einem apt-get upgrade habe ich Probleme mit den unter cacti 0.8.7b erstellten Grafiken. Es scheint, als gäbe es ein Problem im Zusammenspiel mit rrdtool 1.2.28 - jedenfalls klagen im cacti-Forum andere Benutzer über dasselbe Problem.

Nun, dann "rollen" wir halt die schuldigen Pakete zurück. Wie? Nun, eigentlich ist es recht simpel:

  1. Auf packages.debian.org such man nach dem Paket-Namen und ruft dessen Seite auf (stable empfohlen). Hier: packages.debian.org/etch/librrd2
  2. Dann klickt man unter Download <paket> auf die Architektur des Servers (i386 für Normalsterbliche): packages.debian.org/etch/i386/librrd2/download
  3. Dort sucht man einen geographisch naheliegenden Mirror aus und klickt dann auf dem Link, um das Paket herunterzuladen. In meinem Fall war es SWITCH: ftp.ch.debian.org/debian/pool/main/r/rrdtool/
  4. Auf der Kommandozeile tippt man nun
    # dpkg -i librrd2_1.2.15-0.3_i386.deb
    und hofft, dass es keine Abhängigkeiten mit anderen Paketen gibt
  5. Fertig

Mit librrd 1.2.15 produziert cacti wieder anständige Grafiken, wie Backup meiner MacBook-Festplatte auf den iMac beweist

Labels: , , ,

1 Kommentare | neuen Kommentar verfassen

Mittwoch, Juli 09, 2008

cURL versendet POST- als GET-Request

... und zwar genau dann, wenn man CURLOPT_NOBODY aktiviert.

Dieser Erkenntnis hatte ich nach ca. einer Stunde debuggen meines Twitter-Cron-Jobs. Eine Google-Suche führte dann auch schnurstracks zur Erläuterung des "Bugs", der eigentlich ein Feature ist/sein soll:

Setting CURLOPT_NOBODY to FALSE will now switch the HTTP request method to GET simply because previously when you set CURLOPT_NOBODY to TRUE first and then FALSE you'd end up in a broken state where a HTTP request would do a HEAD by still act a lot like for a GET and hang waiting for the content etc.

If you issue a POST request and then want to make a HEAD or GET using the same re-used handle, you must explicitly set the new request type using CURLOPT_NOBODY or CURLOPT_HTTPGET or similar.

Quelle: [ 2010735 ] setting a CURLOPT_NOBODY option forces GET request

Labels: , , ,

0 Kommentare | neuen Kommentar verfassen

Mittwoch, Juli 09, 2008

HTTP-Traffic mit tcpdump mitschneiden

# tcpdump -i eth1 -w /tmp/dump.txt -s 1024 'tcp port 80'
  • -i eth1 gibt das Interface an, auf dem gelauscht werden soll
  • -w /tmp/dump.txt, damit der Müll nicht auf der Kommandozeile, sondern in einer Datei landet
  • -s 1024 ist wichtig, damit genügend Nutzdaten mitgeschnitten werden (hier: 1024 Bytes)
  • 'tcp port 80' beschränkt den Mitschnitt auf HTTP-Traffic (in beide Richtungen)

Die Datei analysiert man dann mittels

$ tcpdump -r /tmp/dump.txt

(weil ich es nicht geschafft habe, auch die Nutzdaten anzuzeigen, musste halt der gute, alte vim für diese Aufgabe herhalten)

Labels: , ,

4 Kommentare | neuen Kommentar verfassen

Dienstag, Juli 08, 2008

Reiser hat sie tatsächlich umgebracht

Bizarre Story um den Entwickler des Dateisystem ReiserFS:

Der des Mordes an seiner Frau schuldig gesprochene Open-Source-Programmierer und Entwickler eines Dateisystems Hans Reiser hat die Polizei zu der mutmaßlichen Leiche seines Opfers geführt. Zudem hat Reiser gestanden, dass er mit seiner Frau gekämpft und sie dann stranguliert hat, berichten unter anderem die US-Tageszeitung San Francisco Chronicle und ABC News aus eingeweihten Kreisen.

Quelle: heise online - Hans Reiser führt Polizei zur Leiche seiner Frau

Labels: , , , ,

0 Kommentare | neuen Kommentar verfassen

Dienstag, Juni 24, 2008

Xdebug-Meldungen verfeinern

Wie man Xdebug installiert, habe ich hier bereits beschrieben. Doch mit der Installation alleine ist es noch nicht getan; das Teufelswerkzeug muss nun auch noch derart konfiguriert werden, dass es dem Entwickler alle wichtigen Informationen liefert.

Die Jungs drüben bei IBM haben sich die Mühe gegeben, die (bezüglich INI-Einstellungen schwer durchschaubare) Dokumentation zu lesen und ihre Konfigurationsparameter im Netz zu publizieren:

xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.dump.REQUEST=*

xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.var_display_max_depth = 6

Quelle: Squash bugs in PHP applications with Xdebug

Tönt gut und produziert äusserst detaillierte Fehlermeldungen.

Wer nichts vom korrekten Initialisieren von Variablen hält, sollte xdebug.dump_undefined vielleicht lieber auf Off schalten ...

Wer auf Exceptions setzt und diese sauber abfängt, sollte vielleicht auch xdebug.show_exception_trace auf Off schalten ...

Labels: , , ,

0 Kommentare | neuen Kommentar verfassen

Freitag, Juni 20, 2008

Runlevel in Debian wechseln

Für viele eine überaus doofe Frage, doch in meinem bereits mehrere Jahre dauernden Linux-Leben war heute tatsächlich das erste Mal, dass ich so etwas durchführen muss.

Aktueller Runlevel

$ runlevel
N 3

Quelle: An introduction to run-levels

Runlevel wechseln

# telinit 1

Mittlerweile läuft rsync munter vor sich hin und kopiert Daten von der alten auf die neue Partition ... Hopp Schwiz!

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Sonntag, Juni 15, 2008

Wie zwei auskommentierte Zeilen Code SSL-Zertifikate unbrauchbar machten

/* MD_Update(&m,buf,j); */

Quelle: Diff for /openssl/trunk/rand/md_rand.c between version 140 and 141

Labels: , , , ,

0 Kommentare | neuen Kommentar verfassen

Dienstag, Juni 10, 2008

Apache 1.3, MySQL 5 und PHP 5 unter Mac OS X auf UTF-8 trimmen

Mittlerweile habe auch ich den AMP-Stack auf meinem MacBook installiert und entwickle damit Web-Applikationen. Damit es bezüglich den Zeichensätzen koscher zu und her geht, musste ich folgende zwei Anpassungen an der Konfiguration vornehmen:

Apache 1.3

(Ich verwende aus Faulheit den mit Tiger mitgelieferten Apache - leider halt noch nicht 2.x)

In der /etc/httpd/httpd.conf wird mit folgendem Befehl eingestellt, dass im Header der HTTP-Antwort UTF-8 als Zeichensatz angegeben wird:

AddDefaultCharset UTF-8

MySQL

In der /etc/my.cnf

init-connect='SET NAMES utf8'

Bei jeder Verbindungsaufnahme (bspw. mysql_connect() via PHP) wird der Zeichensatz der ausgelieferten Daten damit auf UTF-8 geschaltet.

Selbstverständlich muss man aber immer noch aufpassen, in welchem Zeichensatz man Datenbank-Dumps exportiert und wieder einspielt ...

Labels: , , , , , , ,

0 Kommentare | neuen Kommentar verfassen

Sonntag, Mai 18, 2008

PDF unter Mac OS X in ASCII-Text umwandeln

pdftotext

Wenn es auch HTML sein kann: PDF in HTML umwandeln? Gmail!

Labels: , , ,

0 Kommentare | neuen Kommentar verfassen

Mittwoch, Mai 14, 2008

lpd funktioniert nach apt-get upgrade nicht mehr

Kein Wunder, beiss ich mir schon den ganzen Abend die Zähne an diesem Problem aus:

Indeed lprng 3.8.A~rc2-1 comes build with --disable-remote which disables listening on port 515 by default. You have to enable it again with setting

lpd_listen_port=515 

in lpd.conf to get it back.

Quelle: Bug#466964: LPD doesn't listen on port 515

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Freitag, April 11, 2008

Hilfreiche bash-Shortcuts

  • Ctrl+a An den Anfang der Zeile springen
  • Ctrl+e Ans Ende der Zeile springen
  • Ctrl+w Wort löschen
  • Ctrl+u Alles vor dem Cursor löschen
  • Ctrl+k Alles nach dem Cursor löschen
  • Ctrl+l Bildschirm löschen (wie clear auf der Kommandozeile)
  • Ctrl+c Momentan laufenden Befehl abbrechen
  • Ctrl+d Logout

Labels: , ,

1 Kommentare | neuen Kommentar verfassen

Samstag, März 01, 2008

CUE-Sheet für MP3s fehlt?

Da hat man aus hier nicht genannten dubiosen Quellen ein Musik-Album im MP3-Format heruntergeladen - und nun dies: Anstelle der einzelnen Songs liegt ein einziges, grosses MP3 auf der Festplatte. Um das Album auf den iPod zu kopieren und jeden Song einzeln anwählen zu können, muss die grosse Datei ein die Einzelteile zerlegt werden. Aber wie?

Kein Problem! Man bediene sich ...

cuesheet heaven

... um das entsprechende CUE-Sheet (eine einfach aufgebaute Text-Datei, die die exakten Startzeiten der in einem grossen MP3 enthaltenen Lieder aufführt) aufzutreiben.

Unter Linux genügt mp3splt, um die Datei anhand der Angaben in dieser Datei aufzuschlitzen:

mp3splt -c sheet.cue audio.mp3

(Nachtrag: Wie ich gerade bemerke, habe ich darüber ja schon einmal gebloggt; damals empfahl ich aber cuemaster)

Labels: , , , ,

0 Kommentare | neuen Kommentar verfassen

Samstag, Februar 23, 2008

Unter Linux und Mac OS X identische Dateien finden

Man bemächtige sich der Sourcen von fdupes, kompiliere diese, lege das Binary im Ordner /usr/local/bin ab (oder in einem anderen, bevorzugten Ordner) und führe fdupes dann im gewünschten Verzeichnis mit den doppelten Dateien aus:

$ fdupes -r .

Wenn man noch die Option -d dran hängt, kann man überzählige Dateien gleich löschen lassen (keine Angst; jeder Löschvorgang benötigt die Bestätigung durch den Benutzer):

$ fdupes -r -d .

(Profis werden sich mit xargs etwas basteln, um den Löschvorgang zu automatisieren)

Labels:

0 Kommentare | neuen Kommentar verfassen

Donnerstag, Januar 31, 2008

Wer kommentiert auf Winkelried.info?

Winkelried ist derzeit die rechte Bastion in der linkslastigen schweizerischen Blogosphäre. Lieblingsthemen:

Leider ist die Qualität der Beiträge oftmals nicht überzeugend, desöfteren sind Texte wirr und wenig schlüssig.

Schmunzeln musste ich heute, als ein "Richard Flühmann" einen Abgesang auf den Informatikstandort Schweiz publizierte. Die Linken seien - wie übrigens an etwa allem, was in der Schweiz derzeit krumm läuft - schuld, dass wir hier nicht zur Weltspitze gehörten.

Im Grund geht es im Artikel darum, dass Winkelried seinen Server im Ausland (konkret: Den USA) betreiben muss, um vor Klagen (von Linken) wegen Verstössen gegen Gesetze (die selbstverständlich von Linken erlassen wurden) gefeit zu sein. Skandal!

Schon einmal etwas von Referendum und Initiative gehört?

Die Untersuchung

Wer sich gelegentlich die Kommentare durchliest, wird hier kaum etwas neues entdecken: Die Kommentare auf Winkelried leben von einigen wenigen, sehr Winkelried-affinen Personen. Manchmal kommt es einem vor, als wäre einfach der polternde Stammtisch aus einem ruralen Dörfchen in das Internet übertragen worden - man ist unter sich, jeder Kommentator plappert dem anderen nach und gibt diesem Recht. Und selbstverständlich wird immer sowas von auf den Tisch gehauen.

Total Kommentare: 673

1. schlechtmensch 157 23.33%
2. Kulturbereicherer 83 12.33%
3. framei 58 8.62%
4. derdernichtlesenkann 39 5.79%

Die Hälfte der Kommentare (50%) stammen von diesen vier Personen.

Hintergrund

Zur Analyse der Kommentare habe ich die auf der Web-Site aufgelisteten "Top 100"-Beiträge (= Beiträge mit den meisten Ansichten) heruntergeladen.

Hierzu kopierte ich die Liste aus dem HTML-Quelltext der Homepage, fügte diese in TextMate ein und startete die Bereinigung, um die "nackten" URLs zu erhalten:

  • Suchen: <li><a href="
    Ersetzen: - (leer)
  • Suchen: /(".*</li>)
    Ersetzen: - (leer)

Übrigens, lieber "Webdesigner": Standardkonformes HTML umschliesst eine Schlange von <li>s mit einem <ul>-Tag.

Anschliessend liess ich wget die in der Liste aufgeführten URLs herunterladen:

$ wget -i winkelried-urls.txt

Den Rest der Analyse übernahm ein PHP-Script, das die 100 HTML-Dateien mit PCRE nach dem Pattern /<h4>(.*?)<\/h4>\s<br>\s+schrieb/ durchsuchte, von Links trennte und nach Häufigkeit ordnete.

Nachtrag: Die komplette Liste

1 schlechtmensch 157 23.33%
2 Kulturbereicherer 83 12.33%
3 framei 58 8.62%
4 derdernichtlesenkann 39 5.79%
5 viktor 30 4.46%
6 Achilles 27 4.01%
7 tin 18 2.67%
8 Loco 18 2.67%
9 Rose_Auslaender 17 2.53%
10 gebsn 15 2.23%
11 musli_weg 13 1.93%
12 Trojaner 12 1.78%
13 David 11 1.63%
14 und_so 10 1.49%
15 Menahem 8 1.19%
16 Tyrann 8 1.19%
17 Landammann 7 1.04%
18 hinschauende 6 0.89%
19 protectisrael 6 0.89%
20 Rudenz 6 0.89%
21 asylstrasse 6 0.89%
22 schwizli 5 0.74%
23 Rütliborat 5 0.74%
24 benzmann 4 0.59%
25 hoppelhase 4 0.59%
26 Schafspelz 4 0.59%
27 set_it_straight 4 0.59%
28 mauluege 3 0.45%
29 hofmae 3 0.45%
30 emeidi 3 0.45%
31 Oli Garch 3 0.45%
32 white.elefant 3 0.45%
33 Toranaga 3 0.45%
34 elminster 3 0.45%
35 Winkelried 3 0.45%
36 Judith 3 0.45%
37 lionne56 3 0.45%
38 Martin Prochazka 2 0.3%
39 eidgenoss 2 0.3%
40 msarbach 2 0.3%
41 Exackt 2 0.3%
42 Wahlen - Blocher zwischen Staatsstreich und Putsch | DER MISANTHROP 2 0.3%
43 stammtischpolteri 2 0.3%
44 Dumdidum 2 0.3%
45 weissnicht 2 0.3%
46 www.amade.ch 2 0.3%
47 Peter 2 0.3%
48 Tquila_sunrise 2 0.3%
49 Fracas 2 0.3%
50 admin 2 0.3%
51 Markus Giger 2 0.3%
52 KonradBerlin 2 0.3%
53 Iceman 1 0.15%
54 hyde11 1 0.15%
55 Wisi 1 0.15%
56 Winkelruedi 1 0.15%
57 AmonAmarth 1 0.15%
58 links.mitte.rechts 1 0.15%
59 Blocher weg - Unterstützt die SVP! « Leben - Gedanken - Blog 1 0.15%
60 WINKELRIED.INFO » Herman bedauert Äusserungen über Nazi-Zeit 1 0.15%
61 wilderer 1 0.15%
62 donaldson 1 0.15%
63 HellerBarde 1 0.15%
64 Dominik Hennig 1 0.15%
65 omc 1 0.15%
66 David Frankfurter 1 0.15%
67 mousseman 1 0.15%
68 Antisemitismus im Wahlkampf : PROTECT-ISRAEL.CH 1 0.15%
69 WINKELRIED.INFO » SRG-Haldimann: durch Fehler zur Selbsterkenntnis? 1 0.15%
70 M.Giger 1 0.15%
71 Anno_Domini 1 0.15%
72 a.k. 1 0.15%
73 rob debank 1 0.15%
74 grass 1 0.15%
75 Ueli Maurer 1 0.15%
76 Asterix con turbante: la islamización de Germania « NUEVA EUROPA 1 0.15%
77 Mathematiker 1 0.15%
78 jdoute 1 0.15%
79 Eidgenosse 1 0.15%
80 Brielmaier’s Weblog » Schleudertrauma 1 0.15%
81 iceman80 1 0.15%
82 anaximander123 1 0.15%
83 BurimAlbania 1 0.15%
84 GeistesWelt :: Zottel rettet die Schweiz :: September :: 2007 1 0.15%

Labels: , , ,

18 Kommentare | neuen Kommentar verfassen

Dienstag, Januar 29, 2008

Defekte Windows-Installationen mit Ubuntu und rsync übers Netzwerk sichern

Wie man einen Windows-Rechner mit Knoppix und einer externen USB-Festplatte backupt, habe ich bereits im Artikel Defekte Windows-Installationen mit Knoppix und rsync sichern aufgezeigt.

Nun gehen wir noch ein bisschen weiter: Die Linux-Live-CD der Wahl enthält dieses mal Ubuntu 7.10 und die Backup-Destination ist ein Linux-Server im Netzwerk.

Windows-Partition mounten

Zuerst heisst es, die Windows-Partition zu mounten. Da es sich um Ubuntu handelt, wird die Platte nicht automatisch in /etc/fstab aufgenommen (Knoppix tut das meines Wissens), weshalb man nicht einfach ein

# mount /dev/hda1

machen kann.

Zuerst erstellt man sich deshalb ein Verzeichnis unter /mnt und mountet dann die Partition

# mkdir /mnt/winme
# mount -t msdos /dev/sda1 /mnt/winme

Wer sich - wie ich - nicht ganz sicher ist, ob es sich nun um hda1 oder sda1 handelt, muss ausfindig machen, wie die Platte angesprochen wird. Mangels Befehlskenntnis musste ich das graphische Partitionierungstool von Ubuntue heranziehen.

Nachtrag: Einfacher (und auf der Kommandozeile) wäre es vielleicht mit fdisk gegangen ...

FAT oder FAT32?

Während dem Kopieren merkte ich dann, dass die Dateinamen abgeschnitten werden (8+3 halt, willkommen in der DOS-Welt!). Deshalb wäre es das nächste Mal wohl angebracht, beim mounten ein anderes Dateisystem anzugeben:

# mkdir /mnt/winme
# mount -t vfat /dev/sda1 /mnt/winme

Da ich dies nicht probiert habe, kann ich nicht sagen, ob vfat als Option existiert und FAT32-Partitionen mit langen Dateinamen mountet ...

Files rüberspitzen

Sobald die Platte gemountet ist (in meinem Fall wütete während Minuten zuerst noch dosfsck und produzierte eine Menge wiederhergestellter Dateien), kann die Kopieraktion beginnen:

rsync -a -v -e ssh /source/dir user@host:/destination/dir

Und irgendwann einmal ist die Kopiererei fertig:

sent 4589083864 bytes  received 958590 bytes  3190853.29 bytes/sec
total size is 4585802793  speedup is 1.00

Labels: , ,

0 Kommentare | neuen Kommentar verfassen

Sonntag, Januar 27, 2008

YouTube-Video mit mplayer in MP3 konvertieren

$ mplayer -vc null -vo null -ao pcm:file=song.wav song.flv

Quelle: Tonspur von Youtube Videos in MP3/OGG Datei wandeln

Wer keine Ahnung hat, wie man die URL eines YouTube-Videos ausfindig macht, wie man die flv-Datei mit wget herunterlädt, noch nie von mplayer gehört hat und nicht weiss ist, was eine Shell ist, dem wird empfohlen, den Song im iTunes Music Store zu kaufen. Oder er ackert die Anleitung durch ...

PS: Ich habe mir folgenden Song runtergeladen:

Labels: , ,

2 Kommentare | neuen Kommentar verfassen

Mittwoch, Januar 09, 2008

Treppenbildung beim Einfügen von Code in vim

Da auch ich zu den faulen Zeitgenossen gehöre, die dann und wann bestehende Teile von Konfigurations-Dateien durch die Gegend kopieren und auf anderen Systemen in Dateien einfügen möchte, habe ich mich immer wieder über die Auto Indentation von vim aufgeregt.

Sobald nämlich Code eingefügt wird, der bereits eingerückt ist, rückt vim den Code eigenhändig erneut ein, was die Einrücktiefe für jede Zeile erhöht.

Die Lösung des Problems ist ganz simpel - ich frage mich gerade, wieso ich nicht längst danach gegoogelt habe:

:set paste

Damit schaltet man vim in den Einfüge-Modus ein, die Einrückung von bereits eingerücktem Text wird damit unterbunden.

Jetzt also nur noch ...

Ctrl+I
Apple+V

... und schon steht der Text wie gewünscht in der Datei.

Quelle: Tip #330: how to stop auto indenting

Labels:

1 Kommentare | neuen Kommentar verfassen

Samstag, Dezember 15, 2007

Netzwerkdrucker mit Avahi anpreisen


Bonjour Printer Sharing
Originally uploaded by emeidi

Wer Mac OS X in einem Netzwerk einsetzt, in dem sich ein etwas teurerer Netzwerkdrucker befindet, wird es längst wissen: Die Dinger preisen sich im Druckdialog unter "Bonjour Printers" automatisch an. Die von Apple (mit?)entwickelte Technologie ist unter vielen Namen bekannt: Rendezvous, Bonjour, mDNS, Zeroconf.

Hier zu Hause betreibe ich einen HP Laserjet 1300 (der kann Postscript, was in heterogenen Umgebungen mit Linux und Mac OS X von Vorteil ist), der am LPT-Port eines Debian GNU/Linux Servers hängt. Druckaufträge aus dem Netzwerk nimmt lprng mit dem LPD/LPR-Protokoll entgegen (CUPS wäre in diesem Fall Overkill).

Als meine Freundin vor Kurzem bei mir zu Besuch war und von ihrem Laptop etwas ausdrucken wollte, erinnerte ich mich an die Einfachheit der Drucker-Installation mit Bonjour. Irgendwie sollte es doch möglich sein, die Funktionalität mit Linux nachzubauen?

Tatsächlich habe ich es nach einigem Pröbeln hingekriegt. Als erstes installiert man den avahi-daemon, der im Hintergrund die ganze mDNS-Geschichte abhandelt:

# apt-get install avahi-daemon

Anschliessend erstellen wir eine XML-Datei unter /etc/avahi/services mit folgendem Inhalt:

$ cat /etc/avahi/services/printer.service 
<service-group>
<name replace-wildcards="yes">HP Laserjet 1300 on ALPHA</name>

<service>
<type>_printer._tcp</type>
<host-name>mad4you.homeip.net</host-name>
<port>515</port>
<txt-record>txtvers=1</txt-record>
<txt-record>rp=Laserdrucker</txt-record>
<txt-record>ty=HP Laserjet 1300</txt-record>
<txt-record>product=(HP Laserjet 1300)</txt-record>
</service>
</service-group>

Erläuterung der Anweisungen

  • type: _printer._tcp Es wird das LPD/LPR-Protokoll verwendet
  • hostname: IP-Adresse oder Domain-Name des Druckservers
  • port: 515 Die Portnummer, auf der LPD lauscht
  • txt-record: rp=Laserdrucker Sehr wichtig: Der Queue-Name des Druckers auf dem LPD-Server. Stimmt dieser nicht, wird der Druckauftrag nicht angenommen. Wie die definierten LPD-Queues heissen, erfährt man aus /etc/printcap
  • ty, product Die Angaben hier sind nicht zwingend nötig - Mac OS X erkennt den Drucker dank diesen Angaben vollautomatisch und richtet die entsprechenden Drucker-Treiber ein (sofern bereits installiert).

Einen gründlichen Einblick liefert die offizielle Dokumentation von Apple: Bonjour Printing Specification

Vielfältige Anwendungsarten

Dieses Protokoll beschränkt sich überhaupt nicht nur auf die Bekanntmachung von Druckern im Netzwerk. Genauso kann man SSH-Server oder Web-Site URLs in den Äther hinaus funken.

Labels: , ,

0 Kommentare | neuen Kommentar verfassen

Samstag, Dezember 15, 2007

Load average: 87.35


Localhost - Processes
Originally uploaded by emeidi

Im Abstand von einigen Wochen ereignet sich auf meinem kleinen Heimserver hier zu Hause ein immer wieder gern gesehenes Schauspiel:

Tasks: 829 total, 54 running
  Mem[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||822/1012MB]     Load average: 66.20 76.20 87.35 
  Swp[||                                                        46/1961MB]     Uptime: 118 days(!), 02:10:10

Als ich vor einigen Wochen zum betreffenden Zeitpunkt endlich einmal zu Hause weilte (sonst bin ich in der Nacht von Samstag auf Sonntag irgendwo am rumfeiern), fand ich endlich heraus, wieso es diesen Spike gibt:

$ cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid0 md10[0] md11[1]
      488390656 blocks 1024k chunks
      
md11 : active raid1 hdg1[0] hdk1[1]
      244195904 blocks [2/2] [UU]
      [===========>.........]  check = 58.2% (142331328/244195904) finish=60.5min speed=28042K/sec
      
md10 : active raid1 hde1[0] hdi1[1]
      244195904 blocks [2/2] [UU]
      [==========>..........]  check = 54.4% (132947904/244195904) finish=70.5min speed=26291K/sec
      
unused devices: 

APC Smart-UPS SUA750I
Originally uploaded by emeidi

Ganz imposant, dass sich der Check der Arrays auch in der Last-Anzeige der USV widerspiegelt.

Labels:

0 Kommentare | neuen Kommentar verfassen

Mittwoch, Dezember 05, 2007

monit endlich brauchbar

Monit now sends three icmp echo requests in one cycle by default. It is possible to customize the echo requests count using the count parameter of icmp test [...]

Quelle: Re: Any Ping Sensitivity Adjust

Wie oft habe ich meine INBOX zugespammt erhalten, weil von mir betreute "Server" mit Billig-Netzwerkkarten schlicht und einfach ein ICMP Echo "vergessen" haben? Nun hoffe ich, dass mit

check host myserver with address 192.168.1.1
    if failed icmp type echo count 5 with timeout 3 seconds
    then alert

Ruhe einkehrt ...

Labels: , ,

0 Kommentare | neuen Kommentar verfassen

Mittwoch, Dezember 05, 2007

Wenn Sista Özel Frühlingsputz am PC macht ...


/mnt/hda1
Originally uploaded by emeidi

... zu viele Dateien löscht und das Gerät beim nächsten Neustart nicht mehr hochkommt, muss der Bruder ran.

Die Vorgeschichte

So geschehen vorgestern Abend: Um genügend Speicherplatz für das Brennen einer CD freizuschaufeln, empfahl ich meiner Schwester WinDirStat, das die Plattenbelegung graphisch anzeigt. Kombiniert mit ihren Administratoren-Rechten (wann habe ich ihr eine solche Berechtigungsstufe vergeben?!) war es nur eine Frage von Minuten, um die ersten paar wichtigen Systemdateien zu löschen.

Meine Sünden

(Es muss hierbei aber doch noch angemerkt werden, dass es eindeutig mein Fehler war, für die Systempartition auf einer 80GB-Festplatte nur 8GB freizuhalten. Immer wieder muss ich in letzter Zeit solche "Jugendsünden" ausbügeln - Windows-Systeme, in diesem Falle Windows 2000, werden mit jedem Monat fetter. Deshalb würde ich heute die Systempartition 80GB gross machen. "Eine System- und eine Datenpartition ist etwas für Sissis!", höre ich die PC-Welt aus dem Walde rufen ...)

Das Problem

Item. Windows 2000 kam also nicht mehr hoch und zeigte nach dem BIOS-Screen folgende Meldung an:

NTLDR fehlt
Neustart mit Strg+Alt+Entf

Schön. Nun hatte ich zwei Möglichkeiten: Entweder ich boote von der Windows 2000-Installations-CD. Oder aber ich bemächtige mich meiner Knoppix 5.1-CD.

Die Wahl war sofort klar: Knoppix Erstens, weil die Windows-CD unheimlich lange zum starten hat, zweitens weil die Recovery-Umgebung ... nun gelinde ausgedrückt ... für'n Arsch ist. Weder werden USB-Treiber geladen, noch die Netzwerkkarte erkannt. Auch die Bordmittel wie fixmbr sind zwar schön und recht - doch für was braucht man sowas, wenn man eine Linux Live-CD rumliegen hat?

Knoppix

So sehr ich für Knoppix schwärmen mag - ich kann mich nicht erinnern, dieses Live-System jemals im ersten Anlauf hochgebracht zu haben. Entweder wird das CD-Laufwerk, von dem Knoppix gerade bootet, nicht gefunden, irgendetwas stimmt mit ACPI nicht oder aber - wie heute - der Schirm bleibt nach dem erstaunlich flooten Linux-Boot schwarz (evtl. ein VGA/DVI-Problem).

Mit der Boot-Option failsafe drang ich dann schliesslich bis zum Knoppix-GUI vor. Nach dem Wechsel in die Konsole mittels Ctrl+Alt+F2 mountete ich die Windows-Systempartition:

$ sudo su
# mount /mnt/hda1

(klappt übrigens längst auch mit NTFS!) Danach konnte ich eine Inspektion vornehmen:

cd /mnt/hda1
ls -l

Und tatsächlich, neben den einschlägig bekannten Ordner-Namen starrte mich blanke Leere an: Unter C:\ fand sich nur gerade eine Datei, die sich pagefile.sys nannte.

Da hatte meine Schwester also doch tatsächlich alles im Root gelöscht, was nicht niet- und nagelfest war (ich vermute, dass pagefile.sys bei der Löschaktion in Benutzung war, weshalb diese Datei nun wirklich nicht entfernt werden konnte).

On Windows, everything is a file

Nun gut, nicht ganz. Doch ein Versuch war es in diesem Falle wert: Ich ging in den oberen Stock, startete den Windows 2000-Computer meines Vaters und kopierte die Dateien

boot.ini
ntdetect.com
ntldr

auf einen USB-Stick.

USB-Stick nicht gefunden

In der failsafe-Umgebung von Knoppix wurde der USB-Stick leider nicht erkannt (als ich ihn einsteckte, leuchtete er nicht einmal, was auf deaktivierte USB-Ports hindeutet).

Irgendwie musste ich doch in die "normale" Oberfläche hineinkommen? Reboot.

Ich schaute mir am Knoppix-Boot-Screen mit Druck auf F2 und F3 die Vielzahl der möglichen Optionen an. Dann hatte ich die Lösung gefunden:

boot: knoppix 2

Mit dieser Boot-Option startet Knoppix "nur" in den Runlevel 2, also ohne graphische Ausgabe. Genau, was ich benötigte.

Runlevel 2

Nachdem vorbeiflimmern unzähliger Linien über den Linux-Bootvorgang landete ich bei tty2 und konnte mich meiner Kommandozeilen-Kenntnisse bedienen.

  1. Mounten der Windows-Systempartition:
    $ sudo su
    # mount /mnt/hda1
  2. Mounten des USB-Sticks:
    # mount /mnt/sda1
  3. Kopieren der Systemdateien vom USB-Stick auf die Systempartition:
    # cp boot.ini ntdetect.com ntldr /mnt/hda1

Fertig! Zu Probezwecken konnte das System nun neu gestartet werden:

# reboot

Und siehe da - nachdem ich die CD aus dem Laufwerk entfernt hatte, starte Windows frisch und munter in den neuen Arbeitstag hinein ...

Labels: , ,

1 Kommentare | neuen Kommentar verfassen

Dienstag, November 27, 2007

Kleine wget-Tricks

Via ein Video über einen Autisten, der herzergreifend die us-amerikanische Nationalhymne singt ...

... bin ich zum Liedtext vorgedrungen:

The Star Spangled Banner

Das MP3

Auf derselben Seite werden auch drei Tonspuren der Nationalhymne angeboten; darunter eine von LeAnn Rimes.

Da diese Interpretation saugut tönt, wollte ich mir eine "Sicherheitskopie" anfertigen.

Dies hat sich als komplizierter erwiesen als gedacht (ja, ich bevorzuge den Download per wget - insbesondere, wenn es sich um mehrere Megabyte grosse Inhalte handelt):

beta:~/Desktop mario$ wget http://www.englisch-hilfen.de/mp3/leann_rime.mp3--01:11:32--  http://www.englisch-hilfen.de/mp3/leann_rime.mp3
           => `leann_rime.mp3.1'
Resolving www.englisch-hilfen.de... done.
Connecting to www.englisch-hilfen.de[87.106.2.52]:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
01:11:32 ERROR 403: Forbidden.

Soso ... Aber vorhin konnte ich das Stück im Browser doch ohne Probleme anhören? Zwei Möglichkeiten für die unerwartete Weigerung des Web-Servers kommen mir auf Anhieb in den Sinn:

  • Referer-Blocking: Nur wer von der selben Domain auf das MP3 zugreift, darf es herunterladen
  • User Agent-Blocking: User Agents wie "wget 1.9.2" etc. wird der Zugriff auf die Datei nicht erlaubt

Als erstes Versuche ich letzteres und gebe der Anfrage einen anderen User Agent-string mit:

beta:~/Desktop mario$ wget --user-agent Mozilla/4.0 http://www.englisch-hilfen.de/mp3/leann_rime.mp3
--01:11:22--  http://www.englisch-hilfen.de/mp3/leann_rime.mp3
           => `leann_rime.mp3'
Resolving www.englisch-hilfen.de... done.
Connecting to www.englisch-hilfen.de[87.106.2.52]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,910,784 [audio/x-mpeg]

100%[====================================>] 1,910,784    607.03K/s    ETA 00:00

01:11:26 (607.03 KB/s) - `leann_rime.mp3' saved [1910784/1910784]

Na also! Das simple "Mozilla/4.0" reicht bereits, um Zugriff auf die Datei zu erhalten.

Internet-Geschichte

Ursprünglich wurde Mozilla nur als firmeninterne Bezeichnung für den Webbrowser Netscape Navigator benutzt. Zum genauen Ursprung des Namens, der sich auf den ersten populären Webbrowser Mosaic bezieht, gibt es mehrere Erklärungen. Eine besagt, dass er sich aus Mosaic Killa zusammensetzt, laut der anderen aus Mosaic meets Godzilla. Möglicherweise treffen sogar beide Erklärungen zu.

Quelle: Mozilla

Labels: , ,

0 Kommentare | neuen Kommentar verfassen

Montag, November 26, 2007

Das c't vom 26. November 2007

Ein kleiner Streifzug durch die aktuelle Ausgabe der Computerzeitschrift c't:

Offenbar funktioniert Kundenbindung heutzutage nach dem Diodenprinzip und die Kündigung ist dabei die Sperrrichtung. Reinzukommen ist ganz leicht, in der anderen Richtung trifft man auf erheblichen Widerstand.

Quelle: c't, 26. November 2007, "Das Diodenprinzip", S. 1.

Die Expo ist auch als Treffpunkt zwischen Kapitalgebern und Unternehmensgründern konzipiert. In eigenen Workshops gaben Gründer und Investoren Tipps zur Entwicklung von Geschäftskonzepten. Dabei wünschen sich die Kapitalgeber aber "mehr Hacker und weniger MBAs", wie Reshma Sohoni vom Gründer-Netzwerk Seedcamp erklärte.

Quelle: c't, 26. November 2007, "Katerstimmung in Berlin", S. 42.

Swiss fliegt auf Zuverlässigkeit von Windows Server - Linux ohne Starterlaubnis

Ein weiterer Vorteil ist, dass das neue System wesentlich mehr Kapazitäten hat als das alte, das auf 250 Nutzer beschränkt war. [...] "Eine Verbesserung der Uptime auf 99.95% bei gleichzeitiger Kapazitätssteigerung, um mehr Anfragen gleichzeitig zu bearbeiten, ermöglicht es unserem Team, den Anstieg von 30%, den wir bei unserem Online-Vertrieb erleben, spielend abzuwickeln."

Immer schön, wenn sich im Kampf zwischen Gut und Böse auch noch die CIOs ins Rampenlicht stellen:

"[...] Mit Linux hatten wir nicht die nötige Zuverlässigkeit oder Flexibilität." –– Frank Meyer, CIO, SWISS

Mit dieser Aussage stellt sich der CIO gegen den Linux-Erfinder höchstpersönlich:

Torvalds: I think the real strength of Linux is not in any particular area, but in the flexibility. For example, you mention virtualization, and in some ways that's a really excellent example, because it's not only an example of something where Linux is a fairly strong player, but more tellingly, it's an example where there are actually many different approaches, and there is no one-size-fits-all "One True Virtualization" model.

Quelle: Torvalds On Where Linux Is Headed In 2008

Labels: , , ,

0 Kommentare | neuen Kommentar verfassen

Freitag, November 23, 2007

Apache 2.2 gegen LDAP authentifizieren

Die meisten werden es kennen: Wo man sich auch immer in der IT-Landschaft bewegt benötigt man Zugangsdaten. Vielerorts sind diese noch nicht vereinheitlicht (Stichwort Single-Sign-On, Kerberos etc.) - Administratoren wie Endbenutzer müssen sich eine Vielzahl von Benutzernamen und Passwörtern merken, um der täglichen Arbeit nachzugehen.

Wenn wie bei mir auf der Arbeit hingegen bereits ein von einer anderen Einheit betriebenes LDAP-Verzeichnis besteht, kann man dieses bei der Bewirtschaftung von Web-Applikationen zur Benutzer-Authentifizierung und -Authorisierung hinzuziehen.

In der hier vorliegenden Anleitung erläutere ich, wie Web-Verzeichnis gegen unbefugten Zugriff geschützt werden. Zum Einsatz kommen Debian und Apache 2.2 - ich gehe davon aus, dass beides bereits ordnungsgemäss installiert und konfiguriert wurde.

OpenLDAP & Hilfsprogramme installieren

Als erstes installiert man OpenLDAP sowie die ldap-utils mit einigen nützlichen Hilfsprogrammen:

apt-get install slapd
apt-get install ldap-utils

OpenLDAP lässt man aber unkonfiguriert, denn ein aktiver LDAP-Server befindet sich ja bereits im Netzwerk und versieht seinen Dienst.

Anschliessend passt man die Konfiguration von OpenLDAP an:

$ cat /etc/ldap/ldap.conf
BASE            o=org,c=ch
URI             ldaps://ldap.domain.tld
TLS_CACERTDIR   /etc/ldap/cacerts
TLS_REQCERT     never

SSL-Zertifikate

In unserem Falle reichte es, in /etc/ldap einen Symlink auf /etc/ssl/certs einzurichten. Der LDAP-Server verwendet ein Standard-Zertifikat von CyberTrust, welches bei Debian schon von Beginn weg dabei ist (?).

Bei einer frischen Debian-Installation (4.0r3) existiert dieses Verzeichnis nicht; Zertifikate sind auf dem System standardmässig keine vorhanden. Zuerst gilt es nun also, das Zertifikat des Servers herauszufinden:

openssl s_client -connect ldap.domain.tld:636 -showcerts

Anhand dieser Angaben sucht man über Google nach dem "<anbieter> global root" des Anbieters (bspw. Cybertrust) und gelangt so normalerweise sofort zu den gesuchten Information. In meinem Fall war es:

ct_root.pem

Dieses Zertifikat laden wir uns herunter und legen es im Verzeichnis /etc/ldap/cacerts ab.

Anstelle in der ldap.conf explizit ein Zertifikat anzugeben, überlassen wir es OpenLDAP, das richtige Ding zu eruiren. Das klappt natürlich nur, wenn der Sysadmin des LDAP-Servers nicht selbst ein Zertifikat gebastelt hat.

Testlauf

Um zu überprüfen, ob OpenLDAP korrekt konfiguriert wurde, lässt man eine erste Abfrage laufen:

$ ldapsearch -x "uid=maeby"
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: uid=maeby
# requesting: ALL
#

# maeby, suborg, org, ch
dn: ...
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ...
objectClass: ...
objectClass: ...
uid: maeby
shadowFlag: 1
description: temporary staff account, imported from domain
homeDirectory: /home/maeby
uidNumber: 0001
gidNumber: 0010
cn: Mario Aeby
loginShell: /bin/bash

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Wenn dies klappt, geht es zum nächsten Schritt:

Apache 2.2 konfigurieren

Als erstes aktiviert man die zwei LDAP-Module:

$ cd /etc/apache2/mods-enabled
ln -s ../mods-available/ldap.load
ln -s ../mods-available/authnz_ldap.load

Es empfiehlt sich, einen LDAP-Cache einzurichten. Im selben Verzeichnis (/etc/apache2/mods-enabled) erstellt man deshalb eine Datei ldap.conf mit folgendem Inhalt:

$ cat /etc/apache2/mods-enabled/ldap.conf
# Enable the LDAP connection pool and shared
# memory cache. Enable the LDAP cache status
# handler. Requires mod_ldap and mod_auth_ldap

LDAPSharedCacheSize 2000000
LDAPCacheEntries 1024
LDAPCacheTTL 28800
LDAPOpCacheEntries 1024
LDAPOpCacheTTL 28800

# specify shared memory file, to activate cache
LDAPSharedCacheFile /var/cache/apache2/ldap.cache

Web-Verzeichnisse schützen

Das Vorgehen ist ähnlich zu einer Authentifikation über eine htpasswd-Datei, abgesehen davon dass man einige andere Befehle einsetzt:

$ cat .htaccess
AuthType Basic
AuthName Test

AuthLDAPURL "ldaps://ldap.domain.tld/o=org,c=ch?uid"
AuthzLDAPAuthoritative on

AuthBasicProvider ldap

Require ldap-user maeby bgates sjobs

Anstelle Benutzer kann man auch Gruppen spezifizieren - oder gar spezielle Filter mitgeben, die erfüllt sein müssen.

Labels: , , ,

0 Kommentare | neuen Kommentar verfassen

Dienstag, November 06, 2007

PHP wirft mime_magic-Fehler

Wenn beim Aufruf von php-cli folgende Fehlermeldungen ausgespuckt werden ...

PHP Warning:  mime_magic: type search/400       \\input         text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\section       text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\setlength     text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\documentstyle text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\chapter       text/x-tex invalid in Unknown on line 0
PHP Warning:  mime_magic: type search/400       \\documentclass text/x-tex invalid in Unknown on line 0

Quelle: [php-maint] Bug#361789: PHP Warning: mime_magic: type search [..] text/x-tex invalid in Unknown on line 0

... hilft nur noch das Hash-Zeichen in /usr/share/file/magic.mime. Sucht man nach type search, gelangt man innert Bruchteilen zum fraglichen Block. Beim Kommentieren sollte aber auch

#0      regex           [Cc]onstant[[:space:]]+[Ss]tory text/x-inform

nicht vergessen gehen.

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Dienstag, November 06, 2007

Mediawiki mit kurzen und schönen URLs

Mediawiki kann über äusserst hässliche URLs wie http://wiki.domain.tld/index.php?title=Startseite oder aber über kurze und schöne URLs in der Form http://wiki.domain.tld/Startseite angesprochen werden.

Wie? Folgende Kurzanleitung soll mir (und allen anderen Leuten da draussenTM) für zukünftige Installationen als Gedankenstütze dienen:

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule  ^(.+)  /index.php?title=$1  [L]

LocalSettings.php

$wgArticlePath = "/$1";
$wgUsePathInfo = false;

Übrigens: Wenn ich in solchen Momenten den Code dieses Wiki-Systems näher betrachte, frage mich immer wieder, wie Wikipedia mit einem solchen Murks gross werden konnte.

Welches Wiki überzeugt?

Auf der Arbeit an der Uni verwende ich TWiki (Kurzkritik: Perl *wäh*, simple Dateistruktur, GUI unübersichtlich); auf der Arbeit in der Privatwirtschaft Atlassian Confluence. Dieses gefällt mir von all den Wikis da draussen bisher am meisten. Leider kostet es auch einen saftigen Batzen :-/

Labels: , ,

0 Kommentare | neuen Kommentar verfassen

Sonntag, Oktober 21, 2007

Defekte Windows-Installationen mit Knoppix und rsync sichern

Vor einiger Zeit wurde ich zu einem Bekannten gerufen, dessen Windows XP nicht mehr aufstarten wollte - selbst im abgesicherten Modus nicht. Nach einigem Herumpröbeln mit Wiederherstellungspunkten gab ich auf und empfahl dem Kunden eine Neuinstallation mit den Recovery-CDs.

Zuerst galt es aber, die bestehenden Daten zu sichern. Was lag näher, als dazu Knoppix heranzuziehen und das Backup mit Linux-Bordmitteln auf eine USB2-Platte zu bewerkstelligen?

  1. Knoppix-CD einlegen
  2. BIOS-Einstellungen anpassen, damit von CD gebootet wird
  3. Beim Boot-Screen ist die Abfrage mit Enter zu bestätigen
    • Im vorliegenden Fall kam der PC (Fujitsu Siemens Scaleo P) mit den Standard-Einstellungen nicht hoch. Knoppix blieb bei
      accessing knoppix cd at /dev/hdd ...
      hängen
    • Die Boot-Option
      knoppix noaudio nodma
      (muss auf dem Boot-Screen angegeben und danach mit Enter bestätigt werden) liess das Gerät schlussendlich starten. Kurz nach der Suche nach der Knoppix-CD erschien die Meldung
      found primary knoppix compressed image at /cdrom/KNOPPIX/KNOPPIX
  4. Öffnen eines Terminals/Shells (für Windows-Benutzer: "Kommandozeilen-Interface")
  5. Windows-Festplatte mounten:
    sudo mount /mnt/sda1
  6. USB2-Festplatte an den Computer schliessen, mounten:
    sudo mount /mnt/sdb1
  7. Daten von Windows-Festplatte mit rsync auf USB2-Disk spiegeln:
    cd /mnt/sda1
    sudo rsync --verbose -rlt . /mnt/sdb1
    Quelle: rsync Tips & Tricks
  8. Auf dem Bildschirm werden in Echtzeit die Dateien angegeben, die gerade kopiert werden. Die meisten Windows-Systeme sind heute mit NTFS formatiert, weshalb der ntfs-3g-Treiber zum Lesen der Windows-Platte benutzt wird.

Nach ein bis zwei Stunden liegen alle Dateien auf der portablen Festplatte, die Neuinstallation kann nun beginnen.

Tipp: Nu wichtige Dateien sichern

Mit der oben erwähnten Methode wird der gesamte Inhalt der Festplatte gesichert. Wer sich ganz sicher ist, dass er nur bestimmte Ordner benötigt, kann dies mit exclude/include-Anweisungen bewerkstelligen. Nähere Auskunft gibt rsync Tips & Tricks. Leider hatte ich immer wieder Probleme mit der korrekten Formulierung von include/exclude-Anweisungen, weshalb ich ein vollständiges Backup vorziehe.

Folgende Dateien könnten übersprungen werden:

  • hyberfil.sys (~1GB; Speicherabbild im Schlafmodus)
  • pagefile.sys (1.5GB; Auslagerungsdatei)
  • System Volume Information/* (507MB; u.a. Wiederherstellungspunkte)
  • Windows/$NtUninstall* (WindowsUpdates)
  • Windows/$hf_mig$

Labels: ,

1 Kommentare | neuen Kommentar verfassen

Mittwoch, Oktober 17, 2007

Mails mit exim4 pipen

Kürzlich hatte ich auf der Arbeit das Problem, dass ein neu eingeführtes Ticketing-System sich automatisch aller auf die Support-Adresse eingehenden Mails annehmen hätte sollen - es aber nicht tat.

Auf dem Server läuft Debian, als MTA ist exim4 installiert.

In /etc/aliases stand nach der erfolgreichen Installation von Request Tracker (RT) bereits alles zum Besten ...

rt3: "|/home/rt3/bin/rt-mailgate --queue incoming --action correspond --url http://rt3.domain.tld"

... sogar die Weiterleitung war aktiv ...

pc-support: rt3

... doch irgendwie wollte die Zustellung der Mails nach RT einfach nicht klappen! In /var/log/exim4/mainlog war nach erfolglosen Mail-Versuchen (vorerst vom localhost aus, später auch aus dem LAN) zu lesen:

2007-10-09 05:23:42 1Ieqtj-0000u4-40 == |/home/rt3/bin/rt-mailgate --queue incoming --action correspond --url http://rt3.domain.tld  R=system_aliases defer (-30): pipe_transport unset in system_aliases router

Nach einer etwas längeren Google-Suche war das Problem eingegrenzt: exim4 pipet Mails in der Standardkonfiguration nicht. Die Entwickler raten in der Doku zwar vom Pipen nach herkömmlicher Art ab - aber wenn niemand ein anständiges Beispiel beilegt und die Dokumentation im Kreis herumführt (In Z steht: "Schaue in XY nach" und in XY steht "Schaue in Z nach"), biegt man die Konfiguration halt so um, dass zumindest die "mittelalterliche" und gewohnte Vorgehensweise klappt.

Hierzu mussten in der Datei /etc/exim4/exim4.conf.template (falls eine monolithische Konfigurationsdatei verwendet wird) folgende Zeilen eingetragen werden:

...
# for explanation and some workarounds.

SYSTEM_ALIASES_USER = rt3
SYSTEM_ALIASES_GROUP = rt3
SYSTEM_ALIASES_PIPE_TRANSPORT = address_pipe

system_aliases:
...

Seither gelangen neu eintreffende Mails direkt in das Ticketing-System und warten nun darauf, freiwillig von einem der Supporter übernommen zu werden. Dies scheint ein deutlich grösseres Problem zu sein *zwinker*

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Montag, Oktober 01, 2007

Linux-Pinguin

Tux: Was nicht fliegen kann, kann auch nicht abstürzen.

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Samstag, September 15, 2007

Bye bye, SCO!

SCO Group today filed for bankruptcy protection.

Quelle: SCO files for US bankruptcy protection

Endlich ist die Bude hops gegangen. In den letzten Jahren produzierte das Unternehmen nichts substanzielles mehr, als es mit Hilfe einer Horde Rechtsverdreher gegen den Giganten IBM vor Gericht zog. Grund der Klage: IBM habe Unix-Quellcode geklaut und in Linux eingebaut.

Ausser Spesen nichts gewesen: In einem Monat sollen 9 Millionen US-Dollar an die Anwälte überwiesen worden sein. Wenn zwei sich streiten freuen sich am Ende nur die Anwälte.

Labels: , ,

0 Kommentare | neuen Kommentar verfassen

Donnerstag, September 13, 2007

MySQL: Table is marked as crashed and should be repaired

Als ich gestern phpMyAdmin auf einem von mir betreuten Web-Server aufrief, erhielt ich folgende Fehlermeldung präsentiert:

#145 - Table './wsu/smt_stats' is marked as crashed and should be repaired 

Hossa! In meiner ganzen Karriere habe ich so etwas noch nie erlebt. Nun, was tun? phpMyAdmin verfügt in seiner Oberfläche unter tabelle > Operations > Table Maintenance diverse Möglichkeiten zur Fehlerbehebung:

  • Check table
  • Analyze table
  • Repair table
  • Optimize table

Leider waren diese Befehle im aktuellen Fall nicht zugänglich - anstelle der Liste erschien oben genannte Fehlermeldung.

Glücklicherweise kann man in der Tabellenübersicht einer Datenbank Tabellen mit der Checkbox markieren und aus dem Befehle-Drop-Down dann 'Repair' auswählen. Leider brachte dies nichts, die Fehlermeldung erschien weiterhin. Das Problem schien schwerwiegender zu sein, als zuerst angenommen.

Deshalb ging es einerseits rüber zu Google, ums ich über die Möglichkeiten der Tabellenreparatur schlau zu machen, andererseits per SSH auf den Server selbst.

Auf Ways to repair MYSQL Databases fand ich Empfehlungen für solche Fälle, welche ich der Reihe nach ausprobierte.

mysqlcheck

hist-web:~# mysqlcheck -uroot -p wsu smt_stats
Enter password: 
wsu.smt_stats
error    : Table './wsu/smt_stats' is marked as crashed and should be repaired

Oookey ... der Nächste bitte!

myisamchk

Zuerst fährt man MySQL ordnungsgemäss herunter:

/etc/init.d/mysql stop

Dann kann man sich mit dem Brachial-Tool ans Werk machen:

hist-web:/var/lib/mysql/wsu# myisamchk smt_stats.MYI
Checking MyISAM file: smt_stats.MYI
Data records:  139144   Deleted blocks:       0
myisamchk: warning: Table is marked as crashed
- check file-size
myisamchk: error: Size of datafile is: 10473472          Should be: 10473480
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
myisamchk: error: Found 139145 keys of 139144
- check record links
myisamchk: error: Recordlink that points outside datafile at 10473420
MyISAM-table 'smt_stats.MYI' is corrupted
Fix it using switch "-r" or "-o"

Ich tat, wie mir befohlen wurde:

hist-web:/var/lib/mysql/wsu# myisamchk -r smt_stats.MYI
- recovering (with sort) MyISAM-table 'smt_stats.MYI'
Data records: 139144
- Fixing index 1
Found block that points outside data file at 10473420

Zur Sicherheit überprüfte ich die Tabelle erneut:

hist-web:/var/lib/mysql/wsu# myisamchk smt_stats.MYI
Checking MyISAM file: smt_stats.MYI
Data records:  139144   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links

Da alles wieder rosig aussah, konnte man MySQL wieder hochfahren:

/etc/init.d/mysql start

Labels:

2 Kommentare | neuen Kommentar verfassen

Mittwoch, September 12, 2007

VLC gibt Audio von Netzlaufwerk zerhackt wieder

Auf meinem File-Server (Debian GNU/Linux) hier zu Hause liegen unzählige Gigabytes an Musik und Filmen herum. Um sie auf meiner Workstation (Mac OS X) anzuschauen, mounte ich die Verzeichnisse mit dem SMB-Protokoll über das vor einiger Zeit zugekaufte Gigabit-Netzwerk. Zur Wiedergabe benutze ich den Videolan-Client 0.8.6 (heute als VLC bekannt) in der PowerPC-Version.

Leider kommt es immer wieder vor, dass Audio-Signale zerhäckselt ausgegeben werden. Unter Window > Message steht in solchen Fällen folgendes:

main debug: audio output is starving (210051), playing silence

Nachdem ich mich jahrelang um dieses Problem foutiert hatte, platzte mir gestern bei Episode 3 der zweiten Staffel von The IT Crowd der Kragen. Einige Google-Suchen später präsentierte man mir die Lösung:

  1. Preferences
  2. Input / Codes
  3. Access Modules
  4. File
  5. Caching value in ms = 5000

Quelle: VLC and wireless networks

So kam ich in den Genuss einer amüsanten Folge, in der einerseits die RIAA hochgenommen wurde (die Anti-Piraterie-Werbung hat sich seit der Austrahlung auf Channel 4 rasant im Netz verbreitet) ...

... andererseits die deutschen Kannibalen persifliert wurden. Anscheinend hat dieser Menschenesser bei den Briten für Furore gesorgt wie niemand mehr seit Adolf:

Labels: , , , , ,

0 Kommentare | neuen Kommentar verfassen

Mittwoch, September 12, 2007

Mit wget ganze Sites abräumen

wget -r -nd -np -erobots=off "http://server.tld/"
  • -r recursive (= folge und Downloade alle verlinkten Dokumente wie HTML-Dateien und Bilder)
  • -nd nodirectories (= lege Downloads nicht in Unterordner ab)
  • -np noproblem ... eh ... noparent (= folge keinen Links, die eine Ordner-Ebene höher liegen)
  • -erobots=off evaluate robots.txt (= beachte robots.txt)

Im Netz habe ich auch noch diese Version gefunden:

wget -m -k -K -E "http://server.tld/"

Hat ebenso gut geklappt.

Labels: ,

3 Kommentare | neuen Kommentar verfassen

Montag, September 10, 2007

Wo dpkg seine Installationsscripts ablegt

Vor kurzem hatte ich mit einem .deb-Paket zu kämpfen, dass bei der Installation Probleme verursachte. Nachdem ich mich im Internet kundig gemacht hatte, konnte ich unter

/var/lib/dpkg/info/<paket>.preinst
/var/lib/dpkg/info/<paket>.postinst

Einsicht in die Installationsroutine (Shell-Scripts) nehmen und denn Fehler isolieren.

Labels:

0 Kommentare | neuen Kommentar verfassen

Sonntag, September 09, 2007

Kernel Hackers

Quelle: Kernel Summit 2007 group photo, annotated

Dazu das Gespräch mit meiner Freundin per MSN:

Mario: lwn.net/Articles/248891/

Melanie: was si das fürtigi

Mario: programmier vom linux kernel

Melanie: die gseh au chli behinderet us

Mario: ja, wesi würe usgseh wie supermodels würi si äuä ke kernel programmiere ...

Übersetzung für deutsche Mitleser:

Mario: lwn.net/Articles/248891/

Melanie: Was sind das für Leute?

Mario: Programmier des Linux-Kernels

Melanie: Die sehen alle ein wenig behindert aus

Mario: Ja, wenn sie wie Supermodels aussehen würden, würden sie wohl kaum Kernel programmieren ...

Ich halte Millionen Mal mehr auf diesen Jungs als auf alle Heidis, Naomis und Giseles da draussen.

Ferner: The IT Crowd is back!


The IT Crowd - Season 2 - Zattoo
Originally uploaded by emeidi

Die ersten Folgen der zweiten Season der Kult-Serie für Geeks und solche, die es werden möchten, finden sich bereits auf einschlägigen Web-Sites:

Torrentz: it crowd

Siehe auch: Artikel vom Februar 2006 über die erste Staffel

Labels: ,

3 Kommentare | neuen Kommentar verfassen

Freitag, September 07, 2007

ktrace und kdump (strace unter Mac OS X)

Das unter GNU/Linux so nützliche Tool strace findet sich leider nicht unter Mac OS X. Glücklicherweise haben die Macher Darwin aber ktrace mitgegeben, welches die identische Aufgabe erfüllt.

Informationen dazu erhielt ich über eine Dokumentationsseite von Kaspersky sowie über eine vorzügliche Präsentation von den "Kollegen" in Zürich.

Heute habe ich dieses Tool auf der Arbeit benutzt, um auf einem widerspenstigen PowerMac G5 1.6GHz die Applikation Software Update zu debuggen. Jedes Mal, wenn man diese Applikation über das Apfel-Menu aufrief, verbreiterte sich das freie Plätzchen im Dock für einige Hundertstelsekunden, ohne dass aber das Icon erschien. Das Programm konnte aus irgendeinem Grund nicht geladen werden.

Es war wieder einmal der Zeitpunkt gekommen, an dem ich mein geballtes Mac/Unix-Fachwissen anwenden konnte *höhö*

fs_usage

Zuerst einmal durfte sich fs_usage profilieren, indem es mir aufzeigen sollte, was die Applikation beim Start so alles an Dateien aufrief (fs_usage = "Zugriffe auf des Dateisystems"):

[dkf38-222:~] mario% sudo fs_usage | grep pdat
16:19:35  getattrlist     /System/Library/CoreServices/Software Update.app                                  0.000048   Dock        
16:19:35  lstat           /System/Library/CoreServices/Software Update.app                                  0.000031   Dock        
16:19:35  stat            /System/Library/CoreServices/Software Update.app/Contents                         0.000016   Dock        
16:19:35  open            /System/Library/CoreServices/Software Update.app/Contents/Info-macos.plist        0.000039   Dock        
16:19:35  open            /System/Library/CoreServices/Software Update.app/Contents/Info.plist              0.000018   Dock        
16:19:35  open            /System/Library/CoreServices/Software Update.app/Contents/Resources               0.000020   Dock        
16:19:35  open            Services/Software Update.app/Contents/Resources/English.lproj/InfoPlist.strings   0.000033   Dock  
16:19:35  lstat           /System/Library/CoreServices/Software Update.app                                  0.000012   Dock
16:19:35  getattrlist     /.vol/234881034/22761/Contents/Resources/Software Update.icns                     0.000019   Dock

Hmmm - irgendwie nicht das Gelbe vom Ei.

ktrace und kdump

Bevor ich ktrace anwenden konnte, musste ich zuerst das Executable innerhalb des .app-Ordners ausfindig machen (.app-Bundles - dafür sollten die seligen NeXT-Entwickler den think eMeidi Liftetime Achievement-Award erhalten):

/System/Library/CoreServices/Software\ Update.app/Contents/MacOS/Software\ Update

Mit dieser Erkenntnis ausgerüstet, konnte ich mit der Brechstange ktrace hinter den Prozess:

[dkf38-222:~] mario% sudo ktrace /System/Library/CoreServices/Software\ Update.app/Contents/MacOS/Software\ Update

Nichts geschah. Häh? Erst nach reichlichen Überlegungen und Konsultationen von Web-Sites bemerkte ich die nun in ~ liegende ktrace.out, deren man nun mit kdump die Geheimnisse entlocken musste:

[dkf38-222:~] mario% sudo kdump
   668 ktrace   RET   ktrace 0
   668 ktrace   CALL  execve(0xbffffdff,0xbffffd7c,0xbffffd84)
   668 ktrace   NAMI  "./Software Update"
   668 ktrace   RET   execve -1 errno 8 Exec format error
   668 ktrace   CALL  execve(0x9012bf18,0xbffff730,0xbffffd84)
   668 ktrace   NAMI  "/bin/sh"
   668 ktrace   NAMI  "/usr/lib/dyld"
   668 sh       RET   execve 0
   668 sh       CALL  open(0x152c,0,0)
   668 sh       NAMI  "/usr/lib/libncurses.5.dylib"
   668 sh       RET   open 4
   668 sh       CALL  fstat(0x4,0xbffffaf0)
   668 sh       RET   fstat 0
   668 sh       CALL  load_shared_file(0x152c,0x98000,0x441d8,0xbffff900,0x4,0xbffff890,0xbffff904)
   668 sh       NAMI  "/usr/lib/libncurses.5.dylib"
   668 sh       RET   load_shared_file 0
   668 sh       CALL  close(0x4)
   668 sh       RET   close 0
   668 sh       CALL  open(0x1560,0,0)
   668 sh       NAMI  "/usr/lib/libSystem.B.dylib"
   668 sh       RET   open 4
   668 sh       CALL  fstat(0x4,0xbffffaf0)
   668 sh       RET   fstat 0
   668 sh       CALL  load_shared_file(0x1560,0x98000,0x1ac500,0xbffff900,0x4,0xbffff890,0xbffff904)
   668 sh       NAMI  "/usr/lib/libSystem.B.dylib"
   668 sh       RET   load_shared_file 0
   668 sh       CALL  close(0x4)
   668 sh       RET   close 0
   668 sh       CALL  open(0x900006e8,0,0)
   668 sh       NAMI  "/usr/lib/system/libmathCommon.A.dylib"
   668 sh       RET   open 4
   668 sh       CALL  fstat(0x4,0xbffffa80)
   668 sh       RET   fstat 0
   668 sh       CALL  load_shared_file(0x900006e8,0x98000,0x6ac4,0xbffff890,0x3,0xbffff820,0xbffff894)
   668 sh       NAMI  "/usr/lib/system/libmathCommon.A.dylib"
   668 sh       RET   load_shared_file 0
   668 sh       CALL  close(0x4)
   668 sh       RET   close 0
   668 sh       CALL  __sysctl(0xbffffc98,0x2,0xbffffca0,0xbffffca4,0,0)
   668 sh       RET   __sysctl 0
   668 sh       CALL  sigprocmask(0x1,0,0x93a34)
   668 sh       RET   sigprocmask 0
   668 sh       CALL  open(0x797b4,0x6,0x20000000)
   668 sh       NAMI  "/dev/tty"
   668 sh       RET   open 4
   668 sh       CALL  close(0x4)
   668 sh       RET   close 0
   668 sh       CALL  getuid
   668 sh       RET   getuid 0
   668 sh       CALL  getgid
   668 sh       RET   getgid 0
   668 sh       CALL  getuid
   668 sh       RET   getuid 0
   668 sh       CALL  getgid
   668 sh       RET   getgid 0
   668 sh       CALL  sigprocmask(0x1,0,0x93724)
   668 sh       RET   sigprocmask 0
   668 sh       CALL  fstat(0x2,0xbffff960)
   668 sh       RET   fstat 0
   668 sh       CALL  fstat(0x1,0xbffff960)
   668 sh       RET   fstat 0
   668 sh       CALL  sigaction(0x14,0xbffff960,0xbffff9d0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigaction(0x14,0xbffff960,0xbffff9d0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigaction(0x2,0xbffff960,0xbffff9d0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigaction(0x2,0xbffff960,0xbffff9d0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigaction(0x3,0xbffff960,0xbffff9d0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigaction(0x3,0xbffff960,0xbffff9d0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigprocmask(0x1,0,0x94128)
   668 sh       RET   sigprocmask 0
   668 sh       CALL  sigaction(0x3,0xbffff910,0xbffff980)
   668 sh       RET   sigaction 0
   668 sh       CALL  __sysctl(0xbffffa20,0x2,0xbffffa80,0xbffffa28,0,0)
   668 sh       RET   __sysctl 0
   668 sh       CALL  stat(0x100ef0,0xbffff8b0)
   668 sh       NAMI  "/System/Library/CoreServices/Software Update.app/Contents/MacOS"
   668 sh       RET   stat 0
   668 sh       CALL  stat(0x79f24,0xbffff910)
   668 sh       NAMI  "."
   668 sh       RET   stat 0
   668 sh       CALL  getpid
   668 sh       RET   getpid 668/0x29c
   668 sh       CALL  getpid
   668 sh       RET   getpid 668/0x29c
   668 sh       CALL  stat(0x79f24,0xbffff8d0)
   668 sh       NAMI  "."
   668 sh       RET   stat 0
   668 sh       CALL  stat(0x1016a0,0xbffff7c0)
   668 sh       NAMI  "/bin/sh"
   668 sh       RET   stat 0
   668 sh       CALL  stat(0x1016a0,0xbffff7d0)
   668 sh       NAMI  "/bin/sh"
   668 sh       RET   stat 0
   668 sh       CALL  getpgrp
   668 sh       RET   getpgrp 668/0x29c
   668 sh       CALL  sigaction(0x14,0xbffff950,0xbffff9c0)
   668 sh       RET   sigaction 0
   668 sh       CALL  sigprocmask(0x1,0,0x93a34)
   668 sh       RET   sigprocmask 0
   668 sh       CALL  open(0x101de0,0,0x1)
   668 sh       NAMI  "./Software Update"
   668 sh       RET   open 4
   668 sh       CALL  ioctl(0x4,FIODTYPE,0xbffffa60)
   668 sh       RET   ioctl -1 errno 25 Inappropriate ioctl for device
   668 sh       CALL  ioctl(0x4,TIOCGETA,0xbffffa30)
   668 sh       RET   ioctl -1 errno 25 Inappropriate ioctl for device
   668 sh       CALL  lseek(0x4,0,0,0x1)
   668 sh       RET   lseek 0
   668 sh       CALL  read(0x4,0xbffffac0,0x50)
   668 sh       GIO   fd 4 read 0 bytes
       ""
   668 sh       RET   read 0
   668 sh       CALL  lseek(0x4,0,0,0)
   668 sh       RET   lseek 0
   668 sh       CALL  getrlimit(0x8,0xbffff9f0)
   668 sh       RET   getrlimit 0
   668 sh       CALL  dup2(0x4,0xff)
   668 sh       RET   dup2 255/0xff
   668 sh       CALL  close(0x4)
   668 sh       RET   close 0
   668 sh       CALL  fcntl(0xff,0x2,0x1)
   668 sh       RET   fcntl 0
   668 sh       CALL  fcntl(0xff,0x3,0)
   668 sh       RET   fcntl 0
   668 sh       CALL  fstat(0xff,0xbffffad0)
   668 sh       RET   fstat 0
   668 sh       CALL  lseek(0xff,0,0,0x1)
   668 sh       RET   lseek 0
   668 sh       CALL  sigprocmask(0x1,0,0x93a34)
   668 sh       RET   sigprocmask 0
   668 sh       CALL  read(0xff,0x100180,0x1)
   668 sh       GIO   fd 255 read 0 bytes
       ""
   668 sh       RET   read 0
   668 sh       CALL  exit(0)

Hmmm. Nachdem ich mich in die Prozeduren eingelesen hatte, fielen mir folgende Zeilen auf:

668 sh       CALL  ioctl(0x4,FIODTYPE,0xbffffa60)
   668 sh       RET   ioctl -1 errno 25 Inappropriate ioctl for device
   668 sh       CALL  ioctl(0x4,TIOCGETA,0xbffffa30)
   668 sh       RET   ioctl -1 errno 25 Inappropriate ioctl for device

Eine Google-Suche nach "ioctl -1 errno 25 Inappropriate ioctl for device" ergab zwar einige Treffer, doch ich konnte mir keinen Reim daraus machen.

Netzwerk-Einstellungen?

Durch einige gefundene Seiten sensibilisiert erachtete ich nun Netzwerk-Troubles als Ursache. Was liegt da näher, als die Netzwerkeinstellungen zurückzusetzen?

Würde die Maschine unter Windows arbeiten, wären hierzu viele komische Klicks und wohl ein Abstecher in den Registry-Dschungel nötig. Unter Mac OS X hingegen beschränkte sich der Aufwand auf ein simples:

sudo rm /Library/Preferences/SystemConfiguration/preferences.plist

Beim nächsten Zugriff auf die Netzwerkeinstellunge via Apfel-Menu > Location fand ich eine jungfräuliche Netzwerkkonfiguration vor. Leider hat auch dies nichts gebracht.

tcpdump

Nun, der Feierabend rückte unaufweigerlich näher, doch ein cooles Tool wollte ich noch ausprobieren: tcpdump. Fantastisch, was nach dem Aufruf dieses Tools alles über die Shell flimmert - in einem Unternehmens-LAN hört die TCP-Party wohl nie auf *smile*

Leider gab auch dies keine Aufschlüsse über das Problem. Immerhin weiss ich jetzt, dass IP-Adressen, die mit 224.0. beginnen, ganz besondere (Multicast-)Adressen sind ...

Labels: , , ,

0 Kommentare | neuen Kommentar verfassen

Dienstag, September 04, 2007

exim4: Message is frozen

Heute habe ich in meiner /var/log/exim4/mainlog komischen Zeilen vorgefunden:

2007-09-04 17:15:30 Start queue run: pid=3437
2007-09-04 17:15:30 1ISVRa-0003X6-Ag Message is frozen
2007-09-04 17:15:30 1ISVPl-0003UC-HI Message is frozen
2007-09-04 17:15:30 1ISVSO-0003YE-FE Message is frozen
2007-09-04 17:15:30 End queue run: pid=3437

Folgender Befehl löste (zumindest auf meinem Rechner) die temporäre "Verstopfung" tadellos:

exim4 -qff

Labels:

3 Kommentare | neuen Kommentar verfassen

Mittwoch, August 15, 2007

LaTeX mit maximaler Seitenausnutzung und minimalen Seitenrändern

Heute habe ich eine meiner Web-Applikationen auf der Arbeit um die nützliche Funktion erweitert, PDF-Dateien auszugeben. Der Inhalt ist eine Tabelle (longtable, wer LaTeX-kundig ist), die im Querformat ausgegeben werden soll. Mit den Standardeinstellungen der Dokumentenklasse report konnte sich die Tabelle überhaupt nicht entfalten, weshalb ich mich auf der Suche nach Einstellungen machte, die den auf einer Seite zur Verfügung stehenden Platz maximieren:

\documentclass[10pt,a4paper,landscape]{report}

\setlength\topmargin{0cm}
\setlength\headheight{0cm}
\setlength\headsep{0cm}
\setlength\textheight{160mm}
\setlength\textwidth{245mm}
\setlength\oddsidemargin{0cm}
\setlength\evensidemargin{0cm}

\begin{document}
\end{document}

\textheight{} und \textwidth{} waren dabei die massgeblichen Befehle, auch wenn die anderen \setlengths ihren Teil zum Endprodukt beitragen.

Fazit: Anstelle von 16 habe ich das PDF auf 11 Seiten heruntergerechnet.

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Montag, Juli 30, 2007

IIS vs. Apache

Windows Server/IIS

Linux/Apache

In his post, Stiennon explains that both images (shown here) represent a map of system calls that occur when a web server serves a single HTML page with a picture. The same page and picture have been used on both servers for the purpose of testing.

Quelle: Windows vs Linux Server

Wir haben es immer vermutet, jetzt ist es klar: Wer kein Gefrickel will, wählt Open-Source!

In its long evolution, Windows has grown so complicated that it is harder to secure. Well these images make the point very well.

Quelle: Why Windows is less secure than Linux

Labels: , , ,

1 Kommentare | neuen Kommentar verfassen

Freitag, Juli 27, 2007

Datei aus tar-Archiv wiederherstellen

Von Zeit zu Zeit erstelle ich von meinem Linux-Server hier zu Hause ein Backup mit mkcdrec. Das daraus resultierende iso-Image wird dann auf CD gebrannt und in mein Bankschliessfach nach Bern transferiert. Damit ich bei einem Notfall nicht bei meiner Bank vorsprechen muss, belasse ich das iso auf dem Server.

Leider muss ich hie und da auf die Backups zurückgreifen - wie heute. Mit einer blöden Aktion habe ich mir meine named.conf überschrieben. Was nun?

Als erstes habe ich das Image auf meine Workstation (Mac OS X) kopiert und danach gemountet (das Mounten ginge selbstverständlich auch ohne Transfer über das Netzlaufwerk). Danach habe ich die entsprechende Partition gesucht und das Datei-basierte, komprimierte Backup auf den Desktop verschoben.

Als nächstes musste die gz-Datei entpackt werden:

$ gunzip sda7._.tar.gz

Nun haben wir eine tar-Datei rumliegen. Im Normalfall möchte man einige wenige Dateien wiederherstellen, weshalb es sich nicht lohnt, gleich den ganzen Inhalt des "Tape Archives" zurückzuschreiben. Deshalb sucht man den exakten Pfadnamen der Datei, in meinem Fall named.conf:

$ tar --list --file=sda7._.tar | grep named.conf
./etc/bind/named.conf

Mit der obigen Angabe können wir nun die Datei aus dem Archiv herausholen:

$ tar --extract --file=sda7._.tar ./etc/bind/named.conf

Fertig.

Labels:

5 Kommentare | neuen Kommentar verfassen

Samstag, Juli 07, 2007

fink bringt GNU-Software auf den Mac

Der Ordnung halber sei fink erwähnt - wer GNU-Software auf seinem Mac braucht (und demzufolge ein Power-User von Terminal & Co. ist), hat das Ding längst installiert:

How to install Linux applications in OS X - a complete walkthrough

Nebenbei: Leider war ich bisher zu Faul, die Pfad-Variable mit /sw/bin zu ergänzen, weshalb ich jedesmal, wenn ich das gute, alte wget verwenden will, den absoluten Pfad zum Tool angeben muss:

beta:~ mario$ /sw/bin/wget -V
GNU Wget 1.8.2

Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

Originally written by Hrvoje Niksic .

Alternative

Die Alternative ist Darwin Ports - doch mit diesem Paket-Manager und Repository habe ich (leider) keine Erfahrung.

Labels: ,

0 Kommentare | neuen Kommentar verfassen

Samstag, Juli 07, 2007

Mac OS X Terminal einfärben

Nun bin ich also gerade daran, (gemäss Anweisungen der GTD-Gurus) meinen Desktop von altem Ballast zu "decluttern" und arbeite mich durch hunderte von .webloc-Dateien. Eine davon zeigt auf den Artikel Color Your OS X Command Prompt.

Um unter Mac OS X 10.3.9 in den Genuss farbiger Listings zu kommen, muss die Datei ~./bashrc (~./bash_profile geht auch) mit folgendem Inhalt erstellt werden:

export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

Bei einem schwarzen Hintergrund sind folgende Farben lesbarer:

export LSCOLORS=dxfxcxdxbxegedabagacad

Ausserdem sollte das Terminal unter Preferences auf xterm-color geschaltet werden. Nun noch ein Neustart der Applikation, und fertig ist das Farbenwunder!

Labels: ,

2 Kommentare | neuen Kommentar verfassen

Donnerstag, Juni 21, 2007

Wie viele RSS-Abonnenten habe ich? (oder: Shell-Tricks)

Angespornt durch den Artikel 10 Techniques I Used To Go From 0 To 12,000 RSS Subscribers In Seven Months - With No Ads Or Leverage nahm mich Wunder, wieviele RSS-Abonnenten ich denn ungefähr habe.

Dank meinem Hosting-Provider Genotec habe ich Zugriff auf die RAW Log-Files von Apache. Als Stichprobenraum wählte ich den ganzen Monat Mai.

Zur Analyse lud ich die 31 2007-05-*.gz per FTP auf den lokalen PC herunter. Damit war die Arbeit mit dem Mac-GUI erledigt und ich wendete mich einer Mac OS X Terminal-Session zu.

  1. Entpacken und zusammenfügen der täglichen Log-Dateien zu einem grossen File
    gunzip *.gz
    cat access_log* > access.log
  2. Herausfiltern der Zugriffe auf atom.xml sowie rss.xml (die beiden Dateien enthalten die Feeds im XML-Format)
    cat access.log | grep atom.xml > access-atom.log
    cat access.log | grep rss.xml > access-rss.log
  3. Isolieren der Hosts (d bedeutet "Delimiter" oder Trennzeichen; in meinem Fall ist es das Leerzeichen; f bedeutet "Field"). Mit der Kenntnis des Formats des Apache-access.logs sollte es klar sein, dass ich damit die Spalte mit der IP- oder DNS-Adresses des zugreifenden Clients vom restlichen Datenmüll trenne
    cat access-atom.log | cut -d " " -f 1
  4. Nun bringen wir etwas Ordnung in die Sache, fasse Anfragen von identischen Hosts zusammen und geben aus reinem Gwunder auch gleich noch aus, wieviele Anfragen der jeweilige Host verursacht hat:
    sort | uniq -c
  5. Um die Anzahl Abonnenten zu eruieren, benutzen wir das Tool wc (wordcount) mit dem Switch l, der das Tool anweist, Linien (und nicht etwa Wörter) zu zählen
    wc -l

Alle Befehle nacheinander gepipet ergeben folgenden Einzeiler (für Zugriffe auf das altmodische atom.xml):

cat access.log | grep atom.xml | cut -d " " -f 1 | sort | uniq | wc -l

Wer

Die Antwort

Im Monat Mai war mein Blog also von 1634* Lesern abonniert.

*) Bemerkungen

  • Hinter einem Host können sich auch mehrere Leser verbergen (bspw. Google Reader)
  • In dieser Statistik werden auch Hosts gezählt, die im ganzen Monat nur gerade eine Anfrage auf den Feed gemacht haben. Einerseits können dies Leute mit dynamischen IP-Adressen sein, andererseits auch Leute, die ich mit meinem Geschreibsel nicht zu fesseln vermochte.

Qualitative Aussagen

Zu meinen Abonnenten gehören Computer, die (neben anderen) in folgenden Unternehmensnetzwerken stehen:

  • Universität Bern
  • Universität Zürich
  • ZHW
  • ISZ
  • GIBB
  • Universität Leipzig
  • Planetlab MIT/Princeton
  • UCLA Computer Science
  • Ravensbourne College of Design and Communication
  • Espace Media
  • Swisscom
  • Axpo
  • Bundesverwaltung
  • Netstyle
  • Init7
  • Merck

Es scheint sogar einen (?) Leser zu geben, der meine Blogs auf seinem Mobiltelefon liest. Suchthaufen! *zwinker*

Google-Kandidaten aufgepasst!

Eine solche Frage kann einem übrigens während einem Telefoninterview mit Google gestellt werden. Merkt euch als die glorreichen cat, grep, cut, sort, uniq, und ihr seid eurem Traumjob näher.

Labels: , ,

3 Kommentare | neuen Kommentar verfassen

Dien