14 Jan 2009, 14:33

SWT-QT?

Today Qt Software made an very important announcement: They are going to release Qt 4.5 with an additional license option: the LGPL. This means that Qt can be used in closed-source-software (and more restrictive OSS licenses) without paying royalties to Qt Software. This is great news. I hope that now there will be a SWT-Qt binding for eclipse which could improve the speed and responsiveness of eclipse by an order of magnitude (if it’s done right).

This is very, very promising.

26 Nov 2008, 21:30

Auto-generate toString() in Eclipse

Ever wondered why Eclipse provides generators for hashCode() and equals() but not for toString()? I don’t know why, but there is a very handy plugin which will relieve you from this task: JUtils toString.

02 Apr 2008, 14:02

Textdateien schreiben mit Java

Da ich schon wieder in der API nachlesen musste wie ich in Java eigentlich eine Textdatei schreibe und mir nie merken kann welcher *Writer das jetzt ist, halte ich das hier nochmal für die Akten fest:

File target = new File("file.txt");
FileOutputStream fos = new FileOutputStream(target);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
/* Ausgabedaten schreiben */
bw.write(String);
bw.newLine();
...
bw.close();
osw.close();
fos.close();

04 Feb 2008, 06:00

RCP Tutorial

Eine gute Einführung in Eclipse/RCP Programmierung gibts bei vogella.de

25 Nov 2007, 23:33

Europa ohne VE, Callisto mit?

Na toll, das neuste Eclipse Release, Europa, kommt ohne Visual Editor Unterstützung, nur die Vorversion, Callisto, wird unterstüzt. Das ist irgendwie doof …

22 Nov 2007, 05:30

WordNet mit JWNL

Wer auf WordNet mit Java zugreifen will, der stößt über kurz oder lang auf die freie Bibliothek JWNL - Java WordNet Library. Wenn man allerdings versucht diese mit einer aktuellen Version WordNet zu nutzen schmeißt sie nur mit komischen Fehlermeldungen um sich - selbst wenn man den Pfad zur Datenbank in der Konfigurationsdatei richtig angegeben hat.

Das Problem dabei ist, dass JWNL nur mit WordNet 2.0 für Windows zusammenarbeiten will - was freundlicherweise nirgends (deutlich) erwähnt wird.

Kurzanleitung für den Einsatz von WordNet unter Java:

  • WordNet runterladen und installieren (nur Windows)
  • JWNL runterladen, die Klassen (commons-logging,jwnl und utilities) in den Build-Path einbinden
  • In der Datei file_properties.xml den Pfad auf das Unterverzeichnis dict der WordNet Installation verweisen lassen.
  • Mit JWNL.initialize(new FileInputStream(“path/to/file_properties.xml”) und Dicitornary wordnet = Diricotnary.getInstance() eine neune Insatnz von Wordnet bzw. JWNL erzeugen.
  • Danach kann man mit wordnet.lookupAllIndexWords(String) auf die Wordnet Datenbank zugreifen.
Hier eine Beispielklasse die die wichtigsten Wordnet API-Calls demonstriert:

package utils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import net.didion.jwnl.JWNLException;
import net.didion.jwnl.data.IndexWord;
import net.didion.jwnl.data.IndexWordSet;
import net.didion.jwnl.data.PointerUtils;
import net.didion.jwnl.data.Synset;
import net.didion.jwnl.data.list.PointerTargetNode;
import net.didion.jwnl.data.list.PointerTargetNodeList;
import net.didion.jwnl.dictionary.Dictionary;

public class WordNetUtils {

private Dictionary wordnet = null;

public WordNetUtils() {
this.wordnet = Dictionary.getInstance();
}

public List<string> getSynonyms(String word) {
List</string><string> syns = new ArrayList</string><string>();
IndexWordSet iws;
try {
iws = wordnet.lookupAllIndexWords(word);
IndexWord[] words = iws.getIndexWordArray();
for (int i1 = 0; i1 &lt; words.length; i1++) {
syns.addAll(getAllSynonyms(words[i1]));
}
} catch (JWNLException e) {
e.printStackTrace();
}
return syns;
}</string>

@SuppressWarnings("unchecked")
private List<string> getAllSynonyms(IndexWord w) throws JWNLException {
List</string><string> syns = new ArrayList</string><string>();
Synset[] senses = w.getSenses();
for (int i = 0; i &lt; senses.length; i++) {
// PROCESS SYNONYMS
PointerTargetNodeList relatedList = PointerUtils.getInstance()
.getSynonyms(senses[i]);
Iterator</string>

<pointertargetnode> it = relatedList.iterator();
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j &lt; s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
// PROCESS HYPERNYMS
relatedList = PointerUtils.getInstance().getDirectHypernyms(
senses[i]);
it = relatedList.iterator();
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j &lt; s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
// PROCESS HYPONYMS
relatedList = PointerUtils.getInstance().getDirectHyponyms(
senses[i]);
it = relatedList.iterator();
while (it.hasNext()) {
PointerTargetNode elem = (PointerTargetNode) it.next();
Synset s = elem.getSynset();
for (int j = 0; j &lt; s.getWords().length; j++) {
syns.add(s.getWord(j).getLemma());
}
}
}
return syns;
}</pointertargetnode>public List<string> getSynonyms(List</string><string> toks) {
List</string><string> retval = new ArrayList</string><string>();
for (int i = 0; i &lt; toks.size(); i++) {
retval.addAll(this.getSynonyms(toks.get(i)));
}
return retval;
}</string>public Set<string> getSynonyms(Set</string><string> toks) {
Set</string><string> retval = new HashSet</string><string>();
for (Iterator</string><string> iterator = toks.iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
retval.addAll(this.getSynonyms(name));
}
return retval;
}
}
</string>

08 Nov 2007, 10:00

javax.swing.GroupLayout cannot be resolved

Problem: Ein Java Quelltext lässt sich nicht kompilieren, weil die IDE sich über den Fehler “javax.swing.GroupLayout cannot be resolved” beschwert.

Grund: GroupLayout ist erst in Java 6 verfügbar.

Lösung: Java 6 installieren und aktivieren :)

22 Oct 2007, 07:30

Komplexe Datenstrukturen in PHP?

Nachdem ich mir Gedanken über eine Portierung des Spell Checkers von Java nach PHP gemacht habe, ist mir aufgefallen, dass es scheinbar gar keine komplexen Datenstrukturen in PHP gibt.

Natürlich kann man sich das alles selbst bauen, aber eine ordentliche Implementierung von Set, List, Tree & Co. wie in Java scheint es in PHP nicht zu geben.

Das Problem bei der PHP Umsetzung ist im Moment, dass ich ja keine ständig laufende Application sondern einzelne Request habe und daher nicht jedesmal den langwierigen Trainingsprozess durchlaufen kann. Als Alterantive scheint mir eine SQL-Datenbank geeignet, aber bevor das so funktioniert wie ich es mir vorstelle muss ich noch einen Weg finden die Daten dort effektiv abzulegen und aufzufinden. 90.000 SQL-Abfragen pro Suchanfrage sind einfach noch ein bischen zu viel ;)

21 Oct 2007, 07:30

P2P Wiki in Java

Unter dem Namen jP2PWiki habe ich eine Beispielimplementierung eines P2P Wikis in Java veröffentlicht.

Das ganze ist nicht als stabile Software sondern eher als Proof-of-Concept anzusehen, aber möglicherweise hat der eine oder andere Interesse an dieser Thematik.

Alle weiteren Details finden sich auf der Projektseite.

20 Aug 2007, 14:59

Kernkraftwerkbetriebsführungssofware

 Kernkraftwerkbetriebsführungssofware <- OMFG ;D

16 Jul 2007, 10:29

Aus jHTTPd wird libjhttpd

Nachdem ich den Code zu meinem einfachst-Webserver jHTTPd (HTTP/1.0, Multithreading, IPv6- und UTF-8-Support) in wesentlich mehr Projekten weiter verwendet habe, als zunächst geplant, habe ich mich entschlossen den Code nochmals zu überarbeiten, ein wenig refactoring zu betreiben und als Bibliothek umzuarbeiten.

Der Webserver kann jetzt auch ordentlich binäre Multipart POST Requests verarbeiten. Ein kleines Missverständnis zwischen mir und den Java Streams hat dafür gesorgt, dass es vorher nicht funktioniert hat.

Bytes nach String und wieder zurück zu casten geht selten gut ;)

Die Bibliothek ist so angelegt, dass man den bestehenden Code nicht ändern muss - wobei das für eine Bibliothek selbstverständlich sein sollte.

Im Package webserver.sample befindet sich ein Beispiel dafür wie man die Bibliothek verwenden kann.

Ähnlich wie beim Apache-Webserver existieren ein paar Hooks die es erlauben an verschiedenen Stellen der Request Verarbeitung einzugreifen und die Daten entsprechend zu manipulieren.

Eine lauffähige Instanz des Webservers erzeugt man mit folgendem Code:

Config config = new Config(); // read the config try { config.readConfig(Config.CONFIG_FILE); } catch (IOException e) { e.printStackTrace(); } // check command line arg count if (args.length > 0) { // parse args config.setPort(args[0]); } WebServer ws = new WebServer(config, new SampleHttpRequestFactory()); Thread t = new Thread(ws); t.start();

Weiterhin muss man in einer Klasse die Schnittstelle IHttpRequestFactory implementieren und dort die, ebenfalls zu implementierende, Klasse die von HttpRequest erbt, angeben.

HttpRequest bietet drei sog. Hooks.

  • postConnect() - wird aufgerufen sobald der Client die Verbindung hergestellt hat, aber bevor irgendetwas weiter passiert ist. Hier könnte man z.B. überprüfen ob der Client auf einer Blacklist steht, bzw. aus einem nicht zulässigen Netzwerk kommt und die Verbindung schliessen bevor weitere Ressourcen verbraucht werden.
  • postRequest() - wird aufgerufen nachdem der Request des Clients, d.h. inkl. evtl. vorhandenem POST-Body, verarbeitet wurde. Hier sollte eigentlich fast der gesamte benutzerspezifische Code landen.
  • preClose() - wird aufgerufen direkt bevor die Verbindung zum Client geschlossen wird und nachdem die Antwort gesendet und der Request geloggt wurde. Zu diesem Zeitpunkt besteht keine Garantie dafür, dass die Verbindung zu Client noch existiert.
Die Klasse HttpRequest bietet neben den Hooks noch eine Reihe von Methoden die den Zugriff auf die Daten des Requests ermöglichen.

Die wichtigsten wären:

  • getArgument() - um die komplette Liste der Argumente zu erhalten. Also POST und GET Argumente.
  • getMultiparts() - um die evtl. vorhandenen Multipart Teile eines POST Requests zu erhalten.
  • getRemoteAddress() - um die IP des Clients zu erhalten sowie getRemotePort() um den dazugehörigen Port zu erhalten. Diese zwei Felder sind die einzigen die während postConnect() schon gültige Daten enthalten.
  • getRequestHeader() - um den verarbeiteten Header auszulesen.
  • getResponseHeader() - um auf den Response Header zuzugreifen.
Für weitere Details möchte ich direkt auf den Quellcode verweisen. Fragen und Anmerkungen bitte über die Kommentarfunktion.

Den Quellcode und den Download gibts hier: libjhttpd.

16 Jul 2007, 10:01

jSpellCorrect überarbeitet

Der Java Spelling Checker, jSpellCorrect, wurde von mir nochmal ein wenig überarbeitet. Jetzt kommt er prinzipiell mit beliebig großen Trainingsdaten zurecht. Vorher existierte eine, unnötige, künstliche Beschränkung.

Download jSpellCorrect.

Allerdings existiert weiterhin die Einschränkung, dass die HashMap der Wahrscheinlichkeiten in den Arbeitsspeicher passen muss. Hier bin ich allerdings noch nicht an die Grenzen gestossen.

Eine Möglichkeit dies zu umgehen, wäre ein Teil der Daten auf der Festplatte zu speichern, aber dies ist mir im Moment zu umständlich. Bei Bedarf werde ich das nachrüsten.

28 Jun 2007, 08:41

Eclipse macht unter Linux nur Probleme ...

Seit einiger Zeit macht Eclipse unter Linux nur noch Probleme.

Nicht nur, dass es extrem viel Speicher verbraucht, dank SWT/GTK, es stürtzt auch reproduzierbar beim öffnen das Auto-Complete Dialog ab und das neue Europa Release verabschiedet sich gar direkt wenn ich den  Software Update Dialog öffne.

Toll.

Es wird Zeit, das ich mich mit Netbeans beschäftige. Das läuft deutlich besser, nur mit der Bedienung muss ich mich noch anfreunden.

20 Jun 2007, 07:48

Eclipse unter Linux ist super lahm!

Ich frage mich wirklich warum Eclipse unter Linux so super lahm sein muss.

Offensichtlich hängt das ganze mit SWT zusammen und Abhilfe ist auch möglich, aber mir ist es nicht gelungen SWT/Fox zu installieren. Das hängt wahrscheinlich auch damit zusammen, dass das SWT/Fox Projekt seit einiger Zeit inaktiv zu sein scheint.

Bei nächster Gelegenheit werde ich mir mal Netbeans anschauen, das scheint ja nicht ganz so schrecklich langsam zu sein …

18 Jun 2007, 11:50

Rechtschreibkorrektur in Java

Nach der Lektüre des überaus interessanten Artikels über einen einfachen Algorithmus zur Rechtschreibkorrektur von Peter Norvig, habe ich beschlossen den abgefahrenen Python Code in Java zu übersetzen. Nach ein paar Versuchen hat es auch schon geklappt. Das Ergebnis des ganzen gibt es ab sofort unter dem Namen jSpellCorrect zu bewundern.

Update:

Nachdem Peter Norvig seine Seite aktualisiert hat muss ich sagen, dass ich ein wenig schockiert bin: Aus einem einfachen 21 Zeilen Python Programm werden über 350 Zeilen Code in Java ... autsch ;)

31 May 2007, 22:40

jPatchLib 0.0.1b

So, hier ist die nächste Version von jPatchLib: 0.0.1b.

Die Probleme mit den Leerzeilen sollten jetzt erledigt sein und ich habe die Dokumentation hinzugefügt: JavaDoc.

Mehr Infos. Weitere Projekte.

31 May 2007, 13:32

Patch Library für Java - jPatchLib

Nachdem ich lange vergeblich versucht habe eine Implementation von GNU Patch für Java zu finden bin ich zu dem Schluss gekommen, dass es wohl einfacher ist eine selbst zu schreiben.

Das Ergebniss findet sich unter http://developer.gauner.org/jpatchlib/.

Ein paar Sachen stehen noch auf meiner ToDo Liste, aber für einen ersten Eindruck sollte es reichen.

Was noch aussteht:

  • Dokumentation

  • Probleme mit Leerzeilen beheben

Ansonsten natürlich viel Spaß damit.

23 May 2007, 10:24

Patch Library für Java?

Es gibt zwar ein paar Implementierungen von diff für Java, aber eine patch Implementierung konnte ich nicht finden.

Sollte ich doch noch fündig werden, werde ich darüber berichten.

27 Apr 2007, 09:29

Essence of Software Design (Java)

Ich habe mir vor einiger Zeit einige wichtige Design-Prinzipien für das Software Design, insb. in Java, zusammengefasst und einige oft gebrauchte Design-Patterns und Entwurfsrichlinien erläutert.

Zu finden ist das ganze unter The Essence of Software Design.

Die wichtigsten Prinzipien:

  • Open-Closed-Principle (OCP) - A class should be open for extension but closed for modification.
  • Liskov Substitution Principle (LSP) - An instance of a class should function as an instance of its superclass.
    Typical violations of LSP:
    • Derivates that override a method of the super-class by an empty method potentially violate LSP
    • Derivates that throw additional exceptions violate LSP

  • Dependency Inversion Principle (DIP) - High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions. DO NOT DEPEND ON A CONCRETE CLASS. All relationsships in a program should terminate on an abstract class or an interface.