Beispielimplementierung des LZW-Algorithmus in Java

Im Rahmen meines Studiums (Software-Engineering) durfte ich im letzten Präsenzblock die Vorlesung Multimedia besuchen. Dort haben wir auch den Lempel-Ziv-Welch-Algorithmus angesprochen, einen bekannten Algorithmus zur Entropiekodierung. Um die ganze Theorie dahinter (so viel ist es aber eigentlich gar nicht) besser zu verstehen, habe ich eine kleine Implementierung des Algorithmus in Java erstellt. Wen es interessiert, das Progrämmchen gibt es hier zum Download: Beispielimplementierung des LZW-Algorithmus in Java.

Das Ergebnis des Programms für den String, der auch in der Wikipedia verwendet wird, ist im folgenden Screenshot zu sehen.

Beispielaufruf des LZW-Algorithmus in Java

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

MediaWiki-Extension: SVNIntegration

Gestern habe ich meine erste "offizielle" MediaWiki-Extension auf mediawiki.org eingestellt: SVNIntegration. Ich habe zwar schon einige Sachen für unser Wiki entwickelt (z.B. ein Berechtigungskonzept und eine Art ToDo-Liste für die Mitarbeiter) aber die waren sehr speziell und nicht unbedingt für die Öffentlichkeit interessant (jedenfalls meiner Meinung nach).

Eine Subversion-Integration, wie es sie z.B. auch für DokuWiki gibt (Plugin Websvn), wäre jedoch vielleicht auch für den ein oder anderen interessant, sodass ich meine Erweiterung wie gesagt veröffentlicht habe. Sicherlich kann man auch darauf verzichten und gleich Trac verwenden, aber wenn sich ein Wiki einmal etabliert hat, möchte ich es ungern durch eine neue Software ablösen.

Was kann die Erweiterung denn nun so alles? Bislang lediglich drei Aufgaben:

  • Dateiinhalte aus Subversion (SVN) auslesen und anzeigen (inkl. Syntax-Highlighting)
  • Eine kleine Info-Tabelle für eine Datei anzeigen (letzte Änderung, Autor, Revision etc., siehe Beispiel unten)
  • Die Änderungshistorie einer Datei ausgeben

Dabei werden übrigens Commit-Messages, die MediaWiki-Markup enthalten, in HTML umgewandelt und entsprechend formatiert (Siehe Beispiel unten. Dass der zweite Aufzählungspunkt nicht umgewandelt wird, liegt daran, dass ich das falsche Markup (nämlich das von Trac) verwendet habe :) ).

Selbstverständlich funktionieren alle Parameter, die man Subversion auf der Kommandozeile übergeben kann. Hier ist ein Beispiel, das zu dem im Bild gezeigten Ergebnis führt:

<SVNFileInfo username="user" password="pass" revision="67">http://svn.intranet/Sourcecodes/Natural/V-SYSTEM/VOLLVST.nat</SVNFileInfo>

Beispiel für einen SVNIntegration-Befehl: SVNFileInfo

Download

Wie auch auf der MediaWiki-Seite verlinkt, gibt es die Extension hier zum Download: Download von SVNIntegration.

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

CSS-Unterstützung im Internet Explorer 7

Wie ich heute festgestellt habe, funktionieren einige CSS-Selektoren im Internet Explorer 7 nur, wenn im HTML-Quelltext ein DOCTYPE (strict, loose etc., völlig egal welcher) gesetzt ist. Nicht, dass ich das nicht ohnehin bei jeder Website mache, die ich gestalte, aber es gibt durchaus einige "Generatoren" für Websites, die diesen Standard nicht befolgen. Und schon funktioniert z.B. der Attribut-Selektor nicht, z.B.:

input[readonly]

CSS2 Test Suite: 5.8.1 Attribute Selectors

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Natural-Workfiles mit dynamischer Zeilenlänge erstellen

Natural-Workfiles sind bei uns ein beliebtes Hilfsmittel zum Datenex- und -import zwischen den einzelnen Systemen. Leider haben die "normalen" Workfiles die Eigenart mit fixen Zeilenlängen zu arbeiten, was kurze Strings z.B. mit Leerzeichen auffüllt (wordurch die Datengröße drastisch steigt).

Das folgende kleine Natural-Programm zeigt, wie man Workfiles mit dynamischer Zeilenlänge füllt. Man beachte das H'0A' in der WRITE WORK-Zeile: Das ist ein manueller Zeilenumbruch.

DEFINE DATA
*
LOCAL
* Zeilenvariable für das Workfile
01 #WORK1 (A) DYNAMIC
*
END-DEFINE
*
* Definition des Workfiles
DEFINE WORK FILE 1 '$HOME/SomeWorkFile.txt' TYPE 'UNFORMATTED'
*
#WORK1 := 'Test'
*
WRITE WORK 1 VARIABLE #WORK1 H'0A'
CLOSE WORK 1
*
END
Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Aktuelle neue Alben im März und April

Im Moment gibt es für Freunde der leichten Unterhaltung einiges auf die Ohren: Pennywise, No Use For A Name, Millencolin und Good Riddance haben jeweils ein neues Album am Start!

Pennywise haben sich entschieden, ihr Album "Reason to believe" kostenlos (!) im Internet zu veröffentlichen und ich kann nur jedem raten, es herunterzuladen, denn es sind einige Ohrwürmer dabei und man kann es durchaus von vorne bis hinten durchhören, ohne langweiligen Songs lauschen zu müssen. Eine absolute Empfehlung. Die letzte Download-Zahl, die ich gelesen habe, lag bei 500.000! Absolut verdient. Und "The Western World" ist direkt mal auf Platz 34 der Amerikanischen Charts eingestiegen (und es ist nicht der beste Song des Albums!).

Eine absolute Enttäuschung ist dagegen "The Feel Good Record Of The Year" von No Use For A Name. Erinnert mich irgendwie an das letzte Album von Yellowcard: Der erste Song ("Biggest Lie") ist ein Knaller und danach kommt nur noch (langsamer, softiger, leider auch nicht melodischer) Müll. Schade eigentlich.

Ich glaube ähnlich wird es bei Millencolins "Machine 15" aussehen. Der erste Song "Detox" ist schonmal sehr "mainstreamig". Was soll das eigentlich? Wie können zwei ehemals so gute Bands wie No Use und Millencolin, denen ich meine ersten Jahre des Punks verdanke, zu solchen Sell-Outs werden... tststs...

Da bleibt nur noch der Ausweg in Erinnerungen zu schwelgen und dem Live Album von Good Riddance (das gleichzeitig leider das letzte der Band ist) zu lauschen. All the Best Songs wäre ein passenderer Name gewesen als "Remain in Memory"... *schnüff*

Wie gut, dass es auch ein paar neue Bands gibt, die es sich anzuhören lohnt. Wie z.B. A Wilhelm Scream, die ein kleines Video zum Kracher "I Wipe My Ass With Showbiz" veröffentlicht haben. Inklusive Seitenhieb auf die (oben genannten) Sell-Outs ;)

Und für die nahe Zukunft sind auch schon neue Alben von Goldfinger, Pulley und (endlich!) Craig's Brother angekündigt. Da wird jawohl was Schönes dabei sein!

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Anonymen Read-Only-Zugriff für ein Subversion-Repository einrichten

Geht ganz einfach: In der entsprechenden Konfigurationsdatei des Apache vor Require valid-user die folgende Zeile einfügen und den Apache neustarten (siehe Server Configuration im SVNBook):

Satisfy Any

In die Access-Konfigurationsdatei (meist access.conf) von Subversion für das gewünschte Repository die folgende Zeile einfügen:

* = r

Das war's!

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Einheitliche Textausgabe mit Java auf der Konsole und in JSP

Ich habe heute mal ein wenig mit JSP rumgespielt und nach einer Lösung gesucht, Textausgaben per Sytem.out.println() auch in einer JSP auszugeben. Standardmäßig landen solche Ausgaben nämlich in JSP nicht im HTML-Text, sondern im Tomcat-Logfile.

Ich habe eine einfache Anwendung, die Textausgaben erzeugt. Diese soll sowohl über die Konsole, als auch über eine JSP-Seite aufgerufen werden können. Gebe ich die Texte nun per Sytem.out.println() aus, erscheinen sie auf der Konsole, aber nicht in der JSP (hier muss out.println() verwendet werden).

Die sauberste Lösung wäre sicherlich, die Ausgaben aus den "arbeitenden" Klassen zu entfernen und je nach Umgebung einen geeigneten Konsolen- bzw. JSP-View für die Textausgaben zu verwenden. Aber zum Rumspielen ist mir das zuviel Aufwand :-)

Die Lösung für mein Problem sieht nun so aus: Ich habe einfach alle Sytem.out.println()-Ausgaben durch Writer.println() ersetzt, wobei Writer eine statische Klasse ist, die ein Attribut vom Typ PrintWriter besitzt und alle Anfragen an println() an dieses weiterleitet. Mittels Writer.setWriter(PrintWriter pw) kann dieser Writer nun je nach Umgebung auf ein geeignetes Ausgabeobjekt gesetzt werden: Auf der Konsole wäre das PrintWriter(System.out) und in JSP PrintWriter(out).

Das Ganze funktioniert, da der Konstruktor von PrintWriter polymorph ist und sowohl mit einem java.io.Writer (von dem JspWriter (Objekt out unter JSP) abgeleitet ist), als auch mit einem java.io.OutputStream (von dem PrintStream (Objekt System.out der Konsole) abgeleitet ist) aufgerufen werden kann.

Beispiel

Klasse Writer:

  1. import java.io.PrintWriter;
  2. public class Writer
  3. {
  4.         private static PrintWriter s_pw;
  5.         public static void setWriter(PrintWriter pw)
  6.         {
  7.                 s_pw = pw;
  8.         }
  9.         public static void println(Object o)
  10.         {
  11.                 s_pw.println(o);
  12.         }
  13.         public static void println()
  14.         {
  15.                 println("");
  16.         }
  17. }

Textausgabe in irgendeiner Klasse:

  1. public void gibWasAus()
  2. {
  3.         Writer.println("Das ist der auszugebende Text.");
  4. }

Aufruf der obigen Klasse auf der Konsole in der main():

  1. Writer.setWriter(new PrintWriter(System.out), true);
  2. // Instantiieren des Objektes "ausgObj" etc.
  3. ausgObj.gibWasAus();

Aufruf der obigen Klasse auf der Konsole in der JSP-Datei:

  1. Writer.setWriter(new PrintWriter(out), true);
  2. // Instantiieren des Objektes "ausgObj" etc.
  3. ausgObj.gibWasAus();
Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Mittels XPath in Java Werte aus XML-Dateien lesen

Genauso wie das Validieren von XML-Dateien gegen Schemas ist auch das Auslesen von Werten aus XML-Dateien mittels XPath sehr gut im Internet dokumentiert: z.B. The Java XPath API oder Java, XPath und Namespaces.

Ich erweitere mal mein kleines PlantBuilder-Beispiel um eine einfache Auflistung der IDs aller in der XML-Datei enthaltenen Module:

  1. XPath xpath = XPathFactory.newInstance().newXPath();
  2. xpath.setNamespaceContext(new PPNamespaceContext());
  3. String xModules = "/pp:ProductionPlant/pp:Modules/pp:Module";
  4. NodeList modules = (NodeList) xpath.evaluate(xModules, doc, XPathConstants.NODESET);

Wichtig ist, dass doc Namespace-aware eingelesen wurde (siehe Zeile 47 im Quelltext) und ein NamespaceContext angelegt wird, da die zu verarbeitende XML-Datei Namensräume verwendet.

Download

Das erweiterte PlantBuilder-Beispiel inkl. benötigter import-Anweisungen und NamespaceContext gibt es hier zum Download: PlantBuilder2.

Und so wird es ausgeführt:

Kompilierung und Ausführung von PlantBuilder2

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

WDS-Image auf Basis eines Windows XP PCs erstellen

In den letzten Tagen habe ich mich mit den Windows Deployment Services herumgeschlagen. Inzwischen habe ich es nach einigem Rumprobieren und Lesen von zahlreichen Forenbeiträgen endlich geschafft, ein Image von einem Windows XP PC zu erstellen und dieses automatisch an andere PCs zu verteilen. Meine Vorgehensweise basiert hauptsächlich auf diesen drei Artikeln:

Vorgehensweise

  1. PC für WDS-Image vorbereiten (Windows, Treiber und Software installieren)
  2. Computer aus der Domäne entfernen und umbenennen (bspw. in ImagePC)
  3. Inhalt der \Support\Tools\Deploy.cab von der Windows-CD nach c:\sysprep entpacken
  4. Optional: c:\sysprep\setupmgr.exe starten und eine neue sysprep.inf erstellen
    • Keine (!) vollständig automatisierte Installation
    • Computernamen automatisch generieren
    • Die erzeugte sysprep.inf auf den WDS-Server kopieren, da sie später für die automatische Installation benötigt wird
  5. c:\sysprep\sysprep.exe ausführen ("Miniinstallation verwenden" auswählen und "Erneut versiegeln" anklicken)
  6. PC starten und über das Netzwerk (!) booten (bereits vorhandenes "Aufzeichnungsabbild" verwenden)
  7. Den Aufzeichnungswizard durchlaufen und das Image nur lokal auf C:\ speichern
  8. Den PC neu starten, das erstellte Image auf den WDS-Server kopieren und es dort unter ''Installationsabbilder → Clients'' hinzufügen
Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

XML-Datei mit Java einlesen und gegen ein Schema validieren

Eine XML-Datei mit Java einzulesen und gegen ein XML-Schema zu validieren ist recht einfach, wenn man weiß wie es geht ;-)

Gut, dass es zu diesem Thema einige sehr gute Quellen im Internet gibt (z.B. XML Validation and XPath Evaluation in J2SE 5.0 oder Validation with Java and XML Schema, Part 3). Zuerst habe ich es mit der hier beschriebenen Vorgehensweise probiert: Validating with XML Schema. Kurz gesagt: man holt sich eine DocumentBuilderFactory und konfiguriert sie mittels setValidating(true), um die XML-Datei zu validieren. Dafür muss jedoch in der entsprechenden XML-Datei dann auf das XML-Schema verwiesen werden (mittels schemaLocation), was in meinem Fall zu Problemen beim Auflösen von Pfaden führte (die man aber sicher irgendwie umgehen kann). Darüber hinaus hat die Validierung von Constraints (in meinem Fall unique) nicht korrekt funktioniert, sodass ich den Weg über einen Validator gegangen bin.

Doch zunächst einmal mein Beispiel: Es handelt sich um eine XML-Datei, die (sehr einfach) den Aufbau einer Fertigungsanlage beschreibt (siehe Bild hier: Wegfindung mit dem A*-Algorithmus in Java). Eine ProductionPlant enthält Modules (die Teile der Anlage wie z.B. Förderbänder und Drehteller) und Connections zwischen diesen, die jedoch für mein Beispiel nicht wichtig sind. Jedes Module hat eine (eindeutige → unique) ID.

Der eigentliche Code, der nun die XML-Datei einliest und validiert, ist der folgende:

  1. // create a factory that understands namespaces and validates the XML input
  2. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  3. factory.setNamespaceAware(true);
  4. // read the XML file
  5. DocumentBuilder builder = factory.newDocumentBuilder();
  6. Document doc = builder.parse(new File("SamplePlant.xml"));
  7. // create a SchemaFactory and a Schema
  8. SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  9. Source schemaFile = new StreamSource(new File("ProductionPlant.xsd"));
  10. Schema schema = schemaFactory.newSchema(schemaFile);
  11. // create a Validator object and validate the XML file
  12. Validator validator = schema.newValidator();
  13. validator.validate(new DOMSource(doc));
  14. System.out.println("XML file successfully validated.");

Download

In eine Klasse gepackt und um die import-Anweisungen und einen (einfachen) ErrorHandler ergänzt, gibt es das Ganze hier zum Download: PlantBuilder.

Wie folgt kann das kleine Programm gestartet werden:

Kompilierung und Ausführung von PlantBuilder

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description