SVN-Notify

Aufgrund des Kommentars von Markus zu meinem Beitrag “PHP-Script zum Versenden von Mails nach Subversion-Commits” habe ich heute mal SVN-Notify ausprobiert und ich muss sagen, dass ich mir die Arbeit beim Erstellen meines eigenen Post-Commit-Scripts umsonst gemacht habe (naja, nicht ganz: unsere Benutzer hätten halt gerne deutsche Texte etc.)

Durch folgende Befehle wird SVN-Notify installiert (ein installiertes Perl wird vorausgesetzt):
cpan install SVN::Notify cpan install SVN::Notify::HTML cpan install SVN::Notify::HTML::ColorDiff cpan install Text::Trac cpan install SVN::Notify::Filter::Trac

Die letzten beiden Pakete sind nur interessant, wenn man Trac-Formatierungen in den Kommentaren verwendet (wie es bei uns der Fall ist). Alternativ kann man SVN-Notify auch manuell bauen und installieren (hier gibt es die Quellen: SVN-Notify):
perl Build.pl ./Build ./Build test ./Build install

Nachdem svnnotify installiert und im Pfad erreichbar ist, kann durch folgende Zeile in der hooks/post-commit im SVN-Repository nach jedem Commit eine nett formatierte HTML-Mail inkl. “diff” verschickt werden:
svnnotify --repos-path "$1" --revision "$2" --to mail@example.com --from svn@example.com --handler HTML::ColorDiff --filter Trac --trac-url http://trac.example.com/Sandbox --with-diff --subject-prefix [Sandbox]

Fertig! 🙂

Wegfindung mit dem A*-Algorithmus in Java

Für unser Studienprojekt “Fertigungsanlage” habe ich als Prototypen den A*-Algorithmus in Java umgesetzt. Mit der Implementierung kann auf der Beispielanlage, die im folgenden Bild zu sehen ist, eine Wegplanung durchgeführt werden, die den optimalen Weg zwischen zwei Punkten der Anlage ermittelt.

Beispiel einer Fertigungsanlage

Auf der linken Seite sieht man ein Hochregallager und rechts oben eine LKW-Laderampe. Die Kreise sollen Drehteller darstellen und die Striche sind Förderbänder unterschiedlicher Länge. A1, A2 und B1 sind Fertigungsstationen, die die angelieferten Produkte bearbeiten.

Den optimalen Weg zwischen Hochregallager und Rampe ermittelt der Algorithmus wie im folgenden Bild dargestellt. Selbstverständlich kann man Wege zwischen allen Punkten planen, indem man die Bezeichner als Parameter beim Programmstart übergibt (siehe ProductionPlant.java).

Beispiel einer Wegplanung auf der Fertigungsanlage

Wie gesagt handelt es sich nur um einen Prototypen. Die fertige Wegplanung umfasst dynamisches Planen von Wegen in der ausgelasteten Anlage, Kommunikation mit einer Oracle-Datenbank zur Auftragsbearbeitung, Einlesen der Anlagenkonfiguration aus XML-Dateien, Kommunikation zur Anlagensteuerung per CORBA usw. Ein richtig nettes Projekt, dem ich wohl noch viele Wochenenden widmen werde 😀

Download des Quelltextes

Wegfindung mit dem A*-Algorithmus in Java

Eine ausfüllbare PDF-Datei mittels Java mit Werten füllen

Um mittels Java PDF-Dateien erzeugen und bearbeiten zu können, benötigt man zunächst ein Framework, das die benötigten Funktionen bereitstellt. Listen mit möglichen Bibliotheken gibt es z.B. hier: Java libraries to read and write PDF files, Open Source PDF Libraries in Java.

Ich habe mich für iText entschieden. Nachdem man erstmal die Erzeugung der iText.jar mittels ant hinbekommen hat (siehe How I install my development environment for iText (ANT)) ist der Rest ein Kinderspiel. Das folgende Programm fügt dem ausfüllbaren PDF Antrag.pdf den Wert Berlin in das benannte Feld Wohnort ein und speichert die Datei als AntragAusgefuellt.pdf.

package com.stefanmacke.test; import com.lowagie.text.*; import com.lowagie.text.pdf.*; import java.io.*; import java.util.*; public class PDFTest { public static void main(String[] args) { try { PdfReader reader = new PdfReader("Antrag.pdf"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfStamper stamper = new PdfStamper(reader, baos); AcroFields form = stamper.getAcroFields(); form.setField("Wohnort", "Berlin"); stamper.close(); FileOutputStream fos = new FileOutputStream("AntragAusgefuellt.pdf"); baos.writeTo(fos); fos.flush(); reader.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } } }

Update 18:34 Uhr: Habe gerade noch einen Beitrag zum selben Thema im RubyPDF Blog gefunden. Allerdings verwendet der Autor dort iTextSharp, weshalb ich die Lösung natürlich ein wenig schöner finde 😉

AMR-Dateien mit dem PC abspielen

AMR-Dateien (z.B. Handy-Aufnahmen oder -Klingeltöne) auf dem PC abzuspielen ist gar nicht so einfach. Mein Schweizer Taschenmesser für alles, was mit Multimedia zu tun hat, der VLC Player, kommt leider nicht mit den Dateien klar. Der einzige Player, den ich nach langem Suchen gefunden habe, ist ein alter Nokia Multimedia Player, mit dem man die Dateien allerdings nicht vorspulen kann.

Schlussendlich bin ich nun beim Konvertierprogramm SUPER 2008 gelandet, mit dem ich mir die AMR-Dateien ins MP3-Format umgewandelt, und dann ganz normal mit Winamp abgespielt habe.

PHP-Script zum Versenden von Mails nach Subversion-Commits

Ich habe mir heute ein kleines PHP-Script geschrieben, dass nach Commits auf ein Subversion-Repository automatisch Mails an bestimmte Benutzer versendet, falls Pfade im Repository geändert wurden, die für diese Benutzer von Interesse sind. Es kann hier heruntergeladen werden: postCommitMails.php.

Das Script prüft, ob die eingetragenen Pfade geändert wurden und verschickt entsprechend Mails an die zugeordneten Benutzer (natürlich nur eine Mail per Benutzer, falls Benutzer für mehrere Pfade eingetragen sind).

Aktiviert wird das Script im post-commit-Hook von Subversion. Dazu muss lediglich eine Datei namens post-commit im hooks/-Ordner des gewünschten Repositorys erstellt werden (dort sollte bereits eine entsprechende Dateivorlage zu finden sein), die die folgende Zeile enthält: postCommitMail.php $REPOS $REV

Die Mails sehen so aus:

Es wurden Änderungen am Repository http://svn.intranet/Dokumente vorgenommen (Revision HEAD).

Benutzer macke hat am 12.02.2008 um 12:25 Uhr folgende Dateien geändert:

     D /KleinerTest.txt

Der folgende Kommentar wurde vergeben:

  Test der automatischen Mail-Benachrichtigung

Linux-Zeilenumbrüche in Textdateien auf Windows-Format ändern

Ich erstelle unter Linux einige Logfiles, die ich auch gerne unter Windows anzeigen lassen würde. Der Editor meiner Wahl (PSPad) hat damit zwar kein Problem, aber der Standard-Texteditor notepad.exe, den “normale” Benutzer verwenden, leider schon: Zeilenumbrüche werden als kleine Kästchen dargestellt und verunstalten den Text.

Mit sed oder awk kann man die Linux-Zeilenumbrüche (\n) aber recht einfach in Windows-Zeilenumbrüche (\r\n) umwandeln:

sed 's/$/\r/' linux.txt > windows.txt
awk 'sub("$", "\r")' linux.txt > windows.txt

Mit PHP Werte per POST an eine Website übergeben (z.B. Benutzerlogin)

Heute hatte ich den Wunsch, die Inhalte eines kleinen Forums als RSS-Feed anzubieten. Die Umwandlung der Daten in RSS ging mittels Regular Expressions recht einfach, jedoch liegen die Seiten des Forums hinter einer Login-Seite, die Benutzernamen und Passwort in einem HTML-Formular abfragt. Danach wird ein Cookie gesetzt und die Forumsseiten sind zugänglich. Wie kann ich diesen Login-Vorgang nun mit PHP in einem Script durchführen, dass dann per Cronjob automatisch aufgerufen wird?

Eigentlich recht einfach mittels curl. Zunächst gilt es, die Packages zu installieren:

apt-get install curl php5-curl

Danach sollte das folgende Script laufen und die Forenseiten jeweils als HTML-Datei abspeichern:

// die Foren werden über eine einheitliche URL aufgerufen, // die lediglich den Parameter ID bekommt $url = "http://adresse.des.forums/forum.php?id="; // die Foren sollen als HTML-Datei abgelegt werden, // um später geparst zu werden $ids = array( "123" => "Forum123.htm", "234" => "NochEinForum.htm" ); $curl = curl_init(); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // diese Datei wird zum Speichern des Cookies verwendet curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile"); curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile"); // der Aufruf der Login-Seite curl_setopt($curl, CURLOPT_URL, "http://adresse.des.forums/login.php"); // hier müssen die Benutzerdaten eingetragen werden curl_setopt($curl, CURLOPT_POSTFIELDS, "login=Benutzername&passwort=geheim"); $xxx = curl_exec($curl); foreach ($ids as $id=>$name) { echo "Hole " . $name . "...\n"; // hier wird die URL des Forums zusammengesetzt curl_setopt($curl, CURLOPT_URL, $url . $id); $xxx = curl_exec($curl); file_put_contents("/pfad/zum/script/" . $name, utf8_encode($xxx)); } curl_close ($curl);

Nun noch den ganzen Kram in die /etc/crontab eingetragen und es kann losgehen (jede dritte Stunde werden die Seiten geladen):

0  */3    * * *   root    /pfad/zum/script/getPages.php

Xing

Ich habe es getan: Meine erste Anmeldung in einem Social Network (von einigen Fake-Accounts in den Standard-Communities mal abgesehen 😉 ) Ab heute bin ich Mitglied bei Xing.

Mal schauen, ob das vielgepriesene Networking (mir) tatsächlich irgendetwas bringt. Aber wenn in unserem Studiengang das “Socializing” am Abend quasi schon auf dem Stundenplan steht, muss da ja was dran sein 🙂

Software-Architekturmuster

Sooo… nach den üblichen 5,5 Stunden Zugfahrt (1 davon in einem engen Abteil mit 3 Kindern 😉 ) bin ich heute abend in Nürnberg angekommen, wo ich die nächsten 3 Tage mal wieder meinem Studium widmen werde. Morgen halte ich mit zwei Kommilitonen einen kleinen Vortrag zum Thema Software-Architekturmuster. Im Rahmen eines Praktikums im Fach Software-Technologie war dies eine der gestellten Aufgaben. Ich denke, die Ergebnisse könnten den ein oder anderen interessieren, weshalb ich sie einfach mal hier zum Download anbiete.

Die einzelnen Architekturmuster wurden zwar nicht tiefergehend betrachtet, aber gerade die genannten Quellen dürften interessant sein, da es zu einigen Mustern wirklich wenig Informationen gibt. Unser Dokument bietet auf jeden Fall einen guten Überblick über die folgenden Muster:

  • Layered
  • Subsumption
  • Pipes and Filters
  • Blackboard
  • Distributed
  • Batch Sequential
  • Repository-centric
  • Model View Controller (MVC)
  • Rule-based
  • Frame-based
  • Event-driven
  • Interpreter
  • Disposable

Download

Gesetzt wurde das Dokument natürlich in LaTeX 🙂 Es erhebt weder den Anspruch vollständig zu sein, noch wurde es unter Berücksichtigung wissenschaftlicher Arbeitsweisen erstellt. Es dient lediglich als Handout zu unserer Präsentation.

Software-Architekturmuster.pdf