Programmierung

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.


Experimental keys on scalar is now forbidden

31. August 2019 · Programmierung · andreas · 2 Kommentare

Nach einem Wechsel der Interpreter- oder Compilerversion stolpert die neue Version ab und an über Dinge, die bisher problemlos verarbeitet wurden. Im aktuellen Fall mag Perl 5.28 eine Zeile nicht mehr, die von Perl 5.14 noch problemlos verarbeitet wurde:

Die fragliche Zeile

foreach $type ( keys $phonebook{ $entry } ) {

wird nur noch mit einem

Experimental keys on scalar is now forbidden at scriptname.pl line 123.
Type of arg 1 to keys must be hash or array (not hash element) at scriptname.pl line 123, near "} ) "
Execution of fritzphone.pl aborted due to compilation errors.

und das, obwohl es sich bei “%phonebook” um einen Hash handelt. Die Lösung des Problems ist glücklicherweise recht einfach und schnell erledigt

foreach $type ( keys %{ $phonebook{ $entry } } ) {

in dem der von “keys” auszuwertende Eintrag mit “%{ … }” als Hash gekennzeichnet wird.


phpMyAdmin Fehler "Parameter must be an array or an object that implements Countable"

12. Juli 2019 · Programmierung · andreas · 3 Kommentare

Nachdem das Update des Entwicklungsrechners von Debian 9 (Stretch) auf Debian 10 (Buster) reibungslos durchgelaufen ist, hakt es bei phpMyAdmin sobald eine Tabelle angeklickt wird:

Warning in ./libraries/sql.lib.php#613
count(): Parameter must be an array or an object that implements Countable

Eine einfache Lösung findet sich bei Stack Overflow: in der Datei “/usr/share/phpmyadmin/libraries/sql.lib.php” eine der schließenden Klammern von Zeile 614 in Zeile 613 vor das “== 1” versetzen, so daß die Zeilen 613 und 614 wie folgt aussehen:

|| (count($analyzed_sql_results['select_expr']) == 1)
&& ($analyzed_sql_results['select_expr'][0] == '*'))

Nach einem Neustart des Webservers ist der Fehler verschwunden.


Aktuelles Verzeichnis nicht mehr Teil von @INC

25. Mai 2019 · Programmierung · andreas · Kein Kommentar

Gerade beim Wechsel zwischen verschiedenen Perl-Versionen über ein Feature (und keinen Bug) gestolpert: seit Version 5.26 ist das aktuelle Verzeichnis nicht mehr im Standard-Include-Pfad @INC enthalten.

Als Grund hierfür gibt perldelta zur Version 5.26 unschöne Begleiterscheinungen der bisherigen Vorgehensweise an:

While convenient, this has security implications: for example, where a script attempts to load an optional module when its current directory is untrusted (such as /tmp), it could load and execute code from under that directory.

Der Beitrag listet auch einige Möglichkeiten auf, wie man das bisherige Verhalten auf sicherem Weg wiederherstellen kann.

Wer es (quick & dirty) genauso unsicher wie vorher haben will, kann auch

use Cwd qw(abs_path);
use File::Basename qw(dirname);
use lib dirname(abs_path(__FILE__));

in seinem Skript verwenden.


Bytefolge mit Perl ersetzen

18. Januar 2018 · Programmierung · andreas · Kein Kommentar

Die Funktionen, die Perl für das Suchen und Ersetzen innerhalb von Strings bereitstellt, lassen sich auch hervorragend dazu verwenden, Bytefolgen innerhalb von Binärdaten zu bearbeiten.

Mittels der pack-Funktion wird die zu suchende Bytefolge in einer Variable gespeichert

$source = pack("C*", 0x00, 0x40, 0x06, 0x00, 0x00, 0xB0, 0x04, 0x00);

Deren Position innerhalb der zu durchsuchenden Daten kann durch die Funktion index ermittelt

$pos = index($data, $source);

und ggf. auch mit einer Ziel-Bytefolge mit Hilfe der Funktion subst ersetzt werden

substr($data, $pos, length($dest), $dest);