Welcome! :-)

This is both a wiki (a website editable by all) and a blog (an online diary about the stuff Alex Schroeder reads and does). If you’re a friend or relative, you might be interested in reading Life instead of this page. If you’ve come here from an RPG blog, you might want to head over to RPG. There are other similar categories to be found on the SiteMap.

Für Rollenspieler gibt es ebenfalls eine eigene RSP Kategorie.

2018-07-16 Standing in Front of Things

OK, this is more of a joke album but since I had a laugh looking at me standing in front of Swedish things, here’s a collection of photos:

And we love to eat...


Comments on 2018-07-16 Standing in Front of Things

Notes to myself: I copied all the files from the external disk onto the laptop’s SSD and did the picture selecting in Emacs using M-x image-dired and % m JPG RET C-t C-t and such things. It worked surprisingly well.

rm -rf 2018-sweden-alex/ && ~/src/sitelen-mute/sitelen-mute --title "Schweden 2018 (Alex)" --description "Alex standing in front of Swedish things." --url https://alexschroeder.ch/gallery/2018-sweden-alex/ ~/Pictures/Schweden/Alex 2018-sweden-alex

rsync --progress --recursive -e "ssh -p 882" 2018-sweden-alex alexschroeder.ch:alexschroeder.ch/gallery/

– Alex Schroeder 2018-07-16 16:13 UTC

Add Comment

2018-07-16 Blocking IP Addresses

OK, I’ve fiddled with my setup and I think it should work, but these guys still get on my nerves because I don’t understand why they need to download my entire site, ten thousand selectors and counting. And so I learned about blocking IP addresses using iptables and ipset.

I got all the info from this blog post: Block IP addresses in Linux with iptables.

Here’s the gist of it:

# Install
apt-get install ipset

# create blacklist once
ipset create blacklist hash:ip hashsize 4096
# set up iptables rules
iptables -I INPUT -m set --match-set blacklist src -j DROP
iptables -I FORWARD -m set --match-set blacklist src -j DROP
# add a specific IP address
ipset add blacklist
# confirm the blacklist contains the IP address
ipset list blacklist
# show firewall setup
iptables -L
# unblock IP address
ipset del blacklist

And for IPv6, same same but different.

ipset create blacklist6 hash:net hashsize 4096 family inet6
ip6tables -I INPUT -m set --match-set blacklist6 src -j DROP
ip6tables -I FORWARD -m set --match-set blacklist6 src -j DROP
ipset add blacklist6 ...
ipset list blacklist6
ip6tables -L

To save and restore iptables rules, use the package iptables-persistent. We don’t need this, for now.

This seems to work.


Add Comment

2018-07-15 Russian Gopher Idiots at Work

My Gopher site seems sluggish. I wonder what’s up...

top - 21:28:34 up 99 days,  5:38,  1 user,  load average: 38.37, 32.55, 17.14

Well, load average approaching 40 gives me an idea...

$ bin/time-grouping-gopher < farm/gopher-server.log
         Hour Connections   [%]  Selectors   [%]
2018-07-15 06          25    1%         25   1%
2018-07-15 07          39    1%         39   1%
2018-07-15 08          33    1%         33   1%
2018-07-15 09          36    1%         36   1%
2018-07-15 10          32    1%         32   1%
2018-07-15 11          36    1%         36   1%
2018-07-15 12          40    1%         40   1%
2018-07-15 13          36    1%         36   1%
2018-07-15 14          38    1%         37   1%
2018-07-15 15          36    1%         36   1%
2018-07-15 16          37    1%         37   1%
2018-07-15 17          39    1%         39   1%
2018-07-15 18          38    1%         38   1%
2018-07-15 19          37    1%         37   1%
2018-07-15 20          32    1%         32   1%
2018-07-15 21        2324   81%       2288  81%

Yes indeed! I guess it’s time to stop the server.

And who did it?

$ bin/ip-numbers-gopher < farm/gopher-server.log | head -n 2
                  IP Connections   [%]        2448   82%

Same guys like the other day!

$ whois|grep "org-name\|address"|head -n5
org-name:       "Central Telegraph" Public Joint-stock Company
address:        7, Tverskaya street
address:        125375,
address:        Moscow
address:        RUSSIAN FEDERATION

I think I need to install the honeypot ckeen was talking about.


Comments on 2018-07-15 Russian Gopher Idiots at Work

Time to take another look at the tarpit idea again.

– Alex Schroeder 2018-07-16 06:38 UTC

I just added default Surge Protection.

– Alex Schroeder 2018-07-16 07:41 UTC

Apparently it doesn’t help. I come back to the server and my web and gopher services are down. Load is up to 128. Fiddled with the code some more. As these people are forcing me to spend time writing code I’m not interested in because they wrote a gopher bot that requests pages faster than people usually read, I’m growing angrier every time I’m forced to look at this.

Right now their bot is behaving, though: twenty requests in around 50s.

– Alex Schroeder 2018-07-16 18:56 UTC

Add Comment

2018-07-13 Killing Gopher From Russia

My gopher server crashed...

Remember Killing Gopher Servers From Russia, part 1, from April 2018? Well, It’s July and they’re at it again.

$ bin/time-grouping-gopher < farm/gopher-server.log.1
         Hour Connections   [%]  Selectors   [%]
2018-07-12 06          22    1%         22   1%
2018-07-12 07          38    1%         38   1%
2018-07-12 08          32    1%         32   1%
2018-07-12 09          35    1%         35   1%
2018-07-12 10          34    1%         34   1%
2018-07-12 11          37    1%         37   1%
2018-07-12 12          38    1%         38   1%
2018-07-12 13          35    1%         35   1%
2018-07-12 14          32    1%         32   1%
2018-07-12 15          36    1%         36   1%
2018-07-12 16          35    1%         35   1%
2018-07-12 17          38    1%         38   1%
2018-07-12 18          39    1%         39   1%
2018-07-12 19          41    1%         41   1%
2018-07-12 20        3619   88%       3607  88%

OK, so who did this?

$ bin/ip-numbers-gopher < farm/gopher-server.log.1 | head -n 2
                  IP Connections   [%]        3610   88%

And who is this?

$ whois|grep "org-name\|address"|head -n5
org-name:       "Central Telegraph" Public Joint-stock Company
address:        7, Tverskaya street
address:        125375,
address:        Moscow
address:        RUSSIAN FEDERATION

And who was it last time? It was, also “Central Telegraph”, Russia.


To get a feeling for those 3610 requests:

$ grep < farm/gopher-server.log.1 | head
2018/07/12-20:01:50 CONNECT TCP Peer: "[]:59651" Local: "[]:70"
2018/07/12-20:01:51 CONNECT TCP Peer: "[]:59776" Local: "[]:70"
2018/07/12-20:01:51 CONNECT TCP Peer: "[]:59808" Local: "[]:70"
2018/07/12-20:01:51 CONNECT TCP Peer: "[]:59825" Local: "[]:70"
2018/07/12-20:01:51 CONNECT TCP Peer: "[]:59900" Local: "[]:70"
2018/07/12-20:01:51 CONNECT TCP Peer: "[]:60000" Local: "[]:70"
2018/07/12-20:01:52 CONNECT TCP Peer: "[]:60020" Local: "[]:70"
2018/07/12-20:01:52 CONNECT TCP Peer: "[]:60083" Local: "[]:70"
2018/07/12-20:01:52 CONNECT TCP Peer: "[]:60085" Local: "[]:70"
2018/07/12-20:01:52 CONNECT TCP Peer: "[]:60123" Local: "[]:70"
$ grep < farm/gopher-server.log.1 | tail
2018/07/12-20:17:01 CONNECT TCP Peer: "[]:62389" Local: "[]:70"
2018/07/12-20:17:01 CONNECT TCP Peer: "[]:62397" Local: "[]:70"
2018/07/12-20:17:01 CONNECT TCP Peer: "[]:62400" Local: "[]:70"
2018/07/12-20:17:01 CONNECT TCP Peer: "[]:62415" Local: "[]:70"
2018/07/12-20:17:01 CONNECT TCP Peer: "[]:62418" Local: "[]:70"
2018/07/12-20:17:01 CONNECT TCP Peer: "[]:62427" Local: "[]:70"
2018/07/12-20:17:02 CONNECT TCP Peer: "[]:62436" Local: "[]:70"
2018/07/12-20:17:02 CONNECT TCP Peer: "[]:62442" Local: "[]:70"
2018/07/12-20:17:02 CONNECT TCP Peer: "[]:62449" Local: "[]:70"
2018/07/12-20:17:02 CONNECT TCP Peer: "[]:62471" Local: "[]:70"

It took them 16 minutes to take out the server...


Add Comment

2018-07-05 Preventing Dog Piling

@freakazoid recently said “the Internet can’t just be a wide open mesh where everyone is broadcasting to everyone and can see everything all the time.” This inspired the following blog post.

I think we could write a list of design patterns to make harassment and dog piling on the Internet much harder and most people growing up on today’s Internet would be shocked and say that this is not what they wanted. We’ve been raised to expect the kind of features that make the negative interactions possible.

Everything we post must be non-public. This prevents random strangers from discovering it and thus it works like talking in meatspace. You cannot shout and the whole world will hear it, let alone look it up long after you’ve said it.

We need to bring back introductions because the lack of public interaction also means that you cannot step into a timeline of strangers and join the conversation. You need to be introduced to strangers. The situation is very similar in meatspace: it is hard to talk to strangers unless you are introduced, or the situation is highly scripted by cultural expectations: it’s easy to talk to hair dressers or shop keepers because the topics and the nodes of interaction are highly constrained.

We will call people you have been introduced to your acquaintances. This works better than “friends” because we’re not friends, yet; it also works better than “followers” because it’s a mutual relationship.

Next, we need constrained conversation starts with strangers. All your posts are shown to your acquaintances and a very small number of strangers. We want to prevent dog piling of strangers, right? One possible implementation would shown your “public” post to all your acquaintances and one other person. If they don’t interact with it, they lose access to your post. They didn’t care and so the opportunity to interact went away. Another person is shown the post and the cycle repeats until somebody picks it up or enough time has passed.

If the post is picked up by a stranger, the conversation is no longer shown to strangers but with every interaction, participants can invite one of their acquaintances. This automatically introduces them to the existing participants, if they aren’t acquainted already.

A participant is a person that said something in a conversation. If none of your acquaintances spoke up or your don’t have any, then you are the only participant in the conversation. The stranger reacting is another participant.

We could implement this by saying that you cannot add (“mention”) more than one acquaintance per response of all the participants that joined before you. The later you joined the harder it is to add new friends of yours.

Example: If Alice makes a public post and Beatrice is the stranger making a reply, then Alice doesn’t need to add another participant because all her acquaintances can already see the conversation. If Alice replies to Beatrice, the Beatrice can mention her acquaintance Claudia, thus introducing her to Alice. Both Claudia and Alice are now acquainted by default unless they choose to undo this.

If the conversation goes sour, people can leave and cancel their introductions. If they do, they will not get reacquainted by future introductions. This would require an explicit action on both parts.

This service doesn’t do celebrity accounts and news bots. Use blogs for this.

This setup doesn’t solve people working their way into your inner circles and then turning on you. It doesn’t solve ostracizing by your supposed friends. It doesn’t solve gossip and rumors and slander. And yet, it already feels very different from Twitter and Mastodon.

I guess one could make Facebook behave like this by avoiding public posts and groups?

This service would need lists and mass introductions: it was called “circle sharing” in the old Google+ user interface. Sadly, it is no more.


Comments on 2018-07-05 Preventing Dog Piling

A good thread on Mastodon by @freakazoid, @ajroach42 and @ishara starts here: Sean argues for organic growth, like I do in my doomed proposal. Andrew says we need to keep the possibility of meeting strangers alive. Barry adds that hashtags facilitate community finding. It’s interesting food for thought!

– Alex Schroeder 2018-07-06 20:41 UTC

Add Comment

2018-07-03 Rotating Text Mapper Maps

A user sent me a little NodeJS script to rotate a map in order to get “stacked columns”.

I wonder whether I should add a different hex stacking option to Text Mapper.


Add Comment

2018-07-03 Privancy and Agency

Why personal agency matters more than personal data: „For example, the clothes that we wear are privacy technologies. We also have norms that discourage others from, for example sticking their hands inside our clothes without permission. The fact that adtech plants tracking beacons on our naked digital selves and tracks us like animals across the digital frontier may be a norm for now, but it is also morally wrong, massively rude and now illegal under the GDPR.“


Add Comment

2018-06-29 No Take Back

I’ve been hearing about Secure Scuttlebutt (ssb for short). It’s not immediately obvious but one thing is key, I think. The ssb documentation doesn’t mince words: “Secure Scuttlebutt is a database protocol for unforgeable append-only message feeds.” I kept wondering: what about expiring and deleting content? Does that work at all?

No, it doesn’t. Once you publish something here, there is no way to ever remove it again from the public. This thread talks about the thing that has been bothering me for a while. @ckeen calls ssb messages “eternal messages”. And he’s right.

I like some things about sbb:

  • distributed, federated
  • works well with intermittent connectivity

But I don’t like systems where I cannot delete things. I don’t need non-repudiation since I’m talking to people, not signing contracts. Basically a “unforgeable append-only” system is similar to a legal set of contracts and not at all like conversations in real life. But that’s what people claim. They’ll say that ssb works like conversations work in real life. What’s been said cannot be unsaid.

But this is precisely not how it works in real life. The memories might not disappear, but the insult is not repeated every time we meet. The newspaper disappears from the stand, the books get impounded, the graffiti is painted over. Secure Scuttlebutt is an example of a the kind of software design that doesn’t follow human nature even though the words used to describe it (“gossip”) try to paint it that way. Once again, we design systems to never forget but the human thing is to forgive and forget. That web page where I am called a dick still makes me angry, years later. That’s why Oddmuse has Kept Pages instead of a version control backend. I want the system to forget.

As it is, sbb is not for me. If somebody writes something illegal there is no way to effectively retract it. If you’re sorry you wrote something, you can only say you’re sorry and you didn’t mean it and you want it undone but there’s no way to actually do it. I don’t think that’s the kind of service I want to use. How do you deal with this? Assume that mores will change? I don’t think so.

People will also say that it’s impossible to assure you that deletions are honored. And even if you can delete messages others will make screenshots. This happens and it makes people angry, and we can’t stop them, that is true. But it doesn’t follow that the tools we develop must prevent us from doing the things that cannot be guaranteed. After all, our locks are not perfect and yet we still use them to lock our doors. The law and norms take care of the rest.

I don’t like to design a system that doesn’t allow for any take backs. Human lives, our legal systems, or social conventions – they all allow for take backs wherever possible. It’s the humane thing to do. Our software should reflect this.


Comments on 2018-06-29 No Take Back

In court, we will find some people who have embedding a crime in the blockchain, merkletree, or whatever it is. Then what? Eventually the crime will make it worth it for law enforcement to confiscate your equipment and impose daily fines until you’re done for. Until then, it’s legal uncertainty for all. Thus I claim such a system will never work in practice.

People will use it, and problems will occur, I’m sure. But no big player will want to use it. And if your Mastodon instance is full of hentai then many will block you. I think the legal frame of mind is absolutely the way to see these issues. It can be as powerful as code.

@ckeen dig up this paper: A Quantitative Analysis of the Impact of Arbitrary Blockchain Content on Bitcoin, by Roman Matzutt, Jens Hiller, Martin Henze, Jan Henrik Ziegeldorf, Dirk Müllmann, Oliver Hohlfeld, and Klaus Wehrle.

– Alex Schroeder 2018-07-03 07:07 UTC

Add Comment

2018-06-29 A Project For One

In a different context and elsewhere, @linkskywalker gave some advice on things to do for a community. Here’s what he said, slightly edited such that it applies to any community, not just the specific community he was talking about:

Alright, you asked for my advice and thoughts, so I’m gonna give ’em to ya. Gonna give ’em to ya hard. Forgive me for being repetitious.

I like your idea. I think it’s a good idea. The community has needs, you want to fill those needs, and that’s good shit. I need for you to succeed, and that’s why I want you to scale that shit back.

Do something small. Do something sustainable. Don’t expect people to help you, but leave a window open for people to help you. If you start with focused intent, and manageable goals, then you’ll be able to see this through no matter what happens.

Bigger projects work because they got money. We don’t have money. Money is not the resource we’re operating on here. Time is what we have to spend, and you can only spend your own.

A small, consistent good is better than a big, short-lived good.

It seems like there’s a lot of things you want. All of these things are good. I say: pick one of them. When I get the sense that what you’re most passionate about something then that’s good shit. Do that.

Do something that one person can do.

It’s also a goal that is clear and easy to understand. If you say “Hey guys, I’m trying to make the one grand mega site, does anyone wanna help me?” then nobody is gonna know what you fuckin’ mean. They’re gonna wonder “why should I write for this guy when I could just write for my own blog?”

If you say “Guys, I want to make a resource for new people, will you help me?” then people still might not help you, but at least they’ll understand what you’re doing. They’ll see how it has value as a stand-alone project separate from their individual blog, and will be more inclined to offer help.

I think this is excellent advice. It applies to so many individual efforts. Thank you for writing it.


Add Comment

2018-06-28 Murten

We went to Murten for a three day trip and I finally got around to picking a few pictures.


Comments on 2018-06-28 Murten

As always, some notes to myself. This time I created the album on the Mac. Sitelen Mute still seems to work!

perlbrew exec --with perl-5.22.0-thread-multi ~/src/sitelen-mute/sitelen-mute -f --title "Murten 2018" --description "Wir haben ein langes Wochenende in Murten verbracht." --url https://alexschroeder.ch/gallery/2018-murten/ /Volumes/Data/Pictures/Fotos\ 2018/Murten/Album/ 2018-murten

rsync --progress --recursive -e "ssh -p 882" /Volumes/Data/Pictures/Fotos\ 2018/2018-murten alexschroeder.ch:alexschroeder.ch/gallery/

– Alex 2018-06-28 11:45 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 this page if you need to fix typos. You can subscribe to updates by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.

Referrers: frothsof D&D Diary Strange Magic: B/X D&D and Armor Alex Schroeder 🐝 (@kensanata@octodon.social) - Octodon Diary Gothridge Manor Dreams of Mythic Fantasy HERR ZINNLINGS ARBEITSZIMMER ZENOPUS ARCHIVES