feed link ali li literature clock

Found at: vernunftzentrum.de:70/ckeen/phlog/alilipona.atom

  ali li pona
    2022-03-23 - literature clock (~1 min. read)
could be done in a small shell script. 
Turns out it does:
#!/usr/bin/env bash
f [ ! -f "$time_file" ]; then
        curl $URL -o "$time_file"
        awk 'BEGIN {
                FS = "|";
                time = strftime("%H:%M") };
                sub($2, "\033[1m"$2"\033[0m",$3);
                res[results++]=$3"\n\n"$4" -- "$5 };
            END {
              print res[l]}' "$time_file" | fmt
        sleep 10;
Tell me about it!
[0]: https://literature-clock.jenevoldsen.com/
[1]: https://github.com/JohannesNE/literature-clock
    2020-11-09 - Living on the floor (~1 min. read)
As there is a new round of lockdown comming in, we re-arranged our
living room and moved the table to one side of the room, leaving a
~6m² area on the carpet free. We don't have a couch as we gave it
away years ago. We just did'nt use it.
First we wanted to have that room for doing yoga exercises and such.
What has happened though is that we are putting cushions and blankets
and a small coffee table there.
This has created a much more used and dynamic space than we have
anticipated. We are even thinking about trying to have meals there
and making it even more comfy.
We will see where this takes us. If you are part of a culture where
a lot of life is naturally happening on the floor anyway I am all
ears on how you use it and what kind of furniture you consider
    2019-12-18 - More smalltalk more gopher (~2 min. read)
Hey! I am still alive! And I have been going on onto some adventures
n smalltalk land. First of all, I have published an updated version
of squeaky[0] that includes some bug fixes like unbreaking displaying
mages again. But also one navigation UX issue.
This needs some small explanations though. I am misusing a Morph
(or Widget in other UI kits) called BookMorph which can be composed
of arbitrary other graphical objects on a page.  On the top there
are navigation buttons that allow you to move between pages, even
Squeaky uses one page per gopher request. Previously new pages would
you'd expect the forward and back buttons to behave like in a web
before to get back to that one gopher menu.
Well you used to, no more of this idle clicking! With this release
the pages following the current one will get deleted and the newly
clicked page is inserted.
Future work will include reload support and maybe a 'open in new
Thanks for reading and stay tuned for more gopher love!
[0]: gopher://vernunftzentrum.de:70/9/ckeen/gopher-smalltalk/Gopher-ck.4.mcz
    2019-05-05 - On building an audio player (~4 min. read)
Today I want to share my experiences in building an audio player for
a child that has not learned to read (yet). In the household we rip
CDs as a backup or borrow media from friends to listen to. Audio
So the idea has been to use a media playing device that blends well
nto a children's room, is easy to use without having to read. Does
not snitch on its user due to software out of our control and plays
back any audio file that's been fed to it.
As you may guess, a research for ready made players has made me come
back empty handed. So I have decided to build my own. Since I had a
But how should I design the interface? I have seen ideas of using
the player to make it select the media but that seems wasteful to me.
cards would probably get lost soon.
So I decided for a visual media selection mechanism by offering an
mage of the original CD cover, which means the device should feature
a display of some sort. Touch interfaces are right out as they don't
buttons as they provide a nice click and come in colors.
Volume should be capped off at a limit set by us, so the volume knob
s an actual knob stuck on a rotary encoder.
s just another sound card wrt the linux kernel, so no further action
from our side was required.
The device should be powered on and off by itself, so I added a pololu
the same button to do the turning on, and hooked it also to a GPIO on
the arduino to detect the power off. That in turn will shut down the
The display is a 3,4" HDMI display by waveshare which came in a
The housing has been designed in OpenSCAD and I consider it to be in
beta stage. The holes for the speakers are a bit off and the through
The player software itself has been a breeze to write. It's a
The best design decision has been to separate the event generation
from the actual event handling, so whether the player is designed by
keyboard or actual GPIO is a matter of switching a dispatch
Determining the state transitions of the player as well as the non
volatile config stathas been a bit trickier but all was done in a
couple of hours. Then the debugging happened for some more hours.
The most annoying part has been the GPIO handling of the buttons.
mechanism has fit in perfectly in generating the correct events for
the main event loop in my code.
BUT it seems there's a bug in the debounce parameter when using it
the buttons are properly debounced and show exactly the effect I
For the moment the device's wifi has been left turned on for
available under link below
Stay tuned, I will put up pictures of the finished device when I wake
up again.
    2019-02-04 - Programming arduinos without an IDE (~2 min. read)
So on my OpenBSD box there has been an arduino package that did not
use the Java IDE for programming an arduino or such clones. It came
make upload to programm your device.
But alas, the core libs have been outdated for quite a while. Running
cool libs like the fastled.io library was just not possible. Now the
makefile has been purged too!
After some poking I found the commit message of the port stating that
t now uses the arduino-makefile port, which is a general project for
building arduino code with a GNU Makefile.
This does include a 'serial monitor' and easy configuration, way
easier than before!
So a simple makefile for a fastled demo looks like this:
BOARD_TAG    = uno
USER_LIB_PATH = /home/ckeen/arduino/libs/
MONITOR_PORT = /dev/cuaU0
nclude ${ARDMK_DIR}/Arduino.mk
And I have cloned the fastled lib into my $HOME/arduino/libs before.
built automatically with a 'make upload'. This approach works nicely!
There are two caveats on OpenBSD / with arduino-makefile:
 - add yourself to the dialer group, for getting access to the
   /dev/cuaU0 device. 
 - the makefile does not do any preprocessing
   like the arduino IDE, so you will need to rearrange the sources
   of most sketches a bit to have the functions defined in the right
   order (or add forward declarations)
    2018-12-21 - the most embarrassing admin mistake (~3 min. read)
Today I have to share a rather embarrassing admin story that has come
to a happy end yesterday. I started running a small mailserver for my
favourite human 2 years ago. I have been using an OpenBSD VM with
opensmtpd and dovecot which I have documented in my old blog[0].
netcat on the smtpd port to check that it is still up and running.
However at one point digital ocean hosed my VM image, so I migrated
t from a backup over to vultr.com.
All is fine until the human started mentioning strange issues with
mails.  Some would not get delivered or be delayed for some *days*.
The sympthoms would always be the same: E-Mail is entered in a web
My test script didn't show any problem, the server was always
Yesterday a mail I have send would bounce and my script would
complain.  While checking into the issue I have noticed that the
nc mail.example.com 25 | head -n1 | grep  grep -q ^220.*OpenSMTPD
So this would check whatever the nameserver resolves it to.  BUT this
ts DNS records. So I have fixed the script to explicitly check for
BOTH address families.
And lo and behold it showed an error. I could not connect to the ipv4
address to reach the smtpd!
A YEAR without me noticing it. So I asked support to lift the ban
my national ID (which is illegal unless explicitly required by law
for v4 while on the digital ocean VM, I have since disabled spamd on
this VM but forgot about the pf filter rule redirecting traffic. So
after fixing that I finally got to receive mail via ipv4.
So my lesson from this: Tests matter, do them properly so you know
occasionally missing email. Also don't forget about your firewall
That's all folks. This is my most embarrassing admin story of the
[0]: http://pestilenz.org/~ckeen/blog/posts/opensmtpd.html
    2018-12-11 - Miscellaneous update (~3 min. read)
Dear reader!
my life since the last posts. For one I have intensified my under-
The current two poems are:
ali li pona.
ona li moku e kili
kili li ike
nanpa wan sike
la pipi lili li moli
Also besides that I am in the process to translate the children's
book 'Lauren Ipsum' [1] into german. I will probably ask some of you
for advice and proof reading but since this is most likely a highly
llegal activity under copyright law and others I will do it in
Another thing is that I have been keeping a looong reading list
use my lunch break to get done some reading. The work place features
But I don't have the time and energy to do a lot for that
'Muffin' and as soon as I learn how to publish monticello packages, I
transactions updating themselves life! It's magic!
Smalltalk is also the first environment where I have seen Test Driven
Development to actually work. I blame the tight integration of test
On a personal note I am no longer an amazon customer. Amazon has forced
me out of their service. A couple of weeks ago all my orders have been
flagged as suspicious activity. Noone could tell me why this has happened.
The same payment method has been working since I first bought from Amazon in 2000.
They suggested using a credit card as payment method, which I refused
and so they told me I could get pre-paid vouchers in shops instead.
So after getting that poor proposal I immediately cancelled my
The effects on that? Well I have found other resellers that will not
'amazon' written on it. My local bookstore gets books faster for me
than amazon. And for most stuff I don't pay shipping costs.
So thanks for that move Amazon, my money is probably spent better
elsewhere. And it is more comfortable too.
[0]: gopher://vernunftzentrum.de:70/0/ckeen/toki-musi.txt
[1]: https://www.goodreads.com/book/show/13073554-lauren-ipsum
[2]: gopher://cosmic.voyage:70/
[3]: https://github.com/tom95/Pheno
    2018-10-22 - Print if you need an envelope (~1 min. read)
My health insurance company has this service where you can print out
an envelope on A4 paper and mail stuff to them free of charge.
the office, so it is easier to print envelopes in these rare cases.
So I sat down and stripped off the company specific things with
nkscape and saved it on this server in case I need an envelope.
[0]: gopher://vernunftzentrum.de/0/ckeen/media/Briefumschlag.svg
[1]: gopher://vernunftzentrum.de/9/ckeen/media/Briefumschlag.pdf
[2]: gopher://vernunftzentrum.de/9/ckeen/media/Briefumschlag.png
[3]: gopher://vernunftzentrum.de/g/ckeen/media/Briefumschlag.gif
    2018-10-19 - Improvements to smalltalk gopher (~1 min. read)
Hey! I have been exploring Smalltalk a little bit more and found some
Squeak uses MacRoman (of all possible encodings!) as an internal
encoding and while you can specify an external encoding for files and
FilePaths… but you need to explicitly specify a conversion when you
use the bytes for displaying for example.
So to make a long story short, a simple #utf8ToSqueak added to the
message for reading in the data has made this work.
through the local tor socks proxy.
So grab the latest monticello package[0] and enjoy a little gopher
client in Smalltalk.
Start with:
   b:= GopherBrowser new
Go to a page directly with:
   b url: 'gopher://blackgviz2y4nhrd.onion'
As a side note: If you want to use the compose key to enter unicode
n the man page and it took me a while to find that.
[0]: gopher://vernunftzentrum.de/1/ckeen/gopher-smalltalk
    2018-09-21 - Georg Nees' Schotter for CHICKEN (~1 min. read)
antirez wrote[0] about an early piece of computer generated art:
Schotter by Georg Nees[1]. But why on earth use a database?  So I sat
formatted pdf, looking differently each run.
Our friend from the shoestringfoundation[3] wrote a version in
[0]: http://antirez.com/news/123
[1]: gopher://gopherpedia.com:70/0/Georg Nees
[2]: gopher://vernunftzentrum.de:70/0/ckeen/schotter.scm
[3]: https://pestilenz.org/cgi-bin/blosxom.cgi/2018/09/18#schotter
    2018-09-21 - Another Smalltalk journey (~2 min. read)
Smalltalk.  As I have described earlier[0] Smalltalk is a really
nteresting OO langugage with its own eco system.
This time I have been choosing Squeak[1] as my platform in
Thanks to krono[3] for all the help and codezeilen[4] for helping out
While the talk had the goal to give a small introduction into
Smalltalk I wanted to write some little program to get back into the
explorative development mode of Smalltalk writing.
So naturally I have implemented a small gopher client[5] that will
You can finde screenshots here[6] and here[7].
As always finding the right classes has been the biggest obstacle for
me. This time Squeak has been an even bigger target in terms of
classes as Cuis. That's ~2250 classes vs. ~550.
So after some unsuccessful attempts with just a TextMorph inside a
Scrollpane inside a PasteUpMorph, I finally settled with a BookMorph
So you will get a widget with history 'paging' (even with cheesy page
turning sounds!) for free. Which is excellent for implementing gopher
on it turned out.
The rendering logic has been written in an afternoon. Most of the
The next step for me is to learn how to really build a UI in
Smalltalk. Krono pointed me to the Toolbuilder classes and their
building spec and I have started to create a client based on my
nitial set of classes, this time refactored as a Smalltalk model. I
nsights about how this all really works and whether that's a good
fit for another ongoing project of mine.
Another issue is to learn how to do UTF-8 properly with Smalltalk /
Squeak and setup a proper code repository with my own gitd.  Learning
all the tools has been a challenging but pleasant experience. Also
the community in itself is very newcommer friendly and welcoming.
Stay tuned for further Smalltalk news!
[0]: gopher://vernunftzentrum.de:70/0/ckeen/phlog/2018-03-11-On-smalltalk.md
[1]: https://squeak.org/
[2]: gopher://vernunftzentrum.de:70/9/ckeen/smalltalk.pdf
[3]: https://toot.berlin/@krono
[4]: https://freehold.earth/@codezeilen
[5]: gopher://vernunftzentrum.de:70/9/ckeen/Gopher-ck.1.mcz
[6]: https://vernunftzentrum.de/media/e90c868d-594c-4cb6-bd16-47c55937b6f4/FirstMorph.png
[7]: https://vernunftzentrum.de/media/70e376da-0a5d-4405-b908-d2927c27f092/Book.png
    2018-08-23 - Hosting my own social media instance (~1 min. read)
Since a couple of days this domain also hosts a social media instance
for the ActivityPub Federation. The specific implementation is pleroma
the time to do it. Installing pleroma has been a breeze, it needs little
    2018-07-11 - A call for input (~2 min. read)
Hey there! As you may know already I am getting all hyped about the
zine making community and zines in general. The idea of a gopher zine
thing that I would love to do is to gently introduce the reading
Yes this probably is a long term project and I will be moving *very*
So for the first issue I want to give interested readers a showcase
of the gopher space. Which brings me to this post's title. I would
like to ask *you* to send me your favourite gopher link. Send me the
you so upset you started writing on your own. Send me ASCII art,
quotes etc you found in some long gone gopher hole but have a
(online) backup of.
n the first issue but I surely thinkg that there should be some room
for 'gopher gold' in each issue of the zine.
You can reach me via mail or social media as indicated on the root
menu of my gopher menu.
Looking forward to hearing from all of you!
    2018-07-10 - How to fold a zine (~2 min. read)
This short guide will tell you how to fold paper to have a 8 page
zine ready for photocopying and distribution. You will need a big
zine pages.
So take the A3 paper:
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
fold it in half on the short side:
|                |                |
|                |                |
|                v                |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
Then fold it in half on the long side:
|               |                 |
|      -->      |                 |
|               |                 |
And again:
|  -->  |       |
|       |       |
Now fold it all back up, the folding marks are our page guides:
|        |        |        |        |
|   6    |   5    |    4   |    3   |
|        |        |        |        |
|        |        |        |        |
|  back  | front  |   1    |   2    |
| cover  | cover  |        |        |
Now cut the %%% line above with your scissors.  The numbers are
your page numbers. Fold on the short side one more time, and make
the inner folding lines face outward. If you look at it from above
t should look like a cross:
= = 
The 'V' part will be your front cover on the left side and your
first page on the right. So now you fold the cross clockwise starting
from the left '=':
| A -+
=   =v
Now you should have pages in the numbered order above. Use this as
your master copy and draw, glue and write in your content. After
you are satisfied you can fold it right up and put the sheet onto
a photocopier to make your distribution copies.
No go forth and make zines!
a look at the zine tips[0] on this server! Also have a look at the
zine wiki[1]!
[0]: gopher://vernunftzentrum.de/0/ckeen/zinetips.txt
[1]: http://www.zinewiki.com/Main_Page
    2018-06-14 - Freeing a Lenovo X200 (~2 min. read)
This laptop is a bit dated by modern standards but it is roughly the
the battery is dying on my current one, getting the replacement up to
So what's libreboot? It is a distribution of coreboot, a free BIOS
mplementation for amd64/x86 machines. Coreboot is mostly present in
Google chromebooks but can be installed on a small selection of older
laptops as well.  The X200 is one of them. Libreboot is now special
n that it disables the spy chip aka Management Engine (ME) by
To install the new BIOS one needs to obtain a special clip for the
flash chip and use an external programmer. In my case I have used an
Raspberry Pi 1b.  The instructions I have been following are here[1]
and on the X200 page[3]. The only thing to keep in mind is that the
flash needs roughly 400mA of power so use a proper power supply for
the raspberry.
For the X200 one needs to adjust the image as it contains the
contains a default MAC. I did this without editing the MAC and booted
a linux system on a USB stick to add the modification later.
framebuffer console does get a litte distorted during mode switches
but maybe that gets fixed in later releases.  The only downside is
that the grub2 payload does not support OpenBSD's cryptoraid, so full
One thing I forgot during the OpenBSD installer is that the firmware
for the intel wireless is not included in the install CD so I had to
The X200 is now running on a SSD and it is super quiet, light and
[0]: https://libreboot.org/
[1]: https://libreboot.org/docs/install/rpi_setup.html
[2]: https://libreboot.org/docs/install/x200_external.html
    2018-06-13 - The Timeless Way of Building (~5 min. read)
During my vacation I came to read Christopher Alexanders excellent
book "The Timeless Way of Building"[0]. It describes (the following
s oversimplified) a generative way of describing architecture so
that the built results are places where people enjoy being in, they
attached to them that make them beautiful, practical and enjoyable.
boring, depressing. One reason for this according to Alexander is the
missing connection between the architect's pattern langugage and the
Old buildings seem to connect all people involved to create a thing
that's unique and built specifically to meet the needs and
nterpreting the patterns and adapting their variety to the local
needs. Hence all parties need to be involved.
So this seemed to have inspired people to carry the notion of
nvited to give a keynote speech on OOPSLA 1996 [1].
There one finds that both parties Alexander and the SW community
aren't on the same page. He gives the following caveat in his speech:
   When I look at the object-oriented work on patterns that I've
   seen, I see the format of a pattern (context, problem, solution,
   and so forth). It is a nice and useful format. It allows you to
   write down good ideas about software design in a way that can be
   discussed, shared, modified, and so forth. So, it is a really
   useful vehicle of communication. And, I think that insofar as
   patterns have become useful tools in the design of software, it
   helps the task of programming in that way. It is a nice, neat
   format and that is fine.
   However, that is not all that pattern languages are supposed to
   do. The pattern language that we began creating in the 1970s had
   other essential features. First, it has a moral component. Second,
   it has the aim of creating coherence, morphological coherence in
   the things which are made with it. And third, it is generative: it
   allows people to create coherence, morally sound objects, and
   encourages and enables this process because of its emphasis on the
   coherence of the created whole.
   I don't know whether these features of pattern language have yet
   been translated into your discipline.
So apart from the benefit of being able to reason about design using
And this is were the metaphor is ending for software, even today.
There is hardly any moral aspect in today's design language. The UX
folks have a start when discussing manipulative or deceptive design
but there aren't any patterns for good design so far.
The patterns don't strive for coherence with the things they are made
And noone really cares about the generated whole. Maye in closed
come to mind). But with ubiquitous web interfaces this is not the
case anymore.
Also another pattern langugage rule that's violated with software
understood by anyone. If it is not easy to tell people orally, it's
not a pattern. I think the design patterns that fill our bookshelves
Maybe they are too low level. Hardly anyone trying to get work done
Also Alexander argues that to test a pattern language one should
evaluate those to fitness of the requirements. I am not aware of any
methodology in SW design that does this. SW patterns are somewhat
to check whether the whole design will make sense.
We need an easier language to describe our designs and design
about design in software.  How should a language like this look like?
Who should be formulating the requirements?
them and the users. This has been said many times of course and
ncludes software design. So the next step in our evolution would be
to relearn a language that allows us to formulate designs in a way
other humans will understand and are able to evaluate.
Much like everyone used to be able to tell a builder what a good
necessary technical details and choose the tooling but the outcome
needs. If needs change tools must change too. Like moving into
another building or rebuilding a house to fit the new needs of a
contribute to a better software world too.
[0]: gopher://gopherpedia.com/0/The%20Timeless%20Way%20of%20Building
[1]: http://www.patternlanguage.com/leveltwo/archivesframe.htm?/leveltwo/../archives/ieee/ieee.htm
    2018-05-14 - Opening up for residents (~1 min. read)
Hi all!
 * static gopher hosting
 * access through sftp
 * access through a tor hidden service
This is a voluntary effort, so please take it easy :) All content
must be legal under the German legal framework.
Just ask me for an account and send me your ssh public key and we
and I will walk you through the necessary tiny steps.
    2018-05-14 - Handwriting (~2 min. read)
This is probably due to my need to improve speed to keep up with the
class. It has never been clear to me at the time though.
So after all these years I try to recultivate -- that probably means
at all.
Where does all this interest to handwriting stem from all of a
fun, I use a technique called sketch notes[0].
While learning to structure the notes with graphical elements is a
fun process the underlying problem is still evident: My handwriting
So I will work out and retrain my handwriting. I already have found
So there's a nice list of resources on the handwriting reddit[1]. I
especially like the 'Better Handwriting for Adults'[2].
As all crafts this needs physical practise. There are some nice
for your notebook[4].
So I invite you -- my dear reader -- to join me on this journey of
mproving the handwriting.
[0]: http://rohdesign.com/sketchnotes/
[1]: https://www.reddit.com/r/Handwriting/
[2]: https://www.nala.ie/resources/better-handwriting-adults
[3]: https://www.printablepaper.net/category/penmanship
[4]: http://www.wellappointeddesk.com/2014/05/turn-a-blank-notebook-into-a-lined-notebook/
    2018-04-27 - Holymoly fixes (~1 min. read)
The past few days have seen me committing a couple of fixes to
through a SOCKS5 proxy (tested with tor).
The most embarassing mistake I made has been fixed just today. The
tomasino's[1] phlog, which runs on motsognir[2].
There I would only see half the content I have expected then the
connection would close. Turns out I am too blind to see the forest
for the trees. The kind people on #chicken have show me the error[3]:
Sending \n\r instead of \r\n for the selector line ending didn't
So thank you all for listening to my whining, I can carry on to make
[0]: gopher://vernunftzentrum.de:70/1/ckeen/repos/holymoly
[1]: gopher://gopher.black/1/
[2]: gopher://gopher.viste.fr:70/1/projects/motsognir
[3]: gopher://vernunftzentrum.de:70/1/ckeen/repos/holymoly/commit/97785e927c073a76cee25dc3b35fdc8baaa2ef9a.gph
    2018-04-17 - Setting music sheets (~2 min. read)
Over a decade ago I needed to set some songs into nice music sheets
for our wedding ceremony.  At the time there was Lilypond[0] which
music instead.
As it turns out, there is a notation standard that is easy to quickly
enter music into a computer called 'ABC notation'[1]. And there's an
accompanying program that turns this ASCII notation into postscript,
fittingly called 'abc2ps'.
This fine program has been written by Matthias Methfessel[2] and I
Unfortunately modern C compilers have been a bit too picky and it
causes a segfault on my modern machines.
The abc programs seem to have originated and used in the Celtic music
community and have been popular amongst back pipers as the history
As an example have a look at 'The rocky road to dublin'[5] in the
Sorry for the earworm...
[0]: http://lilypond.org/
[1]: http://abcnotation.com/
[2]: https://web.archive.org/web/20080212005024/http://www.ihp-ffo.de/~msm/
[3]: http://trillian.mit.edu/~jc/music/abc/doc/ABCtut_History.html
[4]: gopher://vernunftzentrum.de/1/ckeen/repos/abc2ps.git
[5]: https://en.wikipedia.org/wiki/Rocky_Road_to_Dublin
[6]: gopher://vernunftzentrum.de/1/ckeen/media/index.gph
    2018-04-13 - Re:1436con (~1 min. read)
The fine folks solderpunk and tomasino have brought up the idea for a
virtual 'conference' on gopher. In his latest post[0] tomasino
their talk/video/contribution and a central place for comments.
This really reminds me more of a game jam / IF competition thing. I
mean we are constantly creating content and most of it is about
time pressure to produce something that's worth discussing on a
broader audience or to bring more people together that previously
new application ideas and admin advice, etc…
tomasino, you should just announce a CFP and we spread the word :)
For the record, the name should be 1436con, providing content since
[0]: gopher://gopher.black:70/1/phlog/20180412-port-70-or-1436con
    2018-04-09 - Dealing with rogue crawlers (~3 min. read)
Today I got hit by a crawler that thinks indexing all of my stagit
Now I am unsure about the usefulness of a robots.txt file, if someone
volume limit is not hit by it let them access my selectors.
But I have seen a lot of spiders creating selectors that aren't
valid. And I think one needs to deal with this properly. I am
mplementing the following steps:
   * Add a pf(1) table for greylisting protential spammers
   * Add some tarpit selectors that will trigger another check check
   in the table whether the calling IP is in the greylist.
   * If the calling IP is in the greylist, and is hitting a bogus
   selector again, move it to the blacklist
   * Blacklisted IPs will get blocked from the system entirely for X
   * The tarpit daemon will slowly respon to each request with a huge
   potentially never ending text file stating some explanation and
   then hang up
   * A cron job will clean up the blacklist after a while.
So how to do this with pf(1)? Turns out to be quite easy:
   table <spammers-black> persist
   block in on egress proto tcp from <spammers-black> port 70
The entries can be filled with pfctl(1), I am using a simple script
called update-pf:
   # pfctl -t spammers-black -T replace /
And deleted with the '-T expire <seconds>' command. The former will
be done within the trap cgi and the latter in a cronjob. Note that
this script is for geomyidae, other servers do not provide
REMOTE_ADDR. Check the documentation (or better source!) of your
The CGI:
f [ "$?" -ne "0" ]; then
	echo "$REMOTE_ADDR" >> /var/gopher/greylist
	sed -i.bak "s,$REMOTE_ADDR,,g" /var/gopher/greylist
	echo "$REMOTE_ADDR" >> /var/gopher/blacklist
Gopher tarpit is just a dump slowly sending program, you can use
anything really. Adjust the server settings to your need please.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
char message[] = "i\tHi this is a tarpit...\tInfo\tvernunftzentrum.de\t70\r\n"
	"iFollow any of the links below or this selector again, and you will be banned\tInfo\tserver\tport\r\n"
	"1Some uninteresting content (do not follow!)\t/pit/\tvernunftzentrum.de\t70\r\n"
	"1More uninteresting content (do not follow!)\t/pit/\tvernunftzentrum.de\t70\r\n"
main (int argc, char **argv)
	size_t l = strlen(message);
	for (int i=0; i<l; i++) {
	return 0;
On OpenBSD not everyone can alter the packet filter config, so I put
the pfctl call into a script and allow this in doas.conf:
With that you hit up the rogue crawler, let's free the ip again:
So this sums it up for this little proof of concept. Please don't
t really is necessary. If it is, you now hold the seed for a cure to
your problems.
Thanks for reading!
    2018-04-06 - Irc client improvements (~1 min. read)
can stop the feature creep soon though :)
[0]: gopher://vernunftzentrum.de:70/1/ckeen/repos/irc/log.gph
    2018-04-05 - Plan 9 nuggets The rc shell (~2 min. read)
Today I want to show you a real gem that has been developed by Tom
Duff[0]: The rc shell.  It is the only shell (by default) available
for plan 9. It features a bourne shell like syntax but offers a much
cleaner syntax.
   * Variables are list of strings by default and subscriptable: You
   can write things like '''athing=(foo bar baz); echo $athing(1 1 3
   2)''' which gives 'foo foo baz bar'.
   * String contatenation is (almost) explicit: You use the caret ^
   * You need to enclose everything containing spaces in ''. You
   escape a ' by writing ''. No backslash hell.
   * Pattern matching on variables with ~
   * switch statements look like C, but work without break. Funnily
   this means that Duff's device does not work in this shell :)
   * Pipeline branching: You can feed the output of separate commands
   into pipes with '''<{command}''' (or '''>{command}''')
   * Sane syntax for I/O redirection: You give it the file descriptor
   number: '''make [2]> warnings.log [1]>build.log'''
     Or grep the stderr with '''strace foo |[2] grep open'''
   * Some of the functions you have gotten attached to are missing
   but can be replaced easily. For example there is no read builtin.
   But here's the replacement:
      fn read{
         $1=‘{awk ’{print;exit}’}
All this and more can be found in the rc paper[1] describing the
tools like ii[2]. There is a port to modern unix available[3] just
uses autotools. Oh the irony...
[0]: gopher://gopherpedia.com:70/0/Tom Duff
[1]: http://doc.cat-v.org/plan_9/4th_edition/papers/rc
[2]: https://tools.suckless.org/ii/
[3]: https://github.com/rakitzis/rc
    2018-04-05 - Ed Mastery: A review (~3 min. read)
    "In this bleak age when search engine algorithms dredge up
     shoddily-assembled HOWTOs and pass them off as authorative
     documents, providing for the next generation of sysadmins
     is one of the most vital tasks that we face as profession."
                              -- Michael W Lucas, 'Ed Mastery'
Michael Lucas has always had a lucky hand (or he's listened close
enough to people) for books that are really needed. I fondly remember
first books giving a detailed description of how to run OpenBSD
So on April 1st Michael has released the latest of his dozen or so
books on IT 'niche' topics: Ed(1). Carefully picking the release date
almost caught me off guard and I disregarded it as yet another (bad)
april fools joke. But luckily tomasino showed me it was real.
following Michael on mastodon I think the backstory to it is this: He
been even pronouns with randomly chosen gender, I do not remember
So this book has been offered in a snarky move as the edition for
'normal' people featuring female pronouns, because there are a lot of
nice and brilliant female IT professionals.
And in response to the critics there is a 'Manly MacManface' edition
that uses male pronouns only and is slightly more expensive.  A not
So all shenanigans aside, let's get to the book: The tone is set
quote above. However who could be too serious when talking about
ed(1). While ed(1) is really simple and *really* available on every
unix system out there, it sure is nothing one would write a book in
While I do not know Michael has written this book, I use ed(1) now to
and indeed a powerful text editing engine. The editor sam owes a lot
of its ideas and customs to ed.
Also don't let yourself be fooled by the informal tone of the book!
Michael did his research and knows his stuff. It is a comprehensive
book about the unix standard editor including advanced topics such as
ed's regexp commands and how to script ed.
n the concepts that drive a lot of unix machinery we now take for
b) and many others including my beloved sam.
The book's price is probably cheaper than your lunch at work, fun to
Go and get Ed Mastery!
compensation for this post (apart from scolding that I get it all
[0]: https://www.michaelwlucas.com/tools/ed
    2018-04-04 - Less logging (~1 min. read)
adding statistics to my service.  This serves for 2 things. I get to
know whether some rogue service or indexer is hammering my site, I
At the same time I don't want to keep too much data about you. I
To make this process transparent, I have added a logging policy
Let me know what you think!
[0]: gopher://vernunftzentrum.de/0/ckeen/tools/mail-stats
[1]: gopher://vernunftzentrum.de/0/ckeen/tools/stats.awk
[2]: gopher://vernunftzentrum.de/0/logging-policy.md
    2018-04-03 - VCalendar handling in mutt (~1 min. read)
My coworkers use outlook a lot to handle meeting dates. This is
Today I got so annoyed that I wrote a little awk script:
#!/usr/bin/awk -f
/^SUMMARY/   { FS=":"; summ = $NF }
/^LOCATION/  { FS=":"; meet = $NF }
/^DTSTART/   { FS=":"; 
				n = split($NF, date, "T"); 
				date_st = sprintf("%s-%s-%s", substr(date[1], 0,4), 
								substr(date[1],5,2), substr(date[1],7,2)); 
				time_st = sprintf("%s:%s", 
								substr(date[n],0,2), substr(date[n],3,2)); }
/^DTEND/     { FS=":"; 
				n = split($NF, date, "T"); 
				time_nd = sprintf("%s:%s", 
							substr(date[n],0,2), substr(date[n],3,2)); }
END          { print date_st" - "summ,"\n",time_st, "-", time_nd,meet"\n" }
This works nicely. I have this in my .muttrc:
auto_view text/calendar text/html
alternative_order text/calendar text/plain text/html
And in my mailcap I added:
text/calendar;	vcalendar2txt %s; copiousoutput
The copiousoutput part tells mutt that it is non-interactive (amongst
The awk script is a bit ugly, I guess one could move the redundant
How do you deal with the enterprise IT horrors?
    2018-03-30 - IRC minimalism (~1 min. read)
As I have mentioned earlier I am using irc.c now. As it seems quite
usable for me, I have added small fixes and uploaded the repo[0] to
this server.
nick changes in the right window and you don't see people leaving due
to QUIT messages.
lists in channels (yet).
network will pass the channel name in the data part of the JOIN
message so irc.c wouldn't ever show joins on that network...
Also I cannot figure out how to detect reserved nicknames on nick
changes on networks that have NickServ services. Maybe you -- dear
[0]: gopher://vernunftzentrum.de:70/1/ckeen/repos/irc/log.gph
    2018-03-29 - Posting guidelines (~1 min. read)
'posting guidelines' in their gopher tutorial section[0]. I think such
nformation is still missing and they have started a nice repository
containing a lot of useful information.
As a unreviewed preview have a look here[1].
Once all this gopher centric topics are out of my head I will
continue my journey towards simplifying my electronic life.  The days
missing is highlighting and maybe search. The latter could be done by
an external tool, Maybe I should use a special "channel" window for
[0]: gopher://bitreich.org:70/1/tutorials
[1]: gopher://vernunftzentrum.de/0/ckeen/tmp/publishing-guideline.txt
    2018-03-28 - Minimalistic irc (~1 min. read)
a defunct sic[0] biary in my ~/bin that's been a leftover from long
ago, so I thought about using a more minimal IRC client.
today's little time to hack in topic support and nick changing
s reserved' messages. But I will see how this will work in practise.
The code size is small and there are no shenanigans added. Also it is
The official feature list is:
    infinite scrollback;
    automatic reconnection;
    utf8 support (inputting is still to do);
    line editing (emacs like keybindings);
    activity markers;
    terminal resizes (inside an xterm). 
	Nick change detection for one self
	Channel topics
Well if any more of this is missing one can always send raw commands
to the server. If this becomes more useful I'll put it up on the repo
So long!
[0]: https://tools.suckless.org/sic/
[1]: https://c9x.me/irc/
    2018-03-27 - Gophermaps and item types (~2 min. read)
While reading through my phlogroll[0] I noticed that some authors
misuse the menu item for whole posts. The text is written with
nformational ('i') items, while the links are regular selectors. At
first I thought: "Well this is nice, people can just follow the
bad idea in general.
This is probably the equivalent of using tables for layouting the
view on a choosen set of selectors. Selectors in gopher are really
flat and without hierarchy although a lot of servers use slashes '/'
as hierarchy markers. It's the directory item that imposes a
easy to find and navigation should be simple.
through dozens of basically empty hierarchy directory listings before
organisations clearly trys its reader's patience.  A better phlog
example would be one that has a directory showing the last 5 posts,
then a directory showing all posts or sorted by month.  The user gets
to the interesting content fast.
A side effect of the selectors having no hierarchy: You can easily
modify your directory entries, the selectors to the actual content
to archive pages is just a modification in the directory entries, no
Now as I said in another post[1] crawlers should traverse and index
Therefore I have decided to keep simple files as my post items. I can
Keep it with the spirit of RFC-1436. Keep it simple!
[0]: gopher://vernunftzentrum.de:70/1/ckeen/sites.gph
[1]: gopher://vernunftzentrum.de:70/0/ckeen/phlog/2018-03-25-Gopher-crawlers-and-robots.txt.md
    2018-03-25 - Gopher crawlers and robots.txt (~2 min. read)
Fellow gopher poster kichimi[0] has started a little online
nvalid requests.  If I understood the situation correctly this
are an admin of an open gopher proxy I would suggest you add a line
to your robots.txt file to prohibit crawling of the proxy as a whole.
(rate) limits. I have learned that even veronica obeys a robots.txt[1].
adding rate limiting in the packet filter myself if problems show up,
but anyone is free to read everything on here. Of course I don't have
Also I think for gopher, menu crawling is the way to go. There's no
files. After all we build human scale software here[3] and all the
[0]: gopher://kichimi.uk:70/1/
[1]: gopher://gopher.floodgap.com:70/0/v2/help/indexer
[2]: gopher://kichimi.uk:70/1/software
[3]: https://tilde.tinyserver.club/~jkriss/writing/human-scale
    2018-03-24 - Toki pona spell checking (~1 min. read)
This has happened a month ago but I'd like to share it with you
today.  I have been wondering whether it is possible to add a toki
turns out that it is not hard at all, if you know the file format.
Fortunately I have found a blog post[0] that explains the steps.
Hence you can find a hunspell compatible toki pona file here[1].
[0]: https://www.suares.com/index.php?page_id=25&news_id=233
[1]: gopher://vernunftzentrum.de/9/ckeen/files/tokipona.tgz
    2018-03-23 - Converging to a Plan9 ui (~1 min. read)
Today I have added a small patch to my sam installation that fixes
ssues with locking sam instances.
Triggered by rain[2] I stole the old rio mouse pointers and put them
nto dwm[3]. It's an ugly hack and I am not sure about license
compatibility but there it is.
On the hobby side, I have received a new keyboard PCB. It's a XD60
from desk candy. I am still looking for a proper case for it. My
nitial idea has been to replace the more closed vortex poker PCB and
[0]: https://github.com/deadpixi/sam/issues/62
[1]: https://github.com/deadpixi/sam/issues/55
[2]: https://cybre.space/@grainloom
[3]: gopher://vernunftzentrum.de/0/ckeen/tmp/0001-Add-9wm-cursor.patch
    2018-03-22 - Phlog feedback (~1 min. read)
Yesterday's post has been broken due to the handling of selectors in
file so it contained '..'. This in turn resulted in geomyidae
traversal attacks. I have fixed my post file name and sent a patch
that fixes the behaviour upstream to _20h_.
After a little discussion we settled on a small patch that
'..'. It's better to fail loudly here and being smart is something
left to the web.
On the bright side, this has been brought to my attention several
times by you, dear reader. Thanks for contacting me through the
various channels.
This has been a real motivation boost for me.
    2018-03-22 - Now on gopher campaign (~1 min. read)
mundane things such as getting your content to your readers in a
Go ahead and use this on your (old) http blog, (anti-)social media
and so forth. Spread the gopher goodness. Get people to make
Go phorth!
[0]: gopher://vernunftzentrum.de/g/ckeen/media/nowongopher.gif
[1]: gopher://vernunftzentrum.de/0/ckeen/media/nowongopher.txt
    2018-03-21 - I've lived in emacs,now I am leaving (~1 min. read)
years.  In fact I have been living in emace for most of my work time
the last decade. However I am finding myself using emacs less and
less as an editor in favour of sam.
The last bastion has been mail (of all things!) which I have replaced
now with neomutt with its notmuch integration.
Maybe I am tired of editor wars.
The only move to win is not to play. Use sam!
    2018-03-20 - On sharing in the maker community (~2 min. read)
Today I want to share an observation I have made over the past years.
There's a certain mindset present that is reluctant to share source
files. There are thousands of STL files on thingiverse[0] for
example. But hardly anyone does release the files these STLs where
asking around for the source files of the firmware and the innards of
the casing. Although it turns out the word clock grid and backplanes
And I wonder why that is. I come from a SW hacker background and here
more natural to share compiled hex dumps or blobs.
Also the future you may forget the exact steps on how you created
your files, so documenting that and *sharing* that ensures that your
dea will still be alive tomorrow. With an open mindset this is at
least possible.
like the GPL here. It prepares people to show their work for everyone
to see. Not just the finished thing but also the steps towards that.
So please build your things in the open. You are not the things you
build. Noone will judge you by your thing's source code.
Also if you use free software tools I will love you even more,
because that means I will be able to tinker with your creation in the
future as well.
Also there's the Right To Repair[2] movement that encourages
longlivety of devices and the ability of the owners to repair their
Our current afairs could be so much better if we reclaim the ability
to fix our stuff ourselves.
And in the maker community I see no excuse to not follow this path.
[0]: http://thingiverse.com
[1]: http://wiki.fablab-nuernberg.de/w/Ding:Leuchtgitter (german only)
[2]: gopher://vernunftzentrum.de/0/ckeen/media/repair-manifesto.gif
    2018-03-19 - My phlogging routine (~1 min. read)
By now I have streamlined my process of posting here a lot. I don't
even log into the phlog server anymore. Instead I start a remote sam
terminal on the server, then run 'B < ../tools/newpost.sh A new phlog
title' which creates the template and opens the file for me in sam to
edit. I do my editing, then marking the text and run the |fmt -w 69
command which pipes the selection into the given fmt(1) and replaces
the selection with the result. Then save the buffer and run !
../tools/publish.sh in the command buffer completes the publication
The indices and the atom feed get recreated. A new post is born!
    2018-03-19 - Build a new wordclock (~1 min. read)
Yesterday I got a day off usual chores and joined a 'word clock'
afternoon and the result after 5 hours of soldering, cutting and
talking to the others I hold a nice word clock in my hand.
time is displayed using words that are lit through leds behind a
Mine has RGB leds and a RTC and is controlled via a IR remote.
time with the remote in case the support battery is dead or DST comes
and goes.  I also don't like the fact that the software on it does
not adjust the brightness of the leds.
So my current plans are to add a photoresistor and a DCF77[1] module
to it, so it will adjust itself properly in the future.
Also I still have some DHT sensonsr laying around so why not display
the temperature upon request?
So many things to do build, so little time.
[0]: http://www.instructables.com/id/Word-Clock-2/
[1]: https://en.wikipedia.org/wiki/DCF77
    2018-03-19 - Atom feed for this phlog (~1 min. read)
the phlogosphere. This has already been countered by jynx[1] listing
t is to generate an atom feed for a reader.
Of course it turns out that it is not difficult at all. A small shell
tells me, that it's a valid feed, so it should be ok. Ironically
their validator works with http URIs only...
menu, but maybe moku-pona can make use of this feed mechnanism?
[0]: gopher://sdf.org:70/1/users/sysdharma/phlog/./2018.03.18
[1]: gopher://sdf.org:70/1/users/jynx/dat/20180318.post
[2]: gopher://vernunftzentrum.de:70/0/ckeen/phlog/alilipona.atom
[3]: gopher://alexschroeder.ch:70/12018-02-05_Moku_Pona/menu
    2018-03-17 - Continuity (~1 min. read)
quickly enough to do some real writing soon!
ale li pona!
mi tawa!
    2018-03-16 - Sitelen pona toki pona glyphs (~2 min. read)
So since last time, I posted about toki pona[0] not a lot has
me new groups on memrise for learning toki pona. And by accident I
can now read the original toki pona writing system as created by toki
minimalistic language. But I am pleased to say that it's not the only
one. Besides sitelen pona[2], there's also sitelen sitelen[3] and
other peopla have made up their own[4] styles[5] and even a font[6].
easier than I have expected. I guess it does get easier if you know
the words already and now only have to match up the glyphs to the
nown vocabulary.
As a side effect I get to know the words better by themselves and
these lessons do come with audio snippets, which makes it also easier
to recognise the glyphs quicker somehow.
vocab for 'clown'? How do you translate little red riding hood? Or a
favourite quote by your favourite author?
Simplicity enforces polarisation and clearness amidst all the
mi tawa!
[0]: http://tokipona.net/tp/default.aspx
[1]: https://mastodon.art/@RussSharek/99686159552524884
[2]: http://musilili.net/wp-content/uploads/2017/03/LinjaPona_Presentation-01-01.jpg
[3]: http://www.jonathangabel.com/projects/t47/index.html
[4]: http://tokipona.net/tp/Tengwar.aspx
[5]: http://musilili.net/sitelen-sitelen-remastered/
[6]: http://musilili.net/linja-pona/
    2018-03-15 - The lack of layout (~2 min. read)
After yesterdays post[0] I have received feedback[1] on mastodon
layout language. This effort runs under the tag #gopherine[2] and
looks like a new client based on the ideas of gopher. I have not seen
anything else than the screenshots posted there and I have got mixed
feelings about this. From the (lack of) description I cannot tell,
all one can serve HTML documents over gopher just fine.  Or one can
allow one to add pictures to text and with meta info one could also
So if you come up with another markup, maybe checking whether it is
you are adding value or just ballooning old features into a new
Still with all that said I think it's good and nice to see
alternative experiments with formats and forms. It is still better
than just complaining and may reveal some core features that are
valuable and need to be preserved.
[0]: gopher://vernunftzentrum.de:70/0/ckeen/phlog/2018-03-14-What-about-a-simple-degrading-web.md
[1]: https://a.weirder.earth/@bb010g/99684275372391629
[2]: https://a.weirder.earth/tags/gopherine
    2018-03-15 - Post tooling improved (~1 min. read)
The key is a listpost script that outputs gophermap entries for each
latest 10 entries for the phlog index page.
Also I have edited the old posts to reflect the common layout I am
now using. The old selectors are still valid, so all your gopher URIs
Thanks for reading and all the best!
    2018-03-14 - What about a simple degrading web (~4 min. read)
Last night on mastodon...
User Are0h[0] posted in a rather tongue-in-cheek manner:
   I'm gonna be honest. These 'turn off JavaScript, no css' cats get
   on my last nerve.
   The web is a beautiful platform that has allowed us a fantastic
   medium to share and express data.
   There a places that abuse this privilege, but everyone has the
   freedom to choose not support places that do.
   Wanting to reduce the web to a text renderer because one doesn't
   like a handful of sites is ridiculous and childish.
   If you just want text, go read a book. Enough already.
things. First of all there's 'the web'. A conglomerate of separate
On another development thread, people misued the semantical markup of
HTML for typesetting and layout purposes (tables anyone?). That has
been countered by yet another layer of indirection, namely CSS.
On top of these documents on some of these servers whole applications
the client side of the connection.
This is done via Javascript mostly these days (used to be Java then
Flash, now JS...). The javascript used to be, well, just scripts.
Tiny little add ons on your document to be somewhat helpful for the
user (validating input up front, catching some kind of commands from
the browser, etc.) At this point in time the document still was the
central piece.
Fast forward a view years.
Now there are a lot of sites that will hand the client an almost
empty document and requires JS code to be run which in turn creates
the document on the fly. This makes the client now an arbitrary code
executor that downloads and executes code and does the UI part of the
Apart from the obvious security impact of running arbitrary code from
any source, there are additional downsides: Most sites don't host the
code parts themselves. Instead they just point to 3rd party places
and tell the client to download this snipped of code here and there
to build the desired program. Mostly speed is the argument for this
fragmentation of code.
Entering Ads. Advertisement has been the major player in monetarising
the web pages. In the past there have been pictures with links to the
advertiser that have been embedded in some part of the webpage. Now
those ads themselves depend on their own army of javascript code...
Those are typically hosted on ad networks and the original owner of a
the page.
All of this complexity has its cost. Webbrowsers have bugs,
containing a code execution environment and preventing it from
accessing arbitrary code is hard. Also just the mere possibility to
So I do think, that there are legitimate reasons to switch off
been working without JS but stopped to lately. And I guess a lot of
My guess is that in Are0h's world there are no documents to be served
anymore. Everything is just an application written for a execution
environment called a browser for historical reasons.
And yes, I prefer the document view of things. For a lot of these so
called web applications I don't need an application at all. I want to
access information in a uniform manner. And if I am using a funny
fonts, thanks and I don't want to be tracked and abused by ads and
other analytics software.
So I don't want to turn 'the web' into a text renderer. I want it to
majority of players don't serve my interests and don't respect my
So I guess I'll go and fetch my books now...
[0]: https://playvicious.social/@Are0h/99678576709515025
    2018-03-13 - The funny + gopher menu item (~1 min. read)
This is a short note about the '+' mirror menu item in rfc1436. I was
Also I haven't seen any server making use of this item.  It could be
used to back up data while pointing to the primary site. Or it could
be a 'CDN' and a fallback for popular selectors.
There must be a valid use case for this somewhere...
    2018-03-12 - Sam questions (~1 min. read)
After reading the sam tutorial again to improve my sam foo, I opened
up deadpixie's sam[0] clone's issue page on github.
command, which I have never used and always misread as being the same
as ^. See the cheatsheet[2] for a comparison.
So I sat down and after a short while came up with a small patch[3]
that implements this. But what should the end of line address look
like? In the cheatsheet it is the same as the end of file address '$'
but how does sam distinguish between them?
cloned the plan9port repo[4] to be sure. Nothing. Then I checked the
know tomorrow maybe.
[0]: https://github.com/deadpixi/sam
[1]: https://github.com/deadpixi/sam/issues/69
[2]: http://sam.cat-v.org/cheatsheet/
[3]: https://github.com/ckeen/sam/commit/697a5f25e51a4077ebc2078d8b5fee038016e6b1
[4]: https://github.com/9fans/plan9port
[5]: https://code.9front.org/hg/plan9front/file/d42f25e223fc/sys/src/cmd/sam
    2018-03-11 - On smalltalk (~4 min. read)
All these pattern talks and the Java/C++ code I have to deal with at
a little deeper and see what this is all about. So around last
november I started learning one of the first OO languages around:
Smalltalk[0]. Smalltalk is a nice little language with such little
main communication mechanism in this nice language is message passing
between objects.  Everything is an object and responds to messages.
So you get life introspection into every aspect of the system. Also
the code is executed inside a VM (one of the first around!) and so
you can alter the system *life* and debug and change an application
Besides the simple language code smalltalk consists of two additional
that others would count to a language itself: compiler, interpreter,
And the other part is the *graphical* UI environment. All of these
the image quit and come back later to find your envrionment just as
you have left it.  Yes smalltalk is one of these strange image base
languages, just like the lisp tradition. A collection of these UI,
class and language parts is called a smalltalk system. You may think
of it as a 'distribution' in the linux distro sense.
From the 'original' smalltalk there's now a common VM implementation
opensmalltalk-vm[2]. On this VM there runs pharo[3], which
s the most complete and streamlined systems out there, squeak[4] which
s the 'original' smalltalk system comming from Xerox PARC
newspeak which is a totally new langugage with an emphasis on
While pharo is the most 'enterprise ready' of the whole bunch, I love
cuis for its goal of being minimalistic and simple. If you want to
understand a smalltalk system, I'd recommend to start with cuis. It
GNU smalltalk[6] and 'a little smalltalk'[7] both are independent
mplementations that come with their own VM and instruction set.
Most of the smalltalk books are legally available for download. I
first smalltalk instructors and programmers. She has also managed the
What I like about it so far: The codebrowser, live debugging and
browsability.  The codebrowser is the essential development tool on
n a system. It allows quickly searching and finding
navigate through the source code.
The debugger is invoked upon an unhandled error or user request.
Since smalltalk is run in a VM it allows you to change the faulty
code, and rerun the message as if the error never has happened. The
change you made is compiled and made persistent in the image.
And since all objects adhere to an introspection protocol one can
nspect all aspects of the system life. Want to know what a
that class's browser window.
As you can see this changes the way in one edits code. Also pharo and
change some aspect of a method? Just tell the editor and it will take
care that the whole system is consistent.
to do your own exploring.
Happy hacking!
[0]: https://en.wikipedia.org/wiki/Smalltalk
[1]: gopher://vernunftzentrum.de/g/ckeen/media/smalltalk-postcard.gif
[2]: http://opensmalltalk.org/
[3]: https://pharo.org/
[4]: http://squeak.org/
[5]: http://www.cuis-smalltalk.org/
[6]: http://smalltalk.gnu.org/
[7]: https://en.wikipedia.org/wiki/Little_Smalltalk
[8]: http://sdmeta.gforge.inria.fr/FreeBooks/BlueBook/
[9]: http://stephane.ducasse.free.fr/FreeBooks.html
[10]: gopher://vernunftzentrum.de/0/ckeen/media/smalltalk-postcard.txt
    2018-03-10 - A few weeks with a simple language (~2 min. read)
language'.  I think I can blame Alex Schroeder for it on mastodon. It
That should be doable even for me with the little spare time I have.
And so I sat down and learned those 120 something words within a
couple of days. After the first day I have been able to read texts.
Getting able to express myself is a still ongoing task though.
Now the reason for this is toki pona's simplicity. Complexity needs
to be reduced greatly, often only understandable through context or
customs of the community. Both I am still learning.
For example coffee (or tea!) could be 'telo wawa' (strong liquid) or
'telo lape ala' (liquid of no sleep).
Albeit it being really really simple it works reasonably well for
everyday conversations. Thankfully I have found some fellow toki pona
talkers on mastodon as the #tokipona chat channel seems a bit
quiet... And I dislike being part of a facebook group.
Next on my list for toki pona is getting more fluent and maybe learn
one of the scripts. The one I like best is 'sitelen sitelen'[3] which
mi tawa!
[0]: http://tokipona.org
[1]: http://tokipona.net/tp/default.aspx
[2]: http://tokipona.net/tp/ClassicWordList.aspx
[3]: http://jonathangabel.com/archive/2012/projects_t47.html
    2018-03-09 - Editing gopher posts with sam (~2 min. read)
As I have written yesterday[0], I like to use the sam editor for
editing files on my machines.  Sam is really an ed(1) instance on
Until today I have totally neglected another neat feature of sam:
nstance running on another host.
And that's how I edit this post now. It also enables me to run shell
commands etc completely within this simple editor.  So I have fired
up my script for creating a new file template, edit, save and then I
call the publishing script.
That the terminal is separate from the instance doing all the file
look into the source code to understand the wire protocol!
Note that there are incompatibilities within sam versions around, so
f you want to try this for yourself make sure that the sam versions
on both sides match. Also make sure that sam is in your path...
A quick primer to sam:
The white window is the command window. You can open files there with
'B filename', write with 'w', undo with 'u' (unlimited undo!) and
quit with 'q'.
the text window so that saves you reaching for the mouse for simple
For advanced editing (I am still getting comfortable with it myself)
The entries get formatted with selecting the text body and issuing
the command '|fmt -w 69' in the command window.  That pipes the
the output of said command.
There is so much more to be said about sam. But there are better
[0]: gopher://vernunftzentrum.de/0/ckeen/phlog/2018-03-08-A-mixed-bag-of-random-improvements.md
[1]: http://sam.cat-v.org/cheatsheet/sam-refcard.pdf
[2]: http://doc.cat-v.org/plan_9/4th_edition/papers/sam/
[3]: http://doc.cat-v.org/bell_labs/sam_lang_tutorial/sam_tut.pdf
    2018-03-08 - A mixed bag of random improvements (~2 min. read)
Title says it all. It has been a rather slow day today and I have
found some various nice things on the internet I'd like to share.
First of all today has been International day for women's rights!
Congratulations to all women!  Celebrate this nice day with this
mage[0] which can be found in my new media gallery section[1].
added a little ASCII preview. The preview has been done with the
excellent jp2a[2] tool which I strongly recommend for this type of
On another note I have been playing with tmux[3] and its panes and
the stup of this and I used it today, but I think a) ruby is a bit of
overkill for my use case b) yuck, a yaml description of the layout
and c) I can just use a shell script for this to setup my workspace
ssuing tmux commands just like tmuxinator does.
Also on the holymoly gopher client side, I have fixed[5] a silly bug
So I can say I got some little stuff done for the gopher population
today, learned a little more about my tools.
Also I am back to using sam[7] for editing my gopher posts. I have
[0]: gopher://vernunftzentrum.de/0/ckeen/media/international_womens_day.txt
[1]: gopher://vernunftzentrum.de/1/ckeen/media/
[2]: https://csl.name/jp2a/
[3]: https://github.com/tmux/tmux/wiki
[4]: https://github.com/tmuxinator/tmuxinator
[5]: gopher://vernunftzentrum.de:70/1/ckeen/repos/holymoly/commit/e85ae8fc44a31816b3b4c1f56756e20cc205b399.gph
[6]: gopher://grex.org:70/1/~papa/pgphlog/
[7]: http://sam.cat-v.org/
[8]: https://github.com/deadpixi/sam
    2018-03-07 - A little progress on holymoly (~1 min. read)
today.  The tiny patches include a little formatting change by
ndenting all output by three spaces and marking selectors with
' > '.
Also the gopher uri is now shown on the status line when it is
The client is still lacking a cached history which would allow faster
facility, like feeding all URIs to a dmenu[1] like selection buffer.
VF-1[2] has got a feature similar to this with the 'links' command.
s crap and needs to go.
So many things to do and so little time :-)
[0]: gopher://vernunftzentrum.de:70/1/ckeen/repos/holymoly
[1]: https://tools.suckless.org/dmenu/
[2]: https://github.com/solderpunk/VF-1
    2018-03-06 - On the gopher community (~2 min. read)
WARNING: This post is quite meta, so if you don't like reading such
things, feel free to skip this. It is not important at all...
Some nice folks on the gophersphere seem to have picked up my last
kvothe[2] and jynx[3] for their thoughtful additions.  We seem to
am not that too far off :)
Tomasino[1] takes the arguments a step further in the direction of
community which leads me to this response. I have recently read an
article by David Chapman written in 2015: 'Geeks, MOPs, and sociopaths
n subculture evolution'[4].  That's quite a mouthful but apart
from the sociopath twist in that story it shows that communities
established core values are up for a test.
We have seen this elsewhere when mastodon became popular, driving
out quite a bit of the rich subculture of LBGT people that choose
this platform as their interaction place.  I do think though that
As tomasino wrote the 'technology' used for gopher holes is quite
low tech compared to other monstrosities these days.  But -- I add
--  is so far off the mainstream interaction model that there is
no 'easy' switching from another platform.  You just don't give up
your blog for a gopher site because you think that's right. (Well
There is really no incentive for any (capitalist or otherwise)
exploitative strategy. There is nothing to be gained by using gopher
apart from the stated reasons previously. And technical simplicity
This seems to be the healthiest defense for the community if it
ever needs one.
That and respect for your fellow writers, but I take that as a
This all does not seem too thoughtful to me now as I read it again,
but I will leave this with you anyway.
[0]: gopher://vernunftzentrum.de:70/0/ckeen/phlog/2018-03-05-What-makes-gopher-special-for-me.md
[1]: gopher://sdf.org:70/1/users/tomasino/phlog/20180305-what-makes-gopher-special
[2]: gopher://sdf.org:70/0/users/kvothe/phlog/2018/03/05-special-gopher
[3]: gopher://sdf.org:70/0/users/jynx/dat/20180305.post
[4]: https://meaningness.com/geeks-mops-sociopaths
    2018-03-05 - What makes gopher special for me (~1 min. read)
Sean Tilly (someone I don't know yet) has asked on mastodon[0] about
the recurring mentions of gopher and what's so special about it. This
needed to run for hosting gopher yourself is tiny compared to other
things on the internet.
Because it is simple and way off the mainstream it envourages a do
t yourself attitude. Almost noone is a consumer of some 'publishing'
that keep on using it you can see a lot of unique and different
So not only in terms of protocols, complexity and software but also
n the mindset of its current users, gopher is the anti-thesis to
the 'commercial' web.
This kind of like feels a lot like when people started typing out
HTML pages manually and experimenting with linking styles, how to
communicate with others etc.
Gopher is still a lot simpler than that though, kind of like the
So, I ask you, dear reader: What does gopher mean to you?
[0]: https://social.nasqueron.org/@deadsuperhero/99630052661982090
    2018-03-05 - Posting tools revisited (~1 min. read)
manually. However now, that I seem to settle on one post format, I
my posting templates and updating the index. Nothing special but
t lowers the bar to write something for the phlog even more. Also
used that much in the past.
The scripts are probably buggy and really just tailored to my needs,
using tomasino's burrow[3].
[0]: gopher://vernunftzentrum.de/0/ckeen/phlog/2018-02-28-blogging-manually.md
[1]: gopher://vernunftzentrum.de/0/ckeen/tools/newpost.sh
[2]: gopher://vernunftzentrum.de/0/ckeen/tools/publish.sh
[3]: https://github.com/jamestomasino/burrow
    2018-03-04 - Hosting code (~2 min. read)
Yesterday[1] I have posted my about the ongoing work on my gopher
client and initially published the files in a directory. This has
bugged me so I used stagit-gopher[2] to host my own git repos on
this server.  Stagit-gopher offers a nice overview over a git repo,
a saner github UI so to speak.  I am always happy to find one of
these on the gopher sites since it allows you to decide whether the
Stagit uses a post-receive hook on the repositories to update the
t won't be good for inspecting the history of the linux kernel
for the generic post-receive hook that comes with stagit so for
today the repos have been broken most of the time.  It all should
So to make a long story short, I managed to set it up now and put
the repo link on the 'front'[3] of this gopher hole. Tomorrow I
[1]: gopher://vernunftzentrum.de/0/ckeen/phlog/2018-03-03-on-gopher-clients.md
[2]: gopher://bitreich.org/1/scm/stagit-gopher/log.gph
[3]: gopher://vernunftzentrum.de/1/ckeen/index.gph
    2018-03-03 - On gopher clients (~2 min. read)
Today's post is about gopher clients. For years I have been using
lynx and just recently I came across [solderpunk's][0] [vf-1][1].
n a terminal. I have been using it for reading the [moku pona][2]
output for a week now.
Besides these there are a couple more, including [sacc][3] which
basically made the same design choice by using link numbers as
navigational input from the user.
However all of these clients do lack one feature: The ability to
talk directly to a SOCKS proxy like Tor to browse hidden services.
All of them rely on a LD_PRELOAD trick done by [torsocks][4]. The
bitreich gopher has [instructions][5] on how to use this mechanism.
A couple of years ago I have started to implement my own gopher
client because of this and it turned out to be an easy addition.
easy navigation but it got the job done.
Since I regained interest in gopher again and since I am running
even my own gopher server now I decided to dust it off a bit and
mplement some missing feature on a daily basis. This way I should
Let's see how this goes.
The client is implemented in [CHICKEN Scheme][6] using ncurses.
Today I managed to revice it successfully and changed the entry
At the moment you can find the work in progress [here][7] and the
ncurses egg needs a little [patch][8].
So it is not ready for public consumption yet, but if you do feel
adventurous, give it a try!
[0]: gopher://sdf.org:70/1/users/solderpunk
[1]: gopher://sdf.org:70/0/users/solderpunk/phlog/introducing-vf1.txt
[2]: gopher://alexschroeder.ch:70/02018-02-05_Moku_Pona
[3]: gopher://bitreich.org:70/1/scm/sacc
[4]: https://gitweb.torproject.org/torsocks.git
[5]: gopher://bitreich.org:70/1/onion
[6]: https://www.call-cc.org
[7]: gopher://vernunftzentrum.de/1/ckeen/holymoly/index.gph
[8]: gopher://vernunftzentrum.de/1/ckeen/holymoly/files/ncurses-trunk.diff.gph
    2018-03-02 - Installing a pastebin for gopher (~1 min. read)
As of today this server features a pastebin service located [here][0].
my patches after I have cleaned them up a bit.
UPDATE: My patches for fiche are available in [its own repo][2] now.
are plenty of pastebins out there, also for gopher but why not set
up another one
What do you think?
[0]: gopher://vernunftzentrum.de:70/1/paste.gph
[1]: https://github.com/solusipse/fiche.git
[2]: gopher://vernunftzentrum.de/1/ckeen/repos/fiche
    2018-03-01 - Running a secure gopher server (~3 min. read)
There have been several discussions on how to secure gopher
connections and servers over the years. [__20h__][0] seems to get
tired of this and has made a [proposal][1] to the gopher project
mailing list.
A legacy server (one that does not provide TLS) will see the TLS
then repeat the request with plain old gopher.
He continues to give an example that would allow a migration path
towards secured servers with no code changes on the server part.
Clients of course would have to be written to be able to talk TLS.
__20h__ uses some neat tools in his example that will not require
any code added to an existing server implementation. [sslh][2] is my
favourite in this toolchain. A small wrapper around a port that
appropriate port. The original intent for this tool is to allow ssh
and tls served on the same port. What a nice hack!
another port where stunnel will happily establish a TLS connection
and forward the payloads to the gopher server. If there is no TLS
As I understand the proposal there are several drawbacks to it.
First of all there is no protection against downgrade attacks,
because the client does not know whether a server should speak TLS.
connection this intent gets lost as selectors do not consist of an
URI but just server/port tuples.
Of course one could run force the client to expect secured
connections only but that contradicts the backwards compatibility
Further discussions on the list center around used port schemes and
connections.  This argument does not take into account that a lot of
As for the downgrade attacks one could imagine a scheme were
fingerprints for servers are stored in DNS records for a server
fingerprints.  This will add yet another layer of indirection of
course and client implementations will get even more complicated.
Also the open issues of how to handle certificates, chains of trust
and so forth are still up for discussion.
tor hidden services (.onion URIs) would solve all this with much much
less effort.
Tor hidden services have the expected pub key in their name, will
But it is nice to see efforts in improving gopher!
[0]: gopher://r-36.net:70/1/
[1]: https://lists.debian.org/gopher-project/2018/02/msg00025.html
[2]: https://github.com/yrutschle/sslh.git
[3]: gopher://gopher.rbfh.de:70/0/RFC/rfc4255.txt
Disagree? Found a typo of bug? Please get in touch and tell me!
    2018-02-28 - How I post on gopher (~1 min. read)
the post, add the link to the index page is just too simple to beat.
to/from the server more easily but that's it.
This makes me think about the need for all the blogging frameworks
on the WWW. I guess the forced text-only style with almost and next
to none markup does lower the bar to just create content.  All the
nice things like tag clouds and CSS and fonts and whatnow  are
transferring content and noise in consuming content.  With gopher
the medium and a client may still render the text in a beautiful
font but that's not for me to decide.
Gopher hands the responsibility of formatting back to the client,
the author just makes a suggestion. And since there is no standard
to rely on people don't rely on layout and fancy formatting.
But I like it that way.
    2018-02-27 - Browse this server anonymously (~1 min. read)
now reach it via gopher://j73ayflmpldqrpuo.onion
Tor allows you to have an authenticated, encrypted and to some
extend anonymous connection to this gopher service. The content is
the same as in clear text but sometimes it is easier to access
content via tor than through, say the big corp SOCKS proxy that
[0]: gopher://j73ayflmpldqrpuo.onion
    2018-02-27 - Adding a phlogroll to this gopher (~1 min. read)
s all gathered on the [gopher.club][0] / [super dimensional
fortress][1] I would like a unified interface to all the news.
Fortunately [Alex Schroeder][2] has already written a nice little
All I had to do, was to install the Modern::Perl URI and Net::Server
modules from packages.
ndex files:
$HOME/bin/moku-pona update
cat .moku-pona/sites.txt | tr '\t\r' '|'| sed 's,\(.\),\1|,'|sed 's,\(^.|.*$\),[\1],;s,|],],' > gopher/sites.gph
cat .moku-pona/updates.txt | tr '\t\r' '|'| sed 's,\(.\),\1|,'|sed 's,\(^.|.*$\),[\1],;s,|],],' > gopher/updates.gph
[0]: gopher://gopher.club
[1]: gopher://sdf.org
[2]: gopher://alexschroeder.ch
[3]: gopher://vernunftzentrum.de/1/ckeen/index.gph
    2018-02-27 - Editing ACME style again (~1 min. read)
A dear friend of mine [Felix][0] has written an [acme][1] clone in
TCL/TK called [ma][2].  I have long postponed to try this. I have
been using acme in its inferno incarnation [acme-sac][3] for 5 years
t stayed that way. But using the keyboard to navigate through
me and wished for acme like chording.
So the time has come and I will try out ma. Why not the real acme
you might ask? The window micromanagement necessary by the original
acme was always a wart of it I did not like. I loved [sam's][4]
So the time has come for ma, let's see how this will work out.
Mi tawa.  
[0]: gopher://schinkel.bevuta.com
[1]: http://acme.cat-v.org/
[2]: gopher://schinkel.bevuta.com/1/ma/ma
[3]: https://github.com/caerwynj/acme-sac
[4]: http://sam.cat-v.org/
    2018-02-26 - Making your own keyboard (~8 min. read)
a 60% Vortex Pok3r III with LED backlighting and MX-Clear switches.
All in all it is a nice keyboard, I used it happily.  However the
customisation it offers is both a blessing and a curse.  The good
thing about it is, that it requires no flashing tool and can be done
on the fly by typing keys on the board using a special programming
mode.  The bad thing about it is, that there is no tool to read this
customisations back out for backup.  So when you have to reset the
keyboard which happened 3 times to me you loose all your nifty
So I did some research about building your own mechanical keyboard
and it has been a wild ride ever since.  It turns out making your own
keyboard is pretty easy.  And there is even a wide variety of open
A keyboard mainly consists of:
* Keyswitches
* A plate
* A case
* A controller / A PCB
* Some LEDs / diodes 
* Keycaps
Keyboard switches come in two basic "shapes" which refers to their
footprint on the PCB / plate: Cherry style switches (MX) or Alps.
MX-Switches are by far the most commonly used ones when it comes to
keycaps.  I haven't tried alps yet, so I cannot tell you anything
about them.  Another (rather expensive) outlier are TOPRE switches
Another parameter for switches are the forces need to activate the
 - Linears: Red, Black - Tactile: Brown, Clears - Clicky: Blues
So far I have tried blues, reds, clears and browns. Blacks are on a
codings, such as Gateron or Zealios switches.  To get a feeling for
the switch types either try them on a keyboard from a friend or a
ncludes several different types of switches.  If you have decided on
a switch type, decide on the case.
You got a couple of options:
- CNC'ed cases, those are hard to make youself unless you have access
  to a CNC Mill. Those are around 50->100 EUR or more depending on
  the type and material.
- 3D Printed cases: Those are rather cheap in comparison. Some models
  like the crazy dactyl keyboard can only be made with 3D printed
- Sandwhich cases: Either made from steel with standoffs or wood /
  acrylic layers or a combination thereof. That may be the cheapest
  option if you have access to a laser cutter.
So you see, a local fablab is key to keeping the price tag down to a
minimum :)
The innards of the keyboard consists of the switches being connected
through some diodes to a microcontroller.  The diodes are there to
s a cheap and easily available Atmega32U4, which contains a USB
controller that will do the communication for us.  If you want a
the comms for you.
that require you to solder on the switches, diodes and a cheap
controller (Atmega32U4 in one of its dev board variants).  Or you buy
to do, it is easy to debug and easy to fix.  A PCB approach on the
other hand means that you can save some height on you building, since
you don't need as much space below the plate.  Also the PCB acts as a
Thanks to technomancy's Atreus hand-wiring guide I tried to hand wire
my boards.  The Atreus is also the first board that I built and it is
As for the controllers used there are a wide range of arduino pro
micro clones out there, most of them featuring a usb micro connector.
the Teensy which is of better quality but also twice the price of an
arduino clone.
Electronically a keyboard is a simple circuit consisting of a lot of
the switches are pressed and generates a scancode for the operating
the selected layout of the OS.
Now since a microcontroller does not have one input pin for each
ndividual key, the keys are wired as a so called matrix.  In the
matrix keys are arranged in columns and rows.  Each row and each
column is wired together and connected to one pin.  Maybe it helps if
you imagine the matrix as a coordinate grid, with the rows and cols
on the axis.  The microprocessor then checks periodically where on
the matrix a circuit is closed (the key switch is pressed).  That way
a single compination of row/col pins can identify the exact key that
Now as electricity is a funny thing the effect of ghosting may be a
For a better explanation see here[].  To prevent this diodes are
controller needs to know this to scan the pins in the right
That's all there is to it! The rest of the magic happens in a big
For the cases you need 2D/3D design tooling. I used FLOSS, which
leaves me to: OpenSCAD, FreeCAD, Inkscape and VisiCut.
For the sandwhich case you can download a lot of cases as SVGs which
you can use to feed to VisiCut for cutting on your fablab's laser
cutter.  For a orthogonal planck build I used OpenSCAD to model the
SVG files and I like the procedural approach for that.
For 3D-printed cases you can either use OpenSCAD or FreeCAD to design
your case or use a STL file off of thingiverse.
For the firmware you can use the QMK keyboard firmware which has the
most features implemented, including speaker support or a midi
keyboard, and also features a lot of predefined layouts and board
types.  But there are also a lot of other firmwares available, or you
can build your own matrix scan software.
To flash and build the software you need a gcc-avr toolchain and
avrdude / dfu-programmer depending on the bootloader of your
And of course you need a multimeter, a soldering iron, wires, a flush
cutter, a self adjusting wire stripper and a multimeter for debugging
your soldering joints.
One of the tricks I have learned for hand wiring is that you make a
little loop with the wires around the pins before soldering them on.
That will result in a secure physical connection and you won't be
able to rip off the wire again (well normally anyway).
Also designing a case is non-trivial if you want some extras. While
t looks shiny in OpenSCAD, the laser cutter adds kerf, the arduino
clonse may come with different headers, sizes, pcb thickness...
Acrylic tends to snap easily.
So what I want to tell you probably is: Expect to fail, expect to be
non perfect, there are things that will go wrong in your build and
that's the chance to learn something. Still works for me and it is a
the newly built thing will break as soon as you finish! Then when
things break I can tell myself "oh, sure, of course it breaks, let's
activity with physical things (which I don't do often enough) this
all became clearer to me.
So I hope now you have some starting point to get your own first
build done. Let me know how it went!
    2018-02-26 - How I prepare my coffee (~2 min. read)
Triggered by Alex Schroeder's [0]post I will describe my preparation
of coffee here.
First of all I want to say that coffee has hundreds of different
flavours and whether they are good for you is purely subjective and
a matter of taste.  So all I say here may not apply to you -- dear
That said the key to my coffee journey is this: Grind your coffee
fresh just before brewing.  This meant for me to get a coffee
So with the freshly ground beans you can have the choice of using:
* A moka pot
* An aeropress
* A good old hand filter
* A french press
As you can see all the above methods will not produce anything near
a good old espresso due to the low pressure applied. This also means
that you should buy light roasted beans. Espresso roasted beans
The brewing method varies for me depending on the beans and the
available dishes and time.
boiling and proceed in pouring the water slowly over the ground
easily get 3-4 cups out of ours.
There is a whole nerdy subculture that's obsessed with the right
As an introduction I visited a local coffee roaster and there someone
What I still have to try out is so called cold brew coffee, where
you let the ground coffee sit in cold water for 24+ hours then
filter it and dillute to taste.
So how do you prepare your coffee?
[0]: gopher://alexschroeder.ch/02018-02-16_Coffee