seeseekey.net - Invictus Deus Ex Machina

Vor einigen Tagen hatte ich mir die Oberfläche der macOS-App Affinity Photo zerschossen. Nachdem alle Versuche gescheitert waren, die Leiste auf der rechten Seite wieder zu aktivieren, blieb nur noch der Versuch die Oberfläche von Affinity Photo komplett zurückzusetzen.

Affinity Photo

Dazu wählt man im Menü Ansicht den Punkt Studio und dort den Unterpunkt Studio zurücksetzen. Anschließend werden die Bedienelemente und die Fenster wieder auf den initialen Stand zurückgesetzt.

Für bestimmte Redstone-Schaltungen oder als letztes administratives Mittel ist man manchmal auf der Suche nach einem Minecraft-Kommando um alle Mobs in einem bestimmten Umkreis zu entfernen. Realisiert wird dies über das kill-Kommando:

/kill @e[type=!player,r=100]

Das Kommando entfernt dabei alle Entites außer solche vom Typ Player. Ändert man den Typ z.B. in creeper kann der Befehl auf bestimmte Mobs begrenzt werden.

In Minecraft kann man viele Dinge mit seiner Zeit anstellen. Je nach Tätigkeit und Projekt kann dies den Minecraft-Server in unterschiedlichem Maße in Anspruch nehmen. Größere TNT-Explosionen können den Server dabei durchaus an seine Leistungsgrenze bringen. Manchmal beendet sich der Minecraft-Server ohne das der Server entsprechend ausgelastet ist. Im Log sieht das ganze dann wie folgt aus:

[21:48:23] [Server Watchdog/FATAL]: A single server tick took 60,00 seconds (should be max 0,05)
[21:48:23] [Server Watchdog/FATAL]: Considering it to be crashed, server will forcibly shutdown.

Hintergrund für diese Meldung ist das der Server pro berechenbarer Zeiteinheit (eben ein Tick) Operationen ausführt. Wenn dieser Tick länger als eine bestimmte Zeit dauert, wird dies vom eingebauten Watchdog erkannt und der Server beendet; der Watchdog denkt das sich der Server aufgehangen hat und beendet ihn aus diesem Grund. Die Lösung für dieses Problem ist es nun die Zeit die ein Tick maximal dauern darf zu verlängern. Eingestellt werden kann dies in der server.properties-Datei in der Eigenschaft max-tick-time:

max-tick-time=600000

Der Standardwert ist hier 600000 und kann auf einen beliebigen Wert eingestellt werden. Nutzt man den Wert -1 so wird die Prüfung des Watchdog vollständig deaktiviert. Wenn dieser Wert auf einen ausreichend hohen Wert eingestellt wurde und der Tick schlussendlich vollständig bearbeitet werden kann sieht das im Log wie folgt aus:

[22:09:00] [Server thread/WARN]: Can't keep up! Did the system time change, or is the server overloaded? Running 222029ms behind, skipping 4440 tick(s)

Alternativ kann in bestimmten Szenarien, wie der Zündung von einer zu großen Menge TNT, ein entsprechendes Kommando zur Entfernung der gezündeten TNT-Blöcke eingesetzt werden:

/kill @e[type=PrimedTnt,r=100]

Mit Hilfe dieses Kommando ist es auch möglich Kommandoblöcke zum Schutz bestimmter Gebiete zu nutzen. Ist der Kommandoblock im Repeat-Modus kann damit verhindert werden das TNT in dem definierten Bereich gezündet werden kann.

Das Land der Browsergames verfügt über eine Menge Einwohner. Darunter gibt es einige Perlen zu entdecken wie z.B. Candy Box. Eine weitere Perle im Land der Browsergames ist Kittens Game. Bei dem Spiel geht es darum Stück für Stück eine Katzenzivilisation aufzubauen. Was am Anfang simpel wirkt, weitet sich im Laufe des Spieles zu einer komplexen Simulation aus, welche das Spiel immer interessanter macht.

Kittens Game

Auf grafischen Schnickschnack wird dabei verzichtet, so das die „Textwüste“ die Fantasie anregt, wie bei alten Textadventures. Das Spiel beginnt in der Steinzeit, führt den Spieler Stück für Stück in das Mittelalter, bis man schließlich nach etlichen Spielstunden in der Neuzeit ankommt. Dort betreibt man dann ein Weltraumprogramm und verlässt den Katzenplaneten und erforscht die Weite des Alls. Der Quelltext ist auf BitBucket zu finden, allerdings ist er nicht unter einer freien Lizenz verfügbar. Stattdessen nutzt es die selbst verfasste WET PAWS LICENSE:

Kitten game is licensed under a WET PAWS LICENSE.

You are free to make any changes in the code for personal or educational purpose. 
Using the game code for commercial gain or creation of derivative works is not permitted.

Hosting a translated version of the game is permitted as long as the game retains all links.
And for god's sake please don't make huge idiotic red logos of your website. (Yes, u77 folks, I am talking about you).

Technisch basiert das Spiel auf HTML5 und dem Dojo Toolkit. Neben der Variante im Browser existieren mittlerweile Versionen für iOS und Android.

Kittens Game
Preis: 0,99 €
Kittens Game
Preis: 24,99 UAH

Die App-Versionen sind kompatibel zu dem Spielstand des Browsergames, so das man nahtlos auf den mobilen Geräten weiterspielen kann. Die Spielstände können hierfür exportiert werden. In den neueren Versionen von Kittens Game ist der Im- und Export mittels Dropbox möglich, so dass die Übernahme eines Spielstandes noch einfacher ist.

In Minecraft gibt es eine Reihe von Kommandobefehlen, wie z.B. das clone-Kommando. Mit diesem Kommando ist es möglich einen bestimmten Bereich von A nach B zu kopieren. Allerdings gibt es hier einige Beschränkungen. Würde man den folgenden Befehl eingeben:

/clone 87 76 -74 87 76 -74 9000 100 9000

so würde man einen Block in eine sehr entfernte Region kopieren. Der Server antwortet darauf mit einem:

Cannot access blocks outside of the world

Der Hintergrund dieser Fehlermeldung ist, das der betroffende Bereiche nicht geladen wurde. Um den Spieler herum werden einige Chunks vom Festspeicher in den Arbeitsspeicher des Servers geladen. Diese Bereiche können mit dem clone-Kommando bearbeitet werden. Mit einem Trick kann man auch in entfernte Bereiche klonen. Dazu benötigt man einen zweiten Spieler, welcher sich an den Zielkoordinaten aufhält. Dadurch sind die Chunks des Zielbereiches ebenfalls im Arbeitsspeicher des Servers vorhanden, so das die clone-Operation erfolgreich ausgeführt werden. So bequem wie mit dem WorldEdit-Plugin ist das zwar nicht, aber dafür funktioniert es mit dem Vanilla-Server von Minecraft.

Enums gibt es unter JavaScript nicht. Damit könnte der Artikel an dieser Stelle vorbei sein. Allerdings gibt es viele Wege um in JavaScript ein Verhalten oder die Strukturen zu simulieren, die am Ende gewünscht sind. Bei einem Enum würde dies so aussehen:

var DayOfTheWeek = {
  Monday: 1,
  Tuesday: 2,
  Wednesday: 3,
  Thursday: 4,
  Friday: 5,
  Saturday: 6,
  Sunday: 7
};

Genutzt wird das ganze dann so:

var dayOfTheWeek = DayOfTheWeek.Thursday;

Wer mehr über die Hintergründe rund um Enums unter JavaScript erfahren möchte dem sei der ausgezeichnete Blogbeitrag Enums in Javascript empfohlen.

Unter macOS Sierra existiert ein Dienst mit dem Namen photoanalysisd. Dieses Dienst übernimmt die Gesichtserkennung in den Mediatheken der App Fotos. Den meisten Nutzern von macOS wäre dieser Fakt im ersten Moment relativ egal, allerdings kann der Dienst zu einiger Verwirrung führen.

Ist die Fotos-App geöffnet, stoppt der photoanalysisd Dienst seine Arbeit

Hintergrund dafür ist, dass der Dienst dafür sorgt, das die CPU des Mac über einen längeren Zeitraum (bis alle Fotos analysiert worden sind) einer hoher Last ausgesetzt werden kann. Bemerkbar macht sich dies spätestens beim Lüfter. Ist die Fotos-App geöffnet, stellt der photoanalysisd Dienst seine Arbeit vorübergehend ein. Möchte man den Dienst dauerhaft deaktivieren so kann dies über das Terminal mittels:

launchctl disable gui/$UID/com.apple.photoanalysisd
launchctl kill -TERM gui/$UID/com.apple.photoanalysisd

bewerkstelligt werden. Mit dem ersten Kommando wird verhindert dass der Dienst wieder gestartet wird, während das zweite Kommando die aktuelle Instanz des Dienstes beendet.

Heute gibt es wieder eine neue Folge des seeseekey.net Podcasts und Matthias ist wieder mit von der Partie. Das Thema diesmal: OpenStreetMap – die freie Weltkarte.

Dabei geht es unter anderem um die Geschichte von OpenStreetMap, der Möglichkeit des Beitragens und deren Besonderheiten, sowie die Nutzung und Lizenzierung von OpenStreetMap-Daten. Der Podcast kann über den entsprechenden Feed abonniert werden.

Für ein kleines Projekt an dem ich zur Zeit arbeite war ich mal wieder auf der Suche nach einer sprintf Implementation für JavaScript. Und wieder wurde ich bei der gleichen Implementation – wenn auch erheblich weiterentwickelt – fündig. Seit 2007 arbeitet Alexandru Marasteanu an seiner Implementation der sprintf Funktion für JavaScript. Mit der Hilfe dieses Funktion wird so sprintf-like aus einem:

sprintf("%2$s %3$s a %1$s", "cracker", "Polly", "wants")

ein:

Polly wants a cracker

Der Quelltext ist auf GitHub zu finden. Die Implementation ist freie Software und unter der 3-Klausel-BSD-Lizenz lizenziert.

Wer Entwickler ist oder sich anderweitig mit komplizierten Dingen beschäftigt hört dabei meist Musik. Mit dem passenden Soundtrack im Ohr gehen solche Arbeiten leichter von der Hand.

musicforprogramming.net

Auf der Webseite musicforprogramming.net findet man eine Reihe von Mixes, welche diesen Bedürfnissen entsprechen. In der Selbstbeschreibung klingt das dabei so:

Through years of trial and error – skipping around internet radio stations, playing our entire music collections on shuffle, or just hammering single albums on repeat, we have found that the most effective music to aid prolonged periods of intense concentration tends to have a mixture of the following qualities:

Drones
Noise
Fuzz
Field recordings
Vagueness (Hypnagogia)
Textures without rhythm
Minor complex chords
Early music (Baroque, lute, harpsichord)
Very few drums or vocals
Synth arpeggios
Awesome / daunting / foreboding
Walls of reverb