One font to rule them all

Viele Fonts decken einen gewissen Teil der Unicode-Zeichen ab. Wenn sich ein Zeichen im Text befindet, welches nicht dargestellt werden kann, so erscheint stattdessen das Zeichen �. Dieses Zeichen in der Umgangssprache Tofu genannt ist der Platzhalter für Zeichen, die in der Schriftart nicht enthalten sind. Beim Zeichen selber handelt es sich um das Notdef-Zeichen. Allerdings existiert mittlerweile ein Font, dessen erklärtes Ziel es ist keine Notdef-Zeichen mehr zuzulassen. Der Name des Fonts, Noto, steht für No More Tofu und stellt das Ziel des Fonts dar.

Unterschiedlichste Schriftsysteme werden unterstützt

Mittlerweile hat das Projekt einige Jahre Entwicklung hinter sich. 2011 gestartet werden über 64.000 Zeichen unterstützt, was in etwa die Hälfte der im Unicode definierten Zeichen ist. Dies schlägt sich allerdings in der Größe des Fonts nieder; im Moment belegt dieser knapp 1,5 Gibibyte auf der Festplatte. Deshalb ist er in unterschiedliche Dateien, mit den jeweiligen Schriftfamilien, aufgeteilt. Neben den unterschiedlichen Zeichen finden sich unterschiedliche Schnitte (wie z.B. Fett, Kursiv) im Font. Heruntergeladen kann der Font über die Projektseite von Google. Daneben kann die Entwicklung auf GitHub verfolgt werden. Lizenziert ist Noto unter der SIL Open Font License und damit freie Software.

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.

Achievements aus der Zukunft

Achievements sind eine relativ neumodische Erfindung. Für ältere Spiele aus der 8 oder 16 Bit Ära existieren solche Achievements in den meisten Fällen nicht. Das bedeutet natürlich nicht, dass dies auf ewig so bleiben muss. Mit Retro Achievments hat sich eine Community gebildet, welche genau dieses Ziel erfolgt. Technisch gesehen werden dabei Bedingungen definiert, welche während des Spiels überprüft werden. So könnte ein Achievement für Sim City auf dem SNES überprüfen ob die Einwohnerzahl über einem bestimmten Wert liegt und ein entsprechenden Achievement freischalten.

Der Profilbildschirm von Retro Achievements

Unterstützung für die Retro Achievments findet sich in vielen Emulatoren, wie z.B. der Recalbox, welche intern RetroArch nutzt. Andere für die Retro Achievments nutzbare Emulatoren sind nur für Windows verfügbar. Zu finden ist das Projekt unter retroachievements.org. Das Projekt bzw. dessen Quellen sind auf GitHub zu finden. Die einzelnen Repositories sind unter freien Lizenzen wie der GPL lizenziert.

Spring Projekte einfach anlegen

Das Anlegen eines Projektes mit dem Spring-Framework (bzw. unter Zuhilfenahme von Spring Boot) kann von Hand erfolgen. Einfacher ist es den Spring Initializr zu nutzen. Über das Webinterface kann die Art der Projektes, die gewünschte Sprache und Spring Boot-Version definiert werden. Anschließend können gewünschte Abhängigkeiten ausgewählt und das Projekt generiert und heruntergeladen werden.

Mit dem Spring Initializr können Projekte schnell angelegt werden

Eine Instanz des Projektes ist unter start.spring.io zu finden. Der Quelltext des Projekts ist auf GitHub hinterlegt. Lizenziert ist Spring Initializr unter Apache License in der Version 2 und damit freie Software.

TLS – Schritt für Schritt erklärt

Wenn eine URL wie z.B. https://example.com über den Browser aufgerufen wird, erfolgt dieser Aufruf verschlüsselt. Zuständig dafür ist die Transport Layer Security kurz TLS. Wie genau die Aushandlung von TLS funktioniert, kann sich Byte für Byte auf der Webseite tls.ulfheim.net angeschaut werden.

The Illustrated TLS Connection

Auf der Seite wird in aller Ausführlichkeit der Verbindungsaufbau von TLS erläutert. Dabei wird wie es die Seite verspricht, jedes einzelne Byte entsprechend erklärt. Das Projekt, dessen Quelltext auf GitHub zu finden ist, ist unter der MIT-Lizenz lizenziert und damit freie Software.