Technik

Javascript, Objekte, Werte und Referenzen

03. 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


Bang & Olufsen Beoplay E8: guter Klang mit nervigen Konstruktionsfehlern

20. Dezember 2020 · Hardware · andreas · Kein Kommentar

Bereits seit einiger Zeit sind die Bang & Olufsen Beoplay E8 der ersten Generation für deutlich unter einem Drittel des ursprünglich veranschlagten Preises erhältlich und somit durchaus eine Überlegung wert, zumal Magazine wie z.B. Techstage den Klang loben:

Neutral eingestellt bietet sich ein sehr klares und detailliertes Klangbild auf High-End-Niveau

So gut der Klang auch ist, so unterirdisch präsentiert sich der Rest der Technik.

Bang & Olufsen Beoplay E8

Lediglich der rechte Ohrhörer ist als Master ausgelegt, der linke Ohrhörer ist ein dämlicher Slave, was sich vor allem im Bezug auf die Laufzeit als extrem nervig erweist. Die FAQ erklärt:

… If the earbuds are left outside the charging case, the left earbud will remain switched on and eventually lose its battery charge completely, while the right earbud switches off after 15 minutes.

Während sich der rechte Ohrhörer ohne Aktivität automatisch nach 15 Minuten abschaltet, bleibt der linke Ohrhörer so lange aktiv, bis er entweder zurück ins Etui gelegt wird oder sein Akku leer ist. Leider ist das noch nicht alles, denn

If the charging case does not have any battery charge, it will drain the battery of the left earbud.

falls der Akku des Etuis entladen ist, besteht keine Chance mehr, den linken Ohrhörer überhaupt abzuschalten. Im Gegenteil: beim Einsetzen des linken Ohrhörers wird diesem zusätzlich Energie vom Etui entzogen.

Wer bitte entwirft sowas?
Welche Qualitätskontrolle winkt sowas durch?

Im Vergleich hierzu fällt die große und träge Einstellungs-App mit Registrierungszwang und die instabile Funkverbindung, bei der ein einfacher Seitenblick beim Überqueren einer Straße schon zur Unterbrechung des Streamings ausreicht, fast nicht mehr ins Gewicht.


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


Samsung Galaxy Tab S5e entrümpeln

17. November 2020 · Betriebssysteme · andreas · 1 Kommentar

Ist man Dank Lineage OS eine recht schlanke Betriebssystem-Installation gewöhnt, wird einem beim ersten Start eines Samsung-Geräts nicht nur leicht schwindelig: nicht nur Google hätte gerne Kontoinformationen, man soll am besten auch gleich ein Samsung-Konto einrichten und am dann auch gleich alle weiteren Apps im Samsung eigenen Galaxy-Store kaufen.

Viele andere Apps nerven und buhlen um Aufmerksamkeit (vom Hunger auf Daten ganz zu schweigen) und so drängt sich recht schnell der Wunsch auf, etwas für Ordnung zu sorgen.

Als erste Entrümplungsmaßnahme hilft überraschenderweise das Zurücksetzen auf Werkseinstellungen, denn nach diesem ist bereits ein Teil der Zusatzsoftware verschwunden.

Ein breites Schmunzeln kommt dann bei der zwangsweisen Nachinstallation von Apps während des Neustarts: während man die Samsung-Apps alle (sogar auf einmal) abwählen darf, besteht bei den Google-eigenen Apps diese Möglichkeit nicht.

Mit Hilfe der Entwickleroptionen kann man anschließend noch weiter aufräumen. Hierzu müssen diese zuerst aktiviert werden:

In den Einstellungen auf “Infos zum Tablet” wechseln und dort die “Softwareinformationen” aufrufen. Nach 7-maligem Tippen auf die “Buildnummer” werden den Einstellungen dann am Ende der Liste die “Entwickleroptionen” hinzugefügt.

In den Entwickleroptionen ist nun noch bis zum Punkt “USB-Debugging” zu scrollen und dieser zu aktivieren - dann kann es mit eingestecktem USB-Kabel ans Entrümpeln gehen.

Weiterlesen


Spontane Neustarts beim Samsung Galaxy Tab S2

14. November 2020 · Hardware · andreas · 3 Kommentare

Das Samsung Galaxy Tab S2 ist auch 4 Jahre nach Erscheinen noch ein tolles Gerät: 9,7 Zoll Super-AMOLED-Display mit einer Auflösung von 2048 × 1536 Pixel, 3 GB Hauptspeicher und eine Qualcomm Snapdragon 652 als CPU - und das alles bei einem Gesamtgewicht von 389 g.

Leider hat die Tatsache, daß Samung mit dem Galaxy Tab S2 eines der leichtesten und dünnsten Tablets bauen wollte einen gravierenden Nachteil: mit zunehmendem Alter fängt das Tablet vor allem bei verminderter Akku-Ladung an, im laufenden Betrieb neu zu starten.

Das Problem scheint im Zusammenspiel zwischen Akku und CPU zu liegen und verschiedene Beiträge auf XDA (s.o.) berichten, daß die Geräte auch nach einer erfolgreichen Reparatur meist nach kurzer Zeit wieder ein ähnliches Fehlerbild zeigen.

Als brauchbarer Weg zur Verhinderung der Neustarts hat sich eine Limitierung der Taktfrequenz erwiesen: mit einer App wie SmartPack-Kernel Manager (Google Play) oder Kernel Adiutor (F-Droid) werden die CPU-Parameter so gesetzt, daß die “großen Kerne” nicht mehr bis höchstmöglichen Taktfrequenz von 1804800 getaktet werden, sondern bereits bei einem niedrigeren Wert Schluß ist.

Da zum Setzen der CPU-Frequenz zwangsweise root-Rechte erforderlich sind, kann mit Hilfe von Magisk auch komplett auf eine App verzichtet und stattdessen ein Boot Script im Verzeichnis “/data/adb/service.d” verwendet werden:

#!/system/bin/sh # 2020-09-07 athul/initial echo '4:1382400' > /sys/module/msm_performance/parameters/cpu_max_freq echo '5:1382400' > /sys/module/msm_performance/parameters/cpu_max_freq echo '6:1382400' > /sys/module/msm_performance/parameters/cpu_max_freq echo '7:1382400' > /sys/module/msm_performance/parameters/cpu_max_freq echo '1' > /sys/devices/system/cpu/cpu4/online echo '1382400' > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq echo '1' > /sys/devices/system/cpu/cpu5/online echo '1382400' > /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq echo '1' > /sys/devices/system/cpu/cpu6/online echo '1382400' > /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq echo '1' > /sys/devices/system/cpu/cpu7/online echo '1382400' > /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq

Der Erfolg kann (zu Testzwecken) ebenfalls mit Hilfe eines weiteren Skripts überprüft werden:

#!/system/bin/sh # 2020-09-07 athul/initial echo "available frequencies:" cat /sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies echo "scaling_max_freq:" cat /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq cat /sys/devices/system/cpu/cpu5/cpufreq/scaling_max_freq cat /sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_max_freq echo "cpu_max_freq" cat /sys/module/msm_performance/parameters/cpu_max_freq echo "scaling_available_governors" cat /sys/devices/system/cpu/cpu4/cpufreq/scaling_available_governors

Das Skript zeigt, daß die gesetzten Werten übernommen wurden:

available frequencies: 400000 883200 940800 998400 1056000 1113600 1190400 1248000 1305600 1382400 1612800 1747200 1804800 scaling_max_freq: 1382400 1382400 cpu_max_freq 0:4294967295 1:4294967295 2:4294967295 3:4294967295 4:1382400 5:1382400 6:1382400 7:1382400 scaling_available_governors interactive ondemand userspace powersave performance

Sofern die Werte für einige Kerne nicht angzeigt werden, liegt dies daran, daß diese aktuell zwecks Strom sparen abgeschaltet sind.