www.thomas-guettler.de / Vorträge

Güttli's Tipps und Tricks der EDV

Ich habe etwa im Jahr 2000 mit einer Text-Datei namens readme.guettli angefangen. Dort wurden kleine Shell-Scripte und Argumente für Befehle aufgeschrieben, die man im Beruf oder in der Freizeit immer wieder benötigt. Im Laufe der Zeit wurde die Datei überarbeitet und steht hier nun schon mehrere Jahre für andere zur Verfügung.

Während eine sachliche Beschreibung von Software meistens vorhanden ist, fehlt oft eine subjektive Wertung. Darum stelle ich außerdem meine Sichtweise vor. Da für jedes Problem mehrere Lösungsmöglichkeiten existieren, hoffe ich mit Hinweisen wie "ich finde aufgrund XYZ Programm A besser als Programm B" Einsteigern zu helfen.

Seit Juli 2016 pflege ich meine Tipps zur Softwareentwicklung hier: My personal programming guidelines

Inhaltsangabe
Linux vs. Windows
Interaktive Programme
Shell
Sonstiges
Programmiersprachen
Web-Design und Web-Entwicklung
Persönliche Meinung
Historie

1 Linux vs. Windows [toc]

Die Diskussion bei welchen Aspekten Linux oder Windows besser ist, ist immer wieder interessant. Da es die meisten Linux-Programme für Windows gibt, jedoch die wenigsten Windows-Programme für Linux, verstehe ich jeden Anwender der nicht zu Linux wechseln will.

Als Betriebssystem für Server und als Plattform für Softwareentwicklung, verwende ich auf jeden Fall Linux.
Aufgabe Windows Linux
Serverprozesse Windows unterstützt folgende Funktionen nicht:
  • select() auf Pipes
  • fork()
  • pass_fd: Offene Filedescriptoren zwischen Prozessen austauschen
Linux ist wie die meisten Unix-Systeme gut geeignet für Serveranwendungen.
Anwendungen Unter Windows gibt es viele GUI-Anwendungen. Alles schön bunt. Viel Spaß beim Klicken. Unter Linux gibt es viele Serveranwendungen. Mail-, DNS-, Web-, Zeitserver .... Alles schön stabil. Viel Spaß beim Netzwerkeln. Eine Alternative zum Zeichenprogramm MS-Viso gibt es aber derzeit für Linux nicht (Dia, Inkscape, LibreOffice Draw sind noch nicht so gut).


Meine Tipp: Kein Dual-Boot! Also nicht Linux und Windos parallel installieren. Entscheide dich für ein Betriebssystem und starte das andere in einer virtuellen Umgebung. Dual-Boot Umgebungen machen immer Ärger.

2 Interaktive Programme [toc]

Um zwei Dateien Zeile für Zeile zu vergleichen, kann man Folgendes verwenden:
diff -w -y -W 200 -t old.txt new.txt | less

 -w:     Ignoriere Änderungen die nur aus Leerzeichen bestehen
 -y:     Zeige die Dateien nebeneinander an
 -W 200: Verwende insgesamt 200 Zeichen in der Breite (Etwa 100 für old.txt, und 100 für new.txt)
 -t:     Geben keine Tabs, sondern Leerzeichen aus (Nötig, wenn less mit der Option -x4 (Ein Tab entspricht vier Leerzeichen) gestartet wird)
Schöne bunte Diffs kann man mit vimdiff oder meld produzieren. Der Email Client Thunderbird läuft unter Windows, Linux und vielen anderen Betriebssystemen. Folgende Plugins verwende ich: Es lohnt sich auch mit den Keyboardshortcuts zu beschäftigen: Shortcuts

2.3 Pager [toc]

Der Pager less ist eines der wichtigsten Werkzeuge auf der Kommandozeile. Er zeigt Ausgaben von Programmen oder ASCII-Dateien seitenweise an:

    > beispiel_command | less

    oder

    > less .bashrc

    Die wichtigsten Befehle:

     /     --> Suchen (n: Nächster Treffer; N: vorhergehender Treffer)

     F     --> wie "tail -f": Die Anzeige wird aktualisiert,
           falls neue Daten da sind. 
           Wieder zurück in den Pager-Modus mit ctrl-c.
           Kann auch beim Aufruf angegeben werden: "less +F datei.log"

     -S    --> Zu lange Zeilen werden nicht umgebrochen

     g/G   --> Gehe zum Anfang/Ende der Datei

     20G   --> Gehe zur Zeile Nummer 20
Folgende Umgebungsvariable setze ich in .bashrc
    #less pager
    #q:  silent
    #Q:  allways quiet (Switching from "F" back)
    #i:  case insensitiv search
    #x4: Tab is four spaces (not eight)
    #F --quit-if-one-screen: Causes less to automatically exit if the entire file can be displayed on the first screen.
    #M: Print size of file in the prompt at the bottom

    export LESS=-qQix4FM
Mit "+" lassen sich beim Aufruf Befehle angeben, die gleich ausgeführt werden:
  less +/path .bashrc        # Öffne .bashrc und suche nach "path"
  less +F /var/log/auth.log  # Öffne das Log-File und aktualisiere das Ende fortlaufend
Um zu erkennen wie die non-ascii Zeichen in einer Textdatei kodiert sind, nehme ich folgenden Aufruf:
LESSCHARSET=ascii less -R file-with-latin1-or-utf8.txt
Pro Tag nehme ich ein Verzeichnis um meine Bilder zu speichern. Seit 2016 nutze ich dieses Ablageschema für meine Fotos: YYYY/YYYY-MM/YYYY-MM-DD/. Also zB 2017/2017-12/2017-12-24/ Das hat den Vorteil, dass auch das Verzeichnis des Tages das Jahr und den Monat enthält. Die Einsortierung in dieses Schema mache ich derzeit mit einem einfachen Script. Siehe get-images.sh. Gimp ist ein Bildbearbeitungsprogramm (eine Alternative zu Photoshop). Es ist auch für Windows verfügbar. Es macht keinen großen Spaß mit gimp zu arbeiten, aber es ist besser als die anderen Programme die es unter Linux gibt. Als Elternsprecher der Klasse meines Sohnes habe ich das Gruppenfoto der Kinder mit Nummern und Namen versehen. Das Ergebnis wurde für die Eltern der Kinder ausgedruckt. So fällt es allen leichter die Kinder der Klasse kennen zu lernen. Folgender Ablauf verwendet drei verschiedene Programme. Wenn bei Inkscape und LibreOffice die Datei als Verknüpfung geladen wird, sind nachträgliche Anpassungen auch leicht möglich. Ich bin ncftp sehr zufrieden. Er kann auch nicht interaktiv (in Shell-Scripten) verwendet werden: ncftpput, ncftpget. Das Programm Screen ist ein Terminal Multiplexer. Es ermöglicht in einem Terminal mehrere Terminals zu starten. Besonders praktisch ist, dass man sich von den Sitzungen ab- und wieder anmelden kann. Beispiel: Man möchte auf einem entfernten Server einen lang dauernden Prozess ausführen. Starten man den Prozess innerhalb von Screen, kann man sich von dem Terminal trennen, ohne den Prozess zu beenden. Anders, als bei dem Befehl "nohup", kann man sich mit dem Prozess auch wieder verbinden ("screen -r").

Falls man einen Prozess ohne screen gestartet hat, und sich gerne abmelden möchte, kann man wie folgt vorgehen:

3 Shell [toc]

Die Readline Bibliothek wird von vielen Programmen verwendet. Allen voran der Shell "Bash". Die Readline Bibliothek wird auch in vielen anderen Programmen eingesetzt: Python im interaktiven Modus, pgsql (PostgreSQL) ...
   Pfeil-hoch/runter: Blättern in der History
   ctrl-a: Anfang der Zeile
   ctrl-e: Ende der Zeile
   ctrl-r: Rückwärts in der History (letzte Eingaben) suchen
   ctrl-k: Bis Ende der Zeile löschen
   ctrl-y: Einfügen von gelöschten Bereichen
   ctrl-d: Aktuelles Zeichen löschen
Tricks der Bash:
   ALT. --> letztes Argument einfügen.
Den Begriff "Shell" könnte man mit "Kommandozeile" übersetzten. Die Shell unter Unix ist einiges leistungsfähiger als die DOS-Eingabeaufforderung der Microsoft Betriebssysteme. Im Folgenden werden die Shell Bash und die üblichen Unix-Tools (GNU-Version) beschrieben. Die meisten Programme sind mittels cygwin auch für Windows-Betriebssysteme verfügbar. Inzwischen verwende ich die Shell nur noch interaktiv. Fast alle Programme schreibe ich in Python. Selbst kleine Scripte, die nur einmal genutzt werden. Bei den folgenden Startdateien sollte man darauf achten, dass alle Ausgaben nach stderr geschrieben werden (Siehe SSH), da sonst Programme wie "scp" annehmen, dass diese Ausgaben Teil der zu übertragenden Daten sind. Grep verwendet Reguläre Ausdrücke um Zeilen in der Textdatei zu finden. Wenn Dateien Leer- oder Sonderzeichen enthalten wird das Arbeiten mit Shell-Scripten teilweise richtig schwierig. Inzwischen schreibe ich so gut wie nie mehr Shell-Schleifen. Dafür nutze ich Python.
   find . | while read file
   do 
    bsp_command "$file"
   done
Bei obigen Beispiel muss man jedoch beachten, dass die Bash für die Zeilen der While-Schleife eine neue Subshell erstellt. Umgebungsvariablen, die man in setzt sind nach dem "done" nicht zu sehen, da sie nicht an die Eltern-Shell zurückgegeben werden. Obiges Beispiel ist aber nicht 100% sicher. Das Newlinezeichen ist in Dateinamen unter Unix zulässig. Das Lesen von Stdin würde jedoch darüber 'stolpern'. Mein Tipp: Die Shell nur interaktiv nutzen. So bald man Schleifen programmieren muss: Python.
for file in *.TTF; do mv "$file" "${file%.TTF}.ttf"; done
Näheres zu ${file%.TTF} finden man unter "Parameter Expansion" in "man bash". Während % am Ende ersetzt, kann man mit /.../ auch in der Mitte ersetzen:
#abc_foo.jpg --> abc_bar.jpg
for file in *.jpg; do mv $file ${file/foo/bar}; done 
Nur eine Auswahl an Dateien in ein Zielverzeichnis verschieben:
find ... -print0 -name '*.png' |  xargs -0 mv --target-directory mydir
In Python haben Zeichenketten die praktische Funktion "endswith()". In der Bash ist das etwas komplizierter:
   if [ "${myvar: -3:3}" = "foo"]; then
     ....
   fi
Das Leerzeichen vor "-3" ist nötig. Siehe "man bash" "Parameter Expansion"
   find . -printf '%TY-%Tm-%Td:%TT %p\n' | sort 

   oder einfacher: find -printf '%T+ %p\n' (GNU Extension)

   %T steht für die mtime (Modifikationszeitpunkt). Es kann
   auch %C (Change Time) oder %A (Access Time) verwendet werden.
   Siehe auch "man find" und "man stat"
   
    find . -mtime +0  # Dateien, die älter  als 24 Stunden sind
    find . -mtime  0  # Dateien, die jünger als 24 Stunden sind
    find . -mtime -1  # auch: Dateien, die jünger als 24 Stunden sind
   
Leider kann man mit GNU-find nur nach Dateien mit einem bestimmten Datum suchen, wenn man eine temporäre Datei anlegt:
    #        MMDDHHMM (7. Juli des aktuellen Jahres)
    touch -t 07070000 ~/tmp/start$$
    touch -t 07072359 ~/tmp/end$$
    find -newer ~/tmp/start$$ \! -newer ~/tmp/end$$
    rm ~/tmp/start$$ ~/tmp/end$$
   
Falls der Plattenplatz knapp wird, und man wissen möchte welche Datei und welches Verzeichnis am meisten Platz benötigt, kann folgende Zeile ausführe. Diese Zeile erstellt eine Liste aller Verzeichnisse und Dateien sortiert nach Größe. Falls die Platte (also in diesem Beispiel auch /var/tmp voll) ist, sollte man die Ausgaben ggf. per ssh zu einem anderen Rechner umleiten.
    root> du -ax / | sort -rn > /var/tmp/du-$(date --iso).log

    -x: Bleibe auf diesem Dateisystem. D.h. /proc wird übersprungen. 
    -a: Alle Dateien, nicht nur Verzeichnisse werden angegeben.

    sort -rn: Numerisch absteigend sortieren.


    Falls kein Platz mehr für die Log-Ausgaben sind:

    root@plattevoll> du -ax / | ssh nutzer@woanders -C "sort -rn > /var/tmp/du-$(date --iso).log"
   
Platzverbrauch mit menschenfreundlicher Ausgabe: Die Option -h (human-readable) zeigt bei den folgenden Kommandos die Größe in kByte, Mega-Byte oder Giga-Byte an:
    ls -lh
    --> Größe der Dateien im aktuellen Verzeichnis
   
    du -h
    --> Gesamte Größe inkl. Unterverzeichnisse

    df -h
    --> Platz auf den Dateisystemen/Partitionen
   
find -name '*.py' -print0 | du -b -c --files0-from=-
Damit lässt sich du Größe von einer Auswahl von Dateien bestimmen. Im obigen Beispiel wird nur die Größe von Python-Scripten berechnet. Vergisst man ein Programm im Hintergrund zu starten ("&" am Zeilenende), kann man mit Strg-z das Programm anhalten. Mit den Befehlen "fg" bzw. "bg" kann man das Programm im Vordergrund bzw. im Hintergrund weiterarbeiten lassen.

Trick: Möchte man wissen, wann ein lang laufendes Programm sich beendet, kann man es mit Strg-z anhalten und dann mit folgendem Befehl wieder starten:
    fg ; while /bin/true; do echo -ne \\a; sleep 1; done
   
Nach dem das Programm beendet ist wird in einer Endlosschleife ein Piepgeräusch erzeugt.
Oct   Dec   Hex   C  
-----------------------------
000    0    00   \0  ^@  NULL (Binäre Null)
007    7    07   \a  ^G  bell
010    8    08   \b  ^H  Backspace 
011    9    09   \t  ^I  Tab
012   10    0A   \n  ^J  Linefeed (newline)
013   11    0B   \v  ^K  Vertical Tab
014   12    0C   \f  ^L  Formfeed
015   13    0D   \r  ^M  Carriage Return
033   27    1B       ^[  Escape

Siehe auch "man ascii" unter Linux.

In der Shell Bash können Controll-Zeichen mittels z.B. $'\t' (bzw. $'\xHH') angegeben werden. Gerade für das Tab-Zeichen ist das in Shell-Skripten sinnvoll, da der Unterschied zwischen Tab und mehreren Leerzeichen nicht zu sehen ist. Siehe "Quoting" in "man bash". Mit dem Programm recode kann den Zeichensatz einer Text-Datei ändern.

Text-Dateien von Unix werden im Notepad auf einer Zeile angezeigt, und Scripte, die mit "#!/bin/interpreter" anfangen laufen nicht unter Unix, da noch ein "Carriage Return" hinten dransteht.
# CR/LF wird zu LF (dos --> unix)
recode latin1/CR-LF..latin1 datei.txt

# und zurück
recode latin1..latin1/CR-LF datei.txt
Die Shell "Bash" hat einen Nachteil. Die meisten Befehle sind nur sehr kurz in der Dokumentation (Siehe "man bash" oder "help befehl") beschrieben. Beispiele sind bei den GNU-Tools leider nicht vorhanden. Darum sind in den folgenden Punkten einige Beispiele aufgeführt. Mit dem Befehl "chmod" werden die Zugriffsrechte einer Datei geändert. Möchte man rekursiv für alle Leserechte hinzufügen, kann man das mit folgenden Aufruf erledigen:
  chmod -R a+rX

   -R rekursiv
   a+ für alle folgende Rechte hinzufügen
   r  Leserecht
   X  Nur für Verzeichnisse: Das Recht, das Verzeichnis aufzulisten (ls)
  
Die Bash unterstützt auch reguläre Ausdrücke. Die Syntax zu lernen ist aber aus meiner Sicht zeitverschwendung. Lieber die Regex-Syntax von Python lernen. Die ist mächtiger und flexibler. Durch set -u bricht das Bash-Script ab, falls eine Variable nicht gesetzt ist. Falls man prüfen will, ob eine Variable gesetzt ist, es ist der verzweifelte Versuch der Freunde der Shellprogrammierung das Shell-Scripting etwas zuverlässiger zu machen. Ich nutze die Shell nur noch interaktiv, und darum brauche ich auch "set -u" nicht mehr :-)
find / -type l ! -execdir test -e '{}' \; -print

 Erläuterung:

 find /                          Starte find im Wurzelverzeichnis
   -type l                       Suche Symlinks
    ! -execdir test -e '{}' \;   Falls Datei nicht existiert,
        -print                   gebe den Dateinamen aus
Da das Paket pstree nicht immer installiert ist, verwende ich gerne ps aux --forest. Außerdem lässt sich mit ps besser angeben, welche Prozesse angezeigt werden sollen. Eine Übersicht über meine Script-Sammlung: Scripte

Hier eine kleine Auswahl: Abschließend zu dem Kapitel "Shell" einen Hinweis: Mit wenigen Zeilen lassen sich erstaunlich komplexe Probleme lösen. Doch ab etwa 15 Zeilen werden Shell-Scripte meist unübersichtlich und fehleranfällig. Dann sollte man sich die Zeit nehmen und nochmal von vorne mit einer "richtigen" Programmiersprache anfangen. Die meisten Shellscripte funktionieren nicht mehr, falls Leer- oder Sonderzeichen in Dateinamen vorkommen.

Seit 1996 benutze ich fast täglich die Shell interaktiv. Anfangs verwendete ich Shellscripts für einfache Aufgaben und Python für komplexe Aufgaben. Seit etwas 2010 nutze ich auch für einfache Aufgaben Python. Shellscripts sind aus meiner Sicht unzuverlässig.

4 Sonstiges [toc]

Außer der Möglichkeit mittels harten Links (ln datei ziel) ein inkrementelles Backup mit rsync zu machen, gibt es aus meiner Sicht sehr wenige Stellen, an denen harte Links sinnvoll sind.

Symbolische Links (ln -s datei ziel) sind weniger fehleranfällig und lassen sich auf für Verzeichnisse anwenden. SSH (Secure Shell) ist ein Programm um eine sichere Verbindung zwischen zwei Rechnern zu erstellen. "Sicher" im Sinne von "abhörsicher" und "manipulationssicher". Rsync ist ein sehr mächtiges Programm um Dateien zu kopieren. Es werden nur die Änderungen übertragen. Dateien, die auf beiden Rechnern gleich sind, werden übersprungen. Rsync kann mittels ssh, dem eigenen rsync-Protokoll oder lokal benutzt werden.

In der Regel sollte man es vermeiden, einen Rsync-Server aufzusetzen, da es eine unnötige Sicherheitslücke ist. Besser ist es in der Regel, rsync mittels ssh zu verwenden. Werden die Daten auf beiden Systemen geändert, sollte man anstatt rsync unison verwenden. Zum Beispiel um einen Laptop und einen PC abzugleichen. Das Programm "strace" zeigt alle System-Rufe eines Programms an. Es ist somit sehr gut geeignet, um in fremden Programmen Fehler zu finden. Um es sinnvoll einsetzen zu können muss man verstehen was ein System-Ruf (system call) ist. Öffnen von Dateien, schreiben in Dateien oder Sockets, erstellen neuer Prozesse ... sind Systemrufe. Vergleichen von Zeichenketten und Berechnungen sind keine Systemrufe, da dafür keine Funktionen des Betriebssystems nötig sind.

Man kann strace auf ein Programm ausführen (myapp), oder sich mit einem laufenden Prozess verbinden.
  strace myapp
  strace -p PID
  
Meistens verbindet man freie Software mit der Lizenz "GPL". Ich bevorzuge die BSD-Lizenz, da sie kurz und verständlich ist. Außer Richard Stallman, dem Autor der GPL-Lizenz, gibt es sicherlich wenige, die die GPL gelesen und verstanden haben. Mir ist die Zeit dafür zu schade, und bevorzuge deshalb die BSD-Lizenz. Außerdem darf "BSD-Software" auch in kommerziellen Produkten verwendet werden. Die folgenden Punkte beziehen sich auf Linux, bzw. Unix-ähnliche Betriebssysteme. Während ich viele Jahre mit cdrecord auf der Kommandozeile gearbeitet habe, nutze ich inzwischen auch nur noch Brasero (GUI für Ubuntu). Das Brennen von CD/DVDs ist inzwischen auch deutlich seltener geworden. Die Netzwerkverbindungen sind besser oder man tauscht einen USB-Memory-Stick aus. Als Mailserver verwende ich Exim oder Postfix Gute Anleitung für Postfix: Postfix, saslauthd & dovecot imapd/pop3d Howto für Debian sarge 3.1 Cron ist ein Unix-Dienst, der wiederkehrende Aufgaben ausführt. Der Dienst verschickt eine E-Mail an den Nutzer, falls das Script auf stdout oder stderr schreibt. Oft wird deshalb stdout in ein Log-File umgebogen, damit man nicht täglich mit E-Mails "belästigt" wird. Falls eine Warnung auf stderr geschrieben wird, so erhält man trotzdem eine Nachricht. Das Script sollte so geschrieben sein, dass es nur im Fehlerfall auf stderr schreibt, und somit die E-Mail sinnvoll ist. Das auf Debian basierende Ubuntu ist meine bevorzugte Linux Distribution. Ubuntu ist nutzerfreundlich und außerdem ein gutes Betriebssystem für Server. Eine gute Einführung ist der Ubuntuguide.

Die Paketverwaltung mit apt und dpkg ist spielend einfach:
   >apt-cache search "regex"
   Sucht nach "regex" in allen Paketbeschreibungen

   >apt-cache show apache
   Zeigt Paketbeschreibung von Paket "apache" an.
   
   >apt-file "beispiel"
   Sucht nach der Datei "beispiel" in allen installierbaren Paketen.
 
   Alle Pakete die auf "hold" stehen zu "install" machen, damit
   sie beim nächsten "apt-get upgrade" aktualisiert werden:
   root> dpkg --get-selections > /tmp/selections
   root> cat /tmp/selections | sed 's/hold$/install/' | dpkg --set-selections 
   

   >dpkg -L beispiel
   Zeige die Liste der installierten Dateien des Paketes "beispiel".

   >dpkg -S /etc/beispiel
   Sucht das Paket zu dem die Datei "/etc/beispiel" gehört. Es wird dabei nur nach installieren Paketen gesucht.

   Achtung, der Slash am Ende ist von Bedeutung:
     # dpkg -S /etc/ssh           
     ssh: /etc/ssh

     # dpkg -S /etc/ssh/
     dpkg: /etc/ssh/ nicht gefunden.

   >dpkg-query ... ähnliche wie dpkg, es wird aber in den installierten und nicht installierten Paketen gesucht. 
   Siehe Debian Anwenderhandbuch
  
Möchte man an die Daten, ohne das Paket zu installieren, so kann man eine RPM Datei wie folgt auspacken:
   -Archiv entpacken:
  mkdir wvware
  cd $_
  rpm2cpio ../wv-0.7.2-189.src.rpm | cpio -id

  cpio: -i: extract, -d: create directories 

 
Wie bekommt man heraus zu welchem Paket die Datei "beispiel" gehört?
  rpm -qf /usr/bin/tex
 
Informationen über ein Paket
  rpm -qi beispiel
 
Dateiliste eines Pakets:
  rpm -ql gcc
 
Hier eine Liste von Paketen, die ich normalerweise immer installiere: pakete.txt Eine DVD oder CD kann man erst herausholen, wenn sie aus dem Unix-System entfernt wurde. Das aushängen (umount) ist aber nur möglich, wenn kein Prozess mehr das Dateisystem benötigt. Leider teilt der Befehl nicht mit, welche Prozess das Dateisystem noch benötigt. Falls man "lsof" installiert hat, kann man das wie folgt herausbekommen:
 # ggf. als root aufrufen, damit man alles sieht.
 lsof | grep /media/dvd

 # oder
 fuser -u /media/dvd
Falls "lsof" nicht installiert ist:
for file in /proc/[0-9]*/cwd /proc/[0-9]*/fd/* ; do echo $file $(readlink $file) ; done | grep /media/dvd
Eine Socket-Verbindung wird vom Client zum Server aufgebaut. Mit dem Programm "telnet" kann man zu jedem Port eines Servers einen Verbindungsaufbau mit einem TCP-Socket versuchen.

Protokolle wie SSH, POP3, SMTP, HTTP verwenden TCP für die Kommunikation zwischen Client und Server.
SMTP (RFC 821):
2xx = OK
5xx = Fehler

telnet mails-server 25
ggf. (M$ IIS): EHLO client-rechner

[AUTH PLAIN ???]

Die Zeichenkette für "???" erhält man mit:
perl -MMIME::Base64 -e 'print encode_base64("username\0username\0password");'
  (Siehe Postfix SASL README)


mail from: <email@me.de>
rcpt to: <user@blu.de>
data
Subject: Hallo!

das ist der Body der Email
. (Zeile mit nur einem Punkt beendet die Email)
quit
POP3 (RFC 1725):
telnet mail-server 110
user <name>
pass <passwort>
list (Anzeige der Emails)
retr <nummer> (Email anzeigen)
dele <nummer> (Email löschen)
[top <msg> <N> (Optionaler
   Befehl (wird von den meisten POP3-Servern implementiert: Anzeigen der ersten N Zeilen)]
quit

HTTP (RFC 2616):
telnet www.beispiel.org 80
GET url HTTP/1.0

(Zweimal Return)

url: / bzw. /beispiel.html

HTTP... kann ggf. weggelassen werden

Da viele Webserver mit "namebased virtual hosts" arbeiten, muss man
dem Webserver noch mitteilen, unter welchem Namen man sich mit ihm
unterhält:
telnet www.beispiel.org 80
GET url HTTP/1.1
Host: www.beispiel.org

 
Noch ein Hinweis zu Telnet: Wenn man mit telnet auf einen Portzugreift, und die Verbindung nicht mit protokollspezifischen Befehlen wie "quit" beenden kann, kann man mit Strg-] die Sitzung unterbrechen und die Verbindung konfigurieren. Unter der URL dict.tu-chemnitz.de gibt es ein sehr umfangreiches Deutsch-Englisches Wörterbuch. Im Gegensatz zu dem bekannten Wörterbuch von LEO kann man das der Chemnitzer Uni herunterladen. In der 4,7 MByte großen Datei kann man schnell mit seinem Editor der Wahl nachschlagen. Eine Internetverbindung ist nach dem Herunterladen nicht mehr nötig. die AVIs meiner Digitalkamera sind sehr groß. Mit folgender Kommandozeile verkleiner ich die Dateien.
HandBrakeCLI -i 20110607_080831-0.MOV -o 20110607_080831-0.mp4
HandBrake ist bis jetzt noch recht unbekannt. Es funktioniert sehr gut und nutzt auch mehrere CPUs/Cores. Das Programm gibt es mit gtk GUI oder für die Kommandozeile. Das Programm "mencoder" mit den vielen kryptischen Optionen hat bei mir oft eine Verzögerung in der Ton-Spur verursacht. Folgende Programme und Technologien sind weit verbreitet, jedoch gibt es moderne, bessere und ggf. kostengünstigere Alternativen:
Bisher / Standard Besser Begründung
Sendmail Exim oder Postfix Weniger Altlasten im Quelltext. Sicherer und leichter zu konfigurieren.
Fetchmail getmail Getmail ist nicht in C geschrieben, sondern in Python. Sicherheitslöcher wie bei Fetchmail sind unwahrscheinlich.
Procmail Sieve Die Syntax der Konfiguration von Procmail ist unnötig kompliziert. Sieve ist eine einfache Programmiersprache um Emails zu filtern. Es gibt mehrere Implementierungen. Der größte Vorteil ist, dass das Filtern schon auf dem Server passieren kann, so dass die Emails in verschiedene (meist IMAP) Ordner abgelegt werden.
MBox Format maildir Bei Maildir wird pro Email eine Datei gespeichert. Es gibt keine Probleme beim Locking, falls mehrere Prozesse auf die Emails zugreifen. Siehe auch Maildir im Dovecot Wiki.
Cyrus (IMAP/POP3 Server) Dovecot Dovecot ist leichter zu konfigurieren und zu verstehen.
Perl Python Siehe Warum ich von Perl zu Python gewechselt bin.
tail -f less +F Der Vorteil von Less ist, dass das fortlaufende Lesen der Datei abgebrochen werden kann, und man z.B. nach bestimmten Zeilen suchen kann.
ntpd chrony Der Dienst zum Synchronisieren der Zeit ist einfacher und hat weniger Code. Chrony öffnet außerdem nicht wie ntpd einen UDP-Port im Listen-Modus (wie ein Server)
gtk/qt Django Web-Framework Native-GUIs entwickelt man nicht mehr.
IPSec OpenVPN OpenVPN ist einiges einfacher und verträgt sich besser mit Firewalls.
Debian Ubuntu Während Debian nur von Freiwilligen entwickelt wird, wird das auf Debian aufbauende Ubuntu durch bezahlte Entwickler verbessert.
Oracle, MySQL PostgreSQL PostgreSQL ist eine robuste relationale Datenbank. Sie wird seit mehr als 15 Jahren weiterentwickelt und unterstützt die Standards SQL92 und SQL99. Siehe auch PostgreSQL Tipps.
mencoder/transcode HandBrake Video-Komprimierung kann auch ganz einfach sein.
Siehst du den Unterschied?
user@host> su
Passwort: 
root@host:/home/user# /etc/init.d/apache restart
user@host> su -
Passwort: 
root@host:~# /etc/init.d/apache restart
Lösung:
'su' ohne Bindestrich übernimmt die Umgebung des Nutzers. Das heißt $HOME, $PATH, ... werden vom Nutzer übernommen. Das kann scheinbar nicht erklärbare Veränderungen für alle von Apache gestarteten Kindprozesse (CGI-Scripte) haben.

5 Programmiersprachen [toc]

Meine bevorzugte Programmiersprache: Siehe Python Einführung Wie lange noch bis Weihnachten?
#!/usr/bin/env python
import datetime
today=datetime.date.today()
weihnachten=today.replace(month=12, day=24)
print weihnachten-today

6 Web-Design und Web-Entwicklung [toc]

7 Persönliche Meinung [toc]

8 Historie [toc]


© 2003-2017 Thomas Güttler. Der Text darf nach belieben kopiert und modifiziert werden, solange dieser Hinweis zum Copyright und ein Links zu dem Original unter www.thomas-guettler.de erhalten bleibt. Es wäre nett, wenn Sie mir Verbesserungsvorschläge mitteilen: guettli@thomas-guettler.de
Schreiben Sie mir doch eine E-Mail, falls Ihnen die Seite gefallen/geholfen hat. Falls Ihnen die Seite sehr gut gefällt, wäre ein für Google auffindbarer Link hierher nett.