IPython-Notebooks in einem WordPress-Blog veröffentlichen

Wie in einem vorangegangen Artikel erwähnt, bieten IPython-Notebooks hervorragende Möglichkeiten Arbeiten zu publizieren. Einfügungen können als $\LaTeX$-Code oder durch MathJax vorgenommen werden, Bild- und Videomaterial kann ebenso wie Audiosequenzen in die Notebooks aufgenommen werden. Ein Thema lässt sich so auf sehr ansprechende, multimediale Weise darstellen.
Um eine Notebook-Datei für eine Veröffentlichung in ein gängiges Format zu konvertieren, ruft man auf der Kommandozeile folgendes auf:

> ipython nbconvert --to html input.ipynb

Man erhält ein statisches HTML-Dokument aus dem Notebook input.ipynb, durch Angabe von pdf, latex etc. können selbstverständlich auch andere Formate erzeugt werden.
Ein auf diese Weise erstelltes HTML-Dokument lässt sich nun ohne großen Aufwand in einem WordPress-Blog einfügen. Dazu wird lediglich ein Plugin benötigt, welches HTML-Code direkt im Editor einfügen kann. Hier wird die Vorgehensweise anhand des Plugins EmbedIt Pro beschrieben:

EmbedIt Pro:
Embed any HTML code (Youtube, UStream or whatever HTML) in a post, page or widget, deciding precisely where to embed it, either on-the-fly from custom fields OR from your saved HTML Code Snippets. Super easy for newbies but powerful for developers, since it supports not only shortcodes but PHP functions too to return or display the snippets in your templates.

Nach der Installation des Plugins findet man im Dashboard den Punkt HTML Snippets. Wählt man dort Add New kann man nun den HTML-Code auf der vorgesehenen Fläche einfügen (zum bsp. durch vorherige Selektion mit der Maus). Bestätigt man den Code durch klicken auf Veröffentlichen, erhält man einen Shortcode, der direkt im zu erstellenden Artikel eingefügt werden kann.

Ohne weitere Nachbearbeitung kann man mit dem beschriebenen Workflow seine IPython-Notebooks in einem WordPress-Blog veröffentlichen, dies spart Zeit und erhöht die gestalterische Qualität der Publikation.

IP-Adresse eines Android-Geräts ermitteln

Mit Android-Bordmitteln kann man lediglich die IP-Adresse der Wlan-Schnittstelle feststellen (unter Einstellungen->Wlan->Erweitert). Benötigt man die IP-Adresse einer anderen Netzwerkschnittstelle bietet sich folgender Weg an: Herstellung eines Zugang zum Phone über ssh (bspw. mit der App ConnectBot), anschließend kann auf der Kommandozeile mit dem ip-Befehl die IP-Adressen vorhandener Schnittstellen abgefragt werden:

> ip addr show

Bzw. wenn nur ip4-Adressen interessieren und man evtl. noch mit grep die gewünschten Schnittstelle aussortieren will:

> ip -o -4 addr show

Es werden keine root-Rechte benötigt!

PDFs komprimieren

Vor dem Versenden einer großen PDF-Datei als Email-Anhang, sollte man versuchen sie mit Hilfe eines Postscript-Interpreters zu verkleinern. Dies schont nicht nur upload-Volumen, es verringert auch die Gefahr, dass die Email wegen evtl. Restriktion von Mailservern nicht zugestellt wird. Das auf praktisch allen Systemen verfügbare Programm Ghostscript meistert diese Aufgabe zuverlässig.
Über die Option -dPDFSETTINGS kann man dabei die Darstellungsqualität und damit die Größe der erzeugten Dateien bestimmen:

  • /screen wählt die schlechteste Auflösung,
  • /ebook wählt eine mittlere Auflösung,
  • /printer wählt eine hohe Auflösung,
  • /prepress wählt eine sehr hohe Auflösung aus.

Mit den beiden zuletzt genannten Auflösungsstufen wird man in der Regel keine erheblich Kompression gegenüber der Ausgangsdatei erreichen, mit den erstgenannten Angaben jedoch schon – teils signifikant, jedoch um den Preis stark verlustbehafteter Kompression von enthaltenen Bildern. Man muss gegebenenfalls etwas herumspielen, um bei noch akzeptabler Qualität die gewünschte Verringerung der Dateigröße zu erzielen. Mit folgender Kommandozeile

> gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

wird Ghostscript mit vernünftigen Optionen gestartet. Weitere Optionen und Erläuterungen findet man auf der Website von Ghostscript.

Overlays für PDF-Formulare erstellen

Das PDF-Format bietet komfortable Funktionen für die Erstellung interaktiver Formulare an. Leider nutzen nicht alle Autoren diese Möglichkeit und so bekommt man hin und wieder PDF-Dokumente, denen zwar individuelle Angaben hinzugefügt werden sollen, die andererseits aber keine interaktive Eingabemöglichkeit anbieten. In solchen Fällen hilft nur ausdrucken und handschriftliches hinzufügen der Angaben. Diese Vorgehensweise entstammt dem IT-Mittelalter und vergeudet Papier, welches durch einen guten PDF-Workflow eigentlich hervorragend eingespart werden kann. Hier soll ein Lösungsweg auf Basis des Schweizer Messers unter den PDF-Werkzeugen pdftk und LibreOffice (die Vorgehensweise ist für OpenOffice äquivalent).
Ich treffe hier die Festlegung, dass das Ausgangsdokument unter dem Namen input.pdf vorliegt. Da LibreOffice PDF nicht direkt als Format für Hintergrundbilder unterstützt, muss man erst ein Encapsulated Postscript (EPS) Dokument erzeugen:

> pdf2ps input.pdf
> ps2eps input.ps

In LibreOffice öffnet man nun das Menü Format->Seite… und wählt im Reiter Hintergrund als Quelle Grafik. Jetzt kann man das EPS-Dokument (input.eps) als Hintergrundbild auswählen und muss noch bei Art den Punkt Position anklicken. Als Bezugspunkt den Zentrumspunkt wählen und Anwenden klicken.
Nun auf den Reiter Seite gehen und die Seitenränder so verändern, dass das gewählte Hintergrundbild exakt die gleiche Größe und Lage wie im Original hat. Man wählt bspw. Links 0cm, Rechts 0cm, Oben 1.4cm und Unten 0cm.
Um nun Text über die gewünschten Bereiche des Hintergrundbildes zu legen, öffnet man das Menü Einfügen->Rahmen und wählt dort den Reiter Typ. Als Verankerung den Punkt An der Seite einstellen, auf den Reiter Umrandung wechseln und dort bei Stil -kein- klicken. Nach dem Klick auf ok erscheint das Rahmenelement und kann positioniert und dann mit Text gefüllt werden. Sind mehrere Einfügungen an unterschiedlichen Stellen zu machen, legt man auf die beschriebene Weise weitere Rahmen an. Ebenso kann man ein Bild mit einer gescannten Unterschrift oder eines Stempels einfügen. Dabei ist natürlich darauf zu achten, dass das Bild einen transparenten Hintergrund hat (in Gimp bspw. eine Farbe in Transparenz umwandeln).
Zum Schluss setzt man den Hintergrund wieder auf Farbe und Keine Füllung und exportiert das Dokument als PDF (ich wähle hier overlay.pdf als Dateinamen).
An dieser Stelle tritt das Tool pdftk in Aktion:

> pdftk input.pdf background overlay.pdf output output.pdf

Das zusammengesetzte Dokument steht nun unter dem Dateinamen output.pdf bereit. Sollte es Probleme mit der Sichtbarkeit einzelner Boxen geben, so kann statt der Option background auch die Option stamp verwendet werden. In diesem Fall sollte man den Hintergrund der Boxen transparent gestalten.

Links: Ursprüngl. PDF, Mitte: Overlay PDF, Rechts: Zusammengesetztes PDF

Sollte das ursprüngliche Dokument mehrseitig sein, muss das PDF erst in einzelne Seiten zerlegt werden (das folgende Kommando erzeugt Dateinamen im Format pg_%04d.pdf):

> pdftk input.pdf burst

Nach der Bearbeitung der entsprechenden Seiten können sie wieder zusammengefügt werden:

> pdftk pg_0001.pdf pg_0002.pdf pg_0003.pdf cat output output.pdf

IPython Notebook

Das IPython Notebook ist eine web-basierte, interaktive Plattform, um Programmcode, Text, mathematische Formeln und grafische Ausgaben in einem einzelnen Dokument zu vereinen. Notebooks sind normale Dateien, die einfach in andere Formate wie HTML oder PDF etc. umgewandelt werden können. Außerdem können einzelne Notebooks der Öffentlichkeit als statische Webseite zugänglich gemacht werden ohne das der Betrachter etwas zusätzlich installieren muß. Weitere Informationen zu den umfangreichen Möglichkeiten von IPython und Notebooks erhält man auf der IPython-Homepage[ 1].

Um Notebooks nutzen zu können, ruft man in einer Konsole das Kommando

ipython notebook --no-browser

auf, dies startet den lokalen Notebook-Server. In einem Web-Browser kann man sich nun über

IPython Notebook in Google Chrome

IPython Notebook in Google Chrome

http://127.0.0.1:8888 mit dem Server verbinden und gelangt zum IPython Dashboard, von wo aus ein neues oder bestehendes Notebook ausgewählt werden kann. Im Notebook selbst hat man nun über eine Navigationsleiste Zugriff auf verschiedene Funktionen: Der Punkt Cell gestattet z.B. eine Zelle als Markdown auszuwählen. Eine solche Zelle dient der Dokumentation des Kodierungsprozesses und bietet dafür ausgefeilte Möglichkeiten an. So kann Text mit beliebigem HTML-Code formatiert werden, Bilder und andere Multimedia-Inhalte über html5-Elemente eingefügt und mathematische Formeln in $\LaTeX$-Notation angegeben werden. Der Punkt Help bietet Links zur Onlinehilfe von Python, IPython, NumPy, SciPy, MPL und SymPy an.

Über Magics können bestimmte Funktionen auch nach dem Start des Kernels noch unterstützt werden, die ein spezielles Setup für eine reibungslose Zusammenarbeit mit IPython erfordern und deshalb eigentlich beim Aufruf von IPython in der Kommandozeile übergeben werden müssen. Statt des Kommandozeilenaufrufs:

ipython notebook --no-browser --matplotlib inline

können durch Aufruf des Magics %matplotlib inline die Plot-Funktionen auch nachträglich unterstützt werden. Die Angabe des Backends inline bettet statische Bilder innerhalb des Notebooks ein, statt ein separates, interaktives Fenster zu öffnen.

Interaktive Python Sitzungen speichern

Ein großer Vorteil interpretativer Skriptsprachen ist die Möglichkeit Code interaktiv zu testen. Das Sichern einer Sitzung der klassischen Python-Shell ist durch das readline-Modul möglich, welches durch import readline zur Verfügung steht. Durch readline.write_history_file wird der aktuelle Verlauf (History) per Voreinstellung in die Datei ~/.history geschrieben, man kann aber auch einen eigenen Dateinamen angeben. Zurückgelesen wird das ganze dann durch readline.read_history_file. Weiteres ist der Dokumentation zu entnehmen.

Benutzt man IPython, so stehen die Magics %save und %loadpy bereit. Durch die Angabe von

%save testlauf 1-20

werden die Zellen 1 bis 20 in die Datei testlauf.py (die Endung .py wird automatisch angefügt) geschrieben.