Buchscanner im Eigenbau

Ein professioneller Buchscanner kann problemlos für fünf- bis sechstellige Beträge erworben werden. Allerdings lassen sich Buchscanner auch im Eigenbau herstellen. Einwickelt wird ein solcher Scanner vom Verein mäqädat – Bildung ohne Grenzen e.V. Ziel des Vereines ist es einen günstigen und einfach zu bauenden Scanner zu erstellen. Gebaut wird der Scanner für Universitäten in Athopien, welche zu wenige Lehrbücher anschaffen können, da die Kosten für diese Bücher zu hoch sind. Ein Buchscanner soll dieses Problem entschärfen, indem die Bücher kostengünstig digitalisiert werden können.

Eine günstige Möglichkeit zur Digitalisierung von Büchern soll geschaffen werden

Technisch basiert der Scanner in seinen ersten Versionen auf dem Linear Book Scanner von Google, hat sich allerdings mittlerweile weiterentwickelt. In Bereich Downloads auf der Seite sind die bisherigen Baupläne der aktuellen Version zu finden. Einige Teile fehlen in diesen Bauplänen allerdings noch, so z.B. die Raspberry Pi-Firmware.

Quellcode-Formatierung unter WordPress

Wenn Quelltext in einem WordPress-Beitrag untergebracht wird, so ist dieser in einem pre-Block meist relativ unansehnlich. Im Plugin-Verzeichnis existieren für dieses Problem eine Reihe von Plugins, welche sich der Codeformatierung annehmen.

Mithilfe einer modifizierten Version der Google-Bibliothek code-prettify wird der Quelltext eingefärbt

Problematisch an diesen Plugins ist allerdings, dass der Nutzer in meisten Fällen alle Beiträge entsprechend anpassen muss. Bei einigen Beiträgen mag dies noch funktionieren, aber bei einigen tausenden Beiträgen ist dies relativ unpraktisch. Abhilfe schafft hier das Plugin Code Prettify von Kaspars Dambis.

Code Prettify
Preis: Kostenlos

Mithilfe einer modifizierten Version der Google-Bibliothek code-prettify wird der Quelltext eingefärbt. Alle pre-Blöcke werden entsprechend behandelt und dies führt zu einem ansehnlicheren Quelltext:

public int doFooBar() {
    int prime = generatePrime();
    return prime * 3.14;
}

Die Entwicklung des Plugins findet auf GitHub statt. Lizenziert ist Code Prettify unter der Apache License in der Version 2 und damit freie Software.

Nachkommastellen von Pi als REST-Service

Die Zahl Pi beschreibt das Verhältnis des Umfangs eines Kreises zu seinem Durchmesser und gehört sicherlich zu den bekannteren mathematischen Konstanten. Anlässlich des Pi-Days am 14. März 2019 veröffentlichte Google die Zahl Pi mit bisher unerreichten 31,4 Billionen Nachkommastellen.

3.1415926535897…

Passend dazu stellte Google die Seite pi.delivery in Netz. Neben einigen Spielereien rund um Pi, wie die Nutzung von Pi zur Generierung von Musik, findet sich dort eine REST-API, mit welcher die Nachkommastellen von Pi erfragt werden können. Ein einfacher Request des Services sieht wie folgt aus:

GET https://api.pi.delivery/v1/pi?start=0&numberOfDigits=42

Für den Request existieren zwei Parameter. Der erste Parameter mit dem Namen start definiert ab welcher Stelle die Nachkommastellen geliefert werden sollen. Der zweite Parameter numberOfDigits setzt die Anzahl der zurückgelieferten Nachkommastellen. Als Antwort erhält der Nutzer des Service anschließend die entsprechenden Nachkommastellen (sowie die 3 am Anfang von Pi):

{
    "content": "314159265358979323846264338327950288419716"
}

Java Exceptions in Strings verpacken

Wenn in einem Java-Programm etwas schiefläuft so, wird in den meisten Fällen eine Exception erzeugt und diese nach oben im Stack durchgereicht, bis sie behandelt wird. Manchmal ist es notwendig die Exception bzw. Teile davon in einen String umzuwandeln. Natürlich kann die Exception nun mühsam von Hand auseinander genommen und in einen String konvertiert werden. Sinnvoller ist es die Hilfsmethoden aus der Utility-Bibliothek Guava zu nutzen:

String stacktrace = Throwables.getStackTraceAsString(e);

Bei der Methode getStackTraceAsString wird der Stacktrace der betreffenden Exception in einen String umgewandelt. Neben dieser Methode existieren weitere Methoden rund um das Exception-Handling in der Klasse Throwables. Einfacher wird das Ganze, wenn ein Logger genutzt wird und in diesem die Exception auftauchen soll:

Logger logger = LoggerFactory.getLogger(new Exception().fillInStackTrace().getStackTrace()[0].getClassName());
logger.error("Exception: ", e);

In diesem Fall bieten die meisten Logger die Möglichkeit an, das Throwable direkt als Parameter zu übergeben. Die weitere Verarbeitung der Exception wird anschließend vom Logger erledigt.

LoadingCache der Guava-Bibliothek nutzen

Für Java existiert eine Bibliothek mit dem Namen Guava. Diese, von Google entwickelte, Bibliothek bietet gewisse Basisfunktionalitäten, welche vom Java-Framework nicht abgedeckt werden. Eine dieser Funktionalitäten ist der LoadingCache. Bei diesem handelt es sich um einen Cache, welcher dazu genutzt werden kann die Ergebnisse zeitintensiver Operationen zwischenzuspeichern. Daneben verfügt er über die Informationen wie er die entsprechenden Daten bezogen werden. Um Guava zu nutzen muss die Bibliothek z.B. mittels Maven eingebunden werden. Dazu muss die pom.xml-Datei um eine Abhängigkeit erweitert werden:

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>27.0-jre</version>
</dependency>

Anschließend kann Guava in dem betreffenden Projekt genutzt werden. In diesem Beispiel soll der Cache dazu dienen Anfragen an einen Webservice zu cachen. Der Webservice liefert Daten zurück, welche in einem Objekt vom Typ BookData gespeichert werden:

class BookData {

	public final String title;
	public final String description;
	public final double price;

	public BookData(String title, String description, double price) {
		this.title = title;
		this.description = description;
		this.price = price;
	}
}

Innerhalb der Anwendung übernimmt die Methode getBookData die Aufgabe, diese Daten vom Webservice zu beziehen:

public BookData getBookData(String isbn) {
	return bookdataService.getData(isbn);
}

Der LoadingCache von Guava ist technisch betrachtet eine Map. Bei der Initialisierung ist dies ersichtlich:

LoadingCache<String, BookData> books = CacheBuilder.newBuilder()
		.maximumSize(1000)
		.expireAfterWrite(7, TimeUnit.DAYS)
		.build(
				new CacheLoader<String, BookData>() {
					public BookData load(String isbn) {
						return getBookData(isbn);
					}
				});

Beim Anlegen des Cache können unterschiedliche Parameter wie die maximale Größe, die Zeit ab der ein Eintrag erneuert wird und der CacheLoader definiert werden. Der CacheLoader implementiert die Methode load, welche die entsprechenden Daten vom Webservice bezieht. Nachdem der LoadingCache definiert ist, kann die Map normal genutzt werden:

BookData bookData = books.get("9783736889842");

Im Hintergrund wird der Wert, wenn vorhanden, aus dem Cache bezogen. Ist dies nicht der Fall wird stattdessen der CacheLoader genutzt, welcher in diesem Beispiel einen Request an den Webservice sendet und das Ergebnis wieder im Cache hinterlegt. Der LoadingCache selber beschränkt sich auf die Laufzeit der Applikation und wird nicht persistiert.