<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Abstract Nonsense</title><link>https://abstractnonsense.xyz/</link><description>Recent content on Abstract Nonsense</description><generator>Hugo</generator><language>en-au</language><managingEditor>hello@abstractnonsense.xyz (Yossi Frenkel)</managingEditor><webMaster>hello@abstractnonsense.xyz (Yossi Frenkel)</webMaster><atom:link href="https://abstractnonsense.xyz/index.xml" rel="self" type="application/rss+xml"/><item><title>Activation functions and empiricism</title><link>https://abstractnonsense.xyz/micro-blog/2026-03-04-activation-functions-and-empiricism/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2026-03-04-activation-functions-and-empiricism/</guid><description>&lt;p&gt;In deep learning literature, there&amp;rsquo;s a veritable menagerie of different activation functions that are commonly employed betwixt layers. Proponents of one or another class of functions will usually proffer up some rationalisation for what makes their choice grounded: differentiability, smoothness, computational complexity, numerical stability, concision&amp;hellip;&lt;/p&gt;
&lt;p&gt;Today I was reading through &lt;a href="https://arxiv.org/abs/2002.05202"&gt;&lt;em&gt;GLU Variants Improve Transformer&lt;/em&gt;&lt;/a&gt; by Noam Shazeer (also of &lt;a href="https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf"&gt;&lt;em&gt;Attention is all you need&lt;/em&gt;&lt;/a&gt; fame) and came across this gem of empiricism:&lt;/p&gt;</description></item><item><title>Rustlings</title><link>https://abstractnonsense.xyz/micro-blog/2026-01-25-rustlings/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2026-01-25-rustlings/</guid><description>&lt;p&gt;As part of my recent quest to learn Rust, I worked through the &lt;a href="https://rustlings.rust-lang.org"&gt;Rustlings&lt;/a&gt; exercises. You&amp;rsquo;re given a series of ~100 problems, and your goal is to fix the code to make it compile with passing tests. It was a pretty quick whirl-through, and I don&amp;rsquo;t think the examples are the most interesting, but as a short introduction to the syntax and rudiments of the semantics, it does the trick with aplomb. I did quite enjoy the interactive problem-solving CLI interface, though.&lt;/p&gt;</description></item><item><title>Networking Concepts by Beej</title><link>https://abstractnonsense.xyz/micro-blog/2026-01-24-networking-concepts-textbook-review/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2026-01-24-networking-concepts-textbook-review/</guid><description>&lt;p&gt;Computer networking always felt like an area in which I was lacking after completing my undergraduate CS education. A good while ago I stumbled across the excellent and freely accessible &lt;a href="https://beej.us/guide/bgnet0/"&gt;&lt;em&gt;Beej&amp;rsquo;s Guide to Networking Concepts&lt;/em&gt;&lt;/a&gt; and worked through it, tracking my solutions in this &lt;a href="https://github.com/stochastical/solutions-guide-to-networking-concepts"&gt;&lt;code&gt;solutions-guide-to-networking-concepts&lt;/code&gt;&lt;/a&gt; repository.&lt;/p&gt;
&lt;p&gt;All solutions herein were produced without any LLM assistance. Where any cloze-style template is provided by the textbook for the project, I&amp;rsquo;ve adopted that as the basis for my solution. Any errors or lapses of understanding are solely my own.&lt;/p&gt;</description></item><item><title>GitHub hijacks and breaks browser search</title><link>https://abstractnonsense.xyz/micro-blog/2026-01-14-github-hijacks-and-breaks-browser-search/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2026-01-14-github-hijacks-and-breaks-browser-search/</guid><description>&lt;p&gt;I like to keep a &lt;a href="https://abstractnonsense.xyz/blog/2025-08-01-a-living-log-of-lexical-learnings/"&gt;word list&lt;/a&gt; of any new and interesting words I come across day-to-day. Today I was curious how many entries were in my list and went to search the &lt;a href="https://github.com/stochastical/abstractnonsense/blob/main/data/vocabulary.yaml"&gt;YAML file&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;p&gt;To my delight, I discover that GitHub has hijacked the native &lt;code&gt;Cmd-F&lt;/code&gt; browser search. To top it off, seems the maximum number of matches GitHub&amp;rsquo;s search returns is limited to &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll excuse a search function that at least reports &lt;code&gt;&amp;gt; 200 results matched&lt;/code&gt;, but there is no indication in the UI that this is the case. Even if you navigate to the 200th result and can see additional matches in the viewport, GitHub&amp;rsquo;s UI steadfastly refuses their existence.&lt;/p&gt;</description></item><item><title>Writing an eigenvalue solver in Rust for WebAssembly</title><link>https://abstractnonsense.xyz/blog/2025-12-31-eigenvalue-solver-in-rust-for-webassembly/</link><pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-12-31-eigenvalue-solver-in-rust-for-webassembly/</guid><description>&lt;p&gt;I recently stumbled across the &lt;a href="https://en.wikipedia.org/wiki/Gershgorin_circle_theorem"&gt;Gershgorin Circle Theorem&lt;/a&gt; and thought it was perfectly suited to an interactive visualisation:&lt;/p&gt;
&lt;p&gt;
 
 







&lt;div class="iframe-embed"&gt;
 &lt;iframe
 src="component/component.html"
 width="100%"
 height="auto"
 style=""
 loading="eager"
 title="Gershogrin Circle Theorem"
 frameborder="0"
 scrolling="no"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The problem is I&amp;rsquo;m no web developer, and I don&amp;rsquo;t really like JavaScript. So, the eigenvalue computation in the interactive component above is written in Rust, compiled to WebAssembly, and wrapped up with some HTML and JavaScript. As the old mathematics adage goes: &lt;em&gt;if you can&amp;rsquo;t solve the base problem, turn it into multiple problems&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Talk: Implementing Efficient Language Models under Homomorphic Encryption</title><link>https://abstractnonsense.xyz/micro-blog/2025-11-11-implementing-efficient-language-models-under-homomorphic-encryption/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-11-11-implementing-efficient-language-models-under-homomorphic-encryption/</guid><description>&lt;p&gt;Today (&lt;a href="https://en.wikipedia.org/wiki/Pepero_Day"&gt;11/11 Pepero Day&lt;/a&gt; in Korea), I had the pleasure of attending a fascinating talk on &lt;em&gt;Implementing Efficient Language Models under Homomorphic Encryption&lt;/em&gt; by &lt;a href="https://donghwan-rho.github.io"&gt;Donghwan Rho (노동환)&lt;/a&gt; at the Seoul National University Research Institute of Mathematics&amp;rsquo; &lt;a href="https://rim.math.snu.ac.kr/bbs/board.php?bo_table=Math_Event&amp;amp;wr_id=81"&gt;2025 11.11 Symposium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am on holiday in Korea and didn&amp;rsquo;t want to miss this opportunity to learn more about homomorphic encryption - an area I&amp;rsquo;ve been been increasingly fascinated by as of late!&lt;/p&gt;
&lt;h2 id="talk-abstract"&gt;
 &lt;a href="#talk-abstract"&gt;#&lt;/a&gt;
 Talk Abstract
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;As large language models (LLMs) become ubiquitous, users routinely share sensitive information with them, raising pressing privacy concerns. Homomorphic encryption (HE) is a promising solution to privacy-preserving machine learning (PPML), enabling computations on encrypted data. However, many core components of LLMs are not HE-friendly, limiting practical deployments. In this talk, we investigate the main bottleneck - softmax, matrix multiplications, and next-token prediction - and how we address them, moving toward the practical implementation of LLMs under HE.&lt;/p&gt;</description></item><item><title>Heuristics for Minimum Euclidean Skeletons</title><link>https://abstractnonsense.xyz/blog/2025-11-09-heuristics-for-minimum-euclidean-skeletons/</link><pubDate>Sun, 09 Nov 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-11-09-heuristics-for-minimum-euclidean-skeletons/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: This blog post is a recap of exploration I did as part of the undergraduate &lt;a href="https://ms.unimelb.edu.au/engage/vacation-scholarships"&gt;Mathematics and Statistics Vacation Scholarship&lt;/a&gt; program at the University of Melbourne in January 2021. It&amp;rsquo;s been a while since then, so please forgive any inaccuracies that are almost assuredly present.&lt;/p&gt;
&lt;p&gt;The poster I presented at the conclusion of the program was hosted on the School of Mathematics&amp;rsquo; website but has suffered the demise of linkrot. For posterity, I&amp;rsquo;m hosting my poster PDF and an HTML version on my blog here.&lt;/p&gt;</description></item><item><title>Welcome to the Hyunam-Dong Bookshop by Hwang Bo-Reum</title><link>https://abstractnonsense.xyz/micro-blog/2025-10-05-welcome-to-the-hyunam-dong-bookshop-by-hwang-bo-reum/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-10-05-welcome-to-the-hyunam-dong-bookshop-by-hwang-bo-reum/</guid><description>&lt;p&gt;I really enjoyed this book! The original is in Korean, but the version I read was impeccably translated by someone with a masterful command of idiomatic English.&lt;/p&gt;
&lt;p&gt;The book charts the life of a burnt-out Korean worker, Yeongju, as she embarks on a new venture by opening a bookshop. Seeing the stereotypes of Korean working culture explored through the interactions of Yeongju with her customers was both concerning and illuminating.&lt;/p&gt;</description></item><item><title>Euclidea: An interactive geometric theorem prover</title><link>https://abstractnonsense.xyz/micro-blog/2025-09-28-euclidea-an-interactive-geometric-theorem-prover/</link><pubDate>Sun, 28 Sep 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-09-28-euclidea-an-interactive-geometric-theorem-prover/</guid><description>&lt;p&gt;After watching the excellent piece of exposition
on mathematical exploration by 3Blue1Brown guest Ben Syversen: &lt;a href="https://youtu.be/M-MgQC6z3VU?feature=shared"&gt;&amp;ldquo;What was Euclid really doing?&amp;rdquo;&lt;/a&gt;, I discovered the fantastic web and mobile game &lt;a href="https://www.euclidea.xyz/"&gt;Euclidea&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Geometry was never my favourite branch of mathematics, I always felt more drawn to algebra and more symbolic and abstract forms of reasoning. But Euclidea really does a masterful job of capturing the joy of exploration and problem solving through the lens of scaffolded puzzles of compass-and-straightedge geometric constructions.&lt;/p&gt;</description></item><item><title>Recursive problem solving with DNS</title><link>https://abstractnonsense.xyz/micro-blog/2025-09-16-recursive-problem-solving-with-dns/</link><pubDate>Tue, 16 Sep 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-09-16-recursive-problem-solving-with-dns/</guid><description>&lt;p&gt;I really enjoyed this &lt;a href="https://jvns.ca/blog/2023/05/08/new-talk-learning-dns-in-10-years/"&gt;Learning DNS in 10 years&lt;/a&gt; talk by &lt;a href="https://jvns.ca"&gt;Julia Evans&lt;/a&gt;. Not only does it present a great, lightweight walkthrough on DNS, but it espouses a maxim for learning I really appreciate: keep &lt;code&gt;dig&lt;/code&gt;ging, and when you get stuck, keep &lt;code&gt;dig&lt;/code&gt;ging.&lt;/p&gt;</description></item><item><title>Rust for everyone [video]</title><link>https://abstractnonsense.xyz/micro-blog/2025-09-08-rust-for-everyone/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-09-08-rust-for-everyone/</guid><description>&lt;p&gt;A &lt;a href="https://abstractnonsense.xyz/micro-blog/2023-05-28-week-22/"&gt;while ago&lt;/a&gt; I mentioned that I thought that Rust was a fiendishly complex language at first glance. Well, that hasn&amp;rsquo;t changed. Don&amp;rsquo;t get me wrong, I love Rust, and I wish I had the time to dive deeper into it, but it has a steep learning curve.&lt;/p&gt;
&lt;p&gt;That said, I recently came across a fantastic video, &lt;a href="https://www.youtube.com/watch?v=R0dP-QR5wQo"&gt;&amp;ldquo;Rust for Everyone&amp;rdquo;&lt;/a&gt;, presented by Will Crichton at Jane Street that explores the various tools he&amp;rsquo;s built to make Rust more accessible to newcomers. It&amp;rsquo;s not in the video description, but here&amp;rsquo;s an outline of the tools Will discusses:&lt;/p&gt;</description></item><item><title>The font of all knowledge</title><link>https://abstractnonsense.xyz/micro-blog/2025-09-04-the-font-of-all-knowledge/</link><pubDate>Thu, 04 Sep 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-09-04-the-font-of-all-knowledge/</guid><description>&lt;p&gt;TIL that Google Search has a font-based Easter Egg. If you search for &lt;a href="https://www.google.com/search?q=Georgia+font"&gt;&amp;ldquo;Georgia font&amp;rdquo;&lt;/a&gt;, the results page will change the typeface to &lt;a href="https://en.wikipedia.org/wiki/Georgia_(typeface)"&gt;Georgia&lt;/a&gt;. I initially thought it was limited to System-fonts, but &lt;a href="https://en.wikipedia.org/wiki/List_of_Google_Easter_eggs"&gt;Wikipedia&lt;/a&gt; shows that it works for &lt;a href="https://en.wikipedia.org/wiki/Roboto"&gt;Roboto&lt;/a&gt; too!&lt;/p&gt;
&lt;p&gt;I discovered this when looking up various fonts for this blog. I initially specified the default browser sans-serif font in my CSS, but ended up switching to Georgia for the text-body as I find it more readable for longer posts. There are some beautiful fonts in &lt;a href="https://fonts.google.com"&gt;Google Font&lt;/a&gt; I&amp;rsquo;d love to use, but for now I&amp;rsquo;m going to stick with the &lt;a href="https://systemfontstack.com"&gt;System Font Stack&lt;/a&gt; to avoid loading more external resources on page-load.&lt;/p&gt;</description></item><item><title>Can a regex match valid card numbers?</title><link>https://abstractnonsense.xyz/blog/2025-08-31-can-a-regex-match-valid-card-numbers/</link><pubDate>Sun, 31 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-08-31-can-a-regex-match-valid-card-numbers/</guid><description>&lt;p&gt;Sometimes the mere existence of a question is dangerous. A &lt;a href="https://abstractnonsense.xyz/micro-blog/2025-03-11-irregular-expressions/"&gt;colleague recently asked&lt;/a&gt; me whether it&amp;rsquo;s possible to validate credit card numbers in regex using the &lt;a href="https://en.wikipedia.org/wiki/Luhn_algorithm"&gt;Luhn algorithm&lt;/a&gt;, and, well, I was thoroughly &lt;a href="https://xkcd.com/356/"&gt;nerd-sniped&lt;/a&gt;. I&amp;rsquo;ll outline the problem briefly and we&amp;rsquo;ll try to explicate a solution together.&lt;/p&gt;
&lt;p&gt;For what follows, it&amp;rsquo;ll be helpful if you&amp;rsquo;ve encountered concepts such as &lt;a href="https://en.wikipedia.org/wiki/Deterministic_finite_automaton"&gt;Deterministic Finite Automata (DFA)&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Regular_language"&gt;Regular languages&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Modular_arithmetic"&gt;modular arithmetic&lt;/a&gt; before. If you haven&amp;rsquo;t, I think a quick skim through the Wikipedia pages should be sufficient to follow. I&amp;rsquo;ll also pair the mathematical formalisms with Python code in the exposition to make it easier to follow.&lt;/p&gt;</description></item><item><title>From Lambda Calculus to Lifelong Learning</title><link>https://abstractnonsense.xyz/micro-blog/2025-08-18-from-lambda-calculus-to-lifelong-learning/</link><pubDate>Mon, 18 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-08-18-from-lambda-calculus-to-lifelong-learning/</guid><description>&lt;p&gt;About a decade ago, whilst meandering through a late-night Wikipedia rabbit hole&lt;label for="fn0" class="footnote-trigger"&gt;*&lt;/label&gt;&lt;input type="checkbox" id="fn0" class="footnote-checkbox" /&gt;&lt;small class="footnote-aside" id="fn0"&gt;Some things haven&amp;rsquo;t changed at all&lt;/small&gt;, I stumbled across the page for the &lt;a href="https://en.wikipedia.org/wiki/Lambda_calculus"&gt;Lambda Calculus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A small footnote linked to &lt;a href="https://www.cs.unc.edu/~stotts/723/Lambda/scheme.html"&gt;An Introduction to Lambda Calculus and Scheme&lt;/a&gt;, a transcript of a short talk presented by Jim Larson, and, well, I fell in love. I loved the fact that there was this beautiful correspondence between foundational mathematics and models of computation; and that you could describe it through these symbolic wrappers called Lambda terms. There was something deep and abstract about it that I felt immensely drawn to.&lt;/p&gt;</description></item><item><title>The endless procrastination of meta-blogging</title><link>https://abstractnonsense.xyz/micro-blog/2025-08-17-the-endless-procrastination-of-meta-blogging/</link><pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-08-17-the-endless-procrastination-of-meta-blogging/</guid><description>&lt;p&gt;I came across &lt;a href="https://fabiensanglard.net/blog/"&gt;this great piece&lt;/a&gt; on the act of blogging. Since I started pursuing blogging as a practice, it&amp;rsquo;s been a very rewarding experience. But my drafts and ideas list is ever growing and my output of &lt;em&gt;substantive&lt;/em&gt; content is decreasing proportionately.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve learnt a lot from the simple act of setting up my blog in the first instance: from quality learnings about internet networking through to the dreaded menagerie of tooling that frontend developers call &amp;rsquo;the web&amp;rsquo;. But I can&amp;rsquo;t deny I spend far too much time blogging about blogging than I do &lt;strong&gt;actually blogging&lt;/strong&gt; (this post is no exception).&lt;/p&gt;</description></item><item><title>The Illusion of ... the Illusion of Thinking</title><link>https://abstractnonsense.xyz/micro-blog/2025-08-13-the-illusion-of-the-illusion-of-thinking/</link><pubDate>Wed, 13 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-08-13-the-illusion-of-the-illusion-of-thinking/</guid><description>&lt;p&gt;As of late there&amp;rsquo;s been a &lt;a href="https://www.seangoedecke.com/illusion-of-thinking/"&gt;lot of thinking&lt;/a&gt; engendered by Apple&amp;rsquo;s &lt;a href="https://machinelearning.apple.com/research/illusion-of-thinking"&gt;The Illusion of Thinking&lt;/a&gt; paper.&lt;/p&gt;
&lt;p&gt;I propose we get ahead of this sequence of paper-rebuttal-paper and define the &lt;a href="https://en.wikipedia.org/wiki/Iterated_function"&gt;iterated function&lt;/a&gt; sequence $\{ n \ge 1: \textsf{(The Illusion of)}^{n} \textsf{(Thinking)} \}$. Whether this series of thoughts will converge to any &lt;a href="https://en.wikipedia.org/wiki/Fixed_point_(mathematics)"&gt;fixed point&lt;/a&gt; is left as a conjecture for the reader.&lt;/p&gt;
&lt;p&gt;A &lt;a href="https://www.seangoedecke.com/real-reasoning/"&gt;new post&lt;/a&gt; by &lt;a href="https://www.seangoedecke.com"&gt;Sean Godecke&lt;/a&gt;, commenting on a recent publication &lt;a href="https://arxiv.org/pdf/2508.01191"&gt;&lt;em&gt;Is chain-of-thought AI reasoning a mirage?&lt;/em&gt;&lt;/a&gt; includes this incisive critique:&lt;/p&gt;</description></item><item><title>Writing collapsible inline footnotes in Hugo with Markdown</title><link>https://abstractnonsense.xyz/micro-blog/2025-08-11-writing-collapsible-inline-footnotes-in-hugo-with-markdown/</link><pubDate>Mon, 11 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-08-11-writing-collapsible-inline-footnotes-in-hugo-with-markdown/</guid><description>&lt;p&gt;I use &lt;a href="https://github.com/gohugoio/hugo"&gt;Hugo&lt;/a&gt; as the static site builder for my blog. I love it because it&amp;rsquo;s fast (&lt;em&gt;blisteringly&lt;/em&gt; fast) and for the most part it just gets out of the way.&lt;/p&gt;
&lt;p&gt;However, Hugo&amp;rsquo;s support for customising the rendering of Markdown into HTML is &amp;hellip; lacking, to say the least. Hugo uses &lt;a href="https://github.com/yuin/goldmark/"&gt;Goldmark&lt;/a&gt; under the hood, which supports &lt;a href="https://github.com/yuin/goldmark/?tab=readme-ov-file#list-of-extensions"&gt;Extensions&lt;/a&gt;, but Hugo doesn&amp;rsquo;t natively plug in to those. I&amp;rsquo;d previously been using a Hugo &lt;a href="https://gohugo.io/content-management/shortcodes/"&gt;shortcode&lt;/a&gt; to wrap around some arbitrary Markdown and convert it into a footnote HTML:&lt;/p&gt;</description></item><item><title>A neat CSS trick to add favicons to website links</title><link>https://abstractnonsense.xyz/micro-blog/2025-08-10-a-neat-css-trick-to-add-favicons-to-website-links/</link><pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-08-10-a-neat-css-trick-to-add-favicons-to-website-links/</guid><description>&lt;p&gt;I discovered a neat CSS trick that automatically lets you prepend an SVG &amp;lsquo;favicon&amp;rsquo; before URLs linking to a particular domain. For example, for links to &lt;code&gt;github.com&lt;/code&gt;, you can embed an &lt;a href="https://github.com/octocat"&gt;octocat&lt;/a&gt; SVG using an attribute selector:&lt;/p&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;css&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;href&lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;github.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;-0.15&lt;/span&gt;&lt;span class="kt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;currentColor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data:image/svg+xml;utf8,&amp;lt;svg xmlns=&amp;#34;http://www.w3.org/2000/svg&amp;#34; viewBox=&amp;#34;0 0 16 16&amp;#34;&amp;gt;&amp;lt;path fill=&amp;#34;currentColor&amp;#34; d=&amp;#34;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.62 7.62 0 0 1 2-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8Z&amp;#34;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kc"&gt;contain&lt;/span&gt; &lt;span class="kc"&gt;no-repeat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;We apply the favicon as a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/mask"&gt;CSS mask&lt;/a&gt; to properly render the transparent components of the logo against the background.&lt;/p&gt;</description></item><item><title>An Afternoon Reading the Dictionary</title><link>https://abstractnonsense.xyz/blog/2025-08-09-an-afternoon-reading-the-dictionary/</link><pubDate>Sat, 09 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-08-09-an-afternoon-reading-the-dictionary/</guid><description>&lt;p&gt;I&amp;rsquo;m a heavy user of Apple&amp;rsquo;s &lt;a href="https://support.apple.com/en-au/guide/mac-help/mchl3983326c/mac"&gt;Look Up for words&lt;/a&gt; on macOS. With a quick &lt;a href="https://support.apple.com/en-au/guide/mac-help/mchl3983326c/mac"&gt;force click&lt;/a&gt; you can instantly summon the dictionary or thesaurus for a selected word, which removes the friction of pursuing &amp;ldquo;hmm, that&amp;rsquo;s a new word - what does it mean?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I’ve been collecting new words I discover in an Apple Note for years and recently started migrating my list to a &lt;a href="https://abstractnonsense.xyz/blog/2025-08-01-a-living-log-of-lexical-learnings/"&gt;living blog page&lt;/a&gt;. Rather than manually collecting the macOS built-in &lt;em&gt;Oxford Dictionary&lt;/em&gt; definition for each word (of which I have hundreds), I thought I&amp;rsquo;d script it. It turns out that Oxford Dictionaries has a very neat &lt;a href="https://developer.oxforddictionaries.com/documentation"&gt;API&lt;/a&gt;, but unfortunately it&amp;rsquo;s exorbitantly &lt;a href="https://account.oxforddictionaries.com/pricing"&gt;expensive&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Hard problems: the Hadamard matrix problem</title><link>https://abstractnonsense.xyz/blog/2025-08-09-hard-problems-the-hadamard-matrix-problem/</link><pubDate>Sat, 09 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-08-09-hard-problems-the-hadamard-matrix-problem/</guid><description>&lt;p&gt;There&amp;rsquo;s a lot of &lt;a href="https://en.wikipedia.org/wiki/List_of_unsolved_problems_in_mathematics"&gt;unsolved problems in mathematics&lt;/a&gt;. A lot. It&amp;rsquo;d be a bit imprecise to define a measure on the set of open problems, but I&amp;rsquo;d wager that it is much larger than the set of solved problems. In fact, for every solved problem, I&amp;rsquo;d conjecture that the process of solving it simply creates more open problems.&lt;/p&gt;
&lt;p&gt;One such open problem that I find deeply unsettling is the &lt;a href="https://en.wikipedia.org/wiki/Hadamard_matrix#Hadamard_conjecture"&gt;Hadamard conjecture&lt;/a&gt;. Let&amp;rsquo;s define a Hadamard matrix and explain the conjecture:&lt;/p&gt;</description></item><item><title>MathJax v4.0 released</title><link>https://abstractnonsense.xyz/micro-blog/2025-08-05-mathjax-v4.0-released/</link><pubDate>Tue, 05 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-08-05-mathjax-v4.0-released/</guid><description>&lt;p&gt;&lt;a href="https://github.com/mathjax/MathJax-src"&gt;MathJax&lt;/a&gt; &lt;a href="https://github.com/mathjax/MathJax-src/releases/tag/4.0.0"&gt;v4.0&lt;/a&gt; has been &lt;a href="https://docs.mathjax.org/en/latest/upgrading/whats-new-4.0.html"&gt;released&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I just integrated MathJax v3 with &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt; last night for this blog to start writing some maths posts, and v4 is released today&amp;hellip;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m hoping it improves rendering though, I was seeing some issues with SVG output for inline formulae in Safari. &lt;a href="https://github.com/KaTeX/KaTeX"&gt;KaTeX&lt;/a&gt; is neat and fast, but I find the quality of the typesetting to be quite sub-par compared to MathJax.&lt;/p&gt;</description></item><item><title>A Living Log of Lexical Learnings</title><link>https://abstractnonsense.xyz/blog/2025-08-01-a-living-log-of-lexical-learnings/</link><pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-08-01-a-living-log-of-lexical-learnings/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This is a living document in which I collect new words I encounter in my reading and daily life. All definitions herein are from the &lt;em&gt;Oxford Dictionary of English&lt;/em&gt; unless otherwise stated.&lt;/p&gt;
&lt;/blockquote&gt;


 
&lt;details&gt;
&lt;summary&gt;A&lt;/summary&gt;

&lt;p&gt;&lt;strong&gt;aposiopesis&lt;/strong&gt;: the device of suddenly breaking off in speech:: &lt;em&gt;in coping with the unsaid and unsayable, oral history is impelled towards aposiopesis.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;aetiology&lt;/strong&gt;: the investigation or attribution of the cause or reason for something, often expressed in terms of historical or mythical explanation.&lt;/p&gt;</description></item><item><title>A Character Study in Alliteration</title><link>https://abstractnonsense.xyz/micro-blog/2025-07-24-a-character-study-in-alliteration/</link><pubDate>Thu, 24 Jul 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-07-24-a-character-study-in-alliteration/</guid><description>&lt;p&gt;I came across a short alliterative poem about &lt;a href="https://en.wikipedia.org/wiki/Rorschach_(character)"&gt;Rorschach&lt;/a&gt; I wrote a good while back after reading &lt;a href="https://en.wikipedia.org/wiki/Watchmen"&gt;&lt;em&gt;The Watchmen&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Manic milieu meets maimed mien,&lt;br&gt;
moralising meandering misanthropic menace,&lt;br&gt;
metes most morbid measures masked,&lt;br&gt;
macabre murmurs marry much moribund musings,&lt;br&gt;
massacring measly men mirthlessly&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t know why I decided to pick &amp;rsquo;m&amp;rsquo; here for the alliteration, but I often enjoy writing such whimsical snippets. I&amp;rsquo;m not sure what you&amp;rsquo;d call this, but I suppose &amp;rsquo;extreme alliteration&amp;rsquo; or &lt;a href="https://en.wikipedia.org/wiki/Lipogram#Reverse_lipogram"&gt;&lt;em&gt;reverse lipogram&lt;/em&gt;&lt;/a&gt; would suffice. I quite like the whole field of &lt;a href="https://en.wikipedia.org/wiki/Constrained_writing"&gt;constrained writing&lt;/a&gt;, it&amp;rsquo;s quite fun thinking about how to slot words into constraints just-so. Apparently there was (is?) a group of French mathematicians and writers who similarly delighted in such pursuits&amp;hellip; the &lt;a href="https://en.wikipedia.org/wiki/Oulipo"&gt;Oulipo (&lt;em&gt;Ouvroir de littérature potentielle&lt;/em&gt;)&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Learning from LLMs ethically by practising code minimisation as a discipline</title><link>https://abstractnonsense.xyz/micro-blog/2025-07-13-code-minimisation-for-ethical-learning-from-llms/</link><pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-07-13-code-minimisation-for-ethical-learning-from-llms/</guid><description>&lt;p&gt;Like many people nowadays, I find LLMs an invaluable tool for learning new concepts or vibecoding in unfamiliar stacks and langauages. It’s undeniably a massive accelerator when it comes to quickly iterating and learning.&lt;/p&gt;
&lt;p&gt;But it has its downsides. There’s a strong argument to be said that by offloading the &lt;em&gt;challenge&lt;/em&gt; of learning something new, your core critical thinking atrophies and your ability to focus slides down the slippery slope of instant gratification.&lt;/p&gt;</description></item><item><title>Better Python path handling with Pathlib and Git</title><link>https://abstractnonsense.xyz/blog/2025-07-11-better-python-path-handling-with-pathlib-and-git/</link><pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-07-11-better-python-path-handling-with-pathlib-and-git/</guid><description>&lt;p&gt;One of the most frustrating problems in ad-hoc data science projects is broken file paths.&lt;/p&gt;
&lt;p&gt;You write a script that loads a model, grabs data, or instantiates a config from your local disk. It works perfectly on your machine, then someone else runs it and… catastrophe: &lt;code&gt;FileNotFoundError: No such file or directory&lt;/code&gt;. Uh oh, looks like someone just got bit by hard-coded paths or assumptions about where the script is being run from.&lt;/p&gt;</description></item><item><title>Haptics at 300kph</title><link>https://abstractnonsense.xyz/micro-blog/2025-07-11-haptics-at-300kph/</link><pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-07-11-haptics-at-300kph/</guid><description>&lt;p&gt;Apple released a new &amp;ldquo;Haptic Trailer&amp;rdquo; for their new &lt;a href="https://en.wikipedia.org/wiki/F1_(film)"&gt;F1 movie&lt;/a&gt; - you can check it out in the Apple TV app. It&amp;rsquo;s a pretty neat experience, I&amp;rsquo;d never thought about adding haptics to a playback experience, but it really does add another dimension of immersion.&lt;/p&gt;
&lt;p&gt;I was curious on how it was implemented, and stumbled across a great &lt;a href="https://www.mux.com/blog/how-apple-made-the-f1-movie-trailer-literally-shake-things-up"&gt;blog post&lt;/a&gt; that really shook it out for me&amp;hellip; I&amp;rsquo;m sure it&amp;rsquo;d get horrifically overused, but it&amp;rsquo;d be interesting to see whether this gets adopted into more media streams in the future.&lt;/p&gt;</description></item><item><title>Building animations in Manim with LLMs</title><link>https://abstractnonsense.xyz/micro-blog/2025-07-03-building-animations-in-manim-with-llms/</link><pubDate>Thu, 03 Jul 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-07-03-building-animations-in-manim-with-llms/</guid><description>&lt;p&gt;&lt;a href="https://github.com/3b1b/manim"&gt;Manim&lt;/a&gt; is a Python animation engine designed to build animated mathematical explainer videos (&lt;a href="https://www.manim.community/awesome/"&gt;examples here&lt;/a&gt;) created by Grant Sanderson of the superb YouTube channel &lt;a href="https://www.youtube.com/c/3blue1brown"&gt;3Blue1Brown&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A couple years ago I wanted to write my own mathematics explainer videos with Manim, but found the learning curve to be pretty steep at the outset.&lt;/p&gt;
&lt;p&gt;The user experience has since improved dramatically - in large part because of the &lt;a href="https://github.com/manimCommunity/manim"&gt;Manim Community Edition&lt;/a&gt;, but also because there&amp;rsquo;s now enough samples in recent LLM training runs that they can produce workable Manim code!&lt;/p&gt;</description></item><item><title>An aside on retro gaming on Mac</title><link>https://abstractnonsense.xyz/micro-blog/2025-06-30-an-aside-on-retro-gaming-on-mac/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-06-30-an-aside-on-retro-gaming-on-mac/</guid><description>&lt;p&gt;I&amp;rsquo;m not much of a gamer. In fact, I don&amp;rsquo;t think I&amp;rsquo;ve played any games in the past decade.&lt;/p&gt;
&lt;p&gt;But I do have very fond memories of playing a couple games on an old translucent &lt;a href="https://en.wikipedia.org/wiki/IMac_G3"&gt;iMac G3&lt;/a&gt; in the school computer room in primary.&lt;/p&gt;
&lt;p&gt;On some late night Wikipedia rabbit hole I ended up on the page for &lt;a href="https://en.wikipedia.org/wiki/Antz"&gt;Antz&lt;/a&gt; and was reminded of the old-school-cool games I&amp;rsquo;d played: &lt;a href="https://en.wikipedia.org/wiki/Bugdom"&gt;Bugdom&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Nanosaur"&gt;Nanosaur&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It turns out, they’re been &lt;a href="https://jorio.itch.io"&gt;immortalised&lt;/a&gt; and ported to run on macOS with Apple Silicon. You can download them (for free): &lt;a href="https://github.com/jorio/Nanosaur"&gt;Nanosaur&lt;/a&gt; and &lt;a href="https://github.com/jorio/Bugdom2"&gt;Bugdom2&lt;/a&gt;. They run like a charm and with beautiful graphics scaling to boot!&lt;/p&gt;</description></item><item><title>Meditations by Marcus Aurelius</title><link>https://abstractnonsense.xyz/micro-blog/2025-06-30-meditations-by-marcus-aurelius/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-06-30-meditations-by-marcus-aurelius/</guid><description>&lt;p&gt;I picked up a &lt;a href="https://www.chilternpublishing.co.uk/shop/classics/meditations/"&gt;beautiful copy&lt;/a&gt; of &lt;em&gt;Meditations&lt;/em&gt; by Marcus Aurelius in a cute bookstore in Korea (Chiltern Publishing, translated by A.S.L Farquharson).&lt;/p&gt;
&lt;p&gt;I purchased it mostly on a whim - it’d been a while since I’d read any true classics, and the bind was truly delightful (it’s this beautifully embossed, textured cover with a gilt silver coating across the paper edges).&lt;/p&gt;
&lt;p&gt;The book overall? It’s filled with Stoic aphorisms and pithy existential ruminations. How ‘meditative’ that is to modern sensibilities is up to the individual. Though you do get the occasional good nugget of advice like:&lt;/p&gt;</description></item><item><title>Mapbox documentation uses real tokens</title><link>https://abstractnonsense.xyz/micro-blog/2025-06-10-mapbox-documentation-uses-real-tokens/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-06-10-mapbox-documentation-uses-real-tokens/</guid><description>&lt;p&gt;I&amp;rsquo;ve been working on a small side project that requires embedding an interactive map. I spent some time evaluating different mapping providers - initially &lt;a href="https://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt; with &lt;a href="https://leafletjs.com"&gt;leaflet&lt;/a&gt; for annotations. OpenStreetMap is great for rapid prototyping since it&amp;rsquo;s free and doesn&amp;rsquo;t require any API key, but it doesn&amp;rsquo;t look great (by default, at least) and it doesn&amp;rsquo;t have the same rich POI data integration.&lt;/p&gt;
&lt;p&gt;I dabbled with &lt;a href="https://www.mapbox.com"&gt;Mapbox&lt;/a&gt; next and was really impressed. It has end-to-end API coverage for heaps of mapping use cases, and provides lots of examples of how to integrate Mapbox into your choice of language/platform/framework. However, the thing that really stood out to was their onboarding design. Once you create an account and login, Mapbox injects your API keys directly into the example code on the webpage. They literally inject your personal API key into the standard examples for logged in users so that you can copy/paste and immediately start working.&lt;/p&gt;</description></item><item><title>Internationali(z|a)tion is hard</title><link>https://abstractnonsense.xyz/micro-blog/2025-06-09-internationalization-is-hard/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-06-09-internationalization-is-hard/</guid><description>&lt;p&gt;I came across a UI glitch today in my Uber app. At first glance it appears to be a preposterous oversight, the &lt;code&gt;s&lt;/code&gt; in &lt;code&gt;Favourites&lt;/code&gt; has been &lt;a href="https://en.m.wikipedia.org/wiki/Widows_and_orphans"&gt;orphaned&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I live in Australia, where we closely follow British English spelling - meaning it’s “Fav&lt;strong&gt;ou&lt;/strong&gt;rites” and not “Fav&lt;strong&gt;o&lt;/strong&gt;rites”. In the world of UI/UX, it’s common to use localisation dictionaries to map strings to &lt;a href="https://en.m.wikipedia.org/wiki/Internationalization_and_localization"&gt;locale-appropriate&lt;/a&gt; versions. I suspect some UI designer carefully crafted this screen for US English and mapped over to AU English, accidentally committing a tiny typographic crime.&lt;/p&gt;</description></item><item><title>Gitting things done</title><link>https://abstractnonsense.xyz/micro-blog/2025-06-04-gitting-things-done/</link><pubDate>Wed, 04 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-06-04-gitting-things-done/</guid><description>&lt;p&gt;GitHub has a fascinating &lt;a href="https://github.blog/open-source/git/git-turns-20-a-qa-with-linus-torvalds/"&gt;interview with Linus Torvalds&lt;/a&gt;, the inventor of both git and Linux for the 20th anniversary of git.&lt;/p&gt;</description></item><item><title>This blog has been featured by GitHub!</title><link>https://abstractnonsense.xyz/blog/2025-06-03-this-blog-has-been-featured-by-github/</link><pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-06-03-this-blog-has-been-featured-by-github/</guid><description>&lt;p&gt;This blog has been featured by GitHub!*&lt;/p&gt;
&lt;p&gt;Well, sort of.&lt;/p&gt;
&lt;p&gt;To publish posts to this blog, I’m abusing GitHub’s excellent Issue tracking capability. I have a &lt;a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms"&gt;GitHub Issue Form Template&lt;/a&gt; at &lt;a href="https://github.com/stochastical/abstractnonsense/blob/main/.github/ISSUE_TEMPLATE/new-blog-post.yml"&gt;&lt;code&gt;.github/ISSUE_TEMPLATE/new-blog-post.yml&lt;/code&gt;&lt;/a&gt; which gives me a nice template to complete with fields like blog &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;section&lt;/code&gt; etc.&lt;/p&gt;
&lt;p&gt;The form template automatically labels the issue as a &lt;code&gt;new-blog-post&lt;/code&gt; which triggers a &lt;a href="https://github.com/stochastical/abstractnonsense/blob/main/.github/workflows/new-blog-post.yml"&gt;GitHub Actions workflow&lt;/a&gt; to (very hackily) dump the contents of the Issue into a Markdown file and commit.&lt;/p&gt;</description></item><item><title>Writing in Future Tense: Machine Time</title><link>https://abstractnonsense.xyz/micro-blog/2025-06-03-writing-in-future-tense-machine-time/</link><pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-06-03-writing-in-future-tense-machine-time/</guid><description>&lt;p&gt;I &lt;a href="https://abstractnonsense.xyz/blog/2025-06-03-this-blog-has-been-featured-by-github/"&gt;published a blog post&lt;/a&gt; last night but it never appeared on the site. My GitHub Actions workflow kicked in, my commit hit the server, my Cloudflare build completed with no warnings or errors - everything looked good.&lt;/p&gt;
&lt;p&gt;The culprit? Timezone mismatch. I&amp;rsquo;m writing from AEST (+10, I&amp;rsquo;m in Melbourne), but Cloudflare Pages Workers builds in UTC (&amp;ldquo;server time&amp;rdquo;). Hugo saw my future timestamp and politely ignored the post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Use &lt;code&gt;hugo --buildFuture&lt;/code&gt; as the build command in Cloudflare Pages settings to include posts &amp;ldquo;in the future&amp;rdquo;. I&amp;rsquo;ll consider this a cautionary tale &amp;hellip; it&amp;rsquo;s not the first time timezones have caused me havoc in production.&lt;/p&gt;</description></item><item><title>⚡️Apache Spark 4.0 released</title><link>https://abstractnonsense.xyz/micro-blog/2025-05-29-apache-spark-4.0-released/</link><pubDate>Thu, 29 May 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-05-29-apache-spark-4.0-released/</guid><description>&lt;p&gt;&lt;a href="https://spark.apache.org/releases/spark-release-4-0-0.html"&gt;Apache Spark 4.0&lt;/a&gt; has been released. It&amp;rsquo;s the first major version update since Spark 3.0 in 2020.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s some of the highlights I&amp;rsquo;m excited about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://issues.apache.org/jira/browse/SPARK-49555"&gt;new SQL pipe syntax&lt;/a&gt;. It seems to be a trend with modern SQL engines to include &amp;ldquo;pipe&amp;rdquo; syntax support now (e.g. &lt;a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax"&gt;BigQuery&lt;/a&gt;). I&amp;rsquo;m a fan of functional programming inspired design patterns and the excellent work by the &lt;a href="https://prql-lang.org"&gt;prql&lt;/a&gt; team, so I&amp;rsquo;m glad to see this next evolution of SQL play out.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://issues.apache.org/jira/browse/SPARK-47240"&gt;structured logging framework&lt;/a&gt;. Spark logs are notoriously lengthy and this means you can now use Spark to consume Spark logs! Coupled with &lt;a href="https://issues.apache.org/jira/browse/SPARK-45673"&gt;improvements to&lt;/a&gt; &lt;a href="https://issues.apache.org/jira/browse/SPARK-47274"&gt;stacktraces in PySpark&lt;/a&gt;, hopefully this will mean less &lt;code&gt;grep&lt;/code&gt;ping tortuously long stack traces.&lt;/li&gt;
&lt;li&gt;A new &lt;a href="https://issues.apache.org/jira/browse/SPARK-50541"&gt;&lt;code&gt;DESCRIBE TABLE AS JSON&lt;/code&gt;&lt;/a&gt; option. I really dislike unstructured command line outputs that you have to parse with &lt;code&gt;awk&lt;/code&gt;ward bashisms. JSON input/outputs and manipulation with &lt;a href="https://abstractnonsense.xyz/micro-blog/2025-02-18-surely-youre-jqing/"&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt; is a far more expressive consumption pattern that I feel captures the spirit of command line processing.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://issues.apache.org/jira/browse/SPARK-49530"&gt;new PySpark Plotting API&lt;/a&gt;! It&amp;rsquo;s interesting to see it supports &lt;a href="https://github.com/plotly"&gt;plotly&lt;/a&gt; on the backend as an engine. I&amp;rsquo;ll be curious to see how this plays out going forward&amp;hellip; Being able to do #BigData ETL as well as visualisation and analytics within the one tool is a very powerful combination.&lt;/li&gt;
&lt;li&gt;A new lightweight python-only &lt;a href="https://issues.apache.org/jira/browse/SPARK-47540"&gt;Spark Connect PyPi package&lt;/a&gt;. Now that Spark Connect is getting more traction, it&amp;rsquo;s nice to be able to &lt;code&gt;pip install&lt;/code&gt; Spark on small clients without having to ship massive jars around.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://issues.apache.org/jira/browse/SPARK-45786"&gt;bug fix for inaccurate Decimal arithmetic&lt;/a&gt;. This is interesting only insofar as it reminds me that even well-established, well-tested, correctness-first, open-source software with industry backing can still be subject to really nasty correctness bugs!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Databricks has some excellent coverage on the &lt;a href="https://www.databricks.com/blog/introducing-apache-spark-40"&gt;main release&lt;/a&gt; and the &lt;a href="https://www.databricks.com/blog/sql-gets-easier-announcing-new-pipe-syntax"&gt;new pipe syntax&lt;/a&gt; specifically.&lt;/p&gt;</description></item><item><title>Answering the Unasked</title><link>https://abstractnonsense.xyz/micro-blog/2025-05-24-answering-the-unasked/</link><pubDate>Sat, 24 May 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-05-24-answering-the-unasked/</guid><description>&lt;p&gt;I&amp;rsquo;m not sure exactly where this originated from, but I&amp;rsquo;m quite delighted by this exam question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;State some substantive question which you thought might appear on this exam, but did not. Answer this question (correctly).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As an interview question, I&amp;rsquo;ll sometimes ask: &lt;em&gt;&amp;ldquo;Tell me something interesting you&amp;rsquo;ve discovered or learned recently.&lt;/em&gt;&amp;rdquo; I find its goes a long way to understanding the way the candidate thinks; how they convey technical knowledge to others; and to get a flavour for how real their passion and interest is for the domain.&lt;/p&gt;</description></item><item><title>Paper: Step-by-Step Diffusion: An Elementary Tutorial</title><link>https://abstractnonsense.xyz/micro-blog/2025-05-24-paper-step-by-step-diffusion-an-elementary-tutorial/</link><pubDate>Sat, 24 May 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-05-24-paper-step-by-step-diffusion-an-elementary-tutorial/</guid><description>&lt;p&gt;I&amp;rsquo;ve been reading through &lt;a href="https://machinelearning.apple.com/research/diffusion-elementary-tutorial"&gt;Step-by-Step Diffusion: An Elementary Tutorial&lt;/a&gt; by Apple (&lt;a href="https://arxiv.org/abs/2406.08929"&gt;arxiv&lt;/a&gt;). The mathematics underpinning diffusion language or image models is quite complex, but this walkthrough strikes a nice balance between concrete mathematical grounding and intuition.&lt;/p&gt;</description></item><item><title>View Transition Web API</title><link>https://abstractnonsense.xyz/micro-blog/2025-05-24-view-transition-web-api/</link><pubDate>Sat, 24 May 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-05-24-view-transition-web-api/</guid><description>&lt;p&gt;The (relatively) new &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API"&gt;View Transition API&lt;/a&gt; is really slick! Simply adding the following CSS to my blog enabled &lt;a href="https://developer.chrome.com/docs/web-platform/view-transitions#same-document_view_transitions"&gt;same-document view transitions&lt;/a&gt; - no JavaScript required!&lt;/p&gt;
&lt;p&gt;Go ahead and give it a try now! Simply click a link to another page on this site and you should observe a seamless transition occur.&lt;/p&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;css&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;view-transition&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;navigation&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;If you want to add even more pizzazz, you can declare CSS keyframe animations:&lt;/p&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;css&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Create a custom animation */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;keyframes&lt;/span&gt; &lt;span class="nt"&gt;move-out&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;-100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;keyframes&lt;/span&gt; &lt;span class="nt"&gt;move-in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* Apply the custom animation to the old and new page states */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;view-transition-old&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;root&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt; &lt;span class="kc"&gt;ease-in&lt;/span&gt; &lt;span class="kc"&gt;both&lt;/span&gt; &lt;span class="kc"&gt;move&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;view-transition-new&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;root&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt; &lt;span class="kc"&gt;ease-in&lt;/span&gt; &lt;span class="kc"&gt;both&lt;/span&gt; &lt;span class="kc"&gt;move&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;For a blog like this there&amp;rsquo;s no real use, but for more complex web applications, the View Transition API is a really seamless way to integrate smooth transitions.&lt;/p&gt;</description></item><item><title>Things rewrites their server architecture in Swift</title><link>https://abstractnonsense.xyz/micro-blog/2025-05-23-things-rewrites-their-server-architecture-in-swift/</link><pubDate>Fri, 23 May 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-05-23-things-rewrites-their-server-architecture-in-swift/</guid><description>&lt;p&gt;I&amp;rsquo;ve been a long time user of Cultured Code&amp;rsquo;s &lt;a href="https://culturedcode.com/things/"&gt;Things&lt;/a&gt; to-do app. It&amp;rsquo;s slick, has well designed ergonomics, and is perfectly minimalistic. Things&amp;rsquo; Markdown support is tasteful and its approach to task management structured but pared back.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ve just announced a rewrite of their existing server-side infrastructure stack in Swift, the &lt;a href="https://www.swift.org/blog/how-swifts-server-support-powers-things-cloud/"&gt;linked post&lt;/a&gt; and &lt;a href="https://culturedcode.com/things/blog/2025/05/a-swift-cloud/"&gt;blog post&lt;/a&gt; are worth a read.&lt;/p&gt;
&lt;p&gt;From a technical perspective, I&amp;rsquo;ve always appreciated its rock-solid proprietary Things Cloud syncing service. In particular, I find it interesting the app asks for Local Network access to enable faster syncing:&lt;/p&gt;</description></item><item><title>btop of your resources</title><link>https://abstractnonsense.xyz/micro-blog/2025-04-26-btop-of-your-resources/</link><pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-04-26-btop-of-your-resources/</guid><description>&lt;p&gt;&lt;a href="https://github.com/aristocratos/btop"&gt;&lt;code&gt;btop&lt;/code&gt;&lt;/a&gt; is now my default terminal resource monitor, supplanting &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, and all the others of that ilk. I wanted to spare a few words for its beautiful (and functional!) text-based user interface (TUI):&lt;/p&gt;
&lt;img width="1010" alt="Image" src="https://github.com/user-attachments/assets/3256e7be-6cdc-44ca-ab54-ec60835ad5e6" /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pane management&lt;/strong&gt;: &lt;code&gt;btop&lt;/code&gt; divides your terminal window into multiple information-dense &lt;em&gt;panes&lt;/em&gt; displaying CPU, memory, network, and process information simultaneously. What&amp;rsquo;s fantastic about &lt;code&gt;btop&lt;/code&gt; is that user ergonomics and customisation are clearly front and centre: each pane is numbered, and toggling off/on a pane is as simple as pressing the corresponding pane number. Instead of fiddling with a config file and refreshing (as many other command-line tools require), you can effortlessly switch between panes on-the-fly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;command input&lt;/strong&gt;: In a similar vein, attached to each pane is a set of commands that configure that view. A single letter of the command is highlighted in red, and pressing that letter will toggle that filter/sort/configuration in that panel. Putting the commands front-and-centre shifts the mental burden of recalling &amp;ldquo;What command displays my processes hierarchically&amp;rdquo; (&lt;code&gt;e&lt;/code&gt;) from searching the manual to just &lt;em&gt;looking&lt;/em&gt; at the screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global configuration&lt;/strong&gt;: if you want your customisations to be sticky across sessions, there&amp;rsquo;s a cleanly navigable and expressive configuration window that lets you apply globally persistent configurations. This is much nicer than setting command line flags or editing a config file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cursor support&lt;/strong&gt;: Despite running in a terminal, you can simply click on processes to select them, or use scroll wheels to navigate long lists. This blending of terminal efficiency with GUI-like interactions creates a really slick experience that respects both keyboard purists and those who don&amp;rsquo;t mind the forbidden practice of mouse navigation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;process management&lt;/strong&gt;: As an added bonus, selecting any process will allow you to send any signal straight from the TUI.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="912" alt="Image" src="https://github.com/user-attachments/assets/d69fba1d-3e7d-4dc9-8954-f597472b73b2" /&gt;
&lt;p&gt;What makes &lt;code&gt;btop&lt;/code&gt; stand out is its intuitive keyboard navigation system. Unlike many other CLIs, &lt;code&gt;btop&lt;/code&gt; maps essential functions to single keystrokes. This design philosophy means the interaction mode gets out of the way - toggling through complex system information and controls is always just a keystroke away. To borrow from &lt;a href="https://en.wikipedia.org/wiki/The_Design_of_Everyday_Things"&gt;The Design of Everyday Things&lt;/a&gt;, this feels like a set of masterfully crafted &lt;a href="https://en.wikipedia.org/wiki/Affordance"&gt;&lt;em&gt;affordances&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The Outsider by Albert Camus</title><link>https://abstractnonsense.xyz/micro-blog/2025-04-19-the-outsider-by-albert-camus/</link><pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-04-19-the-outsider-by-albert-camus/</guid><description>&lt;p&gt;Just finished The Outsider by Albert Camus (also known as The Stranger). Reading it felt like walking through an impressionist painting. Finishing it, one is left with a slightly blurred picture of a life — bleak yet nostalgic, emotionally distant yet resoundingly poignant.&lt;/p&gt;
&lt;p&gt;One feels as much an Outsider to the book as the protagonist himself.&lt;/p&gt;
&lt;p&gt;Some highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New word learnt: “&lt;em&gt;lading&lt;/em&gt;”: &lt;em&gt;put cargo onboard a ship&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Wine with lunch! How quintessentially French…&lt;/li&gt;
&lt;li&gt;Trams everywhere! A halcyon stalwart construction of bygone days&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite the surrealism, everything feels strangely real - detached, yet vivid. The first-person voice and inner monologue makes everything feel in equal parts clear and blurry. I don&amp;rsquo;t know how much the various English translations differ, but this edition felt super crisp and readable. I was expecting it to be a more ponderous read, but the langauge was fresh and crisp.&lt;/p&gt;</description></item><item><title>2025 Australian Election Forecast Model</title><link>https://abstractnonsense.xyz/micro-blog/2025-04-18-2025-australian-election-forecast-model/</link><pubDate>Fri, 18 Apr 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-04-18-2025-australian-election-forecast-model/</guid><description>&lt;p&gt;My friend, &lt;a href="mailto:daniel.freidgeim@gmail.com"&gt;Dania Freidgeim&lt;/a&gt;, created a &lt;a href="https://electionfirstpreference.com/methodology/"&gt;probabilistic model&lt;/a&gt; of First Preference votes for the &lt;a href="https://en.wikipedia.org/wiki/2025_Australian_federal_election"&gt;2025 Australian Federal Election&lt;/a&gt;. Australia uses a Preferential voting (&lt;a href="https://en.wikipedia.org/wiki/Instant-runoff_voting"&gt;Instant-runoff&lt;/a&gt;) system, which makes this a really interesting exercise! Please &lt;a href="https://electionfirstpreference.com"&gt;go check it out&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>Structured outputs from LLMs</title><link>https://abstractnonsense.xyz/micro-blog/2025-04-14-structured-outputs-from-llms/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-04-14-structured-outputs-from-llms/</guid><description>&lt;p&gt;This is more of a &amp;ldquo;to-do&amp;rdquo; than anything, but I really love the idea of inference-time next-token probability-distribution hacking to enforce structured outputs. There&amp;rsquo;s this neat Python library &lt;a href="https://github.com/dottxt-ai/outlines"&gt;outlines&lt;/a&gt; that I&amp;rsquo;d love to explore in more depth - it even supports context-free grammars for output guiding!&lt;/p&gt;</description></item><item><title>To uv or not to uv</title><link>https://abstractnonsense.xyz/micro-blog/2025-04-13-to-uv-or-not-to-uv/</link><pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-04-13-to-uv-or-not-to-uv/</guid><description>&lt;p&gt;&lt;a href="https://github.com/astral-sh/uv"&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; is a blazing fast Python package manager that aims to displace &lt;code&gt;pip&lt;/code&gt;. It&amp;rsquo;s a really slick tool that lets you go from &lt;code&gt;git clone&lt;/code&gt; to executing code with all the dependencies seamlessly. All the standard accolades apply: written in Rust, beautiful terminal UI, well thought-out user ergonomics &amp;hellip; all written by &lt;a href="https://astral.sh"&gt;Astral&lt;/a&gt;, the same company that gave the Python community &lt;a href="https://github.com/astral-sh/ruff"&gt;&lt;code&gt;ruff&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But what makes it so damn fast? Under the rusty hood, the magic is even more impressive. Charlie Marsh, the project lead, presented at Jane Street and revealed some of the inner workings. The whole talk is super interesting, but some standout highlights are:&lt;/p&gt;</description></item><item><title>It's always DNS</title><link>https://abstractnonsense.xyz/blog/2025-03-23-its-always-dns/</link><pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/blog/2025-03-23-its-always-dns/</guid><description>&lt;p&gt;I recently moved to the city. As usual, considering the technological ruin that is the &lt;a href="https://en.wikipedia.org/wiki/National_Broadband_Network"&gt;NBN&lt;/a&gt;, I was fully expecting to go another round against the ISP gods.&lt;/p&gt;
&lt;p&gt;I was not disappointed.&lt;/p&gt;
&lt;p&gt;My old apartment used &lt;a href="https://en.wikipedia.org/wiki/Hybrid_fiber-coaxial"&gt;HFC&lt;/a&gt;, which was &amp;hellip; not &lt;em&gt;bad&lt;/em&gt;. But since my new apartment supported &lt;a href="https://en.wikipedia.org/wiki/Fiber_to_the_x"&gt;FTTP&lt;/a&gt;, I figured I may as well upgrade my plan.&lt;/p&gt;
&lt;p&gt;Oh boy.&lt;/p&gt;
&lt;p&gt;First up, the new apartment already had an Optus Ultra Wi-Fi Gen 2 modem-router along with a terrible Optus NBN plan. Since I&amp;rsquo;m lucky enough to get a 50% discount on &lt;a href="https://www.more.com.au"&gt;More NBN&lt;/a&gt; through work, the first step was to switch ISPs.&lt;/p&gt;</description></item><item><title>Inverse UMAP transforms</title><link>https://abstractnonsense.xyz/micro-blog/2025-03-11-inverse-umap-transforms/</link><pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-03-11-inverse-umap-transforms/</guid><description>&lt;p&gt;TIL that the dimensionality reduction algorithm &lt;a href="https://umap-learn.readthedocs.io/en/latest/"&gt;UMAP&lt;/a&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; has support for &lt;a href="https://umap-learn.readthedocs.io/en/latest/inverse_transform.html"&gt;inverse transforms&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Naturally, these are lossy inverses, but being able to generate novel examples of, for example, handwritten digits (yep, classic MNIST once again) is exceedingly cool.&lt;/p&gt;
&lt;p&gt;The example images of handwritten digits here are sampled from the compressed &lt;em&gt;planar&lt;/em&gt; space, and &amp;ldquo;inverted&amp;rdquo; into the original &amp;ldquo;image space&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://umap-learn.readthedocs.io/en/latest/_images/inverse_transform_13_0.png"&gt;&lt;/p&gt;
&lt;p&gt;On a related note, the whole &lt;a href="https://umap-learn.readthedocs.io/en/latest/how_umap_works.html"&gt;explanatory article for UMAP&lt;/a&gt; is a beautiful work of exposition, full of rich ideas that make one ponder deeply. I only wish I understood everything in here end-to-end.&lt;/p&gt;</description></item><item><title>Irregular Expressions</title><link>https://abstractnonsense.xyz/micro-blog/2025-03-11-irregular-expressions/</link><pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-03-11-irregular-expressions/</guid><description>&lt;p&gt;Someone at work asked if it&amp;rsquo;s possible to validate credit card numbers with the &lt;a href="https://en.wikipedia.org/wiki/Luhn_algorithm"&gt;Luhn algorithm&lt;/a&gt; in regex.&lt;/p&gt;
&lt;p&gt;Technically, a &lt;a href="https://en.wikipedia.org/wiki/Regular_language"&gt;regular language&lt;/a&gt; could recognise valid fixed-length credit card numbers by brute-force enumerating all possible sequences. But as a more general solution, I don&amp;rsquo;t think &lt;a href="https://en.wikipedia.org/wiki/Deterministic_finite_automaton"&gt;DFA&lt;/a&gt;s can support the modular arithmetic required for arbitrary sequence lengths&amp;hellip;&lt;/p&gt;
&lt;p&gt;Possible or not, I feel incredibly &lt;a href="https://xkcd.com/356/"&gt;nerd sniped&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://imgs.xkcd.com/comics/nerd_sniping.png"&gt;&lt;/p&gt;</description></item><item><title>Open uBanking</title><link>https://abstractnonsense.xyz/micro-blog/2025-03-09-open-ubanking/</link><pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-03-09-open-ubanking/</guid><description>&lt;p&gt;In Australia, we have the &lt;a href="https://www.cdr.gov.au"&gt;Consumer Data Right&lt;/a&gt;, a government mandated interoperability standard for the Banking (and now Energy) sector.&lt;/p&gt;
&lt;p&gt;Also known as &lt;a href="https://www.ausbanking.org.au/priorities/open-banking/"&gt;Open Banking&lt;/a&gt;, the idea is to ensure that banks expose APIs that allow safe access to your transactions history and account data without having to rely on hacky methods like screen scraping&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, due to how the standard is enforced, it&amp;rsquo;s pretty tough to get access to your own transactions without going through an &amp;ldquo;approved data broker&amp;rdquo; that charges a premium for it (like &lt;a href="https://www.basiq.io/home.html"&gt;Basiq&lt;/a&gt;), or a free app with limited export support like &lt;a href="https://frollo.com.au"&gt;Frollo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Surely you're `jq`ing</title><link>https://abstractnonsense.xyz/micro-blog/2025-02-18-surely-youre-jqing/</link><pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-02-18-surely-youre-jqing/</guid><description>&lt;p&gt;Today I read through the &lt;a href="https://jqlang.org"&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt; &lt;a href="https://jqlang.org/manual/"&gt;manual&lt;/a&gt; cover-to-cover. For those unaware, &lt;code&gt;jq&lt;/code&gt; is a popular CLI tool to query and manipulate JSON. It&amp;rsquo;s also a Turing-complete mini-language with nice functional semantics that fits well into the ethos of composable CLI tools.&lt;/p&gt;
&lt;p&gt;It was an exemplar of well-written technical documentation. Concise, well-written, littered with examples, and linking to an interactive playground to test-and-learn.&lt;/p&gt;
&lt;p&gt;Some learnings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It&amp;rsquo;s surprisingly functional! You can implement recursive functions and use higher-order functions! For example, here&amp;rsquo;s factorial in &lt;code&gt;jq&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;bash&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ jq &lt;span class="s1"&gt;&amp;#39;[.,1]|until(.[0] &amp;lt; 1; [.[0] - 1, .[1] * .[0]])|.[1]&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;ol start="2"&gt;
&lt;li&gt;It supports &lt;a href="https://jqlang.org/manual/#string-interpolation"&gt;string interpolation&lt;/a&gt; - this is really nice if you&amp;rsquo;re piping stuff from JSON into a string. Coupled with &lt;a href="https://jqlang.org/manual/#format-strings-and-escaping"&gt;format strings&lt;/a&gt; this becomes frictionless:&lt;/li&gt;
&lt;/ol&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;bash&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;#34;search&amp;#34;:&amp;#34;hello; world&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;@uri &amp;#34;https://www.google.com/search?q=\(.search)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://www.google.com/search?q=hello%3B%20world&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;ol start="3"&gt;
&lt;li&gt;You can define functions that accept functions&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, and &lt;a href="https://jqlang.org/manual/#breaking-out-of-control-structures"&gt;control structures&lt;/a&gt; that allow labelling.&lt;/li&gt;
&lt;/ol&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;bash&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[[1,2],[10,20]]&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;def addvalue(f): . + [f]; map(addvalue(.[0]))&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#[[1,2,1], [10,20,10]]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;ol start="4"&gt;
&lt;li&gt;You can traverse complex data structures with &lt;a href="https://jqlang.org/manual/#path"&gt;first-class pathing&lt;/a&gt; support. And you can easily &lt;a href="https://jqlang.org/manual/#complex-assignments"&gt;modify nested structures&lt;/a&gt; to extend objects.&lt;/li&gt;
&lt;li&gt;For the category theorists/polyglots, there&amp;rsquo;s a &lt;a href="https://arxiv.org/pdf/2302.10576"&gt;denotational semantics paper&lt;/a&gt; written about &lt;code&gt;jq&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Bonus&lt;/em&gt;: You can build a &lt;a href="https://en.wikipedia.org/wiki/Brainfuck"&gt;Brainfuck&lt;/a&gt; interpreter &lt;a href="https://github.com/01mf02/jaq/blob/main/examples/bf.jq"&gt;in &lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;; and you can build a &lt;a href="https://github.com/wader/jqjq"&gt;&lt;code&gt;jq&lt;/code&gt; interpreter in &lt;code&gt;jq&lt;/code&gt;&lt;/a&gt; - how&amp;rsquo;s that for bootstrapping!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Side note&lt;/strong&gt;: This is one of my goals for 2025 - read through documentation end-to-end to develop mastery over tools. I&amp;rsquo;m trying to prioritise selectively depth over breadth.&lt;/p&gt;</description></item><item><title>Shellshocked? Brace yourselves!</title><link>https://abstractnonsense.xyz/micro-blog/2025-02-15-shellshocked-brace-yourselves/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-02-15-shellshocked-brace-yourselves/</guid><description>&lt;p&gt;I just discovered that to capture multiple lines of &lt;code&gt;stdout&lt;/code&gt; from a shell script and redirect them to a file, you can simply wrap them in braces!&lt;/p&gt;
&lt;p&gt;For example, my &lt;a href="https://github.com/stochastical/abstractnonsense/blob/main/.github/workflows/new-blog-post.yml"&gt;&amp;ldquo;Create a blog post via a GitHub Action triggered on an Issue creation&amp;rdquo;&lt;/a&gt; workflow uses this snippet:&lt;/p&gt;
&lt;details class="code-details" open&gt;&lt;summary class="code-summary"&gt;
 &lt;span class="code-summary-text"&gt;bash&lt;/span&gt;
 &lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;---&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jq &lt;span class="s1"&gt;&amp;#39;del(.content)&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;parsed_issue.json&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; yq -P
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;---&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Inline &amp;#34;content&amp;#34; key for the body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.content&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;parsed_issue.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &amp;gt; content/micro-blog/&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$FILENAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;</description></item><item><title>Typography in Parasite</title><link>https://abstractnonsense.xyz/micro-blog/2025-01-27-typography-in-parasite/</link><pubDate>Mon, 27 Jan 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-01-27-typography-in-parasite/</guid><description>&lt;img width="345" alt="Image" src="https://github.com/user-attachments/assets/e0be47a2-a8a4-4945-a3fe-07efbb15ae2c" /&gt;
&lt;p&gt;This is awesome! Typographic Hangul from the title scene of &lt;em&gt;Parasite&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Developer Ergonomics</title><link>https://abstractnonsense.xyz/micro-blog/2025-01-22-developer-ergonomics/</link><pubDate>Wed, 22 Jan 2025 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2025-01-22-developer-ergonomics/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I wonder how much it is insightful to watch someone doing a workflow and to note when discomfort kicks in. That&amp;rsquo;s a really insightful thing to realize what matters from bitter experience, right? &amp;hellip; Experience tells you when to worry about something and when not to worry about it&amp;rdquo; - &lt;em&gt;Ben Sparks&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is - the rising discomfort of a programmer when employing a new tool, framework, or library is a good window into the ergonomics of how one uses your tool, framework, or library. Source: &lt;a href="https://youtu.be/rbu7Zu5X1zI?feature=shared"&gt;How I animate 3Blue1Brown | A Manim demo with Ben Sparks&lt;/a&gt;. The whole video is worth checking out! It&amp;rsquo;s a masterclass on how to construct a programatic-animation library and demonstrate how to work within it.&lt;/p&gt;</description></item><item><title>Audiolising SwiftUI Graphs</title><link>https://abstractnonsense.xyz/micro-blog/2024-06-18-audiolising-swiftui-graphs/</link><pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2024-06-18-audiolising-swiftui-graphs/</guid><description>&lt;p&gt;This demonstration of an &lt;em&gt;auditory&lt;/em&gt; representation of a (&lt;em&gt;visual&lt;/em&gt;) graph in &lt;a href="https://developer.apple.com/documentation/charts"&gt;Swift Charts&lt;/a&gt; is wild: &lt;a href="https://www.youtube.com/embed/f-qajHmmPWQ?start=180&amp;amp;end=200"&gt;Vectorized and function plots in Swift Charts at WWDC24&lt;/a&gt;.&lt;/p&gt;
&lt;iframe 
 width="560"
 height="315"
 src="https://www.youtube.com/embed/f-qajHmmPWQ?si=8TUB6nnXbUEuj1tL&amp;amp;start=200"
 title="YouTube video player" frameborder="0"
 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
 referrerpolicy="strict-origin-when-cross-origin"
 allowfullscreen
&gt;&lt;/iframe&gt;</description></item><item><title>Week 22</title><link>https://abstractnonsense.xyz/micro-blog/2023-05-28-week-22/</link><pubDate>Sun, 28 May 2023 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2023-05-28-week-22/</guid><description>&lt;ol&gt;
&lt;li&gt;I noted that there&amp;rsquo;s a difference between &lt;a href="https://en.wikipedia.org/wiki/Anomaly_detection"&gt;Anomaly detection&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Outlier"&gt;Outlier detection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;Word of the week&lt;/mark&gt; ~ &lt;strong&gt;enjambement&lt;/strong&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;enjambement&lt;/strong&gt;: (in verse) the continuation of a sentence without a pause beyond the end of a line, couplet, or stanza.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;As an aside, I find Rust as a language fiendishly complex at a first glance, and I’m amazed by people who find it so straightforward. Having said that, I&amp;rsquo;d much rather have lived in a universe where Rust was the first &amp;rsquo;low-level&amp;rsquo; language I learnt instead of C.&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Week 21</title><link>https://abstractnonsense.xyz/micro-blog/2023-05-21-week-21/</link><pubDate>Sun, 21 May 2023 00:00:00 +0000</pubDate><author>hello@abstractnonsense.xyz (Yossi Frenkel)</author><guid>https://abstractnonsense.xyz/micro-blog/2023-05-21-week-21/</guid><description>&lt;ol&gt;
&lt;li&gt;Discovered the concept of similarity graphs through a &lt;a href="https://youtu.be/nq6iPZVUxZU"&gt;talk on Uniform Manifold Approximation and Projection (UMAP) for Dimension Reduction&lt;/a&gt; at SciPy 2018.&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;Word of the week&lt;/mark&gt; ~ &lt;strong&gt;grimoire&lt;/strong&gt;, from French, an alteration of &amp;ldquo;&lt;em&gt;grammaire&lt;/em&gt;&amp;rdquo; (&lt;em&gt;grammar&lt;/em&gt;)
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;grimoire&lt;/strong&gt;: a book of magic spells and invocations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Also, in the world of books: &lt;em&gt;The Cossacks&lt;/em&gt; by Leo Tolstoy.&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>