Programmierung

Javascript, Objekte, Werte und Referenzen

3. Januar 2021 · Programmierung · andreas · Kein Kommentar

Im Gegensatz zu einigen anderen Sprachen kopiert JavaScript bei einer Zuweisung lediglich bei der Verwendung primitiver Datenelemente den Wert der ursprünglichen Variablen. Bei allen anderen Datenstrukturen wird nur die Referenz kopiert, was zu unerwarteten und unerwünschten Ergebnissen führen kann.

var band = {
	name : 'Deep Purple',
	year : 1968,
	members : {
		vocals : 'Rod Evans',
		guitar : 'Ritchie Blackmore'
	}
}

Wird einer zweiten Variablen der Wert der ersten Variable zugewiesen, so wird intern keine Kopie der Werte erzeugt, sondern lediglich die Referenz auf die Werte kopiert. Dies führt dazu, daß bei einer Änderung von “band2” auch “band” geändert wird.

var band2 = band;
band2.year = 1969;

console.log(band);

{
	"name": "Deep Purple",
	"year": 1969,
	"members": {
		"vocals": "Rod Evans",
		"guitar": "Ritchie Blackmore"
	}
}

Weiterlesen


pxlPilot

19. Dezember 2020 · Programmierung · andreas · Kein Kommentar

Eines der wenigen Spiele, das ich unter Android mehr oder minder auf allen meinen Geräten installiert habe ist Radiant - ein sog. Shoot ’em up, das mit seiner leuchtenden Grafik die wenigen Pixel gekonnt in Szene setzt.

Durch ein paar neuerliche Runden kam die Idee, selbst ein paar Sprites über den Bildschirm fliegen zu lassen - etwas, das ich seit meinen wenig erfolgreichen Gehversuchen auf dem Commodore 64 eigentlich nicht mehr getan habe.

Da auch über 30 Jahre nach ihrem Erscheinen Spiele wie Uridium und Katakis noch in mehr als guter Erinnerung waren, folgten ein paar neuerliche Runden (diesmal allerdings ohne den C64 aus dem Kellerverlies zu befreien mit Hilfe der C64 Classix), bevor der Entschluss feststand, selbst einen Shooter nach Retro-Art zu basteln.

Die Suche nach passender Technik führte zu Phaser 3, welches ein solides Grundgerüst für die Entwicklung plattformunabhängiger Spiele in Javascript bietet und an Infrastruktur außer Texteditor und Browser eigentlich nichts benötigt. Zu Phaser gibt es eine gute Dokumentation, zahlreiche Beispiele und Tutorials, so daß der Einstieg nicht allzu schwer fällt. Die verwendeten Grafiken sind alle selbstgemacht und wurden zum Teil mit GrafX2 erstellt, welches bereits beim Zeichnen das notwenige Retro-Gefühl vermittelt.

Das Ziel ist nicht, sich mit den Klassikern zu messen. Was Andrew Braybrook, Manfred Trenz oder Stavros Fasoulas geschaffen haben sind zeitlose Meisterwerke, die sich auch 2020 nicht zu verstecken brauchen. Mein persönliches Ziel ist überhaupt mal wieder kreativ am Bildschirm tätig zu sein, neue Dinge zu erlernen und dabei eine kleine Hommage an die Helden meiner Jugend entstehen zu lassen.

Weiterlesen


LDAP-Suche schlägt bei Namen mit Umlauten fehl

13. Oktober 2019 · Programmierung · andreas · Kein Kommentar

Solange ein Benuztername keinen Umlaut besitzt, kann man den Datensatz Daten mit dem Perl-Modul Net::LDAP recht einfach aus dem Active Directory auslesen:

use Net::LDAP;
$loginUser = Win32::LoginName();

$ldap = Net::LDAP->new($ldapServer) or die "$0";
$ldap->bind($ldapUser, $ldapPass});
$ldap_base = 'OU=Users';
$ldap_results = $ldap->search(base => $ldapBase, filter => "sAMAccountName=$loginUser");

if ($ldap_results->count) {
    # was ganz tolles mit dem Datensatz anstellen
}

Sofern aber ein Umlaut in dem Login-Namen steckt, so schlägt die Suche nach “benjamin.tröt” fehl, obwohl ein entsprechender sAMAccountName im Active Directory vorhanden ist.

Eine einfache Lösung bietet der Beitrag “Windows logon behavior if your user name contains characters that have accents or other diacritical marks”, welcher - auf das Login bezogen - folgende Ausweichmöglichkeit skizziert:

If your user name in the Active Directory directory service contains one or more characters that have accents or other diacritical marks, you may find that you do not have to use the diacritical mark as you type your user name to log on to Windows. You can log on by using the simple form of the character or characters. For example, if your user name in Active Directory is jésush, you can type jesush in the User name box in the Log On to Windows dialog box to log on to Windows.

Interessanterweise funktioniert dies auch bei LDAP-Anfragen im Active Directory, so daß eine Suche nach dem sAMAccountName “benjamin.trot” zum gewünschten Datensatz führt.

Stellt sich die Frage, was passiert, wenn tatsächlich ein Benjamin Trot neben seinem Kollegen Tröt Platz nimmt …


Firefox ignoriert charset=UTF-8

22. September 2019 · Programmierung · andreas · Kein Kommentar

Ein Perl-Skript stellt sein UI als Website mit Hilfe des Moduls HTTP::Server::Simple zur Verfügung. Eigentlich sollte ein

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

im Header-Bereich ausreichen, um anzuzeigen, daß die Daten in UTF-8 kodiert sind. Firefox weigerte sich hartnäckig und benutze immer den Default “windows-1252” zur Darstellung, was alle Umlaute bis zur Unkenntlichkeit verstümmelte.

Erst durch Mitsenden der Zeichenkodierung im Header

print $cgi->header(
	-nph => 1,
	-status => '200 OK',
	-type => 'text/html',
	-charset => 'UTF-8'
);

ließ sich Firefox überreden, die Seite auch tatsächlich als UTF-8 darzustellen.


Sass ohne Ruby

4. September 2019 · Programmierung · andreas · Kein Kommentar

War Ruby Sass bis Anfang 2019 noch das Mittel der Wahl, wenn es um die Syntactically Awesome StyleSheets ging, gilt seit einigen Monaten:

Ruby Sass was the original implementation of Sass, but it reached its end of life as of 26 March 2019. It’s no longer supported, and Ruby Sass users should migrate to another implementation.

Die offizielle Referenz-Implementierung ist seither als Dart Sass erhältlich, sofern es aber lediglich um die Wandlung von scss-Files in css-Stylesheets geht, scheint LibSass in Kombination mit SassC ebenfalls eine gute Alternative.

SassC ist in den offiziellen Debian-Paketquellen enthalten, so daß ein einfaches

$ sudo apt install sassc

reicht, um die beiden Pakete “libsass1” sowei “sassc” herunterzuladen und zu installieren.

Was SassC in der Grundausstattung fehlt, ist die “–watch”-Option von Ruby Sass, diese kann allerdings mit einer einfachen “while”-Schleife und den “inotify-tools” auf der Kommandozeile oder in einem Shell-Skript nachgebildet werden:

$ while inotifywait -e close_write style.scss; do sassc --style compact style.scss style.css ; done

Das in den “inotify-tools” enthaltene “inotifywait”

efficiently waits for changes to files using Linux’s inotify interface. It is suitable for waiting for changes to files from shell scripts.

wartet mit dem Parameter “-e close_write”, bis die überwachte Datei “style.scss” nach dem Öffnen im Schreibmodus wieder geschlossen wurde und übergibt in der “while”-Schleife dann an “sassc”, welches die soeben geänderte Datei verarbeitet.