Freitag, 3. Mai 2013

PDF-Dateien rendern mit Poppler und Cairo

Üblicher weise empfehle ich für das PDF-Rendern mit Java Ghostscript und Ghost4j. Das funktioniert gut und die Ergebnisse sind in Ordnung. Wer Linux benutzt kennt vielleicht auch noch die Poppler-Bibliothek, die ebenfalls für ihre brauchbaren Ergebnisse bekannt ist. Verwendung findet Sie zum Beispiel im PDF-Betrachter Evince. Mittels JNA läßt sich natürlich auch diese Bibliothek  benutzen. Ich habe dazu etwas Java-Code im Netz gefunden, der mit der Poppler-Bibliothek den Text aus einer PDF extrahiert. Auf Grundlage von diesem Source habe ich mal weitergemacht und das Rendern ergänzt. Dazu gibt es in der Poppler-Bibliothek einen Png-Bilddatei-Export. Weil der Umweg über das Dateisystem aber nicht wirklich schön ist und das PNG-Kodieren- und Dekodieren der PDF-Seiten unnötig ist, habe ich eine Lösung mit einem Cairo-Grafik-Buffer genutzt in den die PDF-Seite gerendert und anschließend die Grafik-Bytes in ein BufferedImage überführt werden. Den Source dafür habe ich mal hochgeladen. Für den weiteren Ausbau ist die Poppler-Dokumentation nützlich und einiges geht da bestimmt noch.

Weitere Java-Bibliotheken zum Thema PDF-Dateien rendern habe ich vor längerem schon mal zusammengesucht und immer wieder mal ergänzt.

Sonntag, 28. April 2013

PulseAudio-Soundausgabe automatisch Umschalten

Vor einigen Jahren habe ich mir ein paar ordentlich klingende Desktop-Lautsprecher angeschafft. Die Dinger werden per USB angeschlossen und melden sich mit einer eigenen Soundkarte an. Das bietet den Vorteil, dass Soundkarte und Verstärker auf einer Platine untergebracht sind und Kabelwege zwischen Signalerzeugung und Verstärker entfallen, was wiederum der Soundqualität zugute kommt. Soviel zu den Vorteilen. Nachteilig wirkt sich allerdings aus, dass erst mit dem Einschalten der Boxen die Soundkartenanmeldung erfolgt. Das Standard-Device zur Soundausgabe ist dann schon dem internen Audio-Device auf dem Mainboard zugewiesen, weil das Audio-Device für die ausgeschalteten Lautsprecher beim Hochfahren noch nicht zur Verfügung stand. Ich müsste also jedes Mal in die Audio-Einstellungen und auf die neu aktivierte Soundkarte von den Lautsprechern umschalten. Über die Zeit haben sich verschiedene Lösungen für dieses lästige Verhalten ergeben, dass eigentlich von Seiten Ubuntus leicht zu beheben wäre. Ich meine: was will der User wohl, wenn er eine USB-Soundkarte einsteck/aktiviert?

Erste Lösung: Bash-Script das auf das nächste aktive Ausgabegerät umschaltet. Damit reduziert sich der Aufwand auf einen Klick oder Shortcut nach aktivieren der Soundkarte.

Zweite Lösung: Wenn das interne Audio-Device deaktiviert ist und somit kein valides Ausgabegerät zur Verfügung steht, wird automatisch die neu aktivierte Soundkarte zum aktiven Ausgabegerät. Früher gab es in der Oberfläche für die PulseAudio-Einstellungen die Möglichkeit Devices zu deaktivieren. Die scheint im "Alles muss minimalistisch sein"-Wahnsinn allerdings über Bord gegangen zu sein.

Dritte Lösung: Einfach ein Audio-Device anlegen, dass die Ausgabe auf alle aktiven Audio-Devices umleitet. Dies lässt sich leicht mit dem Programm paprefs unter der Registerkarte Simultane Ausgabe bewerkstelligen. Der PulseAudio-Soundserver muss allerdings neu gestartet werden, damit das Simultaneous output-Device in der Liste der Audio-Devices in der Ubuntu Audio-Konfiguration erscheint. paprefs lässt sich über die Paketverwaltung nachinstallieren.

Donnerstag, 25. April 2013

Das Ding mit dem Ring - Tastaturmodding

Gute Peripherie kann leicht zu nem Spleen werden, was bei Nerds aber ohnehin egal ist. Weit ab von Mediamarkt & Co. bekommt man Profi-Tastaturen, wie die Filco Majstouch-2, die nun ihren Weg auf meinen Schreibtisch gefunden hat.

Weil eine gute Peripherie aber nie gut genug sein kann, lässt sich da auch noch was Modden. Man bekommt bei GetDigital nicht nur die Tastatur selbst, sondern fürs Auge auch gleich ein paar Tasten in verschiedenen Farben zum Aufpeppen oder mit Pinguin um die Windows-Tasten zu ersetzen.

Mechanischen Tastaturen ist neben einem harten Anschlag auch ein gewisser Geräuschpegel zu eigen. Dagegen gibt es auch Modelle mit Soft-Landing-Pads, die sich ebenfalls nachrüsten lassen. Noch besser hat mir die Idee dieser kleinen Dämpfringe gefallen, die unter jede Taste gesteckt werden. Weil solche Ringe nicht zu bekommen sind, gibt es in den Modding-Foren die Idee mit Einmachglas-Gummi und einem Locher selbst solche Ringe herzustellen. Eine weitere Möglichkeit habe ich probiert und kurzerhand einen Beutel Dichtungsringe mit passendem Maß bestellt. Tasten raus, Ring drüber, Taste rein und fertig.

Die Ringe passen super. Wer den harten Anschlag schätzt kann es übrigens auch mit 1mm Ringen versuchen. Wichtig ist nur, dass der Durchmesser zwischen 5,0 und 5,5mm liegt, damit die Ringe nicht rutschen. Meine Tastatur ist jetzt jedenfalls genau richtig.

Samstag, 20. April 2013

E-Book- und Dokumentenmanagement mit Jeboorker

Dieses Mal gibt es aus der Reihe Java auf dem Desktop eine Software-Vorstellung in eigener Sache. Ursprünglich für eigene Zwecke gedacht hat Jeboorker inzwischen einen Entwicklungsstand erreicht, der es auch für andere nutzbar macht.

Jeboorker ist eine E-Book- oder Dokumentenmanagement-Software, deren Besonderheit darin liegt, dass es selbst keine Ordnungsstruktur vorgibt. Das ist für all diejenigen sinnvoll, die ihre E-Books und Dokumente lieber selbst in verschiedene Verzeichnisse sortieren um auch ohne Hilfsmittel jederzeit das passende/gesuchte zu finden. Jeboorker erlaubt die Verwaltung mehrerer Verzeichnis die sich einfach eintragen lassen. Die unterstützten Dokumente werden dann samt ihrer Metadaten eingelesen, so das anschließend eine gezielte Stichwortsuche nach jenen Inhalten möglich ist. Natürlich lassen sich die Dokumenten-Metadaten auch bearbeiten.

Alle eingelesenen Dokumente werden zentral in einer Listenübersicht dargestellt, die nach Dateiname und Metadaten sortierbar und durchsuchbar ist. Außerdem lässt sich die Listenübersicht nach der selbst angelegten Verzeichnisstruktur filtern so das das eigene Ordnungsprinzip nicht nur erhalten bleibt sondern gleich mitgenutzt wird.

Neben den reinen Verwaltungsfunktionen gibt es außerdem Funktionen für den Download von Buchcover aus Google-Search und Metadaten von Amazon.de und Amazon.com, wodurch deutsch- wie englischsprachige Buchinformationen auffindbar sind. Hinzu kommen einige einfache Konvertierungsfunktionen mit denen sich zum Beispiel die Bildarchivformate CBZ und CBR in das für Lesegeräte eher übliche PDF-Format überführen lassen oder umgekehrt eine PDF in ein Bildarchivformat.

Screenshot Jeboorker
Jeboorker ist Open Source und läuft am besten mit einem installierten Java 7. Downloads stehen für Debian/Ubuntu und Windows auf der Projektseite zur Verfügung.

Freitag, 12. April 2013

Java: Listen transformieren

Braucht man eine Liste vom Typ X und hat eine Liste vom Typ Y, müssen alle Werte der Liste X transformiert werden. Das kopieren und transformieren aller Werte der Liste X verbietet sich ab da, wo die Liste X sehr viele Einträge hat und vielleicht nicht einmal alle Einträge gelesen werden. Für diesen Fall ist eine elegante Lösung die, einfach eine Liste vom Zieltyp Y zu erzeugen, die die Werte aus Liste X während dessen Abfrage transformiert. So eine Liste könnte wie folgt aussehen:

import java.util.AbstractList;
import java.util.List;

/**
 * List that allows to transform it values.
 * 
 * @param <T> The target, transformed type.
 * @param <S> The source type.
 */
public abstract class TransformValueList<S, T> extends AbstractList<T> {

    List<S> list;
    
    public TransformValueList(List<S> sourceValuesList) {
        this.list = sourceValuesList;
    }
    
    public abstract T transform(S source);
    
    @Override
    public T get(int index) {
        S source = list.get(index);
        return transform(source);
    }

    @Override
    public int size() {
        return list.size();
    }

}


Der praktische Einsatz der Liste, hier mit einer Transformation von einer List<Boolean> in eine List<String>.

List<String> stringList = new TransformValueList<Boolean, String>(listWithBoolean) {

    @Override
    public String transform(Boolean source) {
        return source != null ? source.toString() : "false";
    }
    
};
Die Werte der Liste werden während der Abfrage / Iteration transformiert. Wenn die Transformation komplexer ausfällt und die Liste mehrfach abgefragt wird, sollten die Werte aus Performancegründen gecacht werden.

Sonntag, 17. März 2013

Java auf dem Desktop 9 - Domination

Domination, den Brettspielklassiker Risiko, gibt es neben einer Android- und  Blackberry-App auch als Java-Desktop-Anwendung. Das ganze macht einen riesigen Spaß, funktioniert im Einzel-, wie auch im Mehrspielermodus, spricht deutsch und ist Open Source. Wer das Spielprinzip, so wie ich noch aus grauer Vorzeit in grober Erinnerung hat wird sich schnell zurechtfinden. Es gibt verschiedene Karten und einen Online-Modus mit dem gegen andere Spieler im Netz angetreten werden kann. Wie für das Brettspiel-Original gilt: Vorsicht Zeitvernichter. Bei mir war jedenfalls mal eben eine Stunde weg bevor mir der rote Spieler Europa abgejagt und mich nach Australien verdrängt hat.

Sehr nett finde ich die Spendenoptionen mit denen auch gleich gezielt neue Features unterstützen werden können. 

Auch wenn der Java-Webstart auf der Projektseite gute Dienste verrichtet habe ich Domination mal für Debian/Ubuntu paketiert.

via 1337core

Freitag, 15. März 2013

Ist Java unsicher?

Sicherheitslücken ohne Ende. Leider kostet das Java ein gutes Stück seines Rufes obwohl dafür im Grunde kaum Anlass besteht. Die Presse berichtet unreflektiert vom "Unsicheren Java" und Elster wird umgestellt, obwohl für die Elster-Anwendung gar keine Sicherheitslücke besteht. Das die im Browser laufenden Java-Applets nur noch auf ausdrücklichen Klick hin gestartet werden ist in dem ganzen Thema eine der wenigen konstruktiven Geschehnisse.

Vor allem der Tote-Holz-Presse ist mal wieder anzulasten, dass durch undifferenzierte Berichterstattung mehr Unsicherheit als Aufklärung gesäht wurde. Dem entgegen wirkend hat Olaf Willhuhn, Entwickler der Homebanking-Software Hibiscus, ein kurzes, treffendes FAQ zu dem Thema aufgesetzt, dem ich mich inhaltlich voll anschließen kann.

Resümee: Viel Wind um kaum etwas. Programme aus dem Netz laden und starten ist viel problematischer als das Applet im Browser, das (selbst bei den gefälschten Zertifikaten) vorher noch nach Rechten für die Sandbox fragt.

Dienstag, 12. März 2013

Parallelverarbeitung mit Java

Anwendungsprozesse in Threads aufspalten ist mit der Verbreitung von Multiprozessorarchitektur zunehmend sinnvoll. Mit Java 1.5 sind da grundlegende und praktische Sachen hinzugekommen. Die Zeit, wo man noch Threads mit Runnables erzeugt sind damit im Grunde längst vorbei. Wie es richtig und gut geht erklärt Tomasz Nurkiewicz in seine Reihe in der DZone sehr anschaulich.

java.util.concurrent.Future Basics
ExecutorCompletionService in Practice
Advanced ListenableFuture Capabilities

Donnerstag, 7. März 2013

Bashskript mit Java 7 Präferenz

Unter Linux kann der Benutzer mit dem Command update-alternatives einstellen, welche Java-Version mit dem Aufruf von /usr/bin/java angesprochen wird. Eine Anwendung, die sich aber auf einer bestimmtem Java-Version besonders zu Hause fühlt, muss sich nicht unbedingt an die Voreinstellung halten, die ohnehin zumeist nur zufällig zustande kommt. Das folgende Anwendungs-Bashscript präferiert Java 7 vor der sonst vielleicht eingestellten Java 6 (oder noch älteren) Version.

#!/bin/sh

javaBin="/usr/bin/java";
for entry in `update-alternatives --list java`; do 

 case "$entry" in
  *"java-7"* )
      javaBin="$entry"
   break;
      ;;
  *)
 esac
 case "$entry" in
  *"jdk1.7"* )
      javaBin="$entry"
   break;
      ;;
  *)
 esac

done

$javaBin -cp application.jar org.test.Aplication $@

Montag, 14. Januar 2013

Java Desktop-Programme und der Speicher

Speicher fressen ist auf dem Desktop unerwünscht und dennoch tut es die Java-VM. Selbst wenn das -client Parameter gesetzt wurde, holt sich die VM Stück für Stück die ihr erlaube Speichermenge. Wie viel das ist, lässt sich mit dem Xmx-Parameter steuern. Weil der per Standard recht knapp bemessen ist, findet sich eigentlich kaum eine Java-Anwendung, die davon keinen Gebrauch macht. Das Parameter -Xmx256m erlaubt der Java-VM also maximal 256MB Ram zu reservieren.

Doof ist auf dem Desktop nur, dass die Java-VM den Speicher nicht mehr hergibt. Der wird nämlich für den späteren Gebrauch reserviert gehalten und nicht wieder freigegeben. Der Benutzer kann das aber nicht sehen. Der erkennt nur, dass die Java-VM irgendwann die vollen 256MB Speicher beansprucht und weniger für andere Programme zur Verfügung steht. Die Java-VM spart dadurch die Zeit für Speicher-Freigaben und erneute Speicher-Allokierungen*.

Um ein günstigeres Desktop-Verhalten zu erreichen, lässt sich die Java-VM mit den passenden Start-Parametern entsprechend konfigurieren. Dafür spielt die Wahl des Garbage-Collector eine Rolle. Der ParNewGC und der SerialGC geben beide nach dem Aufräumen Speicher wieder frei. Auf aktuellen Rechnern mit mehreren Prozessor-Kernen ist der ParNewGC mit seiner parallelen Verarbeitung am günstigsten. Weiter kann mit den Parametern -XX:MinHeapFreeRatio und -XX:MaxHeapFreeRatio ein Prozentwert für die Schwelle definiert werden, ab dem Speicher reserviert und freigegeben wird. Je kleiner diese Werte sind, je dichter ist der Java-VM Speicherbedarf an dem tatsächlichen Speicherbedarf der Anwendung.

Eine günstige Java-VM-Konfiguration für eine Desktop-Anwendung könnte so ausshen. Je nach Bedarf sollte aber z.B. mit VisualVM das tatsächlich Wunschverhalten nachgemessen werden.

java -client -Xmx512m -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 ...

* Das verhalten kann je nach VM-Version und Betriebssystem abweichen. Ich habe das beschriebene Verhalten mit Oracle-Java 1.6 und 1.7 auf 32bit Windows und 64bit Linux nachstellen können, wo der ParallelOldGC als Standard gesetzt war.

Lesenswert zu diesem Thema der Artikel auf Stefan Krause.blog