% instant messaging.tex
%
% My ''special field of interest'' for my A-level
% at BRG Viktring-Viktring
% subject: computer science
% Version: 2.0
%
% Copyright 2009, Lukas Prokop

\documentclass[11pt,a4paper]{report}

% PACKAGES
\usepackage{ngerman}
\usepackage{fullpage}
\usepackage[utf8]{inputenc}
\usepackage{multicol}
\usepackage[sf]{titlesec}
\usepackage[dvips,pdftex]{geometry}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{pstricks}
\usepackage{pst-node}
\usepackage{pst-plot}
\usepackage{boxedminipage}
\usepackage{booktabs}
\usepackage{bibgerm}
\usepackage{ifthen}
\usepackage{algorithmic}
\usepackage{algorithm}
\usepackage{listings}

\usepackage{lastpage}


% CONFIGURATION
\pagenumbering{arabic}
\pagestyle{myheadings}
\setcounter{tocdepth}{2}
\parindent0mm
\parskip2mm

\newcommand{\texit}[1]{\textit{#1}} % i always spell it wrong
\newcommand{\mod}[1]{\bmod{#1}}
\newcommand{\eul}[1]{{\varphi}(#1)}
\newcommand{\life}[2]{* #1 $\dagger$ #2}

%\topmargin25mm
\headheight10mm
\headsep10mm

\author{Lukas Prokop}
\title{Spezialthema Instant Messaging in python}
\date{\today}
% \thanks{Prof. Wolfgang Schmidhofer}
% \begin{quote}
%  <Reverend> IRC is just multiplayer notepad.
% \end{quote}








\begin{document}
\maketitle
\tableofcontents

% \input{irgendwas.tex}

\chapter{Instant Messaging}
\section{Der Begriff}

Unter Instant Messaging bezeichnet man allgemein die Kommunikation
unter einer Gruppe von Menschen \"uber das Internet (oder kleinere
Netzwerke) in Echtzeit. Ein Benutzer sendet dabei Nachrichten gezielt 
an eine Person, eine Benutzergruppe oder alle Benutzer. Die Nachrichten
werden in Echtzeit \"ubertragen, was bedeutet, dass \"ubertragene
Nachrichten in weniger als 1 Sekunde beim Kommunikationspartner
erscheinen. Wie Daten \"ubertragen werden, wird dabei in Protokollen
spezifiziert (folgend werden einige vorgestellt). Den Prozess des
Versenden und Empfangen von Nachrichten erledigen dabei eigene
Programme (Clients), die bei manchen Betriebsystemen nicht 
mitgeliefert werden. Die Anspr\"uche an die Protokolle sind 
unterschiedlich. In manchen ist es m\"oglich Verschl\"usselung,
Datentransfers und Video-Streams zu nutzen. Die Anspr\"uche an
Clients sind beispielweise Smileys, Accountverwaltung, Aufzeichnung
von Gespr\"achen und Einbinden von Erweiterungen mithilfe eines
Plugin-Systems.

Sogenannte Multiprotokoll-Clients sind f\"ahig mit unterschiedlichen
Protokollen umzugehen. Sie verf\"ugen meist \"uber ein umfassenderes
Account-Management und man erspart es sich f\"ur jedes Protokoll einen
neuen Client installieren zu m\"ussen. Jedoch ist die Verwendung
von alternativen Clients oft nicht gestattet (siehe hierzu Sektion 
''OSCAR''). Ein Beispiel f\"ur einen Multiprotokoll-Client ist
Pidgin. 2007 wurde Pigdins Logo (ein lila Vogel) zum h\"asslichsten
Maskottchen gew\"ahlt, aber die Funktionalit\"at und die Plugins
machen dieses Manko wieder wett.

\chapter{Verbreitung}
\section{OSCAR}

OSCAR (Open System for Communication in Realtime) ist das IM-Protokoll
von ICQ (''i seek you'') und AIM (''AOL Instant Messenger''). Wie der 
Name nicht verr\"at, ist das Protokoll 
geschlossen und war bis 2008 ein Geheimnis, welches durch Reversed
Engineering entschl\"usselt wurde. Besondere Kritik empfangen die 
Protokolle durch ihre AGB, welche die Verwendung von firmenfremden
Chatprogrammen verbietet. Allerdings stehen die firmeneigenen Programme
auch unter erheblicher Kritik. Viele Programmierfehler wurden zu langsam
behoben, es fehlt an Transparenz (die Benutzer werden nicht in den
Entwicklungsprozess des Protokolls eingebunden) und eine 
Verschl\"usselungsm\"oglichkeit ist nicht vorgesehen. Die ICQ-Server
k\"onnen somit die privaten Nachrichten aufzeichnen und die AGB sieht
vor, dass die Urheberrechte beim Anmelden abgetreten werden.

Die OpenSource-Community ist nicht bereit den Forderungen von AOL
anzukommen und es existiert eine Vielzahl an freien Clients, die
eine Kommunikation \"uber ICQ/AIM erlauben. Die ICQ-Server k\"onnen
damit nicht zwischen alternativen und ''echten'' Clients unterscheiden,
da beim Login nur ein Clientidentifier \"ubertragen wird, der den 
Client identifizieren soll. Da aber alle fremden Clients gesperrt werden,
melden sich fremde Instant Messengern mit dem originalen Identifier an.

ICQ \"andert unregelm\"a"sig diesen Identifier. Dabei sind nicht nur
die fremden Clients von Problemen betroffen, sondern auch die eigenen
User. Statt des Loginprozesses sendet der Server dann eine Nachricht
''Please upgrade to the newer version'' aus. ''Echte'' ICQ-User werden
dann gezwungen die aktuelle Version herunterzuladen und ''fremde'' 
ICQ-User m\"ussen auf die Identifier-Adaption der Entwickler warten.
Die OpenSource-Gemeinde reagiert auf solche \"Anderungen sehr schnell. 
Allerdings m\"ussen sie die Login-Daten immer reverse engineeren. 
Humorvoll ist dabei zu sehen, dass oft der Neuinstallationsprozess
vom originalen ICQ aufw\"andiger ist als bei einem fremden Client.
Gerade unter Linux werden die Updates nach 2-3 Tagen verf\"ugbar
und werden meist direkt \"uber einen Paketmanager in Sekunden
hinaufgespielt. Wer sich hingegen unter icq.com die aktuelle Version 
runterl\"adt, muss wegen der hohen Zugriffsraten zu solchen Zeiten
mit Downloadproblemen rechnen. Eine ICQ-Version f\"ur Linux wird
au"serdem gar nicht von AOL angeboten.

Die Identifizierung der einzelnen User erfolgt \"uber eine UIN (Unique
Identification Number). In den Clients selbst wird aber ein Username
eingetragen, den der User frei w\"ahlen und \"andern kann. Da ICQ 
zeitweise eine gro"se Popularit\"at besa"s, entwickelte sich ein 
Markt um einfach zu merkende UINs. Auch heute gibt es noch ICQ-Nummern
bei ebay zu kaufen.

Ein gro"ser Vorteil vom ICQ ist das Offline-Versenden von Nachrichten.
Ist ein User offline, kann ihm eine Nachricht gesendet werden und
beim n\"achsten Login erscheint ihm die Nachricht. Ein paar Protokolle
verschlucken solche Nachrichten.

\section{IRC}

IRC ist eine Abk\"urzung von Internet Relay Chat und heutzutage eine
der wichtigsten Anlaufstellen f\"ur Programmierer. IRC wurde in den
90ern entwickelt und hat sich seither etabliert. IRC organisiert
sich in themenbasierenden Channel, wo jeder mitdiskutieren kann. 
Teilnehmer sind der IRC-Server selbst, Bots (zeichnen Logs auf),
Bouncer (reservieren Usernamen) und die Clients (normalen Benutzer).
Die Anzahl der Clients ist unbegrenzt und wird nur durch die 
Belastbarkeit des Servers definiert. Bekannte (gro"se) Server sind
freenode, quakenet und ircnet.

Um teilzunehmen, ben\"otigt man ein IRC-f\"ahiges Programm, wobei
hier auch Plugins f\"ur Webbrowser\footnote{
https://addons.mozilla.org/en-US/firefox/addon/16} existieren. Hat
man ein solches Programm gestartet, kann man meist ein Profil angeben
und verschiedene IRC-Server ausw\"ahlen. Die bekanntesten sind meist
gelistet. Steht man in Verbindung mit dem Server, kann man sich von
ihm die Liste mit den Channels (deutsch: R\"aume) geben lassen. Jetzt
kann ein Channel selektiert und betreten werden.

Nat\"urlich gibt es viele graphische Frontends, aber im Prinzip ist
IRC vollst\"andig textbasierend. S\"amtliche Anweisungen an den 
IRC-Server werden mit einem Slash eingeleitet. Das Anzeigen der R\"aume
(beginnend mit py) erfolgte beispielweise mit \textit{/list py*}.
Die Befehle selbst werden jedoch an den Server gesendet und dort 
abh\"angig. Da nicht \"uberall die selbe Serversoftware l\"auft,
kann es Unterschiede in den Befehlen geben.

IRC ist grundlegend offen konzipiert. Das hei"st IRC-Server sollten
es den Usern selbst erlauben neue Channels zu er\"offnen und zu
verwalten. Jedoch ist auch dies serverabh\"angig. freenode wird
einen brg-viktring Channel gestatten; mozilla.org jedoch nicht.
IRC ist nicht f\"ur Verschl\"usselung konzipiert. Es ist m\"oglich
abseits des Channels (mit /query) einen einzelnen User anzusprechen.
Channels werde immer mit einer beginnenden Raute benannt (zB \#python.de).

Ein Grundproblem des IRCs sind Zeichens\"atze. Mit den lateinischen
Buchstaben kommt man nat\"urlich \"uberall zurecht, doch aufgrund der
unterschiedlichen Client- und Serverzeichens\"atzen gibt es meist
zumindest ein paar Nutzer, die sich nicht an den Standard (meist 
UTF-8) halten und Umlaute werden in Folge falsch vom eigenen Client 
interpretiert.

Sehr interessant sind Nutzerstatistiken (zB die Anzahl an Nachrichten
im Jahr 2009 im Channel \#python sind aufschlussreich dar\"uber, wie
stark die Programmiersprache im Vergleich genutzt wird) und eigene
Webseiten sammeln IRC-Quotes\footnote{zB ibash.de, bash.org, 
german-bash.org}.

\section{XMPP \& Jabber}

Das Extensible Messaging und Presence Protocol schlie"st an den freien 
Gedanken an und wollte Systemen wie ICQ und Skype entgegenstr\"omen,
die von Firmen verwaltet werden. XMPP ist somit total frei, quelloffen
und wird von einer Community gut dokumentiert. XMPP setzt auf XML
als \"Ubertragungsformat auf. Das wichtigste Einsatzgebiet von
XMPP ist Instant Messaging und daraus hervorgegangen ist das Protokoll
Jabber. Eine Alternative w\"are Google Talk.

Jabber-Clients bekommen eine Jabber-ID verliehen, die syntaktisch an
eine E-mailadresse erinnern. Sehr gefragt ist Jabber bei Personen,
die wert auf Verschl\"usselung legen. Dabei wird sowohl Client-to-Server
wie auch Server-to-Server-Verschl\"usselung angewandt. Zum Einsatz
kommt bevorzugt OpenPGP (asymmetrische Verschl\"usselung; IDEA und
RSA).

Bekannte Server sind beispielweise
jabber.org und der CCC\footnote{Chaos Computer Club -- deutscher 
Hackerverein} betreibt auch einen. Die Server sind total abgeschottet
organisiert. Das hei"st die Nachrichten f\"ur einen Benutzer k\"onnen
\"uber 20 verschiedene Server laufen, weil sich die Server nicht direkt
kennen. Jeder Client k\"onnte auch problemlos einen Server betreiben.
Jabber ist somit dezentralisiert organisiert.

Ein Feature von Jabber sind transports. Bei transports handelt es sich
um Server, die eine Anbindung an andere Protokollen besitzen. Besitzt
man einen Jabber-Account und kennt verf\"ugbare transports, k\"onnen
Nachrichten an den verf\"ugbaren Server geschickt werden und dieser
translatiert die Nachricht in ein anderes Protokoll. \"Uber dieses
Protokoll wird dann die Nachricht an den gew\"unschten Benutzer
weitergeleitet. Da die meisten Protokolle Logins bei Servern verlangen,
m\"ussen sich die Clients bei transports grunds\"atzlich anmelden und
dort ihre Login-Daten f\"ur das andere Protokoll hinterlassen, was als
riskant anzusehen ist. Letztendlich vertraut man auf transports von 
Organisationen, die sich f\"ur Informationsfreiheit verschrieben haben.

\chapter{Werkzeuge}
\section{python}

python ist eine Programmiersprache, die mehrere Programmierparadigmen
erlaubt, doch vorwiegend ist sie auf funktionale Ausdr\"ucke und
objektorientierte Konzepte optimiert. Sie wird seit 1990 vom Monty
Python-Fan Guido van Rassum entwickelt. Implementierungen von Python
sind CPython (am weitesten verbreitet; in C entwickelt), Jython (Java),
Stackless Python (experimentell), IronPython (experimentell, C\#, 
Anbindung an .NET) und PyPy (experimentell, python in python, noch zu
langsam). Alle Implementierungen erzeugen einen Bytecode, der dann vom
Interpreter ausgef\"uhrt wird. Dies sieht man auch, wenn man ein Programm
auf der Konsole mit ''python monty.py'' startet. CPython legt dann eine 
Datei ''monty.pyc'' mit Bytecode an. Python wurde von Anfang an so 
konzipiert, dass die Sprache leicht lesbar ist. Dies wird erreicht durch 
wenig Schl\"usselw\"orter im Vergleich zu anderen Sprachen und die Syntax 
wurde auf ein Minimum reduziert. 

\subsection{Paradigmen, Geschichte und python.org}

Das wichtigste Kriterium ist die Philosophie ''Ein Befehl pro Zeile''.
Zwar lassen sich die Befehle durch Kommata (wie in C) trennen, doch
wird dieser Stil nicht gepflegt. Durch List Comprehensions und andere
funktionale Ausdr\"ucke werden zwar mehrere Anweisungen in einer Zeile
angegeben, aber es wird trotzdem eine Aktion pro Zeile ausgef\"uhrt.

\begin{quote}
  primes = [x for x in xrange(1,1000) if not False in [ggt(y, x) == 1 for y in xrange(1,x-1)]]
\end{quote}

Als Resultat legen Python-Programmierer gro"sen Wert auf einen guten 
Programmierstil. Guido van Rossum ver\"offentlicht auf python.org
sogenannte Python Enhancement Proposals, wo sich der Autor an die
Community richtet und Richtlinien f\"ur offene Fragen (vor allem Stil
und Module oder Releases betreffend) festlegt. Ganz bekannt ist jedem 
Entwickler die PEP008 (''Style Guide for Python Code''), wo Guido van
Rossum beispielweise festlegt, wie Whitespace verwendet werden d\"urfen.
Wem das Durchlesen zu schwer erscheint, kann ein kleines Werkzeug verwenden:
pylint parst den Quelltext und versucht Unsauberkeiten zu finden. Wie in
allen Programmiersprachen sollte einen Zeile nicht mehr als 75-80 Zeichen
enthalten; pylint notiert die Zeilennummer, falls man einen \"Ubertritt
begeht. Am Ende wird der Quelltext bewertet. pylint ist allerdings sehr 
streng und teilweise enth\"alt es noch Fehler, weshalb auch meine Quelltexte
nicht vollst\"andig pylint-valid sind. F\"ur einen erfahrenen 
Python-Entwickler ist pylint trotzdem ein guter Wegweiser. Durch die sch\"one
Syntax ist kein Wettbewerb wie ''Obfuscated Perl Contest'' bei Perl m\"oglich.

\subsection{Datentypen}

Python geht dynamisch mit Datentypen um. Das bedeutet, dass es keine 
Typendeklaration wie \textit{int i = 10;} bei Python gibt. \textit{int}
w\"are dann n\"amlich auch wieder ein Schl\"usselwort mehr. Python
verf\"ugt \"uber eine automatische Speicherbereinigung (garbage collection).
Bei einer Variablendefinition wie \textit{a = 1} deutet der Buchstabe 
\textit{a} auf eine Speicheradresse mit dem Inhalt \textit{1}. Die 
Speicheradresse kann auch mit dem Kommando \textit{id()} abgerufen werden.
Wird \textit{a} nach diesem Kommando wieder umdefiniert (\textit{a = 2}),
so wird der Zeiger einfach auf eine andere Speicheradresse umgebogen.
Der Python Interpreter selbst bereinigt den Speicher st\"andig und ein
Element (auf das kein Zeiger deutet) wird gel\"oscht. Die Allokation eines
einer Variable mit demjenigen Wert findet also nicht statt (der Wert
wird im Hauptspeicher nicht direkt an die Variable gebunden). Die
Hauptspeicher-Adresse eines Wertes kann mit dem Befehl \texit{id()}
abgerufen werden.

Python besitzt verschiedene Datentypen. Integer, Float, Strings sind 
grundlegende Datentypen, aber durch die saubere OOP ist es auch m\"oglich
Klassen wie \textit{int} zu vererben. Dann kann man eigene Datentypen 
entwerfen. Ein Beispiel ist cmath, welches die Verwendung von Komplexen 
Zahlen in Python erlaubt. Durch die Speicherverwaltung werden Objekte vom
Typ String bei einer Modifikation nicht angepasst, sondern werden komplett
neu definiert.

Die drei wichtigsten Containertypen sind Dictionaries (dict), Tuples (tuple)
und Listen (lists). Mengen (set) ordnen ihre Elemente selbstst\"andig und
k\"onnen Operationen wie Vereinigung (union) und Differenze (difference) 
ausf\"uhren. Listen sind Container, die ver\"anderbar sind (mutable). 
Tuples besitzen das selbe Verhalten wie Listen, sind jedoch unver\"anderbar 
und damit speicheroptimierter (immutable). Dictionaries erlauben eine Zuordnung 
von Schl\"usseln zu Werten. Alle Containerelemente schreiben keine Vorschriften 
bzw. der Datentypen vor, da es sich bei allem in python um Objekte handelt.
Wie implementiert man Stacks? F\"ur python-Interpreter von stackbasierenden 
Sprachen (zB beatnik) verwendet man Listen.

\subsection{Einr\"ucken, Iteration und lambda}

Sprachen wie C verwenden Sonderzeichen, um Codebl\"ocke zusammenzufassen (zB
geschwungene Klammer \{\} in C). python setzt hier blo"s auf Einr\"uckung.
Dies sieht in etwa so aus:

\lstset{language=python}
\begin{lstlisting}
  while True:
      send_server_answer()
\end{lstlisting}

Wichtig ist bei der Einr\"uckung die einheitliche Verwendung. Es sind wohl
Tabs als auch mehrfache Leerzeichen m\"oglich. Die Community empfiehlt es den
Editor so zu konfigurieren, dass ein Tabzeichen durch 4 Leerzeichen ersetzt 
wird. Im vim kann man sich folgende Befehle setzen (in ~/.vimrc):

\lstset{language=python}
\begin{lstlisting}
" python support
autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=8 softtabstop=4 smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class,with
let python_highlight_all = 1
let python_highlight_exceptions = 0
let python_highlight_builtins = 0
\end{lstlisting}

Iteration nennt man das Durchwandern von Containerelementen (schrittweiser
Zugriff auf eine Folge). Bei Dictionaries wird das Schl\"usselelement als
Iterator geladen und sonst der Inhalt der aktuellen Variable. Wer gerne
auch die Indizes von Tuples oder Listen bereit gestellt haben m\"ochte,
sollte enumerate() ausprobieren

\lstset{language=python}
\begin{lstlisting}
for (index, value) in enumerate(liste):
    print "liste[%d] = '%s'" % (index, str(value))
\end{lstlisting}

Der Lambda-Kalk\"ul ist eine formale Sprache zum Auswerten und Nutzen von 
Parametern. Python-Anf\"anger haben meist Probleme damit umzugehen, aber
programmier-erfahrene Geeks k\"onnen es sich anonyme Funktion (zumindest
ist es so in python implementiert) vorstellen, die Ausdr\"ucke aber keine 
Anweisungen enth\"ahlt. Anweisungen unterscheiden sich von Ausdr\"ucken 
dadurch, dass sie keinen R\"uckgabewert definieren.

\lstset{language=python}
\begin{lstlisting}
>>> a = lambda x: x**2
>>> a(5)
25
>>>
\end{lstlisting}

Hier wird eine Lambda-Funktion mit dem Parameter x definiert. Erreicht
die Variable das call-Signal wird der \"ubergebene Parameter quadriert
und zur\"uckgegeben.

\subsection{Exception}

Ganz wesentlicher Teil von python sind Exceptions; Ausnahmenbehandlungen
wenn Fehler auftreten. Sogar SyntaxErrors k\"onnen abgefangen werden.
Hierf\"ur definiert man try-Bl\"ocke in denen der Fehler auftreten kann
und tritt ein Fehler beim Abarbeiten dieses Blocks auf, sucht er nach dem
entsprechenden except-Block. Findet er keinen, f\"uhrt er (falls gegeben)
den finally-Block aus.

\lstset{language=python}
\begin{lstlisting}
try:
    a = b / 0
except ZeroDivisionError:
    a = 1
\end{lstlisting}

Die gesamte Liste an Builtin-Exceptions kann unter python.org\footnote{
http://docs.python.org/library/exceptions.html\#bltin-exceptions} eingesehen
werden. M\"ochte man eigene Klassen definieren, so m\"ussen sie blo"s als
Subklassen von Exceptions definiert werden.

\section{vim}

Beim Vim (\textbf{V}isual \textbf{IM}proved) handelt es sich um einen
freien Texteditor. Vim basiert auf dem Texteditor vi und vi basiert
wiederum auf ex, welcher auf ed basiert. All diese Pakete sich heute 
standardm\"a"sig auf UNIX-Systemen enthalten. Ein Editor war das 
wichtigste Programm eines modernen Computers, weil durch ihn Programme
geschrieben werden konnten. Und ed/ex/vi/Vim waren/sind die Editoren der
UNIX-Systeme. Eine gute OpenSource-Alternative zum vim bildet f\"ur 
Entwickler der GNU Emacs, welcher eine Anbindung an die Programmiersprache
Lisp enth\"alt (GNU Emacs wird somit nur durch die Programmiersprache
Emacs Lisp konfiguriert). GNU Emacs selbst ist auch in Lisp geschrieben.
Folglich besteht immer ein parodischer Kampf zwischen Entwicklern. Nicht
zuletzt zitiert ein Komik, wo ein Sohn den Vater fragt und dieser wegl\"auft:
''Why are we hiding from the police, daddy?'' ''Because we use vi son, 
they use emacs.'' Der Emacs ist auch Teil des Geekcodes.

Doch der Vim steht dem Emacs um nichts nach. Das erste Pro-Argument f\"ur
den Vim ergibt sich darin, dass der Vim auf jedem UNIX-System vorinstalliert
ist. Dies ist f\"ur Systemadministratoren besonders wichtig, da sie 
plattform\"ubergreifend arbeiten m\"ussen. Der Vor- und Nachteil des Vim
ist seine Bedienung. Er stammt aus Zeiten ohne X und Maus und ist deshalb
ohne Maus und graphischer Oberfl\"ache zu bedienen. Das erwies sich bei
mir als gro"ser Vorteil als ubuntu Probleme hatte, die Tasten ihren 
Bedeutungen zuzuordnen (hatte Apple-Tastatur neu angesteckt). Im Vim
editierte ich dann die .Xmodmap. F\"ur graphische Oberfl\"ache 
ben\"otigt man standardm\"a"sig die Cursortasten und Kombinationen wie
Strg+C. Doch der Vim reserviert hierf\"ur lateinische Buchstaben und
zB die Cursortasten (die nicht funktionierten) konnte ich durch h, j, 
k und l ersetzen (die funktionierten). Der Vim brachte so mein System
wieder zum Laufen.

Aber wer nicht auf graphische Elemente verzichten m\"ochte kann auf 
Alternativen wie GVim und KVim setzen. Letztendlich hat der vi auch
andere Distributionen als nur vim hervorgebracht (zB evlis, nvi, vile).
Die Auswahl von Editoren bleibt also weiterhin gro"s, aber wir m\"ochten
an dieser Stelle kurz seine Funktionalit\"at beleuchten.

Um den Vim bedienen zu k\"onnen, m\"ussen wir 2 verschiedene Modi 
unterscheiden; den Befehl- und Einf\"ugemodus. Der Befehlsmodus
nimmt Befehle entgegen, um diese an ex weiterzuleiten oder ruft selbst
Funktionen aus vims Kern auf. Der Einf\"ugemodus erlaubt uns die 
Modifikation und Navigation im Textbereich. Im Befehlsmodus kennt
man die klassischen Befehle wie (:w), Datei neu laden (:e), Editor
verlassen (:q), aber Vim denkt daran, dass ein Datenverlust entstehen
k\"onnte, wenn eine Datei nicht gespeichert wird. Wer also mit 
Datenverlust den Vim beenden m\"ochte, muss den Quit erzwingen (:q!).
Wie wir gesehen haben, beginnen die Befehle alle mit einem Doppelpunkt.
Der Doppelpunkt leitet die Befehle an ex weiter. Befehle, die nicht von
ex gesteuert werden, sind zum Beispiel Suchbefehle. Mit einem einleitenden 
Slash und danach dem Suchwort, wird die ganze Datei nach dem Suchwort
durchforstet. Mit dem Buchstaben n wird zum n\"achsten Suchtreffer
navigiert. Stichwort Navigieren\ldots h, j, k und l habe ich bereits
angesprochen. Mit 4l kann man den Befehl kombinieren und 4 Schritte 
nach l (rechts) gehen. \$ steht generell f\"ur das Zeilenende und 
die 0 f\"ur den Zeilenanfang. Mit ist es des \"Ofteren bei der Entwicklung
von PyIM passiert, dass mir Variablennamen nicht gefallen haben und
ich sie abschnittsweise ausbessern musste. Oft verwendet man den
selben Variablennamen in einem Dokument in unterschiedlichen Namespaces
(zB Funktionen) und hier wollte ich nur erreichen, dass der Name nur 
im Bereich einer Funktion ersetzt wird. Bei graphischen Editoren habe ich
bisher keine M\"oglichkeit gefunden, doch Vim bietet hierf\"ur das 
m\"achtige Kommando

\begin{quote}
  :145,192s/\/etc\/passwd/\/etc\/shadow/g
\end{quote}

In den Zeilen 145 bis 192 werden /etc/passwd durch /etc/shadow global (also
nicht nur einmal) ersetzt. Wollte ich die gesamte Datei durchsuchen, m\"usste
ich den Befehl mit :\%s\ldots beginnen.

Ein anderes Feature von Vim ist die Arbeit mit Puffern. Oft m\"ochte man 
Zeilen austauschen und verschieben. Bei jedem L\"oschkommando (zB dd f\"ur 
die aktuelle Zeile) wird der gel\"oschte Text in den Hauptpuffer geschrieben 
und kann jederzeit wieder mit p (put) eingef\"ugt werden. Wer mehrere Puffer 
braucht kann sie mit verschiedenen Zeichen ansprechen. Zum Beispiel ''2p
l\"adt die Daten aus Puffer 2 und f\"ugt sie dann ein (put).

Wenn man Escape dr\"uckt landet man immer im Befehlsmodus. In den Eingabemodus
gelangt man durch Dr\"ucken von i (insert), aber ebenso landet Vim automatisch
im Einf\"ugemodus, wenn ein Kommando get\"atigt wir, wo man meist mit dem
Insert-Mode fortfahren m\"ochte (zB o f\"ur newline).

Hat man einen Fehler gemacht, so kann ihn mit u (undo) r\"uckg\"angig machen.
Eine Fehlerkorrektur behebt man mit :redo und wer einen Befehl wiederholen
m\"ochte, kann dies mit einem Punkt erreichen. Wer zwischendurch auf der 
Konsole was erledigen muss, schreibt kurz :! in die Befehlszeile und landet
dann tempor\"ar auf der Konsole.

Nat\"urlich sind das alles recht nette Bedienungsmechanismen, aber was ist
jetzt f\"ur Systemadministratoren wichtig? Syntaxvorhebung existiert f\"ur
mehr als 500 Sprachen (python nat\"urlich standardm\"a"sig) und Vim kann 
Kommandos, Befehle bzw. Stichw\"orter
einer Programmiersprache vervollst\"andigen. Welche Syntax Vim erkennt ist
mit :set einsehbar und mit \textit{:set syntax} konfigurierbar. Wer 
regelm\"a"sige Arbeit automatisieren m\"ochte, kann ein Vim-Makro 
programmieren und dabei eine der Anbindungen an Python, Perl, Ruby oder 
Tcl nutzen. Der Vim ist durch seine Modi und seine Befehle etwas 
gew\"ohnungsbed\"urftig und ist etwas f\"ur richtige Puristen, doch seine
Bedienung resultiert in einer h\"oheren Arbeitsgeschwindigkeit (zur Maus
zu greifen bedeutet immer ein Zeitverlust).

Wer zum ersten Mal mit dem Vim arbeiten m\"ochte, kann den Vim starten
und F1 dr\"ucken oder in der Konsole vimtutor starten. Beides sind
Hilfen f\"ur den Umgang mit dem Vim. Doch aufgrund der gro"sen Community
findet man auch viele beantwortete Fragen im Internet.

\section{pylint}

Bei pylint handelt es sich um einen kleinen Python Syntax Checker. Er
z\"ahlt beispielweise die L\"ange einer Zeile und ab 80 Zeichen wirft
pylint einen Fehler mit der Fehlernummer

\section{mercurial}

Bei mercurial handelt es sich um ein SCM (Source Code Management),
welches plattformunabh\"angig funktioniert und in Python programmiert
wurde. Der Name Mercurial ist angelehnt an die englische Bezeichnung
von Quecksilber (Mercury), welches dem Atomsymbol hg zugeordnet ist.
hg ist der verwendete Name auf der Konsole. Mercurial ist zur gleichen
Zeit wie Git entstanden (2005), welches der gro"se Konkurrent von Mercurial
ist und von Linus Torvalds konzipiert wurde. Unter Linux-Entwickler
hat sich Git durchgesetzt, aber unter anderen OpenSource-Entwicklern 
hat sicht mercurial genauso etabliert.

Die grundlegende Aufgabenstellung von mercurial ist die Verwaltung
von Quelltexten in einem Gro"sprojekt, wo die einzelnen Entwickler
Patches (kleine Aus-/Verbesserungen von Software) zu Software
liefern. Es ist also das Bestreben Entwicklungszweige zu erstellen
(branch) und zusammenzuf\"uhren (merge). Es beginnt damit, dass man
sich einen Klon von einer Software holt.

\begin{quote}
  hg clone http://bitbucket.org/meisterluk/pyim/
\end{quote}

Dadurch wird im lokalen Verzeichnis ein Ordner pyim angelegt, wo
die aktuelle Version der Software verf\"ugbar ist. Versteckt ist
ein Ordner .hg, der erzeugt wurde und s\"amtliche Informationen
\"uber die Dateien enth\"alt. Wird eine Datei ver\"andert, passiert
noch gar nichts. F\"uhrt man jedoch \textit{hg commit} aus, so
untersucht mercurial alle Modifikationszeiten und \"uberpr\"uft
die Dateien auf ihre neueste Version. Werden Modifikationen
festgestellt, so werden die Unterschiede aufgezeichnet und als
''Changeset'' festgehalten. Beim Ausf\"uhren von \textit{hg commit}
\"offnet sich der Editor \$EDITOR und es kann eine Nachricht 
hinterlassen werden, die die Modifikationen beschreiben. Mit
\textit{hg status} kann \"uberpr\"uft werden, welche Dateien
mercurial verfolgt, weil manche mit der Datei .hgignore 
ausgeschlossen werden k\"onnen. \textit{hg log} liefert eine
\"Ubersicht \"uber alle Changesets und \textit{hg tip} gibt
nur den letzten Changeset aus.

Wer ein Projekt von ganz Anfang an starten m\"ochte, kann
\textit{hg init} ausf\"uhren, wodurch jenes Verzeichnis .hg
erzeugt wird. Wird eine neue Datei im Projektverzeichnis
angelegt, so kann man dies mercurial mit dem Befehl \textit{hg
add FILENAME} mitzuteilen. Mercurial ''trackt'' daraufhin
diese Datei und notiert ihre Modifikationen. Vorsicht, beim
Befehl \textit{hg rm FILENAME}, weil die Datei nicht nur
aus dem repository gel\"oscht wird, sondern auch wirklich im
Projektordner. Hat man einen Changeset erfolgreich abgeschlossen,
kann man ihn \"uber SSH oder FTP auf einen Server hochladen, 
welcher die Ver\"anderungen auf einer Webseite pr\"asentiert 
und auch das Klonieren des Projekts f\"ur andere User wieder
erlaubt.

Was ist ein Repository (kurz repo)? Im Prinzip handelt es sich 
um ein Projektverzeichnis mit allen Dateien, jedoch arbeiten 
alle SCMs speicheroptimiert und so geht man blo"s von einer 
urspr\"unglichen Version aus und beschreibt dann alle
Ver\"anderungen. Ben\"otigt jemand wirklich einmal die 
aktuelle Version des Projekts (wie zB f\"ur clone), so
wird das Projekt errechnet und das Paket meist als tar.gz
(oder eben also repo wie bei clone) angeboten.

Mercurial wird beispielweise von Gajim (freier Instant Messenger),
QuakeNet IRC Networks (IRC-Server), bitbucket (die Plattform selbst), 
Mozilla (s\"amtliche Software wie zB der Browser Firefox), OpenSolaris 
(UNIX-System), OpenLibrary (sammelt Dokumente aus aller Welt), 
Pocoo.org (Websoftware).

Meine Skripte waren die meiste Entwicklungszeit im Internet verf\"ugbar.
Dabei lud ich die changesets immer auf einen mercurial-Server;
bitbucket.org hat sich unter python-Entwicklern durchgesetzt.
Im M\"arz 2009 gab die Mailingliste von python.org bekannt auch
auf hg umzusteigen.

\section{sockets}

Der Verbindungsaufbau des PyIMs erfolgt \"uber Sockets.

Ein Socket ist der einfachste Kommunikationsweg (bidirektional), um
zwischen zwei UNIX-Systemen kommunizieren zu k\"onnen. Es handelt sich
um eine API (Application Programming Interface), wodurch Netzwerk-
und Interprozesskommunikation erm\"oglicht wird. Ein sichtbares
Beispiel f\"ur jeden Computerbenutzer ist ein Webbrowser, der beim 
Aufrufen einer Webseite eine Verbindung herstellen muss.

Sockets schlie"sen an die ''Alles ist eine Datei''-Philosophie von UNIX
an. Das bedeutet s\"amtliche (virtuell oder nicht) Laufwerke, Verbindungen
und Kernel-Daten sind \"uber die hierarchische Baumstruktur zug\"anglich.
Sie lassen sich Schreiben, Lesen und Schlie"sen. Mitgliefert (von den
Paketen in Programmiersprachen) werden auch Netzwerkfunktionen 
(zB gethostbyname) und Funktionen zur Konfiguration der Verbindung 
(zB set\_blocking).

Sockets sind ein Standard, der auch von Microsoft Produkten eingehalten
bzw. unterst\"utzt wird.

\subsection{SOCK\_STREAM und SOCK\_DGRAM}

Man kann zwei Varianten der Kommunikation unterscheiden: den Stream Socket
(Daten werden als Strom \"ubertragen) und Datagram Socket (Daten werden
als kleine Pakete versandt). Stream Socket arbeitet mit dem 
verbindungsorientierten TCP, w\"ahrend Datagram Sockets UDP verwenden
(die Pakete werden einfach rausgesandt, ohne Garantie der Ankunft).

\subsection{Server vs. Client}

Server und Client haben unterschiedliche Aufgaben. Ein Client baut eine
Verbindung auf und sendet Daten. Er wartet auf die Antwort und beendet
die Verbindung wieder. Ein Server hingegen muss auf Anfragen von Clients
warten (also st\"andig laufen). Dies wird durch eine Endlosschleife
erreicht.

\subsection{Blocking and non-blocking}

Wann ist das Lesen von Daten aus dem Socket beendet? Auf diese Frage
gibt es zwei Antworten: ein Lesen von Daten ist erst beendet, wenn 
der Server ein paar Daten auf den Socket geschrieben hat (blocking
socket). Oder die API returniert einen Error, der anzeigt, dass der
Socket keine Daten mehr liefert.

Die Standardeinstellung sieht (wegen R\"uckw\"artskompatibilit\"at)
eine Verwendung von blockierenden Sockets vor. Jedoch sind 
nicht-blockierende Sockets performanter.


\section{JSON}

JSON ist das voreingestellte Austauschformat f\"ur eine 
Kommunikation mit PyIM.

JSON ist ein Datenaustauschformat, welches urspr\"unglich f\"ur
das Web entwickelt wurde, wobei die Syntax auf Javascript basiert.
Die Idee war es ein Format zu kreiieren, welches gut zu parsen ist
und sich zum Tauschen von Daten eignet. In der Informatik muss man
hierbei zwischen verschiedenen Datentypen unterscheiden. Zahlen 
werden als Integer oder float gespeichert. Texte werden als Strings
bezeichnet.

Hier soll ein kleiner \"Uberblick \"uber die JSON-Datentypen gegeben
werden.
\begin{verbatim}
  {
    'JSON' : "1.2\n",
         0 : -0.1239875e+5,
   'array' : [1, 2, 3, 4],
    'data' : true
  }
\end{verbatim}

Mit JSON wird zuerst einmal ein Objekt \"ubertragen. Ein Objekt ist
ein Datentyp, der durch geschwungene Klammern umfasst wird. Die einzelnen
Elemente des Objekts werden durch ein Komma getrennt. Die Elemente
erzeugen jeweils eine Zuordnung von Schl\"ussel zu Wert. Das erste 
Element ordnet den Schl\"ussel \textit{JSON} dem Wert 
\textit{1.2{\textbackslash}n} zu. Bei \textit{JSON} handelt es sich um 
einen String, der unter einfachen Anf\"uhrungszeichen steht. Die 
Anf\"uhrungszeichen indizieren, dass es sich um einen ungeparsten String 
handelt; der Inhalt wird so behandelt, wie er eingetragen ist. Das Gegenteil 
bildet der String mit doppelten Anf\"uhrungszeichen (geparst). Das
\textit{{\textbackslash}n} im String wird als ein newline interpretiert 
und bei der Ausgabe dieses Strings wird ein 
Zeilenumbruch erzeugt. Das n\"achste Element besteht aus zwei Zahlen.
Auf der linken Seite steht f\"ur den Schl\"ussel ein Integer; eine
nat\"urliche Zahl. Auf der anderen Seite haben wir ein 
Flusskommadarstellung. Der Wert ist negativ und mathematisch w\"urde
man ihn als $-0.1239875{\cdot}10^5$ notieren. Der n\"achste Wert
zeigt ein Array; ein Container von Werte. Das Array umfasst die
Werte mit eckigen Klammern. Der letzte Wert zeigt einen bool'schen
Wert. Boolsche Werte umfassen nur zwei Zust\"ande (\textit{true} 
oder \textit{false}). Nicht in diesem Beispiel enthalten: der Datentyp
\textit{null}, der quasi f\"ur undefiniert steht.

Parser f\"ur JSON sind in nahezu allen verbreiteten Sprachen verf\"ugbar.
Als Beispiel sei genannt: C, ActionScript, C\#, C++, Delphi, Haskell, Java,
Lisp/Scheme, Perl, Objective-C, PHP, Python, Prolog und Ruby.

Die Syntax von JSON ist weitgehend mit der von python kompatibel.
Einen sch\"onen visuellen \"Uberblick \"uber die JSON Syntax bietet
die Webseite json.org\footnote{http://json.org/}

\section{SVG}

Die PyIM Logos und Wallpapers wurden alle urspr\"unglich als SVG erzeugt.
Verwendet wurde daf\"ur die Software Inkscape\footnote{http://inkscape.org/}.

Bei SVG handelt es sich um ein XML-Format, welches schon bald ins Web
Einzug erhalten soll. Das Problem welches sich f\"ur Webentwickler stellt
ist die Vergr\"o"serung bzw. Anpassung von Graphiken an Bildschirmbereite
bzw. Ger\"ate. Werden Graphiken vergr\"o"sert erscheinen sie als pixelig;
besonders bei starker JPEG-Komprimierung. JPEG hat sich als Standardformat
im Web etabliert.


Als Reaktion auf diese Entwicklung entstand die Nachfrage nach einem Format,
in dem Fl\"achen als Objekte zusammengefasst werden, die Gr\"o"sen dynamisch
anpassf\"ahig sind und der Renderer somit in Echtzeit die Graphik neu berechnen
kann und sie nicht aus dem alten Bild anpassen muss. Dies war jetzt eine 
Umschreibung f\"ur Vektorgraphiken und daher r\"uhrt auch der Name SVG
(''Scalable Vector Graphics'').

Im Gegensatz zu PNG, JPEG oder GIF Dateien handelt es sich um ein Textformat;
der Quelltext wird also mit Sonderzeichen, Zahlen und Buchstaben geschrieben.
In Zukunft soll es so m\"oglich sein SVG Graphiken direkt in HTML Seiten
einzubetten oder wie bisher als eine externe Ressource beziehen. Die Syntax
basiert (wie erw\"ahnt) auf XML. Im Folgenden sei ein kleines Beispiel
genannt. Der Quelltext beschreibt die Augen des ACID2-Smileys\footnote{
http://webstandards.org/action/acid2}.

\begin{verbatim}
<!-- eyes -->
<circle cx="80" cy="60" r="10" 
	style="fill:white; stroke:black; stroke-width:1" />
<circle cx="80" cy="60" fill="green" />
<path d="M67,50 C62,55 62,65 67,70" 
	style="fill:none; stroke:#A82; stroke-width:5" />
<circle cx="120" cy="60" r="10" 
	style="fill:white; stroke:black; stroke-width:1" />
<circle cx="120" cy="60" fill="green" />
<path d="M132,50 C138,55 138,65 132,70" 
	style="fill:none; stroke:#A82; stroke-width:5" />
\end{verbatim}

Es war eines meiner Projekte den ACID2-Smiley ins SVG-Format zu 
\"ubertragen\footnote{http://lukas-prokop.at/blog/2008/03/svg-acid2-smiley/}.
In der ersten Zeile befindet sich ein Kommentar, welches durch \textit{$<$!}
(Einleitung f\"ur einen XML-Befehl) und \textit{-{\hskip1pt}-} (klassisches 
Zeichen f\"ur ein Kommentar / einen Anhang) begonnen und durch 
\textit{-{\hskip1pt}-$>$} beendet wird. Die XML-Syntax ist grundlegend wie 
folgt aufgebaut:

\begin{verbatim}
  <tagname eigenschaften="wert">inhalt</tagname>
\end{verbatim}

Sehr markant ist die Eigenschaft \textit{style}, die bereits aus CSS bekannt
ist. Tats\"achlich enth\"alt der SVG-Standard sogar die Klassen- und 
Identit\"atskonzepte von CSS.

%% sry, but no time left :'(
%\chapter{Das eigene Protokoll}
%\section{Verwendung von python-Bibliotheken}
%\section{Das Protokoll}
%\section{Die interne Funktionsweise}
%\section{Anwendung f"ur den Benutzer}

\appendix
\section{Autor}

\copyright\ 2009 Lukas Prokop

Das Projekt ''PyIM'' wurde urspr\"unglich f\"ur meine Matura
am BRG Viktring initiiert. Ich w\"ahlte es, weil ich so meine
(fehlenden) Kenntnisse im Bereich OOP, Netzwerkaufgaben und
python-libraries erweitern konnte. Leider war alles etwas
zeitlich knapp, aber ich konnte einige Erfahrungen sammeln.
Angefangen bei mercurial (SCM). Ich denke es ist eine gute
Plattform, damit ich selbst noch einiges in Zukunft testen
kann und wer wei"s\ldots vielleicht habe ich einmal viel Zeit
frei und dann wird sicher daran weitergearbeitet.

\section{Dank}
Prof. Schmidhofer (Informatik) vom BRG Viktring \\
written with \LaTeXe

\begin{thebibliography}{1}
  \item de.wikipedia.org als Hauptquelle
\end{thebibliography}

\end{document}

