\documentclass{beamer}
\usepackage{amsmath}
\usepackage{url}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[ngerman]{babel}

% Manual syntax highlighting
\newcommand{\synfunc}   [1]{\color{blue!50!black}#1\color{black}}
\newcommand{\synstr}    [1]{\color{red!50!black}#1\color{black}}
\newcommand{\synvar}    [1]{\color{purple!50!black}#1\color{black}}
\newcommand{\synclass}  [1]{\color{green!50!black}#1\color{black}}
\newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}}
\newcommand{\syncool}   [1]{\color{beamer@blendedblue}#1\color{black}}
\newcommand{\synoder}      {\ \ \color{black}$\vee$\ \ }
\newcommand{\hr}        {\rule[4pt]{\textwidth}{0.1pt}\\}

\title{Terminals, uxterm und screen}
\author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}}
\institute{LUGA}
\date{7. September 2005}

\usetheme{Warsaw}
\usecolortheme{seahorse}
\setbeamercovered{transparent}

\begin{document}

\frame{\titlepage}
\frame{
  \frametitle{Inhalt}
  \tableofcontents
}

% Terminals
% * Geschichte
% * Interna
%   * $TERM
%   * termcap, terminfo
%   * ncurses
%   * SIGWINCH
%   * Probleme
% * xterm, konsole, gnome-terminal
% 
% uxterm:
% * Geschichte
% * Features
% * Konfiguration über X-Resources
% * Maus-Menüs
% 
% screen
% * "Was ist es?"
% * "Wie funzt es?"
%   * $TERM = "screen"
%   * Eigenes PTY
% * Features
%   * Mehrere Fenster
%   * Detaching
%   * Viele Konfigurationsmöglichkeiten
% 
% screen-nodestatus
% * Sinn
% * Live-Demo
%   * Screenshot etc.
%   * "Total einfach"
% * "Wie kann ich mir sowas einbinden?"
% * Andere Sachen einbinden

\section{Terminals}
\subsection{Geschichte}
\frame[t]{\frametitle{Terminals}
  \begin{itemize}
    \item Terminal: Einheit von Aus- und Eingabegerät
    \item "`Dumb Terminals"' (frühe 1970er): \\
          Revolution des Umgangs mit Computern durch \\
          einfache Ein- und Ausgabe
    \item "`Intelligent Terminals"' (späte 1970er): \\
          Interpretation von Escape-Sequenzen (Cursor-Positionierung, Schreiben
          auf beliebigen Positionen, Farbauswahl, etc.)
    \item Heute: Weitgehender Ersatz von echten Hardware-Terminals durch
          Terminal-Emulatoren (xterm, rxvt, DOS mit geladenem
          \texttt{ansi.sys}, \ldots)
  \end{itemize}
}

\subsection{Interna}
\frame[t]{\frametitle{Probleme}
  Inkompatibilitäten zwischen den einzelnen Terminal-Emulatoren:
  \begin{itemize}
    \item Unterschiedliche Interpretation von Escape-Sequenzen
    \item Unterschiedliche Unterstützung von Farben
    \item Unterschiedliche Handhabung von nicht-ASCII
    \item Unterschiedliche Handhabung von Sondertasten (Funktionstasten,
          Cursorbewegungstasten, Modifiers (Shift, Ctrl, Num-Lock, etc.))
    \item Unterschiedliches Verhalten in Grenzfällen (Cursor in der letzten
          Spalte der letzten Zeile, etc.)
    \item \ldots
  \end{itemize}
}

\frame[t]{\frametitle{Abhilfe: \texttt{\$TERM}, termcap, terminfo}
  \begin{itemize}
    \item Setzen der Umgebungsvariablen \texttt{TERM} durch jeden
          Terminal-Emulator
    \item Datenbank über alle Terminal-Typen:
          \begin{itemize}
            \item "`Unterstützt du Farben?"'
            \item "`Welche Escape-Sequenz muss ich dir schicken, um den Cursor auf den
                  Zeilenanfang zu positionieren?"'
            \item "`Wenn \texttt{\$USER} F1 drückt -- welche Sequenz schickst du mir
                  dann?"',
            \item "`Wenn ich was in die untere rechte Ecke schreibe -- tickst du dann
                  aus?"'
          \end{itemize}
    \item Siehe auch: \texttt{/usr/share/terminfo/?/*}
  \end{itemize}
}

\frame[t]{\frametitle{Cool. Problem beseitigt, nicht?}
  \begin{itemize}
    \item Leider nein.
    \item Problem: Aktualität der installierten terminfo-Datenbank
    \vfill

    \item Nutzen von \texttt{shinynewterm}
    \item SSHen zu \texttt{\$oldbox}
    \item Probleme beim Nutzen bildschirmorienterter
          Anwendungen

    \vfill
    \item "`Lösung"': Manuelles Setzen von \texttt{\$TERM} auf einen
          von beiden Seiten verstandenen Standard (z.B. \texttt{vt100})
    \item Lösung: \texttt{\~{}/.terminfo/}
  \end{itemize}
}

\frame[t]{\frametitle{Dann ist jetzt alles ok?}
  \begin{itemize}
    \item Leider nein.
    \item Problem: Lügen vieler Terminal-Emulatoren -- \\
          Ausgeben von konsole, gnome-terminal, PuTTY und vieler anderer als
          xterm
    \item Das \textit{wäre} kein Problem -- \textit{wenn} sie alle Features von
          xterm unterstützten und auch alle Besonderheiten von xterm
          übernähmen.
    \item In der Realität: Implementierung nur einer Untermenge von xterms
          Features durch die meisten Nachahmer
  \end{itemize}
}

\frame[t]{\frametitle{Workarounds}
  \begin{itemize}
    \item Massive Beschneidung des \texttt{xterm}-terminfo-Eintrags auf die
          kleine Schnittmenge aller implementierten Features der am häufigsten
          verwendeten Terminal-Emulatoren
    \item Notwendigkeit für zusätzliche Checks in den Applikationen
  \end{itemize}
}

\frame[t]{\frametitle{\texttt{SIGWINCH}}
  \begin{itemize}
    \item Problem: Möglichkeit, Terminals \textit{während der Laufzeit} in der
          Größe zu verändern
    \item Früher: Fehlen einer Möglichkeit des Mitteilens dieser Information
          den laufenden Programmen
    \item Heute: Senden des Signals \texttt{SIGWINCH} bei Veränderung der Größe
          (und anderen Eigenschaften)
  \end{itemize}
}

\frame[t]{\frametitle{"`Terminal-Viren"'}
  \begin{itemize}
    \item "`Viren"' bei alten textbasierten BBS: \\
          Nutzen von ANSI-Sequenzen zur Farbverstellung, Tastaturumbelegung,
          etc.
    \item Unterstützung für gefährlichere Sequenzen durch heutige
          Terminal-Emulatoren
%          \begin{itemize}
%            \item Umschaltung auf alternativen Grafikzeichensatz
%            \item Veränderung der Terminal-Größe, Schriftart
%            \item Maximierung/Minimierung
%            \item Unterbindung des lokalen Echos
%            \item Reset
%            \item \ldots
%          \end{itemize}
    \item Niemals direkte Ausgabe von fraglichen Dateien per cat; \\
          Stattdessen less oder \texttt{\$EDITOR}
    \item Siehe auch: \texttt{`locate ctlseqs`}
  \end{itemize}

  \vfill
  \begin{block}{Möglichkeiten zur Wiederherstellung}
    \begin{itemize}
      \item Alternativer Zeichensatz?  \texttt{\^{}O}
      \item Kein lokales Echo?         \texttt{stty sane}
      \item Vollständiger Reset nötig? \texttt{reset}
    \end{itemize}
  \end{block}
}

\subsection{Terminal-Emulatoren}
\frame[t]{\frametitle{Terminal-Emulatoren}
  \begin{itemize}
    \item xterm, uxterm (viele Features)
    \item konsole, gnome-terminal \\
          (Integration in die jeweilige Desktop-Umgebung)
    \item rxvt, rxvt-unicode, aterm, wterm, \ldots \\
          (geringer Ressourcenverbrauch)
  \end{itemize}
}

\section{(u)xterm}
\subsection{Geschichte}
\frame[t]{\frametitle{(u)xterm}
  \begin{itemize}
    \item xterm älter als X!
    \item Viele Versionen und Varianten
    \item Viele Features
  \end{itemize}
}

\subsection{Features}
\frame[t]{\frametitle{Features}
  \begin{itemize}
    \item Weniger Ressourcenverbrauch im Vergleich zu Terminal-Emulatoren
          großer Desktop-Umgebungen
    \item Exzellente Konfigurationsmöglichkeiten, auch zur Laufzeit
    \item \textbf{u}xterm: exzellente Unicode- und UTF-8-Unterstützung
  \end{itemize}
}

\subsection{Konfiguration}
\frame[t]{\frametitle{Konfiguration: X-Resources}
  \begin{itemize}
    \item Konfigurationseinstellungen über die X-Resources-Datenbank
    \item Siehe auch: xterm(1), xrdb(1)
  \end{itemize}

  \vfill
  \begin{block}{Beispiel-\texttt{\~{}/.Xdefaults}}\texttt{\small%
    \syncomment{! Farben} \\
    \synclass{UXTerm}*\synvar{background}: \ \synstr{\#000000} \\
    \synclass{UXTerm}*\synvar{foreground}: \ \synstr{\#b2b2b2} \\
%   \synclass{UXTerm}*\synvar{cursorColor}:\ \synstr{\#cdc092} \\
    \syncomment{! Statt fetter Schrift lieber hellere} \\
    \synclass{UXTerm}*\synvar{colorBDMode}:\ \synstr{true} \\
    \syncomment{! Gut leserliche dicktengleiche Schrift} \\
    \synclass{UXTerm}*\synvar{faceName}:\ \ \ \ \synstr{Andale Mono} \\
    \synclass{UXTerm}*\synvar{faceSize}:\ \ \ \ \synstr{12} \\
    \syncomment{! Scrollbar nimmt nur Platz weg} \\
    \synclass{UXTerm}*\synvar{scrollBar}:\ \ \ \synstr{false} \\
    \synclass{UXTerm}*\synvar{saveLines}:\ \ \ \synstr{10000} \\
  }\end{block}
}

\frame[t]{\frametitle{Konfiguration: Kommandozeilen-Optionen}
  \begin{itemize}
    \item \texttt{-geometry \textit{Standard-Geometrie-Beschreibung}}
    \item \texttt{-e \textit{Programm}}
    \item \texttt{-xrm \textit{zusätzlicher xrdb-Eintrag}}
    \item Siehe auch: \texttt{xterm -h}
  \end{itemize}
}

\frame[t]{\frametitle{Konfiguration: Maus-Menüs}
  \begin{itemize}
    \item \texttt{<Ctrl> + <Button 1>}: Generelle Optionen
          \begin{itemize}
            \item Senden von Signalen (u.a. \texttt{SIGTERM}, \texttt{SIGKILL})
            \item Neuzeichnen des Fensters
            \item "`Secure Keyboard"'
          \end{itemize}
    \item \texttt{<Ctrl> + <Button 3>}: Terminal-Optionen
          \begin{itemize}
            \item Reverse Video
            \item Visual Bell
            \item Margin Bell
            \item Reset
          \end{itemize}
    \item \texttt{<Ctrl> + <Button 2>}: Auswahl der Schriftgröße
  \end{itemize}
}

\section{screen}
\frame[t]{\frametitle{screen}
  \begin{itemize}
    \item Fenstermanager für die Konsole mit vielen weiteren Features
    \item Erste Version 1987
    \item Oft genutztes Programm \\
          (wenig Fehler, viel Dokumentation im Netz)
    \item Nach Konfiguration enorme Arbeitserleichterung!
  \end{itemize}
}

\subsection{Features}
\frame[t]{\frametitle{Mehrere Fenster}
  \vspace*{-2em}
  \begin{tabbing}
    \texttt{\^{}A M} (monitor): \= \kill
    \texttt{\^{}A c} (create):  \> Erzeugen eines neuen Fensters \\
    \texttt{\^{}A K} (kill):    \> Abschießen des aktuellen Fensters \\
    \texttt{\^{}A w} (windows): \> Anzeige des Fensterliste in der Statuszeile \\
    \texttt{\^{}A "}:           \> Anzeige des Fensterliste als Menü \\
    \ \\
    \texttt{\^{}A n} (next):    \> Wechsel zum nächsten Fenster \\
    \texttt{\^{}A p} (prev):    \> Wechsel zum vorherigen Fenster \\
    \texttt{\^{}A a}:           \> Wechsel zum zuletzt ausgewählten Fenster \\
    \texttt{\^{}A \textit{Nummer}}: \> Wechsel zu Fenster \textit{Nummer} \\
    \ \\
    \texttt{\^{}A M} (monitor): \> Überwachen des aktuellen Fensters auf Aktivität \\
    \texttt{\^{}A \_{}}:        \> Überwachen des aktuellen Fensters auf Stille \\
  \end{tabbing}
}

\frame[t]{\frametitle{Scrollback-Buffer}
  \vspace*{-2em}
  \begin{tabbing}
    \texttt{\^{}A <Space>}: \= \kill
    \texttt{\^{}A [}:       \> Wechsel in Scrollback-Buffer \\
    \texttt{\^{}A .}:       \> Vorzeitige Rückkehr in normalen Betriebsmodus \\
    \ \\
    \texttt{\^{}A <Space>}: \> Setzen einer Markierung \\
    \ \\
    \texttt{\^{}A ]}:       \> Einfügen der Markierung \\
  \end{tabbing}
}

\frame[t]{\frametitle{Statuszeile}
  \begin{block}{Beispiel-\texttt{\~{}/.screenrc}}
    \texttt{%
      \syncomment{\# Statuszeile immer anzeigen} \\
      \synfunc{hardstatus}\ \synstr{alwayslastline} \\
      \ \\
      \syncomment{\# Datum ganz rechts anzeigen} \\
      \synfunc{hardstatus}\ \synstr{string}\ "\synstr{\symbol{37}h\symbol{37}=\symbol{37}D, \symbol{37}d.\symbol{37}m. \symbol{37}c}" \\
      \syncomment{\# \symbol{37}h:\ \ \ \ \ \ \ \ \ \ \ \ Normaler Status-Text} \\
      \syncomment{\# \symbol{37}=:\ \ \ \ \ \ \ \ \ \ \ \ Folgenden Text rechts ausrichten} \\
      \syncomment{\# \symbol{37}D, \symbol{37}d.\symbol{37}m. \symbol{37}c: Di, 06.09. 18:21} \\
    }
  \end{block}
}

\frame[t]{\frametitle{"`Abdocken"'}
  \vspace*{-2em}
  \begin{tabbing}
    \texttt{\^{}A \^{}D} (detach): \= \kill
    \texttt{\^{}A \^{}D} (detach): \> Beenden von screen (aber nicht der Programme!) \\
    \texttt{\^{}A *} (display):    \> Anzeige aller "`angedockten"' screens \\
    \texttt{\$ screen -RD}:        \> Andocken an eine frühere Sitzung oder \\
                                   \> Erstellen einer neuen
  \end{tabbing}

  \vfill
  \begin{block}{Beispiel-\texttt{\~{}/.screenrc}}
    \texttt{%
      \syncomment{\# Automatisch abdocken wenn das echte Terminal} \\
      \syncomment{\# stirbt (Absturz des X-Servers, Tod einer SSH-} \\
      \syncomment{\# Verbindung, etc.)} \\
      \synfunc{autodetach}\ \synstr{on}
    }
  \end{block}
}

\frame[t]{\frametitle{Viele Konfigurationsmöglichkeiten}
  \begin{itemize}
    \item Vielseitige Konfigurationsmöglichkeiten
    \item \texttt{\~{}/.screenrc}, Kommandozeilen-Parameter
    \vfill
    \item Umbelegung von Tastenbindungen
    \item Vorbelegung einiger Fenster für bestimmte Programme
    \item Detaillierte Anpassung der Statuszeile
    \item Ab-/Einschalten von UTF-8 für einzelne Fenster
    \item \ldots
  \end{itemize}
}

\subsection{Funktionsweise}
\frame[t]{\frametitle{Funktionsweise}
  \begin{itemize}
    \item Erzeugung eines eigenen virtuellen Terminals (\texttt{TERM=screen})
          für jedes Fenster
    \item Verstecken des echten Terminals vor den Programmen in der
          screen-Session
    \item Übersetzen der für \texttt{TERM=screen} passenden Escape-Codes in die
          Codes des unterliegenden Terminals (\texttt{TERM=xterm},
          \texttt{TERM=linux}, \ldots)
    \item Damit auch möglich: Starten einer screen-Session in (z.B.) xterm und
          dann späteres Andocken in PuTTY!
  \end{itemize}
}

\subsection{screen-nodestatus}
\frame[t]{\frametitle{screen-nodestatus}
  \begin{itemize}
    \item Problem: \\
          "`Habe ich das Gateway eingeschaltet?"' \\
          "`Ist mein Server online?"' \\
          "`Spielt AugustaKOM mal wierder Ping-Pong mit meinen Paketen?"'
    \item Lösung: Anzeige des Erreichbarkeitsstatus beliebiger Rechner in
          screens Statuszeile durch screen-nodestatus
    \item Platz in der Statuszeile kostbar -- \\
          Anzeige nur der Anfangsbuchstaben der Namen der überwachten Rechner
          \vspace*{-1.5em}
          \begin{tabbing}
            Kleiner Anfangsbuchstabe? \= \kill
            Großer  Anfangsbuchstabe? \> Rechner erreichbar \\
            Kleiner Anfangsbuchstabe? \> Rechner nicht erreichbar \\
          \end{tabbing}
  \end{itemize}
}

\frame[t]{\frametitle{screen-nodestatus: Funktionsweise}
  \begin{block}{Beispiel-\texttt{\~{}/.screenrc}}
    \texttt{%
      \syncomment{\# Anzeige des jeweils letzten Zeile des Ausgabe} \\
      \syncomment{\# von backtick-Befehl \#40 in der Statuszeile} \\
      \synfunc{hardstatus}\ \synstr{string}\ "\ldots\synstr{\symbol{37}40`}\ldots" \\
      \ \\
      \syncomment{\# Definition des backtick-Befehls \#40} \\
      \synfunc{backtick}\ \synstr{40}\ \synstr{0}\ \synstr{0}\ \synstr{\textit{programm}} \\
      \syncomment{\# 40:\ \ ID} \\
      \syncomment{\# 0 0: Einmaliges Starten des Programms,} \\
      \syncomment{\#\ \ \ \ \ \ Anzeige der jeweils letzten Zeile der Ausgabe} \\
    }
  \end{block}
}

% \subsection{Erweiterbarkeit} -- XXX

% ^J, ^O, ^]=esc, ^@=000=strg+space,strg+altgr+q, ^=ctrl

\frame[t]{\frametitle{Siehe auch}
  \vspace*{-2em}\small
  \begin{tabbing}
    \hspace{0.05\textwidth} \= \kill
    \url{http://www.catb.org/~esr/terminfo/}, \\
    term(7), terminfo(5), termcap(5), tset(1), stty(1): \\
    \> Informationen über die terminfo-Datenbank und \texttt{\$TERM} \\
    {\footnotesize\url{http://thread.gmane.org/gmane.linux.gentoo.devel/30624}}: \\
    \> "`Fixing the TERM mess"' \\
    \ \\
    \url{http://dickey.his.com/xterm/xterm.faq.html}, xterm(1): \\
    \> xterms Geschichte und Konfigurationsmöglichkeiten \\
    {\footnotesize\url{http://www.x.org/pub/unsupported/doc/papers/tutorials/resources.txt}}: \\
    \> Umgang mit der X-Resources-Datenbank \\
    \ \\ 
    {\scriptsize\url{http://www4.informatik.uni-erlangen.de/~jnweiger/screen-faq.html}},
    screen(1): \\
    \> Lösungen zu Problemen mit screen, Konfigurationsmöglichkeiten \\
    \ \\
    {\footnotesize\url{http://svn.openfoundry.org/pugs/examples/network/screen-nodestatus.p6}}: \\
    \> screen-nodestatus (in Perl 6)
  \end{tabbing}
}

\end{document}
