Earth Final Conflict

Vor knapp fünfzehn Jahren, fing ich an die Serie Earth Final Conflict zu schauen. Die Serie basiert auf alten Aufzeichnungen von Gene Roddenberry, den meisten wohl für Star Trek bekannt. Die Serie handelt von einer außerirdischen Rasse, genannt die Taelons, welche sich um das Jahr 2015 herum der Menschheit offenbaren. Nach eigenen Aussagen, der auch als Companion bekannten Außerirdischen, kommen sie in Frieden und helfen der Menschheit Kriege, Krankheiten und Hunger zu besiegen.

Ausgehend von dieser Prämisse entwickelt sich die Geschichte, welche drei Jahre nach Ankunft der Taelons einsetzt. So wird im Laufe der Serie klar, dass die Taelons nicht die hehren Motive haben, die sie vorgeben zu haben. Eine menschliche Widerstandsbewegung formt sich und bekämpft die Taelons.

Da die vierte und fünfte Staffel, beginnend ab Folge 17 der vierten Staffel damals nicht mehr ausgestrahlt wurden, habe ich das in den letzten Wochen nachgeholt und alle fünf Staffeln im Original angeschaut.

Unter Fans der Serie ist das Bild meist so, das die erste Staffel für gut befunden wird, die Staffeln 2 – 4 ebenfalls ihre Freunde finden und Staffel 5 in den Abfall gehört. Für die erste Hälfte der fünften Staffel trifft dies auch zu. Die zweite Hälfte der Staffel nimmt dann etwas an Fahrt auf, allerdings hält sie nicht mit den vorherigen Staffeln mit.

Dies ist unter anderem damit begründet, das die Taelons in der fünften Staffel so gut wie keine Rolle mehr spielen. Die Auflösung über das Schicksal der Taelons am Ende der vierten und fünften Staffel ist mehr als unbefriedigend. Stattdessen geht es plötzlich um eine andere aggressive Spezies namens Atavus. Auch wirkt die fünfte Staffel in Teilen belanglos. Das Ende der Serie an sich ist unbefriedigend, da die Taelons nicht mehr beleuchtet werden.

Im Gegensatz zu anderen Serien wurde bei Earth Final Conflict in fast jeder Staffel ein Teil des Hauptcasts gestrichen bzw. ausgetauscht. Auch das Budget verringerte sich, so das in der fünften Staffel nur noch ein Bruchteil verfügbar war. Dies merkt der Zuschauer unter anderem durch einige Episoden, in denen fast nur Rückblenden vergangener Episoden gezeigt wurden.

Alles in allem fühlt sich Earth Final Conflict wie eine großartige Serie an, bei der der Zuschauer um das Ende und die Auflösung des Taelon-Konfliktes betrogen wurde.

Unicode-Tabelle im Web

Unicode besteht mittlerweile aus über 137.000 Zeichen. Während ASCII mit seinen 128 Zeichen noch übersichtlich daherkam, ist dies bei Unicode etwas komplexer. Abhilfe schafft hier das Webprojekt der Unicode-Zeichentabelle. In dieser Tabelle lassen sich Unicode-Zeichen betrachten, kopieren und einzeln aufrufen. In der Einzelansicht werden verschiedene technische Angaben zu dem jeweiligen Zeichen dargestellt.

Die Unicode-Tabelle stellt die Unicode-Zeichen übersichtlich da

Zu finden ist das Projekt unter unicode-table.com. Die Seite steht in unterschiedlichen Sprachen, unter anderem Russisch, Englisch, Polnisch und Deutsch zur Verfügung. Die Daten, welche vom Projekt genutzt werden, sind auf GitHub zu finden.

Sprache unter macOS ändern

macOS unterstützt unterschiedlichste Sprachen, wie z.B. Deutsch, Englisch und Französisch, für die Anzeige. Unter Umständen kann es vorkommen, das die Sprache verstellt wurde und sie wieder auf den ursprünglichen Wert zurückgestellt werden soll.

Im Terminal kann die neue Sprache eingestellt werden

Mittels des Terminals und des Befehls:

sudo languagesetup

kann die Sprache umgestellt werden. Nach dem Aufruf des Befehls wird ein Menü angezeigt, in dem die zu verwendende Sprache definiert werden kann. Anschließend sollte das System mittels:

sudo reboot

neugestartet werden. Das System nutzt nach dem Neustart die ausgewählte Sprache.

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.

Geocoding in Verbindung mit einer Leaflet-App

Gestern schrieb ich in einem Artikel, wie Adressen aus Koordinaten mittels des Dienstes Nominatim, unter Zuhilfenahme von OpenStreetMap-Daten, ermittelt werden können. Mithilfe der freien Bibliothek Leafleat, kann dies nun in eine kleine Webapplikation gegossen werden.

Anhand der Geo-Koordinate wird die Adresse ermittelt und dargestellt.

Ziel ist es eine Applikation zu bauen, welche eine Karte darstellt und bei einem Klick auf diese Karte den Geocoding-Dienst anfragt. Sobald die Antwort vom Dienst eingetroffen ist, soll in einem Pop-up die Adresse dargestellt werden. Nachdem ein Grundgerüst in Form einer HTML-Datei erstellt wurde, werden dort die benötigten Bibliotheken (Leaflet und jQuery) eingebunden. Anschließend kann die Karte erzeugt werden. Damit diese im Vollbild dargestellt wird, findet sich eine entsprechende CSS-Definition in der Datei:

<style type="text/css">
	body {
		padding: 0;
		margin: 0;
	}

	html, body, #map {
		height: 100%;
	}
</style>

Anschließend kann der TileLayer angelegt werden und der Map zugewiesen werden:

// Options
var centerLatitude=53.49577;
var centerLongitude=13.30873;
var zoomLevel=15;

// Define layer
var openStreetMapLayer = new L.TileLayer(
		'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
		{attribution: '<a href="https://www.openstreetmap.org/copyright">© OpenStreetMap contributors</a>'});

// Define map
var map = L.map('map', {
	center: new L.LatLng(centerLatitude, centerLongitude),
	zoom: zoomLevel,
	layers: [openStreetMapLayer]
});

Für die Karte muss im nächsten Schritt ein Click-Event definiert werden, welches den AJAX-Request gegen den Geocoding-Dienst auslöst und den Marker erstellt. Der jeweilige Marker wird in eine separate Ebene gepackt und beim nächsten Klick wieder gelöscht und anschließend ein neuer Marker erstellt:

// Marker managment
var markerLayer;
map.on('click', function(e){

	// Console debug
	var coord = e.latlng;
	var lat = coord.lat;
	var lng = coord.lng;
	console.log("You clicked the map at latitude: " + lat + " and longitude: " + lng);

	// Marker managment		
	if(markerLayer != undefined) {
		map.removeLayer(markerLayer);
	}
	
	markerLayer = new L.Marker(e.latlng);
	map.addLayer(markerLayer);

	// Call geocode api
	var request =	$.ajax({
		method: "GET",
		url: "https://nominatim.openstreetmap.org/reverse?lat=" + lat + "&lon=" + lng + "&format=json"
	});

	request.done(function( json ) {
		console.log(json);
		markerLayer.bindPopup(json.display_name).openPopup();
	});
});

Am Stück sieht die Applikation wie folgt aus:

<!DOCTYPE html>
<html>
<head>
	<title>Leaflet address encoder</title>
	<meta charset="utf-8" />

	<meta name="viewport" content="width=device-width, initial-scale=1.0">

	<link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css"
   integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
   crossorigin=""/>
	
	<style type="text/css">
		body {
			padding: 0;
			margin: 0;
		}

		html, body, #map {
			height: 100%;
		}
	</style>
	
	<script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"
   integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og=="
   crossorigin=""></script>
	<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>
	<div id="map"></div>
	
	<script>
	        // Options
		var centerLatitude=53.49577;
		var centerLongitude=13.30873;
		var zoomLevel=15;
		
		// Define layer
		var openStreetMapLayer = new L.TileLayer(
				'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
				{attribution: '<a href="https://www.openstreetmap.org/copyright">© OpenStreetMap contributors</a>'});
		
		// Define map
		var map = L.map('map', {
		    center: new L.LatLng(centerLatitude, centerLongitude),
		    zoom: zoomLevel,
		    layers: [openStreetMapLayer]
		});
		
		// Marker managment
		var markerLayer;
		map.on('click', function(e){

			// Console debug
			var coord = e.latlng;
			var lat = coord.lat;
			var lng = coord.lng;
			console.log("You clicked the map at latitude: " + lat + " and longitude: " + lng);

			// Marker managment		
			if(markerLayer != undefined) {
				map.removeLayer(markerLayer);
			}
			
			markerLayer = new L.Marker(e.latlng);
       		map.addLayer(markerLayer);

			// Call geocode api
			var request =	$.ajax({
				method: "GET",
				url: "https://nominatim.openstreetmap.org/reverse?lat=" + lat + "&lon=" + lng + "&format=json"
			});

			request.done(function( json ) {
				console.log(json);
				markerLayer.bindPopup(json.display_name).openPopup();
			});
  		});
	</script>
</body>
</html>

Alternativ kann der Quelltext heruntergeladen bzw. ausprobiert werden.