Freitag, 17. September 2010

LaTeX - Fetisch für Nerds

Im Moment schreibe ich gerade meine Bachelorarbeit und verwende dafür LaTeX, weil ich damit bisher nur gute Erfahrungen gemacht habe. Mit Word habe ich im Hinblick auf wissenschaftliche Arbeiten noch keine schlechten Erfahrungen gemacht, das liegt aber ganz einfach daran, dass viele meiner Bekannten dies netterweise bereits für mich erledigt haben und da ich auf einen Kurz-Vor-Abgabe-Dokument-Korrupt-Herzinfarkt keinen Bock habe bleib ich dabei. Um nicht jedesmal wieder von vorne zu grübeln wie ich die ganze LaTeX-Kampfmaschine einsatzbereit kriege, hier ein paar Notizen:

Distribution
Die allerbeste und dazu noch portable Distribution ist meiner Meinung nach MikTex (portable). Einfach runterladen und die bat-Datei ausführen, Rechtsklick auf das Symbol in der Taskleiste und "Update MikTex" klicken, fettisch! Und wenn man ein zusätzliches Paket braucht, einfach "MikTex Package Manager" aufrufen, leichter gehts nicht.

Editor
Ich gelobe feierlich NIE WIEDER Stunden damit zu verbringen etliche Editoren zu durchforsten, nur um am Ende wieder herauszufinden dass Texmaker der allerbeste ist wo gibt und überhaupt. Ausserdem ist auch der portabel und man kann ihn ganz einfach mit MikTex Portable bekannt machen in dem man die Pfade unter

Optionen > Texmaker konfigurieren > Kommandos

anpasst. Wenn man beispielsweise den Texmaker-Ordner im Selben Ordner hat wie den MikTex-Ordner, dann sieht das ganze ungefähr so aus (Die relevanten Stellen sind rot markiert).



Ich verwende relative Pfade ("../MikTex" bedeutet "Vom aktuellen Verzeichnis aus eine Ebene nach oben und da ins Verzeichnis MikTex"), da der Laufwerksbuchstabe sich ja ändern kann wenn ich meinen Stick an einen anderen PC antecke.

Bibliographie
Ich habe von meinem Lehrstuhl als Vorgabe den apacite Zitierstil zu verwenden. Wenn man wie ich sehr ungeduldig ist, dann liest man sich natürlich nicht die README dazu durch *frtfm* sondern probiert was auf gut Glück, das haut nicht hin und man googled Stundenlang nach Lösungen in Foren ... dämlich. Hier also das Minimaldokument für apacite:


%% main.tex %%%%%%%%
\documentclass[10pt,a4paper]{scrreprt} % Dokumentklasse - Hier die KOMA-Version von report

\usepackage[utf8]{inputenc} % Kodierung
\usepackage[ngerman]{babel} % Sprache
\usepackage{cite} % Zitate - MUSS VOR apacite eingebunden werden
\usepackage{apacite} % Apacite Style einbinden

\begin{document}

%% Beispielzitat
Zitat\cite{fitzgerald:realigning_research_and_practice}

%% Literaturverzeichnis einbinden
\bibliographystyle{apacite}
\bibliography{lit}

\end{document}



%% lit.bib %%%%%%%%%

%% Beispiel-Quelle
@BOOK{fitzgerald:realigning_research_and_practice,
AUTHOR = "Fitzgerald, B. and Russo, N. and DeGross, J.", %Mehrere Autoren werden mit 'and' eingetragen
TITLE = "{R}ealigning {R}esearch and {P}ractice in {I}nformation {S}ystems {D}evelopment: {T}he {S}ocial and {O}rganizational {P}erspective",
PUBLISHER = "Kluwer Academic Press",
YEAR = "2001",
ADDRESS = "Boston",
NOTE = "Eine optionale Notiz"
}


Zum erfolgreichen Kompilieren dann erstmal die alten, von Latex generierten Dateien löschen, LaTeX generieren, BibTeX generieren, PDF generieren ... vielleicht auch ein paar mal bis endlich *tata* das Zitat richtig angezeigt wird

In Texmaker: Werkzeuge> Aufräumen, LaTeX, BibTex, Schnelles Übersetzen

Freitag, 29. Januar 2010

Python und die Newlines

Klingt nach ner lustigen Sketchcomedy, ist aber gar nicht witzig:

Wie ich bei der Arbeit mit codeextract herausgefunden habe können die unsichtbaren Voodoozauber von Python manchmal auch murks erzeugen. Python arbeitet, wenn es um Strings geht, intern mit \n also Unix-Zeilenumbruchszeichen. Windows verwendet hingegen eine Kombination von \r\n.

Python macht es sich beim speichern eines Strings in eine Datei (meinedatei.write(string)) ganz einfach: Wenn das Skript unter Windows läuft ersetzt der Interpreter \n durch \r\n.

Preisfrage: Was passiert wenn der String ein Windows-Format aufweist und in eine Datei gespeichert wird?
Antwort: Aus \r\n wird \r\r\n!

Das führt dazu dass die Textdatei entweder (Je nach Texteditor) gar nicht angezeigt werden kann, oder zwischen jeder Zeile eine Leerzeile entsteht.

Bei den ActiveState Recipies bin ich aber auf eine elegante und einfache Lösung gestoßen. Per Regular Expression werden hier jegliche Newline-Formate auf Unix-Format (\n) normalisiert:


import re
windows_string = 'Zeile 1\r\nZeile 2'
unix_string = re.sub(r'(\r\n\r\n)', '\n', string)
# unix_string --> 'Zeile 1\nZeile 2'


Das ganze hab ich schon in codextract ausprobiert. Funktioniert blendend!

Mittwoch, 20. Januar 2010

Wie man Excel seinen Code entlockt

Wie ich das letzte mal festgestellt habe komme ich um eine Code-Extraktion marke Eigenbau nicht herum. Ich hab mich erst mal informiert wie ich über pywin per COM Excel steuern kann. Das gestaltete sich einfacher als ich gedacht hatte!

Excel öffnen und schließen


import win32com.client

# Neue Instanz von Excel
excel = win32com.client.Dispatch("Excel.Application")
# Sicherheitsrichtlinien speichern und Makros deaktivieren
security = excel.AutomationSecurity
excel.AutomationSecurity = 3
# Workbook öffnen
wbook = excel.Workbooks.Open("C:/Pfad/zur/Excel/datei.xls)

# Code hier einfügen!!

# Sicherheitsrichtlinien zurücksetzen
excel.AutomationSecurity = security
# Workbook schließen (Ohne zu speichern)
wbook.Close(False)
# Excel Instanz schließen
excel.Quit()



Die Sicherheitsrichtlinien stelle ich deshalb um, damit während der Extraktion nicht die wildesten
Makros abgefeuert werden.

Ab hier kommt man mit der gut versteckten aber extrem nützlichen Microsoft Excel 2003 Language Reference weiter, da der zugriff auf die Excel-Objekte wie in VBA läuft ... nur eben toller über listen und so ... Schöööntoll!

Herausgekommen ist das kleine Tool codeXtract, das ihr euch hier herunterladen könnt

Wichtig: Es müssen pywin (Python Library) sowie Excel installiert sein !!

Die Bedienung ist denkbar einfach:
python codeextract.py -i inputpath -o outputpath

wobei inputpath eine XLS-Datei sein kann oder ein Verzeichnis, in dem dann rekursiv alle XLS-Dateien durchsucht werden. Outputpath muss ein Verzeichnis sein. Wenn es noch nicht existiert wird es angelegt. Bei der Extraktion wir die Verzeichnisstruktur (im rekursiven Modus) beibehalten, wobei der Inhalt der XLS-Dateien in ein Verzeichnis mit dem Namensschema [FILE] Dateiname geschrieben wird.

Die Module, Classfiles, etc. werden darin wiederum in Unterordner gepackt, so dass sich eine Struktur ähnlich der im VBA Editor ergibt. Macht man das vor jeden neuen Commit, so lässt sich der Code in Zukunft sauber Versionieren.

Wenn ihr meinen Code nützlich findet würde ich mich über nen kurzen Kommentar freuen. Wenn ich codeXtract noch weiter ausbauen sollte werde ich dann die Ergebnisse hier posten.

Mittwoch, 16. Dezember 2009

VBA Code konforportabel versionieren mit Bazaar: Von hinten durch die Brust ins Auge

Erster Post, na denn ...

Overtüre

Als Werkstudent eines erfolgreichen deutschen Multifastillionen-Konzerns merkt man schnell: Der Kitt in den Fugen heisst Excel *fanfarentirilli*

Man merkt anschliessend an der ständig wachsenden Schlange interessierter Kollegen dass jegliche Fähigkeiten die über das aufzeichnen von Makros hinausgehen heissbegehrt sind. Anfangs macht das zusammenhacken von Makros ja auch noch Spass und die Wünsche sind meist recht schnell erfüllt (Wobei man der Paarung von "VBA" und "Spass" natürlich immer Skeptisch gegenüberstehen sollte). Da wird dann das kleine Angebots-Makro von gestern schnell zum Universal Offer Tool Framework V5.6

Spätestens hier hört der Spass auf, denn dafür war VBA nie gedacht (Wobei die Paarung von "VBA" und "Denken" ... ach wie müßig). Man reisst sich also am Riemen und fängt erst mal an hie und da Kommentare einzustreuen und alles mehr oder weniger sinnvoll zu ordnen. Dabei kann man mit 100%iger Sicherheit sagen dass irgendwas in die Binsen geht. Wie gut dass man ja immer "n Backup macht" (Sprich: Klick auf XLS, Strg + C, Strg + V, Umbenennen).

Machen wirs kurz: Nach dem Urlaub hat man keinen blassen Schimmer mehr welches Backup welchen Stand der Dinge wiederspiegelt und man nimmt sich fest vor: "Ab jetzt wird versioniert!".

Versionierungssoftware

Ich will jetzt keinen Glaubenskrieg entfachen denn ich suche mir meine Werkzeuge nach folgendem einfachen Prinzip aus: "Check ich? Ja! Funzt? Ja! Kost was? Nö! Geilo!"

Aus der Uni kenne ich SVN was meine o.g. Prinzipien voll erfüllt. Das Problem ist dass ich wahrscheinlich erst mit Charly nach Candymountain reisen muss bin bis ich von der IT nen SVN Server aufgesetzt bekomme. Ausserdem kann ich mir kein TortoiseSVN installieren weil ich keine Adminrechte habe (Messer, Gabel, Schere, Root tut dem Werksstudent nicht gut) Aber halt, gab es da nicht sowas wie ...

Bazaar + PortablePython = Geilo²

Bazaar ist ein verteiltes Versionierungssystem. Soweit so unklar. Das tolle ist, dass es lokal d.h. ohne dedizierten Server verwendet werden kann: Ohne Installation! Wow! Aber man kann seinen Branch (working copy) auch mit anderen teilen, abgleichen, mergen, zentral ablegen, verteilt bearbeiten ... Alles kann nichts muss ... super, kein Plan! Gut dass Bazaar eine super Dokumentation hat mit dem selbst meine ungeduldige Wenigkeit zurecht kommt (Guter Einstieg: Bazaar in five minutes).

Nach kurzer Lektüre fand ich folgendes toll:
  1. Ich muss nix installieren
  2. Ich kann sofort lokal losversionieren (commit)
  3. Ich kann auf Arbeit die Änderungen auf ein zentrales Repository (Auf nem popeligen Windows Share) "pushen", zur Sicherheit falls meine Kiste mal abraucht.
  4. Der Kommandozeilenclient ist einfach zu bedienen
  5. Eine GUI ist aber gleich dabei (Bazaar Explorer) *freu*

Kleine Hürde: Ich brauch dazu Python weil Bazaar darauf basiert. Gut dass es sein einiger Zeit Portable Python gibt. Portable Python ist für mich was das Bowie-Messer für Crocodile Dundee ist: Die Allzweckwaffe! Ohne Admin-Rechte scripten bis der Arzt kommt!

21. Jahrhundert: Ich komme! Wäre da nicht noch ein klitzekleines Problem ...

XLS Dateien sind binär: Doh!

Warum nur !? Jetzt kann ich zwar frühere Versionen wiederherstellen aber ich hab keine Ahnung was geändert wurde, da der VBA code natürlich nicht im Klartext in den XLS Dateien liegt sondern brav ver10t wurde. Es gibt zwar Plugins für Bazaar mit denen man Änderungen im Dokument (Sprich in den Zellen) darstellen kann, die kümmern sich aber nicht um den code!

Da hilft nur eins: Ärmel hochkrempeln und selber was programmieren! Aber mehr dazu im nachsten Post.