<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: linux</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/linux.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2026-09-10T23:44:15+00:00</updated><author><name>Simon Willison</name></author><entry><title>Any Nix package, live in your browser</title><link href="https://simonwillison.net/2026/Sep/10/trynix/" rel="alternate"/><published>2026-09-10T23:44:15+00:00</published><updated>2026-09-10T23:44:15+00:00</updated><id>https://simonwillison.net/2026/Sep/10/trynix/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fzakaria.com/2026/09/04/any-nix-package-live-in-your-browser"&gt;Any Nix package, live in your browser&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Farid Zakaria calls this his "&lt;em&gt;magnum opus&lt;/em&gt; of Nix work", and I can see why.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://trynix.dev"&gt;trynix.dev&lt;/a&gt; provides a &lt;a href="https://github.com/ktock/qemu-wasm"&gt;qemu-wasm&lt;/a&gt; powered x86_64 Linux virtual machine running entirely in your browser through WebAssembly. That VM can then be booted with &lt;em&gt;any Nix package&lt;/em&gt; from the past 13 years. They are URL addressable, so you can navigate to this page:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://trynix.dev/?pkg=python3%403.6.2"&gt;https://trynix.dev/?pkg=python3%403.6.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then click "Load" and get an interactive shell against a virtual machine running Python 3.6.2 from 2017.&lt;/p&gt;
&lt;p&gt;Farid is building all sorts of neat things on top of this. One recent example: &lt;a href="https://fzakaria.com/2026/09/09/review-a-pull-request-by-booting-it"&gt;Review a pull request by booting it&lt;/a&gt; introduces &lt;a href="https://github.com/marketplace/actions/trynix-preview"&gt;trynix-preview&lt;/a&gt;, described like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub action that comments a link on a pull request which lets you boot the PR’s build in the browser using &lt;a href="https://trynix.dev/"&gt;https://trynix.dev&lt;/a&gt;. No servers, just browsers.&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://lobste.rs/s/7lii0g/review_pull_request_by_booting_it"&gt;Lobste.rs&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/code-review"&gt;code-review&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webassembly"&gt;webassembly&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github-actions"&gt;github-actions&lt;/a&gt;&lt;/p&gt;



</summary><category term="code-review"/><category term="linux"/><category term="webassembly"/><category term="github-actions"/></entry><entry><title>Creepy crawlies</title><link href="https://simonwillison.net/2026/Sep/7/creepy-crawlies/" rel="alternate"/><published>2026-09-07T23:08:58+00:00</published><updated>2026-09-07T23:08:58+00:00</updated><id>https://simonwillison.net/2026/Sep/7/creepy-crawlies/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://people.kernel.org/monsieuricon/creepy-crawlies"&gt;Creepy crawlies&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Konstantin Ryabitsev discusses how bad the "background radiation" of abusive crawlers has become from the perspective of &lt;a href="https://git.kernel.org/"&gt;git.kernel.org&lt;/a&gt;, the official Git repository for the Linux kernel:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR: we spend more CPU cycles rendering commits for scrapers than we spend on all other kinds of legitimate access, including git clones. At any one time, across 5 geo-distributed nodes, there are 14 CPU cores doing nothing but rendering git commits as html.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I worry about this a lot from the perspective of Datasette, which serves a huge number of crawlable web pages.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49491791"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/crawling"&gt;crawling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/git"&gt;git&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;&lt;/p&gt;



</summary><category term="crawling"/><category term="git"/><category term="linux"/><category term="datasette"/><category term="ai-ethics"/></entry><entry><title>Quoting Rick Brewster</title><link href="https://simonwillison.net/2026/Sep/2/rick-brewster/" rel="alternate"/><published>2026-09-02T05:50:57+00:00</published><updated>2026-09-02T05:50:57+00:00</updated><id>https://simonwillison.net/2026/Sep/2/rick-brewster/</id><summary type="html">
    &lt;blockquote cite="https://forums.paint.net/topic/134563-🍷-extremely-experimental-winelinux-support-how-to-get-started/"&gt;&lt;p&gt;Direct2D has always been the biggest hurdle for Paint.NET on WINE, and it's clear that it will never be completed enough for Paint.NET's use. And I can't just "disable" the use of Direct2D. So, instead, &lt;strong&gt;Paint.NET now has an internal, from-scratch, clean-room reverse-engineered rewrite of Direct2D that it uses on WINE&lt;/strong&gt; (triggered by using &lt;strong&gt;/wine&lt;/strong&gt;). It lives in &lt;strong&gt;PaintDotNet.Windows.Direct2D1.Managed.dll&lt;/strong&gt;. This was written by our good friend &lt;a href="https://claude.ai/"&gt;Claude&lt;/a&gt;, without whom this would NOT have been possible and would NEVER have happened. [...]&lt;/p&gt;
&lt;p&gt;Most of this code is, as they say, "vibe coded." By that I mean that it has not been thoroughly reviewed, it's more "trust me bro" style. I cannot possibly review 180,000 lines of code, it's just way way &lt;em&gt;way&lt;/em&gt; too much. For reference, the rest of Paint.NET is about 700,000 lines of code and I've been working on it for over 20 years. [...]&lt;/p&gt;
&lt;p&gt;At times, Claude was working with the fury of 10 freshly unshackled Einstein genius-level 10x coders. And other times ... well, not so much. I had to babysit Claude quite a bit to make sure it did resource management correctly (for awhile it just wasn't doing the COM equivalent of AddRef() for reference counted objects, oops). I had to slap it a few times when I found some really bad design or architecture decisions. And I was also impressed at some rather clever and tireless reverse engineering work it did to figure out all the formulas needed for implementing Direct2D's built-in effects library.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://forums.paint.net/topic/134563-🍷-extremely-experimental-winelinux-support-how-to-get-started/"&gt;Rick Brewster&lt;/a&gt;, author of Paint.NET&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dotnet"&gt;dotnet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/reverse-engineering"&gt;reverse-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vibe-coding"&gt;vibe-coding&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/coding-agents"&gt;coding-agents&lt;/a&gt;&lt;/p&gt;



</summary><category term="dotnet"/><category term="linux"/><category term="reverse-engineering"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="claude"/><category term="vibe-coding"/><category term="coding-agents"/></entry><entry><title>Your executable is a SQLite database</title><link href="https://simonwillison.net/2026/Aug/24/your-executable-is-a-sqlite-database/" rel="alternate"/><published>2026-08-24T11:38:15+00:00</published><updated>2026-08-24T11:38:15+00:00</updated><id>https://simonwillison.net/2026/Aug/24/your-executable-is-a-sqlite-database/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fzakaria.com/2026/08/23/your-executable-is-a-sqlite-database"&gt;Your executable is a SQLite database&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Farid Zakaria describes a neat Linux pattern for creating a SQLite database file that can be directly used as an executable binary.&lt;/p&gt;
&lt;p&gt;The trick sets the SQLite file format's 4-byte application ID (68 bytes into the file) to SELF, standing for Structured Executable &amp;amp; Linkable Format.  The various components of the ELF executable format are then arranged into a number of different SQLite tables, using &lt;a href="https://github.com/fzakaria/selfdb/blob/main/schema/self.sql"&gt;this schema&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Their &lt;code&gt;self-exec&lt;/code&gt; interpreter (&lt;a href="https://github.com/fzakaria/selfdb/blob/main/loader/self-exec.c"&gt;C code here&lt;/a&gt;) can then extract and execute the necessary pieces.&lt;/p&gt;
&lt;p&gt;You can additionally use a Linux mechanism called &lt;a href="https://docs.kernel.org/admin-guide/binfmt-misc.html"&gt;binfmt_misc&lt;/a&gt; to teach the kernel to execute that any time it encounters an executable matching that binary pattern. Farid uses NixOS here, but without NixOS I think registration looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;printf '%s\n' ':self:M:68:SELF::/usr/local/bin/self-exec:' \
  &amp;gt; /proc/sys/fs/binfmt_misc/register
&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=49415271"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/c"&gt;c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sqlite"&gt;sqlite&lt;/a&gt;&lt;/p&gt;



</summary><category term="c"/><category term="linux"/><category term="sqlite"/></entry><entry><title>Quoting Linus Torvalds</title><link href="https://simonwillison.net/2026/Aug/22/linus-torvalds/" rel="alternate"/><published>2026-08-22T21:04:26+00:00</published><updated>2026-08-22T21:04:26+00:00</updated><id>https://simonwillison.net/2026/Aug/22/linus-torvalds/</id><summary type="html">
    &lt;blockquote cite="https://github.com/torvalds/linux/commit/818bebeb63dd6bf5f4e07e145f6cdbace520a34c"&gt;&lt;p&gt;And this was a debug session from hell, enormously helped by an AI doing much of the grunt-work.&lt;/p&gt;
&lt;p&gt;I'd like to call it my tireless helper, but the AI several times stated flat out that this was impossible and unsolvable and that we should just write a report about it.&lt;/p&gt;
&lt;p&gt;I suspect those things have been trained by people who may not be quite as stubborn as I am.&lt;/p&gt;
&lt;p&gt;But while the AI was ready to give up several times, it did keep adding debug code and analyzing it faithfully when I pushed. So credit where credit is due and I let the AI write the commit message above.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://github.com/torvalds/linux/commit/818bebeb63dd6bf5f4e07e145f6cdbace520a34c"&gt;Linus Torvalds&lt;/a&gt;, drm/xe: Don't hand out the flat CCS storage as usable VRAM&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linus-torvalds"&gt;linus-torvalds&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;&lt;/p&gt;



</summary><category term="linus-torvalds"/><category term="linux"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/></entry><entry><title>Quoting Linus Torvalds</title><link href="https://simonwillison.net/2026/Jul/16/linus-torvalds/" rel="alternate"/><published>2026-07-16T13:26:10+00:00</published><updated>2026-07-16T13:26:10+00:00</updated><id>https://simonwillison.net/2026/Jul/16/linus-torvalds/</id><summary type="html">
    &lt;blockquote cite="https://lore.kernel.org/linux-media/CAHk-=wi4zC+Ze8e+p3tMv8TtG_80KzsZ1syL9anBtmEh5Z40vg@mail.gmail.com/"&gt;&lt;p&gt;I realize that some people really dislike AI, but this is an area where I'm willing to absolutely put my foot down as the top-level maintainer.&lt;/p&gt;
&lt;p&gt;Linux is not one of those anti-AI projects, and if somebody has issues with that, they can do the open-source thing and fork it.&lt;/p&gt;
&lt;p&gt;Or just walk away.&lt;/p&gt;
&lt;p&gt;AI is a tool, just like other tools we use.  And it's clearly a useful one.&lt;/p&gt;
&lt;p&gt;It may not have been that "clearly" even just a year ago, but it's no longer in question today.&lt;/p&gt;
&lt;p&gt;There are other questions around AI (like what the economy of it will actually look like in the end), but "is it useful" is no longer one of those questions. Anybody who doubts that clearly hasn't actually used it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://lore.kernel.org/linux-media/CAHk-=wi4zC+Ze8e+p3tMv8TtG_80KzsZ1syL9anBtmEh5Z40vg@mail.gmail.com/"&gt;Linus Torvalds&lt;/a&gt;, Linux Media Mailing List&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linus-torvalds"&gt;linus-torvalds&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;&lt;/p&gt;



</summary><category term="linus-torvalds"/><category term="linux"/><category term="open-source"/><category term="ai"/><category term="generative-ai"/><category term="llms"/></entry><entry><title>Quoting Willy Tarreau</title><link href="https://simonwillison.net/2026/Apr/3/willy-tarreau/" rel="alternate"/><published>2026-04-03T21:48:22+00:00</published><updated>2026-04-03T21:48:22+00:00</updated><id>https://simonwillison.net/2026/Apr/3/willy-tarreau/</id><summary type="html">
    &lt;blockquote cite="https://lwn.net/Articles/1065620/"&gt;&lt;p&gt;On the kernel security list we've seen a huge bump of reports. We were between 2 and 3 per week maybe two years ago, then reached probably 10 a week over the last year with the only difference being only AI slop, and now since the beginning of the year we're around 5-10 per day depending on the days (fridays and tuesdays seem the worst). Now most of these reports are correct, to the point that we had to bring in more maintainers to help us.&lt;/p&gt;
&lt;p&gt;And we're now seeing on a daily basis something that never happened before: duplicate reports, or the same bug found by two different people using (possibly slightly) different tools.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://lwn.net/Articles/1065620/"&gt;Willy Tarreau&lt;/a&gt;, Lead Software Developer. HAPROXY&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-security-research"&gt;ai-security-research&lt;/a&gt;&lt;/p&gt;



</summary><category term="linux"/><category term="security"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-security-research"/></entry><entry><title>Quoting Greg Kroah-Hartman</title><link href="https://simonwillison.net/2026/Apr/3/greg-kroah-hartman/" rel="alternate"/><published>2026-04-03T21:44:41+00:00</published><updated>2026-04-03T21:44:41+00:00</updated><id>https://simonwillison.net/2026/Apr/3/greg-kroah-hartman/</id><summary type="html">
    &lt;blockquote cite="https://www.theregister.com/2026/03/26/greg_kroahhartman_ai_kernel/"&gt;&lt;p&gt;Months ago, we were getting what we called 'AI slop,' AI-generated security reports that were obviously wrong or low quality. It was kind of funny. It didn't really worry us.&lt;/p&gt;
&lt;p&gt;Something happened a month ago, and the world switched. Now we have real reports. All open source projects have real reports that are made with AI, but they're good, and they're real.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://www.theregister.com/2026/03/26/greg_kroahhartman_ai_kernel/"&gt;Greg Kroah-Hartman&lt;/a&gt;, Linux kernel maintainer (&lt;a href="https://en.wikipedia.org/wiki/Greg_Kroah-Hartman"&gt;bio&lt;/a&gt;), in conversation with Steven J. Vaughan-Nichols&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-security-research"&gt;ai-security-research&lt;/a&gt;&lt;/p&gt;



</summary><category term="linux"/><category term="security"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-security-research"/></entry><entry><title>Quoting Julian Andres Klode</title><link href="https://simonwillison.net/2025/Nov/1/debian/" rel="alternate"/><published>2025-11-01T17:34:34+00:00</published><updated>2025-11-01T17:34:34+00:00</updated><id>https://simonwillison.net/2025/Nov/1/debian/</id><summary type="html">
    &lt;blockquote cite="https://lists.debian.org/debian-devel/2025/10/msg00285.html"&gt;&lt;p&gt;I plan to introduce hard Rust dependencies and Rust code into
APT, no earlier than May 2026. This extends at first to the
Rust compiler and standard library, and the Sequoia ecosystem.&lt;/p&gt;
&lt;p&gt;In particular, our code to parse .deb, .ar, .tar, and the
HTTP signature verification code would strongly benefit
from memory safe languages and a stronger approach to
unit testing.&lt;/p&gt;
&lt;p&gt;If you maintain a port without a working Rust toolchain,
please ensure it has one within the next 6 months, or
sunset the port.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://lists.debian.org/debian-devel/2025/10/msg00285.html"&gt;Julian Andres Klode&lt;/a&gt;, debian-devel mailing list&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/debian"&gt;debian&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rust"&gt;rust&lt;/a&gt;&lt;/p&gt;



</summary><category term="debian"/><category term="linux"/><category term="open-source"/><category term="rust"/></entry><entry><title>No More Blue Fridays</title><link href="https://simonwillison.net/2024/Jul/22/no-more-blue-fridays/" rel="alternate"/><published>2024-07-22T18:33:00+00:00</published><updated>2024-07-22T18:33:00+00:00</updated><id>https://simonwillison.net/2024/Jul/22/no-more-blue-fridays/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.brendangregg.com/blog/2024-07-22/no-more-blue-fridays.html"&gt;No More Blue Fridays&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Brendan Gregg: "In the future, computers will not crash due to bad software updates, even those updates that involve kernel code. In the future, these updates will push eBPF code."&lt;/p&gt;
&lt;p&gt;New-to-me things I picked up from this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;eBPF - a technology I had thought was unique to the a Linux kernel - is coming Windows!&lt;/li&gt;
&lt;li&gt;A useful mental model to have for eBPF is that it provides a WebAssembly-style sandbox for kernel code.&lt;/li&gt;
&lt;li&gt;eBPF doesn't stand for "extended Berkeley Packet Filter" any more - that name greatly understates its capabilities and has been retired. More on that &lt;a href="https://ebpf.io/what-is-ebpf/#what-do-ebpf-and-bpf-stand-for"&gt;in the eBPF FAQ&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;From &lt;a href="https://news.ycombinator.com/item?id=41034079"&gt;this Hacker News thread&lt;/a&gt; eBPF programs can be analyzed before running despite the halting problem because eBPF only allows verifiably-halting programs to run.&lt;/li&gt;
&lt;/ol&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=41033579"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/windows"&gt;windows&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webassembly"&gt;webassembly&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/brendan-gregg"&gt;brendan-gregg&lt;/a&gt;&lt;/p&gt;



</summary><category term="linux"/><category term="security"/><category term="windows"/><category term="webassembly"/><category term="brendan-gregg"/></entry><entry><title>Hello World</title><link href="https://simonwillison.net/2024/Apr/9/hello-world/" rel="alternate"/><published>2024-04-09T01:06:46+00:00</published><updated>2024-04-09T01:06:46+00:00</updated><id>https://simonwillison.net/2024/Apr/9/hello-world/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://thecoder08.github.io/hello-world.html"&gt;Hello World&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Lennon McLean dives deep down the rabbit hole of what happens when you execute the binary compiled from “Hello world” in C on a Linux system, digging into the details of ELF executables, objdump disassembly, the C standard library, stack frames, null-terminated strings and taking a detour through musl because it’s easier to read than Glibc.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=39967709"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/c"&gt;c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;&lt;/p&gt;



</summary><category term="c"/><category term="linux"/></entry><entry><title>iSH: The Linux shell for iOS</title><link href="https://simonwillison.net/2023/Dec/31/ish/" rel="alternate"/><published>2023-12-31T04:20:00+00:00</published><updated>2023-12-31T04:20:00+00:00</updated><id>https://simonwillison.net/2023/Dec/31/ish/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://ish.app/"&gt;iSH: The Linux shell for iOS&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Installing this iOS app gives you a full Linux shell environment running on your phone, using a “usermode x86 emulator”. You can even install packages: “apk add python3” gave me a working Python 3.9 interpreter, installed from the apk.ish.app repository.&lt;/p&gt;

&lt;p&gt;I didn’t think this kind of thing was allowed by the App Store, but that’s not been the case for a few years now: Section 4.5.2 of the App Store guidelines clarifies that “Educational apps designed to teach, develop, or allow students to test executable code may, in limited circumstances, download code provided that such code is not used for other purposes.”

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=38816029#38816414"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/appstore"&gt;appstore&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/emulator"&gt;emulator&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ios"&gt;ios&lt;/a&gt;&lt;/p&gt;



</summary><category term="appstore"/><category term="emulator"/><category term="linux"/><category term="python"/><category term="ios"/></entry><entry><title>Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs</title><link href="https://simonwillison.net/2023/Sep/8/dynamic-linker-tricks/" rel="alternate"/><published>2023-09-08T22:05:10+00:00</published><updated>2023-09-08T22:05:10+00:00</updated><id>https://simonwillison.net/2023/Sep/8/dynamic-linker-tricks/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/"&gt;Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This tutorial by Rafał Cieślak from 2013 filled in a bunch of gaps in my knowledge about how C works on Linux.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=37439125"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/c"&gt;c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;&lt;/p&gt;



</summary><category term="c"/><category term="linux"/></entry><entry><title>Lima VM - Linux Virtual Machines On macOS</title><link href="https://simonwillison.net/2023/Jul/10/lima/" rel="alternate"/><published>2023-07-10T19:01:21+00:00</published><updated>2023-07-10T19:01:21+00:00</updated><id>https://simonwillison.net/2023/Jul/10/lima/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://earthly.dev/blog/lima/"&gt;Lima VM - Linux Virtual Machines On macOS&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This looks really useful: “brew install lima” to install, then “limactl start default” to start an Ubuntu VM running and “lima” to get a shell. Julia Evans wrote about the tool this morning, and here Adam Gordon Bell includes details on adding a writable directory (by default lima mounts your macOS home directory in read-only mode).

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://jvns.ca/blog/2023/07/10/lima--a-nice-way-to-run-linux-vms-on-mac/"&gt;Lima: a nice way to run Linux VMs on Mac&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/virtualization"&gt;virtualization&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/julia-evans"&gt;julia-evans&lt;/a&gt;&lt;/p&gt;



</summary><category term="linux"/><category term="macos"/><category term="virtualization"/><category term="julia-evans"/></entry><entry><title>Weeknotes: Getting my personal Dogsheep up and running again</title><link href="https://simonwillison.net/2021/Aug/22/weeknotes-dogsheep/" rel="alternate"/><published>2021-08-22T04:46:13+00:00</published><updated>2021-08-22T04:46:13+00:00</updated><id>https://simonwillison.net/2021/Aug/22/weeknotes-dogsheep/</id><summary type="html">
    &lt;p&gt;I gave a talk about &lt;a href="https://dogsheep.github.io/"&gt;Dogsheep&lt;/a&gt; at Noisebridge's &lt;a href="https://www.noisebridge.net/wiki/Five_Minutes_of_Fame_2021_08_19"&gt;Five Minutes of Fame&lt;/a&gt; on Thursday. Just one problem: my regular Dogsheep demo was broken, so I ended up building it from scratch again. In doing so I fixed a few bugs in some Dogsheep tools.&lt;/p&gt;
&lt;h4&gt;Dogsheep on a Digital Ocean droplet&lt;/h4&gt;
&lt;p&gt;The latest iteration of my personal Dogsheep runs on a $20/month 4GB/2CPU &lt;a href="https://www.digitalocean.com/"&gt;Digital Ocean&lt;/a&gt; Droplet running Ubuntu 20.04 LTS.&lt;/p&gt;
&lt;p&gt;It runs a private Datasette instance and a bunch of cron jobs to fetch data from Twitter, GitHub, Foursquare Swarm, Pocket and Hacker News.&lt;/p&gt;
&lt;p&gt;It also has copies of my Apple Photos and Apple HealthKit data which I upload manually - plus a &lt;a href="https://simonwillison.net/2019/Sep/20/weeknotes-design-thinking-genome-sqlite/#genome-to-sqlite"&gt;copy of my genome&lt;/a&gt; for good measure.&lt;/p&gt;
&lt;p&gt;Some abbreviated notes on how I set it up, copied from a private GitHub Issues thread:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new Ubuntu droplet, and configure its IP address as the A record for &lt;code&gt;dogsheep.simonwillison.net&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Python 3 and NGINX and SQLite: &lt;code&gt;apt-get install python3 python3-venv nginx sqlite -y&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;a href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt; to get an HTTPS certificate for it: &lt;code&gt;apt-get update&lt;/code&gt; and then
&lt;code&gt;apt install certbot python3-certbot-nginx -y&lt;/code&gt;, then &lt;code&gt;certbot --nginx -d dogsheep.simonwillison.net&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had to remove the &lt;code&gt;ipv6only=on;&lt;/code&gt; bit from the NGINX configuration due to &lt;a href="https://github.com/certbot/certbot/issues/5550#issuecomment-367971137"&gt;this bug&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created a &lt;code&gt;dogsheep&lt;/code&gt; user, &lt;code&gt;useradd -s /bin/bash -d /home/dogsheep/ -m -G&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As that user, created a virtual environment: &lt;code&gt;python3 -mvenv datasette-venv&lt;/code&gt; and then &lt;code&gt;datasette-venv/bin/pip install wheel&lt;/code&gt; and &lt;code&gt;datasette-venv/bin/pip install datasette datasette-auth-passwords&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created a &lt;code&gt;/etc/systemd/system/datasette.service&lt;/code&gt; file with &lt;a href="https://gist.github.com/simonw/0653b6177c6f12caa16530da4c56646f"&gt;this contents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created a set of blank SQLite database files &lt;a href="https://til.simonwillison.net/sqlite/enabling-wal-mode"&gt;in WAL mode&lt;/a&gt; in &lt;code&gt;/home/dogsheep&lt;/code&gt; using the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for f in beta.db twitter.db healthkit.db github.db \
  swarm.db photos.db genome.db simonwillisonblog.db \
  pocket.db hacker-news.db memories.db
do
  sqlite3 $f vacuum
  # And enable WAL mode:
  sqlite3 $f 'PRAGMA journal_mode=WAL;'
done
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Started the Datasette service: &lt;code&gt;service datasette start&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configured NGINX to proxy to localhost port 8001, using &lt;a href="https://docs.datasette.io/en/stable/deploying.html#nginx-proxy-configuration"&gt;this configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It's a few more steps than I'd like, but the end result was a &lt;a href="https://datasette.io/plugins/datasette-auth-passwords"&gt;password-protected&lt;/a&gt; Datasette instance running against a bunch of SQLite database files on my new server.&lt;/p&gt;
&lt;p&gt;With Datasette up and running, the next step was to start loading in data.&lt;/p&gt;
&lt;h4&gt;Importing my tweets&lt;/h4&gt;
&lt;p&gt;I started with Twitter. I dropped my Twitter API access credentials into an &lt;code&gt;auth.json&lt;/code&gt; file (as &lt;a href="https://datasette.io/tools/twitter-to-sqlite#user-content-authentication"&gt;described here&lt;/a&gt;) and ran the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;source /home/dogsheep/datasette-venv/bin/activate
pip install twitter-to-sqlite
twitter-to-sqlite user-timeline /home/dogsheep/twitter.db \
  -a /home/dogsheep/auth.json
@simonw [###############################-----] 26299/29684 00:02:06
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That pulled in all 29,684 of my personal tweets.&lt;/p&gt;
&lt;p&gt;(Actually, first it broke with an error, exposing a &lt;a href="https://github.com/dogsheep/twitter-to-sqlite/issues/57"&gt;bug that had already been reported&lt;/a&gt;. I shipped &lt;a href="https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.4"&gt;a fix for that&lt;/a&gt; and tried again and it worked.)&lt;/p&gt;
&lt;p&gt;Favourited tweets were a little harder - I have 39,904 favourited tweets, but the Twitter API only returns the most recent 3,200. I grabbed those more recent ones with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;twitter-to-sqlite favorites /home/dogsheep/twitter.db \
  -a /home/dogsheep/auth.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I requested &lt;a href="https://help.twitter.com/en/managing-your-account/how-to-download-your-twitter-archive"&gt;my Twitter archive&lt;/a&gt;, waited 24 hours and uploaded the resulting &lt;code&gt;like.js&lt;/code&gt; file to the server, then ran:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;twitter-to-sqlite import twitter.db /tmp/like.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gave me an &lt;code&gt;archive_like&lt;/code&gt; table with the data from that file - but it wasn't the full tweet representation, just the subset that Twitter expose in the archive export.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://datasette.io/tools/twitter-to-sqlite#user-content-importing-data-from-your-twitter-archive"&gt;README&lt;/a&gt; shows how to inflate those into full tweets:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;twitter-to-sqlite statuses-lookup twitter.db \
  --sql='select tweetId from archive_like' \
  --skip-existing
Importing 33,382 tweets [------------------------------------] 0% 00:18:28
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once that was done I wrote additional records into the &lt;code&gt;favorited_by&lt;/code&gt; table like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sqlite3 twitter.db '
  INSERT OR IGNORE INTO favorited_by (tweet, user)
  SELECT tweetId, 12497 FROM archive_like
'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(12497 is my Twitter user ID.)&lt;/p&gt;
&lt;p&gt;I also came up with a SQL view that lets me see just media attached to tweets:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sqlite-utils create-view twitter.db media_details "
select
  json_object('img_src', media_url_https, 'width', 400) as img,
  tweets.full_text,
  tweets.created_at,
  tweets.id as tweet_id,
  users.screen_name,
  'https://twitter.com/' || users.screen_name || '/status/' || tweets.id as tweet_url
from
  media
  join media_tweets on media.id = media_tweets.media_id
  join tweets on media_tweets.tweets_id = tweets.id
  join users on tweets.user = users.id
order by
  tweets.id desc
"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now I can visit &lt;code&gt;/twitter/media_details?_where=tweet_id+in+(select+tweet+from+favorited_by+where+user+=+12497)&lt;/code&gt; to see the most recent media tweets that I've favourited!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2021/liked-media-details.jpg" alt="media_details view showing Twitter media I have liked" data-canonical-src="https://static.simonwillison.net/static/2021/liked-media-details.jpg" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;h4&gt;Swarm checkins&lt;/h4&gt;
&lt;p&gt;Swarm checkins were a lot easier. I needed my previously-created Foursquare API token, and &lt;a href="https://datasette.io/tools/swarm-to-sqlite"&gt;swarm-to-sqlite&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install swarm-to-sqlite
swarm-to-sqlite /home/dogsheep/swarm.db --token=...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gave me a full table of my Swarm checkins, which I can visualize using &lt;a href="https://datasette.io/plugins/datasette-cluster-map"&gt;datasette-cluster-map&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2021/dogsheep-swarm-map.jpg" alt="Map of my 2021 Swarm checkins" data-canonical-src="https://static.simonwillison.net/static/2021/dogsheep-swarm-map.jpg" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;h4&gt;Apple HealthKit&lt;/h4&gt;
&lt;p&gt;I don't yet have full automation for my Apple HealthKit data (collected by my Apple Watch) or my Apple Photos - both require me to run scripts on my laptop to create the SQLite database file and then copy the result to the server via &lt;code&gt;scp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://datasette.io/tools/healthkit-to-sqlite"&gt;healthkit-to-sqlite&lt;/a&gt; runs against the &lt;code&gt;export.zip&lt;/code&gt; that is produced by the Apple Health app on the iPhone's export data button - for me that was a 158MB zip file which I AirDropped to my laptop and converted (after &lt;a href="https://github.com/dogsheep/healthkit-to-sqlite/issues/19"&gt;fixing a new bug&lt;/a&gt;) like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;healthkit-to-sqlite ~/Downloads/export.zip healthkit.db
Importing from HealthKit  [-----------------------------]    2%  00:02:25
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I uploaded the resulting 1.5GB &lt;code&gt;healthkit.db&lt;/code&gt; file and now I can do things like visualize my 2017 San Francisco Half Marathon run on a map:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2021/dogsheep-marathon.jpg" alt="A map of the half marathon I ran" data-canonical-src="https://static.simonwillison.net/static/2021/dogsheep-marathon.jpg" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;h4&gt;Apple Photos&lt;/h4&gt;
&lt;p&gt;For my photos I use &lt;a href="https://datasette.io/tools/dogsheep-photos"&gt;dogsheep-photos&lt;/a&gt;, which I described last year in &lt;a href="https://simonwillison.net/2020/May/21/dogsheep-photos/"&gt;Using SQL to find my best photo of a pelican according to Apple Photos&lt;/a&gt;. The short version: I run this script on my laptop:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Upload original photos to my S3 bucket
dogsheep-photos upload photos.db \
  ~/Pictures/Photos\ Library.photoslibrary/originals
dogsheep-photos apple-photos photos.db \
  --image-url-prefix "https://photos.simonwillison.net/i/" \
  --image-url-suffix "?w=600"
scp photos.db dogsheep:/home/dogsheep/photos.db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;photos.db&lt;/code&gt; is only 171MB - it contains the metadata, including the machine learning labels, but not the photos themselves.&lt;/p&gt;
&lt;p&gt;And now I can run queries for things like photos of food I've taken in 2021:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2021/dogsheep-photos-of-food.jpg" alt="Some photos of food" data-canonical-src="https://static.simonwillison.net/static/2021/dogsheep-photos-of-food.jpg" style="max-width:100%;" /&gt;&lt;/p&gt;
&lt;h4&gt;Automation via cron&lt;/h4&gt;
&lt;p&gt;I'm still working through the last step, which involves setting up cron tasks to refresh my data periodically from various sources. My &lt;code&gt;crontab&lt;/code&gt; currently looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Twitter
1,11,21,31,41,51 * * * * /home/dogsheep/datasette-venv/bin/twitter-to-sqlite user-timeline /home/dogsheep/twitter.db -a /home/dogsheep/auth.json --since
4,14,24,34,44,54 * * * * run-one /home/dogsheep/datasette-venv/bin/twitter-to-sqlite mentions-timeline /home/dogsheep/twitter.db -a /home/dogsheep/auth.json --since
11 * * * * run-one /home/dogsheep/datasette-venv/bin/twitter-to-sqlite user-timeline /home/dogsheep/twitter.db cleopaws -a /home/dogsheep/auth.json --since
6,16,26,36,46,56 * * * * run-one /home/dogsheep/datasette-venv/bin/twitter-to-sqlite favorites /home/dogsheep/twitter.db -a /home/dogsheep/auth.json --stop_after=50

# Swarm
25 */2 * * * /home/dogsheep/datasette-venv/bin/swarm-to-sqlite /home/dogsheep/swarm.db --token=... --since=2w

# Hacker News data every six hours
35 0,6,12,18 * * * /home/dogsheep/datasette-venv/bin/hacker-news-to-sqlite user /home/dogsheep/hacker-news.db simonw

# Re-build dogsheep-beta search index once an hour
32 * * * * /home/dogsheep/datasette-venv/bin/dogsheep-beta index /home/dogsheep/beta.db /home/dogsheep/dogsheep-beta.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I'll be expanding this out as I configure more of the &lt;a href="https://dogsheep.github.io/"&gt;Dogsheep tools&lt;/a&gt; for my personal instance.&lt;/p&gt;
&lt;h4&gt;TIL this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/sqlite/build-specific-sqlite-pysqlite-macos"&gt;Building a specific version of SQLite with pysqlite on macOS/Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/sqlite/track-timestamped-changes-to-a-table"&gt;Track timestamped changes to a SQLite table using triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://til.simonwillison.net/observable-plot/histogram-with-tooltips"&gt;Histogram with tooltips in Observable Plot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Releases this week&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/dogsheep/healthkit-to-sqlite"&gt;healthkit-to-sqlite&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/dogsheep/healthkit-to-sqlite/releases/tag/1.0.1"&gt;1.0.1&lt;/a&gt; - (&lt;a href="https://github.com/dogsheep/healthkit-to-sqlite/releases"&gt;9 releases total&lt;/a&gt;) - 2021-08-20
&lt;br /&gt;Convert an Apple Healthkit export zip to a SQLite database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/dogsheep/twitter-to-sqlite"&gt;twitter-to-sqlite&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.4"&gt;0.21.4&lt;/a&gt; - (&lt;a href="https://github.com/dogsheep/twitter-to-sqlite/releases"&gt;27 releases total&lt;/a&gt;) - 2021-08-20
&lt;br /&gt;Save data from Twitter to a SQLite database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-block-robots"&gt;datasette-block-robots&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-block-robots/releases/tag/1.0"&gt;1.0&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette-block-robots/releases"&gt;5 releases total&lt;/a&gt;) - 2021-08-19
&lt;br /&gt;Datasette plugin that blocks robots and crawlers using robots.txt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/sqlite-utils"&gt;sqlite-utils&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/sqlite-utils/releases/tag/3.16"&gt;3.16&lt;/a&gt; - (&lt;a href="https://github.com/simonw/sqlite-utils/releases"&gt;85 releases total&lt;/a&gt;) - 2021-08-18
&lt;br /&gt;Python CLI utility and library for manipulating SQLite databases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/simonw/datasette-debug-asgi"&gt;datasette-debug-asgi&lt;/a&gt;&lt;/strong&gt;: &lt;a href="https://github.com/simonw/datasette-debug-asgi/releases/tag/1.1"&gt;1.1&lt;/a&gt; - (&lt;a href="https://github.com/simonw/datasette-debug-asgi/releases"&gt;3 releases total&lt;/a&gt;) - 2021-08-17
&lt;br /&gt;Datasette plugin for dumping out the ASGI scope&lt;/li&gt;
&lt;/ul&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nginx"&gt;nginx&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dogsheep"&gt;dogsheep&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/weeknotes"&gt;weeknotes&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="linux"/><category term="nginx"/><category term="datasette"/><category term="dogsheep"/><category term="weeknotes"/></entry><entry><title>TLDR pages</title><link href="https://simonwillison.net/2017/Nov/24/tldr-pages/" rel="alternate"/><published>2017-11-24T05:38:04+00:00</published><updated>2017-11-24T05:38:04+00:00</updated><id>https://simonwillison.net/2017/Nov/24/tldr-pages/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://tldr.sh/"&gt;TLDR pages&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This is an absurdly good idea: a community maintained set of alternative man pages for common commands with a focus on usage examples, plus a “tldr netstat” command to see them. The man pages themselves are maintained on GitHub.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/documentation"&gt;documentation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/github"&gt;github&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;&lt;/p&gt;



</summary><category term="documentation"/><category term="github"/><category term="linux"/></entry><entry><title>Docker Containers on the Desktop</title><link href="https://simonwillison.net/2017/Nov/5/jessie-frazelle/" rel="alternate"/><published>2017-11-05T04:16:38+00:00</published><updated>2017-11-05T04:16:38+00:00</updated><id>https://simonwillison.net/2017/Nov/5/jessie-frazelle/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://blog.jessfraz.com/post/docker-containers-on-the-desktop/"&gt;Docker Containers on the Desktop&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jessie Frazelle’s classic explanation from 2015 of how she runs every desktop application on her Linux machine in its own Docker container.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/webology/status/927026639820779520"&gt;Jeff Triplett&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/docker"&gt;docker&lt;/a&gt;&lt;/p&gt;



</summary><category term="linux"/><category term="docker"/></entry><entry><title>What is the difference between Windows and Linux for web hosting, in other words, what are the pros and cons of each, each’s limitations, performance development environment and deployment between Windows and Linux?</title><link href="https://simonwillison.net/2013/Aug/5/what-is-the-difference/" rel="alternate"/><published>2013-08-05T12:24:00+00:00</published><updated>2013-08-05T12:24:00+00:00</updated><id>https://simonwillison.net/2013/Aug/5/what-is-the-difference/</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-is-the-difference-between-Windows-and-Linux-for-web-hosting-in-other-words-what-are-the-pros-and-cons-of-each-each’s-limitations-performance-development-environment-and-deployment-between-Windows-and-Linux/answer/Simon-Willison"&gt;What is the difference between Windows and Linux for web hosting, in other words, what are the pros and cons of each, each’s limitations, performance development environment and deployment between Windows and Linux?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Any and every operation you perform on a Linux server can be trivially automated by copying the commands you ran in to a text file. I haven't managed a Windows server in years and I hear PowerShell is pretty great these days but an OS based around a GUI is always going to be harder to automate than one based around a command line.&lt;/p&gt;

&lt;p&gt;Linux has a much stronger complement of high quality open source software - and new open source server software (stuff like node.js) usually becomes available for Linux first.&lt;/p&gt;

&lt;p&gt;If you don't know anything about Linux but are comfortable with Windows, you'll find it easier to manage a Windows server in the short term.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/hosting"&gt;hosting&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/windows"&gt;windows&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ecommerce"&gt;ecommerce&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="hosting"/><category term="linux"/><category term="web-development"/><category term="windows"/><category term="quora"/><category term="ecommerce"/></entry><entry><title>How can I download a web server's directory and all subdirectories with one command?</title><link href="https://simonwillison.net/2012/Jan/15/how-can-i-download/" rel="alternate"/><published>2012-01-15T18:55:00+00:00</published><updated>2012-01-15T18:55:00+00:00</updated><id>https://simonwillison.net/2012/Jan/15/how-can-i-download/</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-can-I-download-a-web-servers-directory-and-all-subdirectories-with-one-command/answer/Simon-Willison"&gt;How can I download a web server&amp;#39;s directory and all subdirectories with one command?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Use wget (you can install it with apt-get install wget)&lt;/p&gt;

&lt;p&gt;$ wget --recursive &lt;span&gt;&lt;a href="http://example.com"&gt;http://example.com&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;That will create a directory called &lt;span&gt;&lt;a href="http://example.com"&gt;example.com&lt;/a&gt;&lt;/span&gt; and put the mirrored downloaded files in the right sub-directories inside it.&lt;/p&gt;

&lt;p&gt;If you just want to download a subdirectory, do this:&lt;/p&gt;

&lt;p&gt;$ wget --recursive &lt;span&gt;&lt;a href="http://example.com/subdirectory"&gt;http://example.com/subdirectory&lt;/a&gt;&lt;/span&gt; --no-parent&lt;/p&gt;

&lt;p&gt;The --no-parent option ensures wget won't follow links up to parent directories of the one you want to download.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ubuntu"&gt;ubuntu&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="http"/><category term="linux"/><category term="ubuntu"/><category term="quora"/></entry><entry><title>What is a painless way for a non-Unix programmer to get started learning Unix or GNU/Linux?</title><link href="https://simonwillison.net/2010/Oct/4/what-is-a-painless/" rel="alternate"/><published>2010-10-04T17:01:00+00:00</published><updated>2010-10-04T17:01:00+00:00</updated><id>https://simonwillison.net/2010/Oct/4/what-is-a-painless/</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/What-is-a-painless-way-for-a-non-Unix-programmer-to-get-started-learning-Unix-or-GNU-Linux/answer/Simon-Willison"&gt;What is a painless way for a non-Unix programmer to get started learning Unix or GNU/Linux?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'd suggest getting yourself an Ubuntu virtual machine running on your own laptop - VirtualBox is free, so that's a good starting point. That way you can play with Linux all you like without fear of breaking anything, since you can always delete the image or roll back to a snapshot.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/software-engineering"&gt;software-engineering&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="linux"/><category term="programming"/><category term="software-engineering"/><category term="quora"/></entry><entry><title>Undelete!</title><link href="https://simonwillison.net/2010/Aug/21/undelete/" rel="alternate"/><published>2010-08-21T10:56:00+00:00</published><updated>2010-08-21T10:56:00+00:00</updated><id>https://simonwillison.net/2010/Aug/21/undelete/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://spin.atomicobject.com/2010/08/18/undelete?utm_source=y-combinator&amp;amp;utm_medium=social-media&amp;amp;utm_campaign=technical"&gt;Undelete!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
How to undelete a file accidentally removed using rm on Linux, by grepping through the raw bytes on the hard drive searching for a unique string that was contained in the file. “grep -a -B 25 -A 100 ’some string in the file’ /dev/sda1 &amp;gt; results.txt”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sysadmin"&gt;sysadmin&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="linux"/><category term="sysadmin"/><category term="recovered"/></entry><entry><title>Running Processes</title><link href="https://simonwillison.net/2010/Mar/2/running/" rel="alternate"/><published>2010-03-02T09:55:18+00:00</published><updated>2010-03-02T09:55:18+00:00</updated><id>https://simonwillison.net/2010/Mar/2/running/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://dustin.github.com/2010/02/28/running-processes.html"&gt;Running Processes&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I’ve been searching for a good solution to this problem (“run this program, and restart it if it falls over”) for years. I’m currently using god which works pretty well, but according to this article I should be learning upstart instead. It never ceases to amaze me how difficult this is, and how obtuse the tools are.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/god"&gt;god&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/processes"&gt;processes&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ubuntu"&gt;ubuntu&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/unix"&gt;unix&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/upstart"&gt;upstart&lt;/a&gt;&lt;/p&gt;



</summary><category term="god"/><category term="linux"/><category term="processes"/><category term="ubuntu"/><category term="unix"/><category term="upstart"/></entry><entry><title>Linux performance basics</title><link href="https://simonwillison.net/2010/Jan/24/jonathan/" rel="alternate"/><published>2010-01-24T13:50:39+00:00</published><updated>2010-01-24T13:50:39+00:00</updated><id>https://simonwillison.net/2010/Jan/24/jonathan/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://spyced.blogspot.com/2010/01/linux-performance-basics.html"&gt;Linux performance basics&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
This kind of Linux knowledge is rapidly becoming a key skill for server-side web development.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/jonathan-ellis"&gt;jonathan-ellis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ops"&gt;ops&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sysadmin"&gt;sysadmin&lt;/a&gt;&lt;/p&gt;



</summary><category term="jonathan-ellis"/><category term="linux"/><category term="ops"/><category term="performance"/><category term="sysadmin"/></entry><entry><title>The Maximal Usage Doctrine for Open Source</title><link href="https://simonwillison.net/2010/Jan/6/licenses/" rel="alternate"/><published>2010-01-06T17:23:31+00:00</published><updated>2010-01-06T17:23:31+00:00</updated><id>https://simonwillison.net/2010/Jan/6/licenses/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://yehudakatz.com/2010/01/05/the-maximal-usage-doctrine-for-open-source/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A KatzGotYourTongue %28Katz Got Your Tongue%3F%29"&gt;The Maximal Usage Doctrine for Open Source&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Yehuda Katz shares my own philosophy on Open Source licensing—stick BSD or MIT on it to maximise the number of people who can use it. The projects I work on are small enough that I don’t care if someone makes big private improvements and refuses to share them. I can see how much larger projects like Linux would disagree though.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bsd"&gt;bsd&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/licensing"&gt;licensing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mit"&gt;mit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yehuda-katz"&gt;yehuda-katz&lt;/a&gt;&lt;/p&gt;



</summary><category term="bsd"/><category term="licensing"/><category term="linux"/><category term="mit"/><category term="open-source"/><category term="yehuda-katz"/></entry><entry><title>Using Graphics Card Memory as Swap</title><link href="https://simonwillison.net/2009/Nov/3/graphics/" rel="alternate"/><published>2009-11-03T11:01:18+00:00</published><updated>2009-11-03T11:01:18+00:00</updated><id>https://simonwillison.net/2009/Nov/3/graphics/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://en.gentoo-wiki.com/wiki/Using_Graphics_Card_Memory_as_Swap"&gt;Using Graphics Card Memory as Swap&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Interesting idea: “Graphic cards contain a lot of very fast RAM, typically between 64 and 512 MB. With Linux, it’s possible to use it as swap space, or even as RAM disk.”

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.anchor.com.au/blog/2009/10/new-dedicated-server-upgrade-offering/"&gt;Anchor Hosting&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/graphicscards"&gt;graphicscards&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/memory"&gt;memory&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ops"&gt;ops&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ram"&gt;ram&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sysadmin"&gt;sysadmin&lt;/a&gt;&lt;/p&gt;



</summary><category term="graphicscards"/><category term="linux"/><category term="memory"/><category term="ops"/><category term="performance"/><category term="ram"/><category term="sysadmin"/></entry><entry><title>Learning to compile things from source (on Unix/Linux/OSX)</title><link href="https://simonwillison.net/2009/Jul/27/learning/" rel="alternate"/><published>2009-07-27T16:21:47+00:00</published><updated>2009-07-27T16:21:47+00:00</updated><id>https://simonwillison.net/2009/Jul/27/learning/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://serverfault.com/questions/46381/learning-to-compile-things-from-source-on-unix-linux-osx"&gt;Learning to compile things from source (on Unix/Linux/OSX)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I asked on serverfault.com for tips on learning how to solve configure/make/install problems on my own, and got some extremely useful replies.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/compiling"&gt;compiling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/questions"&gt;questions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/serverfault"&gt;serverfault&lt;/a&gt;&lt;/p&gt;



</summary><category term="compiling"/><category term="linux"/><category term="macos"/><category term="questions"/><category term="serverfault"/></entry><entry><title>Ubuntu brings advanced Screen features to the masses</title><link href="https://simonwillison.net/2009/Apr/28/screen/" rel="alternate"/><published>2009-04-28T21:52:50+00:00</published><updated>2009-04-28T21:52:50+00:00</updated><id>https://simonwillison.net/2009/Apr/28/screen/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://arstechnica.com/open-source/news/2009/04/ubuntu-brings-advanced-screen-features-to-the-masses.ars"&gt;Ubuntu brings advanced Screen features to the masses&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ubuntu 9.04’s screen-profiles package adds a taskbar to screen and emulates the gnome panel. You can even add a widget showing the cost of your current EC2 session.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ec2"&gt;ec2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/screen"&gt;screen&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ubuntu"&gt;ubuntu&lt;/a&gt;&lt;/p&gt;



</summary><category term="ec2"/><category term="linux"/><category term="screen"/><category term="ubuntu"/></entry><entry><title>Introducing the Karmic Koala, our mascot for Ubuntu 9.10</title><link href="https://simonwillison.net/2009/Feb/21/koala/" rel="alternate"/><published>2009-02-21T17:19:18+00:00</published><updated>2009-02-21T17:19:18+00:00</updated><id>https://simonwillison.net/2009/Feb/21/koala/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://lists.ubuntu.com/archives/ubuntu-devel-announce/2009-February/000536.html"&gt;Introducing the Karmic Koala, our mascot for Ubuntu 9.10&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ubuntu 9.10 will have a strong focus on cloud computing, including tools for easily creating EC2 AMIs and Eucalyptus, an open-source system for running an EC2-compatible cloud in your own data centre.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://blog.gardeviance.org/2009/02/happiness-is-koala.html"&gt;Simon Wardley&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/cloud-computing"&gt;cloud-computing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ec2"&gt;ec2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/eucalyptus"&gt;eucalyptus&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/karmickoala"&gt;karmickoala&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mark-shuttleworth"&gt;mark-shuttleworth&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ubuntu"&gt;ubuntu&lt;/a&gt;&lt;/p&gt;



</summary><category term="cloud-computing"/><category term="ec2"/><category term="eucalyptus"/><category term="karmickoala"/><category term="linux"/><category term="mark-shuttleworth"/><category term="ubuntu"/></entry><entry><title>Quoting Jeremy Allison</title><link href="https://simonwillison.net/2008/Dec/9/mali/" rel="alternate"/><published>2008-12-09T08:03:09+00:00</published><updated>2008-12-09T08:03:09+00:00</updated><id>https://simonwillison.net/2008/Dec/9/mali/</id><summary type="html">
    &lt;blockquote cite="http://tuxdeluxe.org/node/287"&gt;&lt;p&gt;[In Mali...] The outcome of this rampant illegal software copying is that Windows is seen as "the first world standard" and any attempt to push a cheaper alternative is strongly resisted. They consider it trying to cheat local people out of getting the same quality of software that is used in the developed world, even though it's a legal way of getting quality software for free.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://tuxdeluxe.org/node/287"&gt;Jeremy Allison&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/africa"&gt;africa&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeremy-allison"&gt;jeremy-allison&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mali"&gt;mali&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/open-source"&gt;open-source&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/piracy"&gt;piracy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/windows"&gt;windows&lt;/a&gt;&lt;/p&gt;



</summary><category term="africa"/><category term="jeremy-allison"/><category term="linux"/><category term="mali"/><category term="open-source"/><category term="piracy"/><category term="windows"/></entry><entry><title>Ubuntu and Debian AMIs for Amazon EC2</title><link href="https://simonwillison.net/2008/Dec/8/ubuntu/" rel="alternate"/><published>2008-12-08T18:04:09+00:00</published><updated>2008-12-08T18:04:09+00:00</updated><id>https://simonwillison.net/2008/Dec/8/ubuntu/</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://alestic.com/"&gt;Ubuntu and Debian AMIs for Amazon EC2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Exactly what it says on the tin.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/amis"&gt;amis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/debian"&gt;debian&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ec2"&gt;ec2&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/linux"&gt;linux&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ubuntu"&gt;ubuntu&lt;/a&gt;&lt;/p&gt;



</summary><category term="amis"/><category term="debian"/><category term="ec2"/><category term="linux"/><category term="ubuntu"/></entry></feed>