%% Presentation about ctypes

%% Some useful variations of the document class
%%\documentclass[draft]{beamer}
%%\documentclass[handout]{beamer}
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{texments}
\usepackage{lmodern}
%% get the smiley
\usepackage{wasysym}
\mode<presentation>{\usetheme{Copenhagen}}
\title{ctypes: Python-Bindings ohne C-Code}
\author{Marek~Kubica}
\date{18.~Juni~2009}
\institute{$\mu$Py}

%% define texments style
\usestyle{default}
%% define beamer colors
\usecolortheme{python}
\input{cc_beamer}

\begin{document}

\frame{
  \titlepage
  \vfill
  \begin{center}
    \CcGroupBy{0.83}\\[2.5ex]
    {\tiny\CcNote{\CcLongnameBy}}
    \vspace*{-2.5ex}
  \end{center}
}

\AtBeginSection[]{
  \begin{frame}
    \frametitle{\insertsection}
    \tableofcontents[currentsection]
  \end{frame}
}

\section{Das C-Library Ökosystem}
\subsection{Übersicht}

\begin{frame}{Was gibt es denn für Libraries?}
  \begin{columns}[c]
    \column{0.5\textwidth}
      \includegraphics[height=7cm]{library}
    \column{0.5\textwidth}
      \begin{enumerate}
        \item libc
        \item xlib
        \item Necko
        \item OpenSSL/GnuTLS
	\item OpenGL
	\item Cairo
	\item GLib/APR
	\item RSVG
	\item geschätzte 1 Mio weitere
      \end{enumerate}
  \end{columns}
\end{frame}

\subsection{Problemstellung}

\begin{frame}{Gründe}
  \begin{columns}
    \column{0.6\textwidth}
      \begin{block}{C ist dominant}
        Leider sind nicht alle Libraries in Python geschrieben
        \begin{itemize}
          \item älter als Python (xlib)
          \item Performance (GTK+)
          \item geringer Ressourcenverbrauch (libxml2)
          \item Interoperabilität
        \end{itemize}
      \end{block}
    \column{0.4\textwidth}
      \includegraphics[width=4cm]{cprog}
  \end{columns}
\end{frame}

\subsection{Lösungsansätze}

\begin{frame}{Module}
  \begin{columns}
    \column{0.5\textwidth}
      \includegraphics[width=6cm]{module}
    \column{0.5\textwidth}
      \begin{block}{Python kann durch eigene Module erweitert werden}
        \begin{itemize}
          \item Jede Variante: reine Python-Module (``pure Python modules'')
          \item Jython: Java-Code (+ sonstige JVM-Sprachen)
          \item IronPython: C\# (+ sonstige .NET-Sprachen)
          \item CPython: C und C++, über Hacks auch OCaml
        \end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\begin{frame}{SWIG}
  \includegraphics[width=2cm]{swig10}
  \includegraphics[width=2cm]{swig11}
  \includegraphics[width=2cm]{swig13}
  \includegraphics[width=2cm]{swig16}
  \includegraphics[width=2cm]{swig17}
  \begin{block}{Simplified Wrapper and Interface Generator}
    \begin{itemize}
      \item Wrapper für Python, Ruby, C\#, Java, Scheme, Common Lisp,
        Lua, OCaml, Perl...
      \item kommt mit ANSI C komplett und ANSI C++ teilweise
        zurecht
      \item spezielle SWIG-Dateien müssen geschrieben werden
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}{Cython}
  \begin{columns}
    \column{0.5\textwidth}
      \includegraphics[width=6cm]{sharkcat}
    \column{0.5\textwidth}
      \begin{block}{Python mit C gemischt}
        \begin{itemize}
	  \item Python mit C-Datentypen
	  \item momentan noch ein Python-Subset
	  \item Nachfolger von Pyrex
	  \item verwendet um Code zu beschleunigen
	  \item eignet sich auch zum Wrappen von C-Libraries
		    (lxml, Binding für libxml2)
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\section{Das \texttt{ctypes}-Modul}

\subsection{Informationen}

\begin{frame}{Über \texttt{ctypes}}
  \begin{columns}
    \column{0.3\textwidth}
      \includegraphics[height=7cm]{oldinterface}
    \column{0.7\textwidth}
      \begin{block}{FFI}
        \begin{itemize}
	  \item \emph{Foreign Function Interface}
	  \item Zugriff auf nicht gelinkte Shared Objects (DLLs)
	    zur Laufzeit
	  \item Technik nicht neu, gibts woanders genauso
	  \item funktioniert nur mit C-Libraries gut
	\end{itemize}
      \end{block}

      \begin{block}{ctypes}
        \begin{itemize}
	  \item FFI-Modul für Python
	  \item ab 2.3 lauffähig, ab 2.5 mitgeliefert
	  \item Python 3.x-kompatibel \smiley
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\begin{frame}{Vor- und Nachteile}
  \begin{columns}[t]
    \column{0.5\textwidth}
      \includegraphics[height=3cm]{smiling}
      \begin{block}{Vorteile}
        \begin{itemize}
	  \item funktioniert auf jedem Python mit \texttt{ctypes}
	  \item kein Compiler notwendig
	  \item reiner Python-Code
	\end{itemize}
      \end{block}
    \column{0.5\textwidth}
      \includegraphics[height=3cm]{sadpod}
      \begin{block}{Nachteile}
        \begin{itemize}
	  \item langsamer als natives Binding
	  \item funktioniert nur mit Code, der die C-Aufrufsemantik
	    befolgt
	  \item segfaultet bei Fehlern
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\subsection{Vorgehen}

\begin{frame}{Üblicher Ablauf}
  \begin{columns}
    \column{0.7\textwidth}
      \begin{block}{Wie wrappt man eine Library mit ctypes}
        \begin{enumerate}
          \item C-Dokumentation besorgen (insbesondere auch Header)
	  \item C-Beispiele überfliegen
	  \item Datentypen definieren (\texttt{struct}, \texttt{union})
	  \item Konstanten definieren
	  \item Libraries einbinden
	  \item Parametertypen und Rückgabewerte definieren
	  \item Funktionen aufrufen
	  \item \emph{optional:} Aufrufe unter hübscher API kapseln
        \end{enumerate}
      \end{block}
    \column{0.3\textwidth}
      \includegraphics[width=3.5cm]{flow}
  \end{columns}
\end{frame}

\section{Ein kleines Projekt}

\subsection{Unique, eine kleine C-Library}

\begin{frame}{Was wir wrappen werden}
  \begin{columns}
    \column{0.6\textwidth}
      \includegraphics[width=7cm]{alreadyrunning}
    \column{0.4\textwidth}
      \begin{block}{unique}
        \begin{itemize}
	  \item löst ``nur ein Exemplar der Applikation
	    soll gleichzeitig laufen''-Problem
	  \item baut auf C, GLib und GTK+ auf
	  \item dadurch vergleichsweise einfach zu wrappen
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\subsection{Der Wrapper-Code}

\begin{frame}[fragile]{Library referenzieren}
  Wie heißt die Library auf dem System?
  \begin{pygmented}{pycon}
>>> import ctypes, ctypes.util
>>> name = ctypes.util.find_library('libunique-1.0')
>>> name
'libunique-1.0.so.0'
>>> # jetzt eine Referenz erstellen
>>> unique = ctypes.CDLL(name)
  \end{pygmented}
  Voilà, wir haben eine C-Library eingebunden!
\end{frame}


\begin{frame}[fragile]{Libraries, Typen}
  \begin{pygmented}{python3}
# die Libraries
unique = ctypes.CDLL(
    ctypes.util.find_library('unique-1.0'))
gobject = ctypes.CDLL(
    ctypes.util.find_library('gobject-2.0'))
gtk = ctypes.CDLL(
    ctypes.util.find_library('gtk-x11-2.0'))
# Typ Aliase
gchar = ctypes.c_char
gchar_p = ctypes.c_char_p
gint = ctypes.c_int
gboolean = gint
gpointer = ctypes.c_void_p
guint = ctypes.c_uint
  \end{pygmented}
\end{frame}

\begin{frame}[fragile]{Konstanten}
  \begin{pygmented}{python3}
# UniqueCommand
UNIQUE_INVALID = 0
UNIQUE_ACTIVATE = -1
UNIQUE_NEW = -2
UNIQUE_OPEN = -3
UNIQUE_CLOSE = -4
# UniqueResponse
UNIQUE_RESPONSE_INVALID = 0
UNIQUE_RESPONSE_OK = 1
UNIQUE_RESPONSE_CANCEL = 2
UNIQUE_RESPONSE_FAIL = 3
UNIQUE_RESPONSE_PASSTHROUGH = 4
  \end{pygmented}
  Werte aus den Headern der \texttt{libunique} abgeschrieben.
\end{frame}

\begin{frame}[fragile]{Parameter und Rückgabewerte}
  \begin{pygmented}{python3}
# define to be gchar_p and not c_wchar_p
unique.unique_app_new.argtypes = [gchar_p, gchar_p]
unique.unique_app_new.restype = ctypes.c_void_p
  \end{pygmented}
  \texttt{unique\_app\_new} hat als Parameter zwei (Byte-)Strings
  und gibt ein \texttt{UniqueApp*} zurück, das wir als
  \texttt{c\_void\_p}, also Pointer-to-void übernehmen.
\end{frame}

\begin{frame}[fragile]{In Aktion}
  \begin{pygmented}{python3}
def main():
    # GTK+ initialisieren
    gtk.gtk_init()
    # registrieren
    app = unique.unique_app_new(
      'net.xivilization.unique', None)
    # nachsehen, ob es gestartet ist
    running = bool(unique.unique_app_is_running(app))
    # Objekt entfernen
    gobject.g_object_unref(app)
  \end{pygmented}
  GTK+ initialisieren, Applikation registrieren, nachsehen ob sie schon 
  läuft. Je nachdem entweder starten oder Fehlermeldung ausgeben.
\end{frame}

\subsection{Erweiterungsmöglichkeiten}

\begin{frame}{Weitere Features von Unique}
  \begin{columns}
    \column{0.4\textwidth}
      \includegraphics[height=6.5cm]{extend}
    \column{0.6\textwidth}
      \begin{block}{Unique und ctypes können noch mehr}
        \begin{itemize}
	  \item Nachrichten an gestartete Applikationen schicken
          \item die GTK+ Mainloop starten und Events verarbeiten
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\begin{frame}{Probleme}
  \begin{columns}
    \column{0.4\textwidth}
      \includegraphics[width=5cm]{shattered}
    \column{0.6\textwidth}
      \begin{block}{Es gibt auch ein paar Probleme}
        \begin{itemize}
	  \item beim Starten der Mainloop hört \texttt{\^{}C} 
	    auf zu funktionieren
          \item mögliche Probleme mit PyGTK
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\section{Weitere Informationen}

\begin{frame}{Dokumentation}
  \begin{columns}
    \column{0.4\textwidth}
      \includegraphics[height=6.5cm]{paperstack}
    \column{0.6\textwidth}
      \begin{block}{\texttt{ctypes} ist dokumentiert}
        \begin{itemize}
	  \item Stdlib-Dokumentation: 48 A4-Seiten
	  \item Tutorials im Internet
	  \item Quelltexte von PyOpenGL, dem TRE-Binding
	    für Python, etc.
	\end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\begin{frame}{Die Sprache C}
  Falls es doch ein wenig mehr Kenntnisse braucht...
  \begin{columns}
    \column{0.4\textwidth}
      \includegraphics[width=6.2cm]{krbook}
    \column{0.6\textwidth}
      \begin{block}{C Ressourcen}
        \begin{itemize}
          \item The C Programming Language, bekannt als \emph{K\&R}:
	    das C-Lehrbuch schlechthin
          \item C in a Nutshell: Ein Überblick über C.
        \end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\begin{frame}{Credits}
  \begin{columns}
    \column{0.4\textwidth}
      \includegraphics[width=5cm]{sharing}
    \column{0.6\textwidth}
      \begin{block}{Code \& Ideen}
        birkenfeld, fred.reichbier, Trundle
      \end{block}
      \begin{block}{CC-NC-SA lizensierte Bilder von flickr}
        mwichary, munaz, nostri-imago, SOCIALisBETTER, purrr, benjibot,
        fncll, wooandy, kurafire, lexnger, bionicteaching, t0msk
      \end{block}
  \end{columns}
  Danke, das war's!
\end{frame}

\end{document}
