<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>rixx.de</title><link>https://rixx.de/</link><description>rixx's playground</description><atom:link href="https://rixx.de/feed.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Wed, 19 Feb 2025 15:35:17 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Top 41 Must-Read Fantasy Books</title><link>https://rixx.de/blog/top-41-must-read-fantasy-books/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;It's been &lt;a href="https://rixx.de/blog/sff-perspectives/"&gt;a while&lt;/a&gt; since I posted a huge book lists. I try to contain all my
book posting impulses over at &lt;a href="https://books.rixx.de/reviews"&gt;books.rixx.de&lt;/a&gt; these days, after all. (Which also has an
RSS feed, for those of you following this blog and concerned about the silence). However, I took a dangerous step this
year and became part of a Sci-Fi book club – a very ill-advised move, as we all fuel each other's addiction. Thankfully,
my addiction was already well-fuelled, so it's not like the book club is doing anything but slightly accellerate my
descent into madness. It's fine, &lt;em&gt;it's fine&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;Apart from the occasional &lt;del&gt;nearly violent&lt;/del&gt; civil debate about the boundaries of Sci-Fi and Fantasy, we're a peaceful
lot, I thought. That is, until one of us prompted the group to name our top three Sci-Fi books. Three!, dear reader, not
three hundred, or at least thirty! And while grieviously wounded – and coping by posting increasingly long lists of
Sci-Fi books, to reassure each other that, yes, we weren't about to run out of books, M. said:&lt;/p&gt;
&lt;blockquote&gt;

Your task, should you choose to accept it, is to craft a list of 41 Fantasy books, each of which must not only be
essential reading but also be the soulmate of a &lt;a href="https://en.wikipedia.org/wiki/Discworld"&gt;Discworld novel&lt;/a&gt;
(only one book per DW-novel - if we start accepting poligamy into our Fantasy reading list there’s no saying where we’ll
end up). Go!

&lt;/blockquote&gt;

&lt;p&gt;And here we are.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/top-41-must-read-fantasy-books/"&gt;Read more…&lt;/a&gt; (8 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/top-41-must-read-fantasy-books/</guid><pubDate>Fri, 04 Aug 2023 08:00:00 GMT</pubDate></item><item><title>2022 in review</title><link>https://rixx.de/blog/2022-in-review/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;A year, gone, and for what? Let's see. Wrote some code, read some books, made some friends, and occasionally even had a
life. A year in review:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/2022-in-review/"&gt;Read more…&lt;/a&gt; (5 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/2022-in-review/</guid><pubDate>Sat, 31 Dec 2022 09:00:00 GMT</pubDate></item><item><title>How Django's @page_cache works</title><link>https://rixx.de/blog/how-django-s-page-cache-works/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;Hi, Future Me! It seems that you've forgotten once again how Django's &lt;code&gt;@page_cache&lt;/code&gt; decorator function works. But this
time, I'm here to tell you what you (or rather, I) worked out in the past. So here it is: &lt;code&gt;@page_cache&lt;/code&gt; from the ground
up.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/how-django-s-page-cache-works/"&gt;Read more…&lt;/a&gt; (4 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/how-django-s-page-cache-works/</guid><pubDate>Fri, 21 Jan 2022 23:00:00 GMT</pubDate></item><item><title>On Running a Mastodon Instance</title><link>https://rixx.de/blog/on-running-a-mastodon-instance/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;Together with &lt;a href="https://chaos.social/@leah"&gt;a friend&lt;/a&gt;, I’m running the Mastodon/Fediverse instance
&lt;a href="https://chaos.social/about/more"&gt;chaos.social&lt;/a&gt;. We’ve been at it for &lt;a href="https://chaos.social/@rixx/2"&gt;nearly five years&lt;/a&gt;
now, and I feel like it’s time to reflect on the &lt;a href="https://rixx.de/blog/on-running-a-mastodon-instance/#the-good"&gt;good&lt;/a&gt;, the &lt;a href="https://rixx.de/blog/on-running-a-mastodon-instance/#the-bad"&gt;bad&lt;/a&gt;, the &lt;a href="https://rixx.de/blog/on-running-a-mastodon-instance/#the-ugly"&gt;ugly&lt;/a&gt;. Please
note that you'll be reading an edited version of this post with most of the cursing removed, so please be understanding
of the bits that I kept – they are load-bearing.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/on-running-a-mastodon-instance/"&gt;Read more…&lt;/a&gt; (15 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/on-running-a-mastodon-instance/</guid><pubDate>Tue, 21 Dec 2021 15:00:00 GMT</pubDate></item><item><title>while history: continue</title><link>https://rixx.de/blog/while-history-continue/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="header-image  small  post-image"&gt;
    &lt;img src="https://rixx.de/img/while-history-continue/title.png" title=""&gt;
    &lt;div class="post-image-caption"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is an edited transcript of the keynote I delivered at PyCon UK in 2019. I'm still grateful to the organisers, and I
still treasure my memories of visiting Cardiff for the first time that year. I've edited the transcript only to make it
readable, fixing sentences and removing filler words – but the content and structure remains unchanged. I also left in
audience reactions, for flair (and because I'm a bit proud to have made people laugh). See the end notes for corrections
and other remarks – you can also see the full slides including speaker notes
&lt;a href="https://rixx.de/presentations/while-history-continue/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/while-history-continue/"&gt;Read more…&lt;/a&gt; (36 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>python</category><category>transcript</category><guid>https://rixx.de/blog/while-history-continue/</guid><pubDate>Wed, 27 Oct 2021 08:00:00 GMT</pubDate></item><item><title>December 13: Python Concurrent Execution Modules</title><link>https://rixx.de/blog/december-13-python-concurrent-execution-modules/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;Now we get to talk about a completely trivial topic, barely worth mentioning: Concurrent execution, including
&lt;code&gt;threading&lt;/code&gt;, &lt;code&gt;multiprocessing&lt;/code&gt;, &lt;code&gt;concurrent&lt;/code&gt;, &lt;code&gt;subprocess&lt;/code&gt;, &lt;code&gt;sched&lt;/code&gt; and &lt;code&gt;queue&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, you might say, "wait a second, it is not December 13th!", and … you would be right. Life got in the way and I had
to spend a week figuring some things out, and pushing out a blog post about concurrency in Python did not quite fit in
with that. Now all the things are figured out, and I'm continuing the &lt;a href="https://rixx.de/blog/0-introduction"&gt;Traversal of the Python Standard Library
Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="highlights"&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Oh god Popen has so many arguments.&lt;/li&gt;
&lt;li&gt;Python ships a "general purpose event scheduler"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/december-13-python-concurrent-execution-modules/"&gt;Read more…&lt;/a&gt; (8 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/december-13-python-concurrent-execution-modules/</guid><pubDate>Sat, 19 Dec 2020 07:00:00 GMT</pubDate></item><item><title>December 12: Context Variables</title><link>https://rixx.de/blog/december-12-context-variables/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;As part of the &lt;a href="https://rixx.de/blog/0-introduction"&gt;Python Standard Library documentation traversal&lt;/a&gt;, we're following up on
yesterday's exhausting post about &lt;a href="https://rixx.de/blog/december-11-python-operating-system-services/"&gt;Operating System Services&lt;/a&gt; with
probably the shortest chapter yet: the &lt;code&gt;contextvars&lt;/code&gt; module. It's not cheating, it really is listed as its own
high-level documentation section!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/december-12-context-variables/"&gt;Read more…&lt;/a&gt; (2 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/december-12-context-variables/</guid><pubDate>Sat, 12 Dec 2020 07:00:00 GMT</pubDate></item><item><title>December 11: Python Operating System Services</title><link>https://rixx.de/blog/december-11-python-operating-system-services/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;After some restful days, today's &lt;a href="https://rixx.de/blog/0-introduction"&gt;Python Standard Library Traversal&lt;/a&gt; follows up yesterday's
&lt;a href="https://rixx.de/blog/december-10-python-cryptographic-service-modules/"&gt;Cryptographic Service Modules&lt;/a&gt; with all the generic OS
interaction modules. That is &lt;code&gt;os&lt;/code&gt; (but not &lt;code&gt;os.path&lt;/code&gt;, we did that &lt;a href="https://rixx.de/blog/december-6-python-file-and-directory-access/"&gt;a week
ago&lt;/a&gt;), &lt;code&gt;io&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;argparse&lt;/code&gt;, &lt;code&gt;getopt&lt;/code&gt;, &lt;code&gt;logging&lt;/code&gt; and its
submodules, &lt;code&gt;getpass&lt;/code&gt;, &lt;code&gt;curses&lt;/code&gt; and submodules, &lt;code&gt;platform&lt;/code&gt;, &lt;code&gt;errno&lt;/code&gt; and &lt;code&gt;ctypes&lt;/code&gt;. Strap in!&lt;/p&gt;
&lt;h3 id="highlights"&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On Windows, &lt;code&gt;os.startfile()&lt;/code&gt; acts like double-clicking the file.&lt;/li&gt;
&lt;li&gt;There are way too many ways to start new processes in Python.&lt;/li&gt;
&lt;li&gt;"&lt;em&gt;seconds since epoch&lt;/em&gt;" usually excludes leap seconds.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;argparse&lt;/code&gt; is honestly not as bad as I remembered it. Stockholm syndrome?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logger.getChild()&lt;/code&gt; is like calling &lt;code&gt;getLogger()&lt;/code&gt; on the full target name, very useful when you use stand-in values
  like &lt;code&gt;__name__&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logger.handlers.TimedRotatingFileHandler&lt;/code&gt; and &lt;code&gt;logger.handlers.RotatingFileHandler&lt;/code&gt; handle log file rotation, nice!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logger.handlers.HTTPHandler&lt;/code&gt; defaults to &lt;code&gt;secure=False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You can change the default &lt;code&gt;%&lt;/code&gt;-style string formatting in logging formatters to &lt;code&gt;str.format()&lt;/code&gt; or &lt;code&gt;string.Template&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You can query the platform you are running on with the &lt;code&gt;platform&lt;/code&gt; module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/december-11-python-operating-system-services/"&gt;Read more…&lt;/a&gt; (12 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/december-11-python-operating-system-services/</guid><pubDate>Fri, 11 Dec 2020 07:00:00 GMT</pubDate></item><item><title>December 10: Python Cryptographic Service Modules</title><link>https://rixx.de/blog/december-10-python-cryptographic-service-modules/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;Shhh! 🤫 As part of the &lt;a href="https://rixx.de/blog/0-introduction/"&gt;Python Standard Library traversal&lt;/a&gt;, after &lt;a href="https://rixx.de/blog/december-9-python-file-format-modules/"&gt;yesterday's
look at file format modules&lt;/a&gt;, today is going to be all about secrets.
Well, all about &lt;code&gt;secrets&lt;/code&gt; and &lt;code&gt;hmac&lt;/code&gt; and &lt;code&gt;hashlib&lt;/code&gt;, to be precise.&lt;/p&gt;
&lt;h3 id="highlights"&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;There's an awful lot of hash algorithms in &lt;code&gt;hashlib&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;secrets&lt;/code&gt; module exists and is suitable for (reasonably) strong randomness, eg for generating long secret URLs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/december-10-python-cryptographic-service-modules/"&gt;Read more…&lt;/a&gt; (1 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/december-10-python-cryptographic-service-modules/</guid><pubDate>Thu, 10 Dec 2020 07:00:00 GMT</pubDate></item><item><title>December 9: Python File Format Modules</title><link>https://rixx.de/blog/december-9-python-file-format-modules/</link><dc:creator>rixx</dc:creator><description>&lt;div&gt;&lt;p&gt;Combining the commonplace and the weirdly specific: As part of the &lt;a href="https://rixx.de/blog/first-sunday-of-advent-built-in-functions/"&gt;Python Standard Library
traversal&lt;/a&gt;, after &lt;a href="https://rixx.de/blog/december-8-python-data-compression-and-archiving-modules"&gt;yesterday's short post about data
compression and archiving modules&lt;/a&gt;, today we're going to
look at Python file format modules. Those include &lt;code&gt;csv&lt;/code&gt;, &lt;code&gt;configparser&lt;/code&gt;, &lt;code&gt;netrc&lt;/code&gt;, &lt;code&gt;xdrlib&lt;/code&gt; and the forgettable
&lt;code&gt;plistlib&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="highlights"&gt;Highlights&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Writing your own &lt;code&gt;csv&lt;/code&gt; dialect is extremely easy. I wonder how cursed you can make it.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configparser&lt;/code&gt; has an extended interpolation mode that allows you to refer to values from other sections like
  &lt;code&gt;%{OtherSection:other_value}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can configure lots of things about &lt;code&gt;configparser&lt;/code&gt;, like the delimiters, comment prefix, strict mode, enable
  multiline strings with empty lines, permit empty/flag values, …&lt;/li&gt;
&lt;li&gt;Why on earth is &lt;code&gt;csv&lt;/code&gt; in a different documentation block from &lt;code&gt;json&lt;/code&gt; and &lt;code&gt;xml&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;I learnt that the &lt;code&gt;netrc&lt;/code&gt; FTP configuration format exists, and requires its own stdlib support module.&lt;/li&gt;
&lt;li&gt;I learnt that &lt;code&gt;xdr&lt;/code&gt; file format exists, and at least the Python interface sounds pretty annoying.&lt;/li&gt;
&lt;li&gt;I learnt that &lt;code&gt;plist&lt;/code&gt; Apple format exists, and it sounds not that bad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://rixx.de/blog/december-9-python-file-format-modules/"&gt;Read more…&lt;/a&gt; (3 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><guid>https://rixx.de/blog/december-9-python-file-format-modules/</guid><pubDate>Wed, 09 Dec 2020 07:00:00 GMT</pubDate></item></channel></rss>