Stranger Than Usual

60g GRATIS

Ich habe mir heute Schokolade gekauft. Schokokugeln von einer bekannten, teuren Marke. Man muss sich ja zu Weihnachten auch mal etwas gönnen.

Was mich ein bisschen genervt hat war die Werbung auf der Verpackung: „60g GRATIS“. Wer hat sich diesen Bullshit eigentlich ausgedacht?

Das ist eine 200g-Packung. Ich habe für eine 200g-Packung gezahlt. Die 60g „gratis“ waren nicht gratis. Die habe ich bezahlt.

Oder ich habe halt 60g gratis bekommen, weil ich 140g zum Preis von 200g gekauft habe. Gratis wäre es, wenn ich die 60g kriegen könnte, ohne etwas zu bezahlen. Ich habe im Supermarkt aber nicht nachgefragt, ob das möglich ist.

Animierte SVG und CPU-Last

Ich habe ja vor ein paar Monaten schon davon geschrieben, wie ein Kollege einen animierten Github/Gitlab contribution graph gebastelt hat, in Form einer animierten SVG. Ich finde das nach wie vor cool, aber ich habe keine solche Datei in den Blogpost eingebunden. Zum einen, weil die Dateigröße trotz alle Optimierungen noch ziemlich heftig war (250 kiB), zum anderen, weil alleine das Anzeigen der Animation bei mir 50% CPU-Last auf einem Kern erzeugt.

In diesem Artikel geht es um animierte SVG und deren CPU-Last. Eigentlich wären animierte SVG eine super Gelegenheit, mal wieder ein paar Bilder in das Blog zu bringen… allerdings möchte ich keine riesige CPU-Auslastung bei allen verursachen, die meine Seite besuchen, also verlinke ich die Animationen nur.

Angefangen hat meine neuerliche Besessenheit mal wieder mit Napstablook.

Napstablook, animiert und tanzend

Ich bin gestern Abend über ein Github-Repo mit einem animierten Napstablook gestoßen. Die Grafiken selber stammen von Joel Erhart, die er auch in diesem Youtube-Video veröffentlicht hat. Ob das Github-Repo von ihm ist oder von einem Fan, weiß ich nicht.

Dieses Repo enthält jedenfalls eine Napstablook-Animation. Allerdings nur, wenn man eine SVG-Datei mir SPrites der verschiedenen Animationsschritte mit ein bisschen HTML und CSS mischt. Und ich habe mir gedacht: Hey, das kann man doch sicher auch standalone machen. Also habe ich das Repo geklont und mich an die Arbeit gemacht.

Einschub: SVG-Editoren und ihr komischer SVG-Code

Meistens wird der SVG-Code nicht von Hand geschrieben. Das ist verständlich, denn SVG von Hand zu bearbeiten ist eine Menge Arbeit und, um ehrlich zu sein, ich habe keine Intuition dafür, wie ich die Punkte in Bezierkuven setzen muss, damit sie so aussehen, wie ich es will. Also Benutzt man visuelle Editoren wie z.B. Inkscape, diese eine Adobe-Tool dessen Namen ich vergessen habe oder einen Haufen anderer SVG-Editoren. Manche Editoren sind auch für bestimmte Zwecke gemacht (z.B. für Diagramme), lassen ihre Ergebnisse aber auch als SVG exportieren.

Und dieses exportierte SVG ist, meiner Erfahrung nach, oft sehr unschön. Zum Beispiel wird anstelle von SVG-Attributen wie fill und stroke eine Menge CSS eingefügt wie ich schon bei meinem nichtanimierten Napstablook-SVG feststellen musste. Dann werden Koordinaten und Skalierungen willkürlich gesetzt, um sie danach mit einem transform-Attribut auf die richtige größe zu skalieren und an die richtige Position zu schieben.

Oft werden auch Gruppierungs-Tags (<g>) recht willkürlich verwendet, um Elemente zu gruppieren. Und, was ich speziell in diesem Fall feststellen musste: Statt den stroke eines Pfades zu nehmen, um eine Linie zu zeichnen, wurde mit dem Pfad eine zweidimensionale Fläche erzeugt, die dann mit fill gefüllt wurde. Obwohl es in dem Bild eigentlich nur zwei etwa gleich starke Linien gibt. Wenn man das so macht, kann man das Element natürlich nicht mehr weiß füllen… also erstellte die Software einen zweiten Pfad, der die inneren Umrisse des ersten Pfades abbildet. Oh, und der beide Pfade sind auch sehr lang.

Ich habe eine ganze Menge Müll herausgeworfen und es geschafft, die Größe der Datei von etwa 200 kiB auf etwa 100 kiB zu reduzieren. Immer noch groß, aber ich habe auch nicht alle Optimierungsmöglichkeiten ausgenutzt.

Lustig ist, dass man an der Struktur der SVG-Datei gut erkennen kann, wie die erschaffende Person gearbeitet hat, vieles davon zeigt auf verschiedene Arbeitsschritte hin, z.B. die zeigen Translationen und Transformationen vermutlich, wie der Künstler in diesem Fall Objekte hin- und hergeschoben hat. Ist ja schön, aber es sollte in einem SVG-Editor eine Export-Funktion geben, die diesen ganzen Kram zusammenstreicht um ein einfacheres SVG zu erzeugen. Aber genug der Ausschweifung.

Der animierte Napstablook, standalone

Ich habe einige Zeit gebraucht, die größtenteils daraus bestand, mich in der Ursprungsdatei zurechtzufinden, unnützen krams wegzuwerfen und Translationen zu berechnen. Am Ende jedoch hatte ich die Animation, die ich auch zu meinem geklonten Repo auf Github gepushed habe. Die Sache hat nur einen Nachteil: Meine CPU-Lst geht auf 30% hoch, sobald ich die Animation im Browser betrachte.

  <use> <!-- "use" referenziert ein anderes Objekt, das gerendert werden soll.-->
    <!-- Das "href"-Attribut von "use" wird durch das "animation"-Tag gesetzt. -->
    <animate attributeName="href" values="#f1;#f2;#f3;#f4;#f5;#f6;#f7;#f8;#f9;#f10;#f11;#f12;#f13;#f14;#f15;#f16;#f17" dur="1.5s" repeatCount="indefinite"/>
  </use>
  
  <!-- das sind die einzelnen Animationsschritte, sie sind in einer Gruppe, die sie aus
       dem gerenderten Bereich heraus verschiebt -->
  <g transform="translate(135,253)">
    <path
       transform="matrix(0.5,0,0,0.5,0,-273)"
       id="f1"
       d="m 50.917047,1047.8813 c -9.810776,-5.1114 [sehr langer Pfad]"/>
    <!-- 16 andere Pfade mit IDs von "f2" bis "f17" -->
  </g>

Die CPU-Last animierter SVG

30% auf einem halbwegs modernen CPU-Kern… das ist zu viel für einen kleinen animierten Geist in schwarz-weiß. Aber wie gesagt, die SVG-Pfade für den Geist sind sehr lang und umständlich. Also nehme ich eine einfachere Animation. So einfach wie möglich. Ich nehme das Beispiel von der MDN-Dokumentation zum <animate>-Tag:

<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">
  <rect width="10" height="10">
    <animate
      attributeName="rx"
      values="0;5;0"
      dur="10s"
      repeatCount="indefinite" />
  </rect>
</svg>

Das ist nur ein Quadrat, und die Animation ist so, dass sie langsam die Ecken immer weiter abrundet, bis ein Kreis dabei heraus kommt, und wieder zurück. Ad infinitum. Das kann doch nicht so schlimm sein, oder?

70 Prozent?!?

Mist. Dieses fast-Minimalbeispiel braucht sogar noch mehr CPU-Leistung. Und es macht auch keinen Unterschied, ob das Bild groß skaliert oder klein ist. Oder ob man die Animation verlangsamt oder beschleunigt. Es braucht.

Ich kann doch nicht die einzige Person mit diesem Problem sein, oder?

Nein, natürlich nicht. Vor über 7 Jahren schon hat zum Beispiel jemand auf Stackoverflow um Hilfe gebeten. Und das ist kein alleiniges Firefox-Problem. Chrome (bzw. Chromium) macht das Gleiche. Und damit in aller Wahrscheinlichkeit auch Safari und Edge.

Ich habe noch ein paar Experimente angestellt. Bewegen von Elementen (in diesem Fall eines Quadrats) hat auch für 70% Auslastung gesorgt (Beispiel von der MDN-Seite über das repeatCount-Attribut). Tatsächlich bin ich mit den 30% noch ganz gut dabei gewesen.

<svg viewBox="0 0 220 150" xmlns="http://www.w3.org/2000/svg">
  <rect x="120" y="0" width="100" height="100">
    <animate
      attributeType="XML"
      attributeName="y"
      from="0"
      to="50"
      dur="1s"
      repeatCount="indefinite" />
  </rect>
</svg>

Ironischerweise hat dieses Tutorial, um SVG-Animationen auf Page Speed zu optimieren als Titelbild eine animierte SVG, die meine CPU-Last auf 200% bis 250% hochtreibt. Super hilfreich ist die Seite auch nicht. Ein paar gute Tipps (z.B. zum Verkleinern der SVG-Dateien) sind aber dabei.

Andere Animationen

Auch CSS-Animationen können sehr teuer sein. Ich habe da nicht viel ausprobiert, aber ich vermute mal, dass Animationen, die das Seitenlayout verschieben, sehr teuer sind, weil dabei ständig alles neu berechnet werden muss. Animationen, die nur sich selbst betreffen, dürften weniger rechenlastig sein. Die über CSS animierte Ursprungsversion des tanzenden Napstablook zum Beispiel sorgt nur für eine 15% Last auf einem Kern.

Animierte Rastergrafiken (z.B. animierte GIF-Bilder) funktionieren hingegen sehr effizient. Ich vermute mal, dass dort einfach nur die Pixel ausgetauscht werden, während bei SVG potentiell eine Menge Fließkommazahlen berechnet werden müssen, um das Bild richtig darzustellen.

Vielleicht kann ich also hoffen, dass sich die SVG-Animations-Renderer mit der Zeit verbessern, und z.B. alte Zustände cachen, um deutlich effizienter zu rendern. Bis dahin muss ich selber herausfinden, wie ich SVG-Animationen möglichst effizient mache.

Wenn ich etwas herausfinden sollte, schreibe ich hier wieder etwas dazu.

PS: svgo

Ach ja: Seit vorsichtig mit SVG-Optimierungstools wie svgo, wenn ihr animierte SVG-Dateien habt. SVGO fügt nämlich mehrere Pfade zu einem Pfad zusammen, entfernt Gruppen und IDs, und ignoriert dabei, dass die vielleicht von Animationen als getrennte, identifizierbare Elemente benötigt werden. Man kann das teilweise wegkonfigurieren, aber das ist ein bisschen aufwändig und man muss trotzdem aufpassen.

Edit 2025-12-26

Ich hatte ganz vergessen, ein paar Codebeispiele einzufügen. Das habe ich jetzt nachgeholt.

39C3 Power Cycles

Ab morgen ist es wieder soweit: Der 39. Chaos Communication Congress (39C3) beginnt. Hier ist ein Überblick mit Links zu allen notwendigen Informationen. Wer kein Ticket hat, kann sich die Livestreams der Talks auf media.ccc.de anschauen. Dort werden auch später die Aufzeichnungen veröffentlicht.

Der Fahrplan mit allen Talks oder der Schedule mit vielen anderen Veranstaltungen wie z.B. Workshops ist auch online. Er wird immer wieder aktualisiert, also schaut regelmäßig drauf.

Wer sich im CCH nicht zurecht findet, kann das C3Nav verwenden.

Aber die Talks sind nur der Kern der Sache. Der eigentliche Spaß sind die ganzen verrückten Hacker, ihre Projekte, Werke und Assemblies. Ich werden zum Beispiel mal wieder beim House Of Tea vorbeischauen. Vielleicht gibt es auch wieder einen Pixelflut-Server, auf dem ich ein bisschen spielen kann (dieses Jahr ohne Raspberry Pi und Controller). Die Lightning Talks an Tag 2 und 3 sollte man nicht verpassen, da sind immer ein paar Perlen dabei.

Oder man lernt ein bisschen Lockpicken. Oder lötet sich etwas zusammen (Bausätze unterschiedlicher Komplexität werden gegen Spenden verteilt).

Wer kein Ticket bekommen hat: Viele Hackspaces in Deutschland veranstalten den Congress Everywhere mit dezentralen events. Ich war da noch nie, aber meine Erfahrung mit Hackspaces ist gut.

Für alle die zum Congress kommen: Viel Spaß und be excellent to each other. Für die, die nicht zum Congress kommen: Habt trotzdem viel Spaß, schaut euch vielleicht den einen oderen anderen Talk an und be excellent to each other!

39C3: Tag 1

Eine Fassade mit vielen Glasscheiben und bunten Lichtern. An der Fassade ist eine große Leuchttafel mit der Aufschrift „39C3 POWER CYCLES“

Letztes Jahr habe ich ja im Nachhinein über den Congress geschrieben, dieses Jahr versuche ich, das halbwegs zeitnah zu machen.

Der erste Tag war mal wieder ein voller Genuss. Ich bin morgens angekommen, erst einmal durch die größtenteils leeren Hallen gewandelt und mir angeschaut, was die Assemblies so alles aufgebaut haben. Ich habe mir im Laufe des Tages einige Vorträge angehört, einige alte Bekannte getroffen, mich gut unterhalten, mit ein paar Leuten über ihre Projekte gesprochen usw. Ich habe auch ein paar Fotos von Sachen (aber nicht von Leuten) gemacht. Ich bin während des Congress innerhalb des Congress-Netzes unter der Nummer 65914 erreichbar.

Ich werde vermutlich wieder einige Posts zum Congress schreiben, also kommt nicht alles, was ich erlebt habe, in diesen Post (auch weil ich müde bin und ins Bett will). Links zu den aufgezeichneten Talks füge ich auch später hinzu.

Vorträge, die ich angeschaut habe

  • Opening Ceremony: Hier hat Stella Schiffczyk einige schöne Cartoonfiguren gezeichnet, um die Erklärungen lebhafter zu gestalten
  • The art of text (rendering): Ein Vortrag über die Schwierigkeiten und Details von Textrendering
  • All my Deutschlandtickets gone: Fraud at an industrial scale: über Betrug beim Verkauf von Deutschlandtickets.
  • Die Känguru-Rebellion: Digital Independence Day: Eine Lesung von Marc-Uwe Kling. Zum Digital Independence Day (DID) schreibe ich später noch mehr.
  • Hacking washing machines: Ein Talk über reverse-Engineeren von Wartungsschnittstellen und internen Bussen von Waschmaschinen und anderen Geräten von Miele und B/S/H.

Vorträge, deren Aufzeichnung ich noch anschauen möchte

Eine Menge. Ich werde aber gerade echt zu müde, sie aufzuschreiben. Das kommt später separat.

Pixelflut und Pixelebbe

Pixelflut gab es auch wieder. Neu dieses Mal: Pixelebbe. Der Prozess, hier ein Pixel zu setzen ist fast so effizient wie bei Pixelflut:

  1. Eine Wartenummer ziehen
  2. Warten, bis die Nummer aufgerufen wird
  3. Der Person am Schalter sagen, dass man ein Pixel setzen möchte. Man bekommt daraufhin ein Formular (mit Durchschlag)
  4. Das Formular ausfüllen (Koordinaten, Farbcode, Unterschrift und eventuell optionale Felder)
  5. Das Formular abgeben. Es wird überprüft, gestempelt und man erhält es als Bestätigung (der Durchschlag wird nicht ausgegeben)
  6. Warten, bis das Pixel gesetzt ist.

Ein ausgefülltes Formular für einen „Pixelfestsetzungsantrag“. Formularfelder sind u.a. „Ortschaft“ (Koordinaten), Gegenstand des Pixels (Farbe) und Datum des Antrags. Der Antrag ist vom „Pixel Office“ abgestempelt.

Rick Rolling

Special Mentions gehen an den Harry Plotter. Ein Plotter mit verschiedenen Knöpfen. Ich war neugierig, was der „mystery“-Knopf macht:

Eine Plotterzeichnung von Rick Astley. An der Seite steht: „You have been rickrolled by Harry Plotter.

Zu allem Überdruss hat der Plotter dann auch noch seine Motoren genutzt, um „Never Gonna Give You Up“ zu spielen.

So, jetzt muss ich aber schlafen um für Tag 2 fit zu sein.