This page collects blog pages concerned with programming: the writing of code or the reading of books about the writing of code.

2019-03-13 Debian forever?

I loved A (Partial) Defense of Debian by John Goerzen. “We recognize the value of something that just works, that is so stable that things like unattended-upgrades are safe and reliable.” I did not appreciate this for many years. But now I’m back to using Debian for my servers and that’s exactly why. The years on my laptop have taught me this.

And I still love ❤ Slackware. 🙂

The only reason I’m using PureOS on my laptop is that it came pre-installed and hasn’t failed me, yet. It’s basically a repackaging of Debian, with changes.

I do acknowledge the beauty of a web based workflow, but my aesthetics actually point me the other way, the way John Goerzen defends, based on local git, local review tools, local email clients. Perhaps these days it’s harder to set these up locally? This is something I have noticed at the office, for example: many developers don’t like to use git directly. They try to never go to the command line, preferring to use the Eclipse git plugin EGit instead. I am torn. On Windows, using git and and magit inside Emacs is slow. I only drop to the command line when I’m confused and need to make sure I know what’s going on. And we use GitLab to review code using merge requests. So yes, I understand the lure and the convenience of using an all-in-one website.

I still want to like the old school workflow using local tools and email.

Github constantly forces me to their website. I can’t very well work on bug reports, etc. without a strong Internet connection. And it’s designed to push people into using their tools and their interface, which is inferior in a lot of ways to a local interface – but then the process to pull down someone else’s set of patches involves a lot of typing and clicking, much more that would be involved from a simple git format-patch. In short, I don’t have my shortcut keys, my environment, etc. for reviewing things – the roadblocks are there to make me use theirs. – John Goerzen

I know this is true, and yet I’ve also enjoyed contributing code to projects hosted on GitHub and GitLab and other “software forges”. It’s smooth sailing if you’re all-in or all-out. Crossing over is what breaks your workflow.


Comments on 2019-03-13 Debian forever?

Glad to find more people making the point. Github was tolerable but the long term effects are starting to show.

orbifx 2019-03-18 15:07 UTC

Add Comment

2019-01-27 Digraphs and Name Generation

I have a name generator that works like the old Elite name generator: it generates a string of digraphs (usually syllables). Take a look at the help page.

But now I wonder: is there a list of these for English? An easy way to generate them based on some text? Split a text into consonants + vowels, leading vowels and ending consonants, and rank them by count? @gwmngilfen suggested starting with a e i o u but since my first language is German, I knew that this wasn’t going to cut it.

Why is there no Unicode property to indicate vowels? For my own uses, I might go with all the vowels in Latin-1, I guess? @bkhl said “there are properties for vowels in particular writing systems, where that’s unambigous, such as some Indic ones, but not for the Latin family, where the same character can be a vowel, a consonant, or both, depending on the language.”

OK, so given the list of Unicode names, how would I do it? With Emacs Lisp:

(let (names vowels)
   (lambda (range arg)
     (let ((from (car range))
	   (to (cdr range)))
       (dotimes (c (- to from))
	 (setq names (cons (cons c (get-char-code-property (+ c from) 'name)) names)))))
  (dolist (name names)
    (when (and (cdr name) (string-match "^latin small .*\\b[aeiouy]\\b" (cdr name)))
      (setq vowels (cons (car name) vowels))))
  (mapconcat 'char-to-string vowels ""))

Result: a e i o u y à á â ã ä å è é ê ë ì í î ï ò ó ô õ ö ø ù ú û ü ý ÿ ā ă ą ē ĕ ė ę ě ĩ ī ĭ į ı ō ŏ ő ũ ū ŭ ů ű ų ŷ ơ ư ƴ ǎ ǐ ǒ ǔ ǖ ǘ ǚ ǜ ǝ ǟ ǡ ǫ ǭ ǻ ǿ ȁ ȃ ȅ ȇ ȉ ȋ ȍ ȏ ȕ ȗ ȧ ȩ ȫ ȭ ȯ ȱ ȳ ɇ ɏ ɐ ɔ ɘ ɛ ɜ ɝ ɞ ɨ ɵ ʉ ʎ ʚ ᴈ ᴉ ᴑ ᴒ ᴓ ᴖ ᴗ ᴝ ᴞ ᵻ ᵾ ᶏ ᶒ ᶓ ᶔ ᶖ ᶗ ᶙ ḁ ḕ ḗ ḙ ḛ ḝ ḭ ḯ ṍ ṏ ṑ ṓ ṳ ṵ ṷ ṹ ṻ ẏ ẙ ẚ ạ ả ấ ầ ẩ ẫ ậ ắ ằ ẳ ẵ ặ ẹ ẻ ẽ ế ề ể ễ ệ ỉ ị ọ ỏ ố ồ ổ ỗ ộ ớ ờ ở ỡ ợ ụ ủ ứ ừ ử ữ ự ỳ ỵ ỷ ỹ ỿ ⱥ ⱸ ⱺ ꝋ ꝍ ꬱ ꬲ ꬳ ꬴ ꬽ ꬾ ꬿ ꭃ ꭄ ꭎ ꭏ ꭒ ꭚ ꭡ

(let (names consonants)
   (lambda (range arg)
     (let ((from (car range))
	   (to (cdr range)))
       (dotimes (c (- to from))
	 (setq names (cons (cons c (get-char-code-property (+ c from) 'name)) names)))))
  (dolist (name names)
    (when (and (cdr name) (string-match "^latin small .*\\b[^aeiouy ]\\b" (cdr name)))
      (setq consonants (cons (car name) consonants))))
  (mapconcat 'char-to-string consonants ""))

Result: b c d f g h j k l m n p q r s t v w x z ß ç ñ ć ĉ ċ č ď đ ĝ ğ ġ ģ ĥ ħ ĵ ķ ĺ ļ ľ ŀ ł ń ņ ň ʼn ŕ ŗ ř ś ŝ ş š ţ ť ŧ ŵ ź ż ž ſ ƀ ƃ ƈ ƌ ƒ ƙ ƚ ƞ ƥ ƫ ƭ ƶ ǥ ǧ ǩ ǰ ǵ ǹ ȑ ȓ ș ț ȟ ȡ ȥ ȴ ȵ ȶ ȷ ȼ ȿ ɀ ɉ ɋ ɍ ɓ ɕ ɖ ɗ ɟ ɠ ɡ ɥ ɦ ɫ ɬ ɭ ɯ ɰ ɱ ɲ ɳ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʂ ʄ ʇ ʈ ʋ ʌ ʍ ʐ ʑ ʝ ʞ ʠ ʮ ʯ ᴟ ᵬ ᵭ ᵮ ᵯ ᵰ ᵱ ᵲ ᵳ ᵴ ᵵ ᵶ ᵷ ᵹ ᵽ ᶀ ᶁ ᶂ ᶃ ᶄ ᶅ ᶆ ᶇ ᶈ ᶉ ᶊ ᶌ ᶍ ᶎ ᶑ ḃ ḅ ḇ ḉ ḋ ḍ ḏ ḑ ḓ ḟ ḡ ḣ ḥ ḧ ḩ ḫ ḱ ḳ ḵ ḷ ḹ ḻ ḽ ḿ ṁ ṃ ṅ ṇ ṉ ṋ ṕ ṗ ṙ ṛ ṝ ṟ ṡ ṣ ṥ ṧ ṩ ṫ ṭ ṯ ṱ ṽ ṿ ẁ ẃ ẅ ẇ ẉ ẋ ẍ ẑ ẓ ẕ ẖ ẗ ẘ ẛ ẜ ẝ ỻ ỽ ↄ ⱡ ⱦ ⱨ ⱪ ⱬ ⱱ ⱳ ⱴ ⱶ ⱹ ꜿ ꝁ ꝃ ꝅ ꝇ ꝉ ꝑ ꝓ ꝕ ꝗ ꝙ ꝛ ꝟ ꝣ ꝺ ꝼ ꝿ ꞁ ꞃ ꞅ ꞇ ꞎ ꞑ ꞓ ꞔ ꞕ ꞗ ꞙ ꞡ ꞣ ꞥ ꞧ ꞩ ꬱ ꬵ ꬶ ꬷ ꬸ ꬹ ꬺ ꬻ ꬼ ꭃ ꭄ ꭅ ꭇ ꭈ ꭉ ꭊ ꭋ ꭌ ꭖ ꭗ ꭘ ꭙ ſt

And then some Perl:

# Copyright (C) 2009-2017  Alex Schroeder <>
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <>.

use Modern::Perl;
use utf8;
use open qw/:std :utf8/;

# (let (names vowels)
#   (map-charset-chars
#    (lambda (range arg)
#      (let ((from (car range))
# 	   (to (cdr range)))
#        (dotimes (c (- to from))
# 	 (setq names (cons (cons c (get-char-code-property (+ c from) 'name)) names)))))
#    'unicode)
#   (dolist (name names)
#     (when (and (cdr name) (string-match "^latin small .*\\b[aeiouy]\\b" (cdr name)))
#       (setq vowels (cons (car name) vowels))))
#   (mapconcat 'char-to-string vowels ""))

my $vocals = "aeiouyàáâãäåèéêëìíîïòóôõöøùúûüýÿāăąēĕėęěĩīĭįıōŏőũūŭůűųŷơưƴǎǐǒǔǖǘǚǜǝǟǡǫǭǻǿȁȃȅȇȉȋȍȏȕȗȧȩȫȭȯȱȳɇɏɐɔɘɛɜɝɞɨɵʉʎʚᴈᴉᴑᴒᴓᴖᴗᴝᴞᵻᵾᶏᶒᶓᶔᶖᶗᶙḁḕḗḙḛḝḭḯṍṏṑṓṳṵṷṹṻẏẙẚạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹỿⱥⱸⱺꝋꝍꬱꬲꬳꬴꬽꬾꬿꭃꭄꭎꭏꭒꭚꭡ";

# (let (names consonants)
#   (map-charset-chars
#    (lambda (range arg)
#      (let ((from (car range))
# 	   (to (cdr range)))
#        (dotimes (c (- to from))
# 	 (setq names (cons (cons c (get-char-code-property (+ c from) 'name)) names)))))
#    'unicode)
#   (dolist (name names)
#     (when (and (cdr name) (string-match "^latin small .*\\b[^aeiouy ]\\b" (cdr name)))
#       (setq consonants (cons (car name) consonants))))
#   (mapconcat 'char-to-string consonants ""))

my $consonants = 'bcdfghjklmnpqrstvwxzßçñćĉċčďđĝğġģĥħĵķĺļľŀłńņňʼnŕŗřśŝşšţťŧŵźżžſƀƃƈƌƒƙƚƞƥƫƭƶǥǧǩǰǵǹȑȓșțȟȡȥȴȵȶȷȼȿɀɉɋɍɓɕɖɗɟɠɡɥɦɫɬɭɯɰɱɲɳɹɺɻɼɽɾɿʂʄʇʈʋʌʍʐʑʝʞʠʮʯᴟᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵽᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶌᶍᶎᶑḃḅḇḉḋḍḏḑḓḟḡḣḥḧḩḫḱḳḵḷḹḻḽḿṁṃṅṇṉṋṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṽṿẁẃẅẇẉẋẍẑẓẕẖẗẘẛẜẝỻỽↄⱡⱦⱨⱪⱬⱱⱳⱴⱶⱹꜿꝁꝃꝅꝇꝉꝑꝓꝕꝗꝙꝛꝟꝣꝺꝼꝿꞁꞃꞅꞇꞎꞑꞓꞔꞕꞗꞙꞡꞣꞥꞧꞩꬱꬵꬶꬷꬸꬹꬺꬻꬼꭃꭄꭅꭇꭈꭉꭊꭋꭌꭖꭗꭘꭙſt';

sub digraphs {
  my $word = shift;
  my @digraphs = $word =~ /([$consonants]+[$vocals]*|[$vocals]+)/g;
  # local $" = "•";
  # warn "@digraphs";
  for (@digraphs) {
    if (/^([$vocals]+)/ or /([$consonants]+)([$vocals]*)/) {
      my ($one, $two) = ($1, $2);
      $one = "." if length($one) == 0;
      $two = "." if not $two or length($two) == 0;
      $one = "[$one]" if length($one) > 1;
      $two = "[$two]" if length($two) > 1;
      $_ = "$one$two";
      # warn $_;
    } else {
      warn "WTF is $_\n";
  return \@digraphs;

sub words {
  my $text = shift;
  my @words = $text =~ /(\w+)/g;
  # local $" = "•";
  # warn "@words";
  return \@words;

sub process {
  my $text = shift;
  my $words = words($text);
  # local $" = "•";
  # warn "@$words";
  my %digraphs;
  for my $digraphs (map { digraphs($_) } @$words) {
    # warn "@$digraphs";
    for my $digraph (@$digraphs) {
      # warn $digraph;
  # sort descending by number of occurences
  my @keys = sort { $digraphs{$b} <=> $digraphs{$a} } keys %digraphs;
  # print the best
  for my $digraph (@keys[0..49]) {
    print "$digraph" if $digraph;
  print "\n";

local $/;

And then use it to parse Romeo & Juliet:

$ ./ < ~/Documents/Romeo\ and\ Juliet.txt 

And feed that to the name generator:

  • Mehitove
  • Nomond
  • Llng
  • Cofa
  • Ewif
  • Lolif
  • Limethithi
  • Eveto
  • Llmost
  • Teuhe
  • Remor
  • Thiliso
  • Afomem
  • Ngbemy
  • Ngfo
  • Istmo
  • Ngth
  • Hawref
  • Hengtfo
  • Rwili

Hm. It’s not very impressive. 😔


Comments on 2019-01-27 Digraphs and Name Generation

This needs Markhov chains, or at least and indicator for terminal sounds. Looking at “Ngfo” for example: Sure, many words end with a last consonant like “ng”. But that doesn’t meant you can put “ng” anywhere in a word. So actually what we need to do looks like a Markhov chain based on syllables, I think? I guess you will then never get any variations on “John”. Perhaps we could implement a sort of “word2vec” for characters: we’d find that generally speaking “o” often occurs in the context of “j”, “h” and “n” and perhaps we’d find that “u” often occurs in the same context (”June”) and so if we get the “nearest” characters to “o” given the context of “j”, “h” and “n” we might get back “u”, leading to the “new” word “Juhn”.

– Alex Schroeder 2019-01-30 07:35 UTC

Good to see Perl use.

Ngfo, have to use that one. And make up the dialect of a language that has a silent Ng. 😊

Blue Tyson 2019-01-30 10:12 UTC

Heh. 😊

– Alex Schroeder 2019-01-30 13:01 UTC

Add Comment

2018-12-10 Handwritten Digits for Download

In 2017 I announced a git repo containing handwritten digits suitable for machine learning. Some coworkers and I wanted to get some hands-on experience with Deeplearning4j and that included the entire experience of collecting and preparing the data. That’s why we didn’t want to just use the MNIST database. («The MNIST database of handwritten digits, available from this page, has a training set of 60,000 examples, and a test set of 10,000 examples. It is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image.»)

In addition to that, the MNIST database has handwritten digits by Americans. But here in Switzerland we don’t necessarily write the digits in exactly the same way, so that was an additional incentive to collect our own data. And we did!

This year, however, I talked to one of our customers. We had trained a neural network to recognise digits on a much, much larger set of data. I wanted to make these digits available, too. And they agreed! Thank you!

That’s why there are now more than 800,000 handwritten digits in this repository!


Comments on 2018-12-10 Handwritten Digits for Download

800000! gewaltig!

– Chris 2018-12-13 18:49 UTC

git add hat auf Windows 10 über 1h gedauert, also habe ich den Rechner über Nacht laufen gelassen. git commit hat dann nochmal etwa 1h gedauert. Hochladen waren dann relativ schnell, haha.

– Alex Schroeder 2018-12-13 22:24 UTC

Add Comment

2018-12-03 Fennel

Fennel is a Lisp that translates straight to Lua. I’d like to learn more about it because @technomancy writes a spaceflight progamming game called Bussard using it.

So I’m doing Advent of Code using Fennel. I’m three days in and I like it so far.

Some weird things I’ve noticed:

  1. There are no breaks from loops! Thus, while you can write a loop with an explicit exit condition like (while (not done?) ...) you have no way to exit a loop like (each [key value (pairs table)] ...).
  2. I miss so many Lisp things, like ... lists! There seem to be no lists in this language. How the hell is this a Lisp? Oh well. Apparently you can use Lua tables as lists, but I keep using them as maps/hashes/dictionaries.
  3. If you use let to create a local binding, you can’t set it! That’s weird for somebody like me who’s used to Emacs Lisp.

If you want to look at my code, take a look at the 2018 folder in my advent repository.


Add Comment

2018-10-06 Programming Ethics

The feeling when you remember what was deemed paranoid fantasy in computing a decade ago and then thinking of today’s supply chain attacks, bot nets, great firewalls, xkeyscore and all that… and as a programmer I am disappointed in the kind of people that decide to work on these things.


Now, you might argue that some programmers don’t have a choice. Capitalism and all that. This might be true in general, for poor people, but in the context of programmers, the ones I know do have the freedom to decide whom to work for and what to work on.

But even if you do know people in such circumstances – I’m not sure how to respond to this. I can go commit the No True Scotsman fallacy, or go back and qualify my statements with “most” and “the ones I know” and “it seems to me” – but at the same time I don’t know enough these people and their situations so let me put it this way: I hope they get back their agency as quickly as possible and that they will exercise their freedom as soon as they can.

And at the same time I will be thinking of Kant and the categorical imperative and where as I know that his statements are harsh and contested, he did argue that you should not lie, no matter what, because that is the foundation of our society. No excuses. And thus while I acknowledge the need to make compromises, these don’t exempt people from moral judgement. That’s why these are compromises and not good deeds.


Add Comment

2018-10-02 Terminal

I really like the macros used for ANSI sequences from everything you ever wanted to know about terminals.

#include <unistd.h>
#define szstr(str) str,sizeof(str)

#define     plain "0" /* or "" */
#define        no "2"
#define    bright "1"
#define       dim "2"
#define    italic "3"
#define underline "4"
#define   reverse "7"
#define      with ";"
#define  ansi_esc "\x1b"
#define fmt(style) ansi_esc "[" style "m"

int main() {
	write(1, szstr(    "plain text - "
		fmt(right)     "bright text"     fmt(no bright) " - "
		fmt(dim)       "dim text"        fmt(no dim)    " - " 
		fmt(italic)    "italic text"     fmt(no italic) " - "
		fmt(reverse)   "reverse video"   fmt(plain)     " - "
		fmt(underline) "underlined text" fmt(no underline) ")

And then you can write code like this: fmt(underline with bright with no italic). And the blog post keeps adding to this! Eight colors, 256 colors, true colors, and so on.

Note: “all sample code in this document is the sole property of the author and is released exclusively under the GNU AGPLv3.” – Lexi Summer Hale


Add Comment

2018-08-24 GitHub

I really should learn two things:

  1. how to use the Git command line interface to GitHub
  2. or better yet, how to create a pull request on GitHub but for my self-hosted git repository


Add Comment

2018-08-23 Programming

This blog post is a beautiful call to arms by @garbados :

Ours is a sorcerous craft. Dark magics make monarchs and topple nations. Our baubles track you, watch you, think about you, and then sell what they learn. They are porous and brittle, prone to exploitation. Executives spin sales opportunities on the backs of hundreds of millions of stolen identities, billions of manipulated impressions, and tens of thousands of automated hate machines. Fascists use the places we have built to organize their violence, and our keepers rejoice for the increased usage.
Regarding why software is so bad

And it just gets better. Thank you!


Add Comment

2018-07-24 Learning C

I saw @brainblasted ask about good and preferably free e-books to start with C. I started wondering. How did I learn C?

I learned it by looking at the code of a small game and the GNU manuals.

These were references, not good language tutorials!

These days the early editions of the book written by the creators of C is available, for free. Who cares about how old it is. C Programming Language, 2nd Edition by Brian W. Kernighan, Dennis M. Ritchie.

Search for “K&R C free” to find more interesting material like tutorials. Mark Burgess has an old C tutorial on his site, for example.

Since I believe in actual projects, the Build Your Own Text Editor booklet seems like a great idea!

@lerk mentioned the fact that C often goes hand in hand with UNIX programming and this reminded me of the fact that the online manual — the man pages — of your system should document both command line programs and C. This is great. Try running man printf, for example. These are also available online: OpenBSD manual pages, The Linux man-pages project, etc.

@hoergen recommended C How to Program by Deitel&Deitel, but it’s not free.

@bortzmeyer mentioned Steve Oualline and recommended Practical C Programming (see his non-free books). One of the free books available from his site is C Elements of Style.

@cstrotm posted a list of his recommendations:

And finally: The Definitive C Book Guide and List.

Carsten also recommended Build Your Own Lisp, by Daniel Holden. It sounds fantastic: “Learn C and build your own programming language in 1000 lines of code!” But @simon_brooke said he was disappointed in the result: this is not a real Lisp! Read his review to learn more. Note the last sentence in that review where he says that this book still is “a very good, clear, engaging introduction to writing a non-trivial program in C.”

In the discussion, Carsten also linked to the The Make-A-Lisp Process. There, you’ll find a ton of implementations in various languages, including C.


Comments on 2018-07-24 Learning C

Wow, that takes me back. I only started learning about coding in 2013 with this giant book the “C++ Primer”. I’m not even sure how I wasn’t totally intimidated by this 1000+ page monstrosity. Plus I didn’t even know what IDE meant at the time, so I was writing my code in Ubuntu’s notepad, saving as a cpp file, and compiling it through the terminal with a line of code I had to look up myself. Fun times.

Ynas Midgard 2018-07-24 11:08 UTC

Wow! That sure sounds intimidating! 😰

I think when I looked at C++ for the first time I was looking at some Borland compiler documentation which felt a thousand pages thick. But back then I was a teenager and I gave up. It took a few years until I went back, and then it was C simply because the existing game I wanted to translate into German was already written in C.

I’d never start a new project in C but there is so much existing C code out there, perhaps it will never truly disappear. 😃

– Alex Schroeder 2018-07-24 11:50 UTC

I know a little C but would like to be better, or find a study partner.

– Anonymous 2018-07-27 02:01 UTC

Add Comment

2018-06-26 A New Web

I was talking to a friend who was thinking about the internet we want to have, decentralized, less silos, a bit like the nineties where it was possible to have static pages, host email, write your own CGI scripts, and it was all step by step easy and possible if that was what you wanted. And we got talking about the kind of things we need to today to get this back. Do you have reading suggestions? Blogs to read? Projects? People to follow?

I think targeting the in-serious developer is key. Kids and adults that want to tinker must see small achievable steps forward. A bit like Emacs, Smalltalk, or fiddling with autoexec.bat or whatever we did as kids.

@ajroach42 and @freakazoid seem to be talking about this, too!

Teenagers these days grow up with a phone instead of MSDOS or a C64 and how will they ever learn to tinker? How can we transition from play to programming, allowing people to create their own games, like in the old days you could play on a MUD or MUSH (I liked MUSHes better!) and from text adventure to community to programming it had everything. And I want the same thing for the web and messaging. People writing bots. People writing CGI scripts or whatever. I want it all! I want it now!

@eleanor recommended two blog posts to read:

Against Facebook has a misleading title. 0xADADA writes: «The platform takes our real authentic friendships and first commodifies them, reifies them, and then sells them back to us as an “image of friendship”, but one that is bankrupt of any genuine social value.» Capitalism at work extracting value in novel ways!

Encouraging individual sovereignty and a healthy commons was a reaction to the “Facebook Manifesto” by Mark Zuckerberg. @aral writes: “That is the world that I wake up every day to work towards. Not because it is charitable. Not because I’m a philanthropist. In fact, for no reason at all other than because that is the world that I want to live in.”

Hell Yeah!

A few replied with the suggestion that Minecraft might be the answer I was looking for and I think they are right. Specially when combined with a Raspberry Pi and the special edition of Minecraft for it which can be extended using Python (but I don’t exactly know how this works). And the barrier for a Raspberry Pi is higher than having a C64 in your bedroom, for sure.


Comments on 2018-06-26 A New Web

I think your premise is wrong. The old web wasn’t easy and simple to understand and everybody could participate. This is only true for nerds like you and me. Facebook and Co “won” by actually making good on the promise of participation for all. You want the good old times back where the net was for nerds. That’s fine and I wouldn’t mind to be part of it. But thinking it to be the “solution” (to whatever you think the problem is) is rather elitist thinking.

Also don’t worry about tinkerers, geeks like us always exist. They may hack their minecraft or create apps for their phones or do whatever. They will never be the mainstream though. We never were.

Andreas Gohr 2018-06-27 15:19 UTC

I don’t disagree with what you’re saying. I think one of the points I wanted make is that the current Internet is hard, even for us. Setting up a secure mail server is hard. Setting up a content management system and keeping it up to date is hard. Perhaps it isn’t in fact hard but we’re old and tired and unwilling to put in the hours, I don’t know. But yes, I agree with the basic statement: it wasn’t easy back then and it isn’t easy now.

And I agree that going back to the old web isn’t the answer. We have learned so many things. My friend and I kept talking about email (even though I argued that Email is the New Snail Mail) and we joked about the configuration of sendmail and procmail and writing sieve filters and setting up dovecot. None of that is something we want! But we also don’t want to replace all of the Internet with Facebook. We want to have the kind of Internet where tinkerers and kids can get interested in the infrastructure through play and use and develop the necessary skills to build and make. It’s a bit like Word and Facebook and phones in general making some things very easy and at the same time making it impossible to develop from there. I don’t mind things being easy for people. I mind the impossibility of the things we use to grow with us.

Or, as @dredmorbius writes on Reddit in The Tyranny of the Minimum Viable User: we must take care such that designing for normal people doesn’t drag down the experience for others, in particular expert or experienced users.

Then again, perhaps this guy on Gopher is right: Why we don't need to rebuild the internet. The old web is still there, for those of us who want it. I’d argue that my first point still stands: once you’re outside the big silos, setting things up is still harder than necessary.


  • no way “up” once you’re proficient with your phone
  • no way “up” once you’re proficient with Facebook
  • if you do switch to self-hosting, everything is harder than it ought to be

At the same time:

  • the old web was hard to use
  • server space was hard to get
  • setup was hard back then, too

– Alex Schroeder 2018-06-28 07:59 UTC

Also an interesting perspective:

I find the discussions about technical matters to be liberating and self-empowering, and I identify as “non-technical”. To be sincere, it was in the slow accumulation of technical knowledge and skills that I became excited about the future again. […] This feels antithetical to how people approach the internet today, but I don’t think that’s the case for the future. The present moment is one where companies are obscuring the depth of their technical processes to quietly profit off surveillance, oppression, and depression. The future is one where technology is reclaimed by everyone; it is open and welcoming and asking to be built by hand. I want us to grow towards that future with everything we share.

The Future will be Technical

I don’t want to be techno gullible, but I like the approach with a focus on understanding and empowerment.

– Alex 2018-06-28 12:12 UTC

And yet another perspective: How to Build a Low-tech Internet (2015) talks about long range WiFi and extending the sneaker net using buses, and more. A great summary of our options.

– Alex Schroeder 2018-07-14 07:18 UTC

Nick Heer wrote The Bullshit Web.

Behind closed doors, those in the advertising and marketing industry can be pretty lucid about how much they also hate surveillance scripts and how awful they find these methods, while simultaneously encouraging their use. Meanwhile, users are increasingly taking matters into their own hands — the use of ad blockers is rising across the board, many of which also block tracking scripts and other disrespectful behaviours. Users are making that choice.

– Alex Schroeder 2018-07-31 17:22 UTC

Add Comment



Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. Note: in order to facilitate peer review and fight vandalism, we will store your IP number for a number of days. See Privacy Policy for more information. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.